Parcourir la source

fix: 更新样品不合格数逻辑,添加损耗数自动同步功能

xieyong il y a 1 mois
Parent
commit
c6b051adf6

+ 97 - 24
src/views/produce/components/workPlan/components/inspectionProjectReport.vue

@@ -62,9 +62,11 @@
       <template v-slot:sampleNoQualifiedNumber="{ row }">
         <el-input
           v-model="row.sampleNoQualifiedNumber"
+          @input="formSampleNoQualifiedNumberChange"
+          @blur="formSampleNoQualifiedNumberChange"
           placeholder="自动取值(质检项中最大不合格数)"
           type="number"
-          disabled
+          :disabled="type == 'detail' || qms_defaultDisposalType"
         >
           <template slot="append">{{ form.measureUnit }}</template>
         </el-input>
@@ -421,14 +423,6 @@
             label: '样品数',
             showOverflowTooltip: true
           },
-          {
-            minWidth: 180,
-            prop: 'sampleNoQualifiedNumber',
-            slot: 'sampleNoQualifiedNumber',
-            align: 'center',
-            label: '样品不合格数',
-            showOverflowTooltip: true
-          },
           {
             minWidth: 140,
             prop: 'sampleQualifiedNumber',
@@ -445,6 +439,15 @@
             label: '样品合格数',
             showOverflowTooltip: true
           },
+          {
+            minWidth: 180,
+            prop: 'sampleNoQualifiedNumber',
+            headerSlot: 'isRequired',
+            slot: 'sampleNoQualifiedNumber',
+            align: 'center',
+            label: '样品不合格数',
+            showOverflowTooltip: true
+          },
           {
             minWidth: 140,
             prop: 'lossNumber',
@@ -761,23 +764,47 @@
       // 任意质检项的不合格数变更时,自动同步最大不合格数到样品不合格数
       tableData: {
         deep: true,
-        handler(list) {
-          if (!Array.isArray(list) || !list.length) {
-            this.$set(this.form, 'sampleNoQualifiedNumber', 0);
+        handler(newVal) {
+          if (!newVal || !newVal.length) {
+            this.form.sampleNoQualifiedNumber = 0;
+            this.form.sampleQualifiedNumber = this.form.sampleQuantity || 0;
+            return;
+          }
+          const maxNoQualified = newVal.reduce((max, item) => {
+            const val = Number(item.noQualifiedQuantity) || 0;
+            return val > max ? val : max;
+          }, 0);
+          this.$set(this.form, 'sampleNoQualifiedNumber', maxNoQualified);
+          const qualifiedNumber =
+            (Number(this.form.sampleQuantity) || 0) - maxNoQualified;
+          if (qualifiedNumber < 0) {
+            this.$message.warning('样品合格数不能小于0');
+            this.$set(this.form, 'sampleQualifiedNumber', 0);
           } else {
-            const maxNoQualified = list.reduce(
-              (max, item) =>
-                Math.max(max, Number(item.noQualifiedQuantity) || 0),
-              0
-            );
-            this.$set(this.form, 'sampleNoQualifiedNumber', maxNoQualified);
+            this.$set(this.form, 'sampleQualifiedNumber', qualifiedNumber);
+          }
+
+          // 损耗数逻辑:从下方 lossNumberUnqualified 取最大值,lossNumberUnqualified = 总数量 - lossNumber
+          if(this.qms_defaultDisposalType) {
+            const maxLossNumberUnqualified = newVal.reduce((max, item) => {
+              const val = Number(item.lossNumberUnqualified) || 0;
+              return val > max ? val : max;
+            }, 0);
+            this.$set(this.form, 'lossNumberUnqualified', maxLossNumberUnqualified);
+            const lossUnqualified =
+              (Number(this.form.sampleQuantity) || 0) - maxLossNumberUnqualified;
+            if (lossUnqualified < 0) {
+              this.$set(this.form, 'lossNumber', lossUnqualified || 0);
+            } else {
+              this.$set(this.form, 'lossNumber', lossUnqualified);
+            }
+          } else {
+             const lossNumberUnqualified = Number(this.form.lossNumberUnqualified) || 0;
+             const sampleNoQualifiedNumber = Number(this.form.sampleNoQualifiedNumber) || 0;
+             if(lossNumberUnqualified > sampleNoQualifiedNumber) {
+               this.$set(this.form, 'sampleNoQualifiedNumber', lossNumberUnqualified);
+             }
           }
-          const total = Number(this.form.sampleQuantity) || 0;
-          this.$set(
-            this.form,
-            'sampleQualifiedNumber',
-            Math.max(total - (Number(this.form.sampleNoQualifiedNumber) || 0), 0)
-          );
         }
       }
     },
@@ -844,6 +871,22 @@
         this.$set(this.tableData, index, data);
       },
 
+      //当 qms_defaultDisposalType 为 true 时,损耗数自动同步合格/不合格数
+      syncLossNumber(row, index) {
+        if (!this.qms_defaultDisposalType) return;
+        this.$set(
+          this.tableData[index],
+          'lossNumber',
+          Number(row.qualifiedQuantity) || 0
+        );
+        this.$set(
+          this.tableData[index],
+          'lossNumberUnqualified',
+          Number(row.noQualifiedQuantity) || 0
+        );
+        this.initData();
+      },
+
       async open({ workData, row, list }, type, pageName) {
         this.tableData = [];
         console.log(workData, row, list, 'workDataworkData');
@@ -894,6 +937,13 @@
           this.tableData = JSON.parse(JSON.stringify(list));
         }
 
+        //当 qms_defaultDisposalType 为 true 时,初始化时同步损耗数
+        if (this.qms_defaultDisposalType) {
+          this.tableData.forEach((item, index) => {
+            this.syncLossNumber(item, index);
+          });
+        }
+
         this.visible = true;
       },
       formSampleQuantityChange() {
@@ -948,6 +998,26 @@
           this.$set(this.tableData[index], 'qualifiedQuantity', 0);
           this.$set(this.tableData[index], 'noQualifiedQuantity', qualified);
         }
