From d21d7dd23f15a0ca395a4c9d1b3bb31330ff56c0 Mon Sep 17 00:00:00 2001
From: yxh <172933527@qq.com>
Date: 星期三, 30 九月 2026 11:27:37 +0800
Subject: [PATCH] 专家费校验

---
 src/views/project/travelexpenseapply/travelexpensedetail/index.vue |  278 ++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 162 insertions(+), 116 deletions(-)

diff --git a/src/views/project/travelexpenseapply/travelexpensedetail/index.vue b/src/views/project/travelexpenseapply/travelexpensedetail/index.vue
index 1851048..bd4b966 100644
--- a/src/views/project/travelexpenseapply/travelexpensedetail/index.vue
+++ b/src/views/project/travelexpenseapply/travelexpensedetail/index.vue
@@ -1282,7 +1282,8 @@
   exportReimbursement,
   getdownload,
   checkfund,
-  fundSubmit
+  fundSubmit,
+  listbypowerone
 } from "@/api/project/reimbursement";
 import {
   addReimbursementdetail,
@@ -1304,6 +1305,7 @@
 import { listReportname, listUser } from "@/api/project/organization";
 import { getToken } from "@/utils/auth";
 import debounce from "lodash/debounce";
+import { moneySum, moneyAdd, moneyRound } from "@/utils/money";
 export default {
   components: {
     Treeselect,
@@ -1492,6 +1494,8 @@
         flowconclusion: null,
         fundid: null
       },
+      //杩炵画瀹℃壒锛氬緟瀹℃壒鍒楄〃
+      pendingList: [],
       jurisdiction: false,
 
       //淇濆瓨鎸夐挳鎺у埗
@@ -2143,9 +2147,9 @@
           if (tempStr == "鏉窞") {
             row.otherexpense = "";
           } else if (
-            tempStr == "鏉窞-妗愬簮" ||
-            tempStr == "鏉窞-寤哄痉" ||
-            tempStr == "鏉窞-娣冲畨"
+            tempStr.includes("妗愬簮") ||
+          tempStr.includes("寤哄痉") ||
+          tempStr.includes("娣冲畨")
           ) {
             row.otherexpense = (parseInt(row.days) * 60).toString();
           } else {
@@ -2534,7 +2538,7 @@
             .map(item => ({ url: item, name: item }))
           : [];
         //瀹℃牳鐘舵��
-        this.form.recordstatus = response.data.recordstatus + "";
+        this.form.recordstatus = this.toStatusText(response.data.recordstatus, "-1");
         let ids = response.data.id;
         let listFundflowparams = {
           fundid: ids,
@@ -2545,14 +2549,19 @@
         });
 
         //鎶ラ攢鏄庣粏
-        getReimbursementdetaillist(ids).then(res => {
-          this.rbDetails = res.data;
-          //鍚堣璐圭敤
-          // if (this.rbDetails.length > 0) this.sumTotalFee();
-          for (let i = 0; i < this.rbDetails.length; i++) {
-            this.sumRowFee(this.rbDetails[i]);
-          }
-        });
+        getReimbursementdetaillist(ids)
+          .then(res => {
+            this.rbDetails = this.normalizeDetailList(res);
+            //鍚堣璐圭敤
+            // if (this.rbDetails.length > 0) this.sumTotalFee();
+            for (let i = 0; i < this.rbDetails.length; i++) {
+              this.sumRowFee(this.rbDetails[i]);
+            }
+          })
+          .catch(err => {
+            this.rbDetails = [];
+            console.error("鑾峰彇鎶ラ攢鏄庣粏澶辫触,id=" + ids, err);
+          });
 
         //浠樻淇℃伅
         this.queryParamsPayee.rbid = ids;
@@ -2575,12 +2584,21 @@
       this.reset();
       this.open = true;
       const id = ids || this.ids;
-      this.checkObj.fundid = id;
+      // 閲嶇疆瀹℃壒淇℃伅锛岄伩鍏嶄笂涓�鍗曠殑瀹℃壒缁撴灉甯﹀叆涓嬩竴鍗�
+      this.checkObj = {
+        flowlevelone: null,
+        flowconclusion: null,
+        fundid: id
+      };
+
+      // 杩炵画瀹℃壒锛氬姞杞藉綋鍓嶇敤鎴风殑寰呭鎵瑰垪琛�
+      this.getPendingList();
 
       getReimbursement(id).then(response => {
         this.form = response.data;
         console.log(this.form.checkstatus, "checkstatus");
-        this.form.checkstatus = this.form.checkstatus.toString();
+        // checkstatus 鍦ㄥ簱涓彲涓虹┖锛堥瀹$姸鎬佸皻鏈骇鐢熸椂锛夛紝鐩存帴 toString 浼氭姏 TypeError 涓柇鍚庣画鍙栨暟
+        this.form.checkstatus = this.toStatusText(this.form.checkstatus, "-1");
 
         //绁ㄦ嵁
         this.fileListto = this.form.annexfiles
@@ -2607,16 +2625,22 @@
         });
 
         //鎶ラ攢鏄庣粏
-        getReimbursementdetaillist(ids).then(res => {
-          this.rbDetails = res.data;
-          console.log(this.rbDetails);
+        getReimbursementdetaillist(ids)
+          .then(res => {
+            this.rbDetails = this.normalizeDetailList(res);
+            console.log("鎶ラ攢鏄庣粏琛屾暟锛�", this.rbDetails.length, this.rbDetails);
 
-          //鍚堣璐圭敤
-          // if (this.rbDetails.length > 0) this.sumTotalFee();
-          for (let i = 0; i < this.rbDetails.length; i++) {
-            this.sumRowFee(this.rbDetails[i]);
-          }
-        });
+            //鍚堣璐圭敤
+            // if (this.rbDetails.length > 0) this.sumTotalFee();
+            for (let i = 0; i < this.rbDetails.length; i++) {
+              this.sumRowFee(this.rbDetails[i]);
+            }
+          })
+          .catch(err => {
+            // 鍙栨暟澶辫触鏃朵笉鍐嶉潤榛橈細缃┖骞舵墦鍑哄師鍥狅紝閬垮厤鈥滄帴鍙f湁鏁版嵁浣嗛〉闈㈢┖鐧解�濇棤浠庢帓鏌�
+            this.rbDetails = [];
+            console.error("鑾峰彇鎶ラ攢鏄庣粏澶辫触,id=" + ids, err);
+          });
 
         //浠樻淇℃伅
         this.queryParamsPayee.rbid = ids;
@@ -2665,9 +2689,8 @@
         if (res.code == 200) {
           this.$modal.closeLoading();
           this.$modal.msgSuccess("鎻愪氦瀹℃牳鎴愬姛!");
-          // 鍏抽棴绐楀彛
-          this.$store.dispatch("tagsView/delView", this.$route);
-          this.$router.go(-1);
+          // 杩炵画瀹℃壒锛氳闂槸鍚︾户缁鎵逛笅涓�鍗�
+          this.continueOrExit();
         } else {
           this.$modal.closeLoading();
           if (res.msg) {
@@ -2677,6 +2700,66 @@
           }
         }
       });
