Browse Source

fix: 企业申报管理-成本核定加个计算公式,核定值自动生成(核定值=账面值+审核调整值)

shiyanyu 1 month ago
parent
commit
7174ac7a81
1 changed files with 92 additions and 0 deletions
  1. 92 0
      src/views/costAudit/auditInfo/auditManage/costAudit.vue

+ 92 - 0
src/views/costAudit/auditInfo/auditManage/costAudit.vue

@@ -134,6 +134,8 @@
             :placeholder="item.label"
             :disabled="item.disabled"
             style="width: 100%"
+            @input="handleCellInput(scope.row)"
+            @change="handleCellInput(scope.row)"
           ></el-input>
         </template>
       </el-table-column>
@@ -251,6 +253,8 @@
         // 成本审核数据
         costAuditData: [],
         project: {},
+        // 年份到各列prop的映射:{ '2025': { book: '...', audit: '...', approved: '...' } }
+        yearPropMap: {},
       }
     },
     watch: {
@@ -508,14 +512,79 @@
             })
             // 强制刷新
             this.costAuditData = [...this.costAuditData]
+            this.computeApprovedForAllRows()
           }
         } catch (e) {
           console.warn('回显上传数据失败:', e)
         }
       },
+      // 单元格输入联动:当账面值或审核调整值变化时,自动计算核定值
+      handleCellInput(row, item) {
+        console.log(111)
+        if (!row) return
+        // 若未传入列信息,则对该行全部年份重算
+        if (!item || !item.prop) {
+          this.computeApprovedForRow(row)
+          return
+        }
+        const m = String(item.prop).match(
+          /^year(\d{4})(BookValue|Audit|ApprovedValue)$/
+        )
+        if (!m) {
+          this.computeApprovedForRow(row)
+          return
+        }
+        const year = m[1]
+        const bookProp = `year${year}BookValue`
+        const auditProp = `year${year}Audit`
+        const approvedProp = `year${year}ApprovedValue`
+        const a = parseFloat(row[bookProp])
+        const b = parseFloat(row[auditProp])
+        const aNum = isNaN(a) ? 0 : a
+        const bNum = isNaN(b) ? 0 : b
+        // 若两者皆为空字符串则清空核定值;否则计算和
+        if (
+          (row[bookProp] === '' || row[bookProp] === undefined) &&
+          (row[auditProp] === '' || row[auditProp] === undefined)
+        ) {
+          this.$set(row, approvedProp, '')
+        } else {
+          this.$set(row, approvedProp, String(aNum + bNum))
+        }
+      },
+      // 针对单行,遍历存在的年份字段进行重新计算
+      computeApprovedForRow(row) {
+        if (!row) return
+        const map = this.yearPropMap || {}
+        Object.keys(map).forEach((year) => {
+          const bookProp = map[year].book
+          const auditProp = map[year].audit
+          const approvedProp = map[year].approved
+          if (!bookProp || !auditProp || !approvedProp) return
+          const a = parseFloat(row[bookProp])
+          const b = parseFloat(row[auditProp])
+          const aNum = isNaN(a) ? 0 : a
+          const bNum = isNaN(b) ? 0 : b
+          if (
+            (row[bookProp] === '' || row[bookProp] === undefined) &&
+            (row[auditProp] === '' || row[auditProp] === undefined)
+          ) {
+            this.$set(row, approvedProp, '')
+          } else {
+            this.$set(row, approvedProp, String(aNum + bNum))
+          }
+        })
+      },
+      // 针对全表,批量重新计算核定值
+      computeApprovedForAllRows() {
+        if (!Array.isArray(this.costAuditData)) return
+        this.costAuditData.forEach((row) => this.computeApprovedForRow(row))
+      },
       parseAndDisplayTableHeaders(res) {
         this.tableHeadersRes = Array.isArray(res.value) ? res.value : []
         if (this.tableHeadersRes.length > 0) {
+          // 重置年份映射
+          this.yearPropMap = {}
           this.auditForm.surveyTemplateId = res.value[0].surveyTemplateId
           // 表头按照orderNum重新排序
           this.tableHeadersRes.sort((a, b) => a.orderNum - b.orderNum)
@@ -532,6 +601,22 @@
               showOverflowTooltip: item.fieldName == '序号' ? false : true,
             }
             this.costAuditcolumn.push(column)
+
+            // 基于表头中文名构建年份映射
+            const name = item.fieldName || item.label || ''
+            const prop = item.fieldEname || item.prop || ''
+            const m = String(name).match(
+              /^(\d{4})年(账面值|审核调整值|核定值)$/
+            )
+            if (m && prop) {
+              const year = m[1]
+              const kind = m[2]
+              if (!this.yearPropMap[year]) this.yearPropMap[year] = {}
+              if (kind === '账面值') this.yearPropMap[year].book = prop
+              else if (kind === '审核调整值')
+                this.yearPropMap[year].audit = prop
+              else if (kind === '核定值') this.yearPropMap[year].approved = prop
+            }
           })
           // 若表头未包含“单位”列,则追加;已包含则不重复添加
           const hasUnitCol = this.costAuditcolumn.some(
@@ -583,6 +668,9 @@
               }
               this.costAuditcolumn.push(bookValueColumn)
               this.tableHeadersRes.push(bookValueColumn)
+              // 映射
+              if (!this.yearPropMap[item]) this.yearPropMap[item] = {}
+              this.yearPropMap[item].book = bookValueColumn.prop
               // 审核字段
               let auditColumn = {
                 fieldEname: 'year' + item + 'Audit',
@@ -608,6 +696,7 @@
               }
               this.costAuditcolumn.push(auditColumn)
               this.tableHeadersRes.push(auditColumn)
+              this.yearPropMap[item].audit = auditColumn.prop
               // 核定值字段
               let approvedValueColumn = {
                 fieldEname: 'year' + item + 'ApprovedValue',
@@ -633,6 +722,7 @@
               }
               this.costAuditcolumn.push(approvedValueColumn)
               this.tableHeadersRes.push(approvedValueColumn)
+              this.yearPropMap[item].approved = approvedValueColumn.prop
             })
           }
         }
@@ -763,6 +853,8 @@
             if (!seen.has(row)) flat.push(row)
           })
           this.costAuditData = flat
+          // 平铺完成后统一计算核定值
+          this.computeApprovedForAllRows()
         }
       },
       handleSaveTemplate(type) {