+        //当 qms_defaultDisposalType 为 true 时,损耗数自动同步合格/不合格数
+        this.syncLossNumber(row, index);
+      },
+      formSampleNoQualifiedNumberChange() {
+        if (+this.form.sampleNoQualifiedNumber < 0) {
+          this.form.sampleNoQualifiedNumber = 0;
+        }
+
+        const sampleNoQualifiedNumber = Number(this.form.sampleNoQualifiedNumber) || 0;
+        const lossNumberUnqualified = Number(this.form.lossNumberUnqualified) || 0;
+        if(lossNumberUnqualified && sampleNoQualifiedNumber && sampleNoQualifiedNumber < lossNumberUnqualified) {
+          this.$message.error("样品不合格数不能小于损耗数(不合格数)")
+          this.$set(this.form, 'sampleNoQualifiedNumber', lossNumberUnqualified);
+        }
+
+        if (+this.form.sampleNoQualifiedNumber > this.form.sampleQuantity) {
+          this.form.sampleNoQualifiedNumber = this.form.sampleQuantity;
+        }
+        this.form.sampleQualifiedNumber =
+          this.form.sampleQuantity - this.form.sampleNoQualifiedNumber;
       },
 
       handleClose() {
@@ -1004,6 +1074,9 @@
           if (type == 'noQualifiedQuantity' && item[type] > 0) {
             this.$set(this.tableData[index], 'qualityResults', 2);
           }
+
+          //当 qms_defaultDisposalType 为 true 时,损耗数自动同步合格/不合格数
+          this.syncLossNumber(item, index);
         }
         //损耗数
         if (type == 'lossNumber' || type == 'lossNumberUnqualified') {