+    },
+
+    // 鑾峰彇褰撳墠鐢ㄦ埛寰呭鎵瑰垪琛紙鐢ㄤ簬杩炵画瀹℃壒锛�
+    getPendingList() {
+      listbypowerone({
+        pageNum: 1,
+        pageSize: 1000,
+        CHECKFLAG: 1
+      })
+        .then(res => {
+          this.pendingList = res.rows || [];
+        })
+        .catch(() => {
+          this.pendingList = [];
+        });
+    },
+
+    // 瀹℃壒瀹屾垚鍚庯細璇㈤棶鏄惁缁х画瀹℃壒涓嬩竴鍗�
+    continueOrExit() {
+      const list = this.pendingList || [];
+      const curId = String(this.checkObj.fundid);
+      const idx = list.findIndex(item => String(item.id) === curId);
+      let next = null;
+      if (idx > -1 && idx + 1 < list.length) {
+        next = list[idx + 1];
+      } else {
+        // 褰撳墠宸叉槸鏈綅锛堟垨浠庝腑闂村紑濮嬶級锛屽彇鍓╀綑鍒楄〃涓涓�鏉¢潪褰撳墠鍗曟嵁
+        next = list.find(item => String(item.id) !== curId) || null;
+      }
+
+      if (next) {
+        this.$confirm("瀹℃壒宸插畬鎴愶紝鏄惁缁х画瀹℃壒涓嬩竴寮犲緟瀹℃壒鍗曟嵁锛�", "鎻愮ず", {
+          confirmButtonText: "缁х画瀹℃壒",
+          cancelButtonText: "杩斿洖鍒楄〃",
+          type: "info"
+        })
+          .then(() => {
+            // 鐩存帴鍦ㄥ綋鍓嶉〉闈㈠姞杞戒笅涓�寮犲緟瀹℃壒鍗曟嵁
+            this.handleCheck(next.id);
+            // 鍚屾鏇存柊鍦板潃鏍忥紝閬垮厤鍒锋柊鍚庡洖鍒颁笂涓�鍗�
+            this.$router
+              .replace({
+                path: this.$route.path,
+                query: { id: next.id, pos: 4 }
+              })
+              .catch(() => {});
+          })
+          .catch(() => {
+            this.exitToPage();
+          });
+      } else {
+        this.$modal.msgSuccess("宸叉棤寰呭鎵瑰崟鎹紝杩斿洖鍒楄〃");
+        this.exitToPage();
+      }
+    },
+
+    // 杩斿洖鍒楄〃椤�
+    exitToPage() {
+      this.$store.dispatch("tagsView/delView", this.$route);
+      this.$router.go(-1);
     },
 
     /** 鎻愪氦淇濆瓨鎸夐挳 */
@@ -3180,108 +3263,71 @@
         });
     },
 
-    //璁$畻涓�琛屽悎璁�
-    //璁$畻褰撳墠琛屾姤閿�鍐呭璐圭敤鍚堣
-    sumRowFee(row) {
-      let totalFee = 0;
-      if (!isNaN(parseFloat(row.trafficexpense))) {
-        totalFee += parseFloat(row.trafficexpense);
+    /**
+     * 鐘舵�佺被瀛楁杞瓧绗︿覆锛堟帴鍙e彲鑳借繑鍥� null锛夈��
+     *
+     * 鑳屾櫙锛歝heckstatus銆乺ecordstatus 绛夊湪搴撲腑鍙┖锛屾棭鏈熺洿鎺ヨ皟鐢� .toString()
+     * 浼氭姏 TypeError 骞朵腑鏂叾鍚庣殑鍙栨暟閫昏緫锛岃〃鐜颁负鈥滄帴鍙e凡鏈夋暟鎹絾鏄庣粏鍖虹┖鐧解�濄��
+     *
+     * @param {*} value 鍘熷鐘舵�佸��
+     * @param {string} fallback 涓虹┖鏃剁殑鍏滃簳鍊�
+     * @returns {string}
+     */
+    toStatusText(value, fallback) {
+      if (value === null || value === undefined || value === "") {
+        return fallback;
       }
-      if (!isNaN(parseFloat(row.cityfee))) {
-        totalFee += parseFloat(row.cityfee);
-      }
-      if (!isNaN(parseFloat(row.hotelexpense))) {
-        totalFee += parseFloat(row.hotelexpense);
-      }
-      if (!isNaN(parseFloat(row.otherexpense))) {
-        totalFee += parseFloat(row.otherexpense);
-      }
-      if (!isNaN(parseFloat(row.foodexpenses))) {
-        totalFee += parseFloat(row.foodexpenses);
-      }
-      if (!isNaN(parseFloat(row.foodallowance))) {
-        totalFee += parseFloat(row.foodallowance);
-      }
-      if (!isNaN(parseFloat(row.otherfeeamount))) {
-        totalFee += parseFloat(row.otherfeeamount);
-      }
-      row.total = totalFee.toFixed(2);
+      return String(value);
+    },
 
-      /*
-      if (!isNaN(parseFloat(this.rbDetails[rowIndex].trafficexpense))) {
-        totalFee += parseFloat(this.rbDetails[rowIndex].trafficexpense);
+    /**
+     * 缁熶竴浠庢槑缁嗘帴鍙e搷搴斾腑鍙栧嚭鏁扮粍銆�
+     *
+     * 姝e父涓� AjaxResult 鐨� data 鏁扮粍锛涜嫢鍚庣鏀逛负鍒嗛〉缁撴瀯锛坱otal + rows锛夛紝
+     * res.data 灏嗕笉鏄暟缁勶紝鐩存帴缁戝畾鍒� el-table 浼氬鑷粹�滄湁鏁版嵁浣嗕笉鏄剧ず鈥濄��
+     *
+     * @param {Object} res 鎺ュ彛鍘熷鍝嶅簲
+     * @returns {Array} 鏄庣粏鏁扮粍锛堝紓甯告椂涓虹┖鏁扮粍锛屼笉浼氳琛ㄦ牸鎷垮埌闈炴暟缁勶級
+     */
+    normalizeDetailList(res) {
+      if (!res) {
+        return [];
       }
-      if (!isNaN(parseFloat(this.rbDetails[rowIndex].cityfee))) {
-        totalFee += parseFloat(this.rbDetails[rowIndex].cityfee);
+      if (Array.isArray(res.data)) {
+        return res.data;
       }
-      if (!isNaN(parseFloat(this.rbDetails[rowIndex].hotelexpense))) {
-        totalFee += parseFloat(this.rbDetails[rowIndex].hotelexpense);
+      if (Array.isArray(res.rows)) {
+        return res.rows;
       }
-      if (!isNaN(parseFloat(this.rbDetails[rowIndex].otherexpense))) {
-        totalFee += parseFloat(this.rbDetails[rowIndex].otherexpense);
-      }
-      if (!isNaN(parseFloat(this.rbDetails[rowIndex].foodexpenses))) {
-        totalFee += parseFloat(this.rbDetails[rowIndex].foodexpenses);
-      }
-      if (!isNaN(parseFloat(this.rbDetails[rowIndex].foodallowance))) {
-        totalFee += parseFloat(this.rbDetails[rowIndex].foodallowance);
-      }
-      if (!isNaN(parseFloat(this.rbDetails[rowIndex].otherfeeamount))) {
-        totalFee += parseFloat(this.rbDetails[rowIndex].otherfeeamount);
-      }
-      this.rbDetails[rowIndex].total = parseFloat(totalFee).toFixed(2);
-      this.$set(this.rbDetails, rowIndex, this.rbDetails[rowIndex]);
-      */
+      return [];
+    },
+
+    //璁$畻涓�琛屽悎璁�
+    //璁$畻褰撳墠琛屾姤閿�鍐呭璐圭敤鍚堣锛堥噾棰濅竴寰嬭蛋绮剧‘杩愮畻锛�
+    sumRowFee(row) {
+      const totalFee = moneySum([
+        row.trafficexpense,
+        row.cityfee,
+        row.hotelexpense,
+        row.otherexpense,
+        row.foodexpenses,
+        row.foodallowance,
+        row.otherfeeamount
+      ]);
+      row.total = moneyRound(totalFee).toFixed(2);
+
       //閲嶆柊璁$畻鏁翠釜鎶ラ攢鍗曠殑鍚堣
       this.sumTotalFee();
     },
 
     //璁$畻璐圭敤鍚堣
     sumTotalFee() {
-      let allSum = 0;
-
-      //鎹愮尞鑰呭灞炶垂鐢�
-      if (!isNaN(parseFloat(this.form.donoramount))) {
-        allSum += parseFloat(this.form.donoramount);
-      }
-
       //鎶ラ攢鏄庣粏璐圭敤
       try {
-        for (let i = 0; i < this.rbDetails.length; i++) {
-          /*
-          let totalFee = 0;
-          //璁$畻褰撳墠鎶ラ攢鍐呭璐圭敤鍚堣
-          if (!isNaN(parseFloat(this.rbDetails[i].total))) {
-            totalFee += parseFloat(this.rbDetails[i].total);
-          }
-          if (!isNaN(parseFloat(this.rbDetails[i].cityfee))) {
-            totalFee += parseFloat(this.rbDetails[i].cityfee);
-          }
-          if (!isNaN(parseFloat(this.rbDetails[i].hotelexpense))) {
-            totalFee += parseFloat(this.rbDetails[i].hotelexpense);
-          }
-          if (!isNaN(parseFloat(this.rbDetails[i].otherexpense))) {
-            totalFee += parseFloat(this.rbDetails[i].otherexpense);
-          }
-          if (!isNaN(parseFloat(this.rbDetails[i].foodexpenses))) {
-            totalFee += parseFloat(this.rbDetails[i].foodexpenses);
-          }
-          if (!isNaN(parseFloat(this.rbDetails[i].foodallowance))) {
-            totalFee += parseFloat(this.rbDetails[i].foodallowance);
-          }
-          if (!isNaN(parseFloat(this.rbDetails[i].otherfeeamount))) {
-            totalFee += parseFloat(this.rbDetails[i].otherfeeamount);
-          }
-          this.rbDetails[i].total = parseFloat(totalFee).toFixed(2);
-          this.$set(this.rbDetails, i, this.rbDetails[i]);
-          */
-
-          if (!isNaN(parseFloat(this.rbDetails[i].total))) {
-            allSum += parseFloat(this.rbDetails[i].total);
-          }
-        }
-
-        this.form.amountrequested = allSum.toFixed(2);
+        this.form.amountrequested = moneyAdd(
+          moneySum(this.rbDetails, "total"),
+          this.form.donoramount
+        ).toFixed(2);
         this.form.bigstrmoney = this.convertCurrency(this.form.amountrequested);
       } catch { }
     },

--
Gitblit v1.9.3