From b6516d781857f47bad5b4e6ef5f6bd4306dfe525 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期二, 20 十月 2026 17:28:05 +0800
Subject: [PATCH] feat(costStatistics): 新增委托下单类型的数据格式化支持

---
 src/views/CNAS/process/ensureResults/qualityControlPlan/components/recordsDialog.vue |  320 ++++++++++++++++++++++++++++-------------------------
 1 files changed, 169 insertions(+), 151 deletions(-)

diff --git a/src/views/CNAS/process/ensureResults/qualityControlPlan/components/recordsDialog.vue b/src/views/CNAS/process/ensureResults/qualityControlPlan/components/recordsDialog.vue
index e24000f..cca0e74 100644
--- a/src/views/CNAS/process/ensureResults/qualityControlPlan/components/recordsDialog.vue
+++ b/src/views/CNAS/process/ensureResults/qualityControlPlan/components/recordsDialog.vue
@@ -2,7 +2,7 @@
   <div>
     <el-dialog :close-on-click-modal="false" :close-on-press-escape="false"
                v-model="formDia"
-               title="妫�娴嬪伐浣滅洃鐫h褰曡〃"
+               title="鏃ュ父鐩戠潱妫�鏌ヨ褰曡〃"
                width="70%" @close="closeRecordsDia">
       <el-steps :active="currentStep" align-center finish-status="success">
         <el-step title="瀹炴柦"></el-step>
@@ -12,30 +12,9 @@
         <table border="1" cellspacing="10" class="tables">
           <tr>
             <td class="td-title">
-              <p><span class="required-span">* </span>妫�娴嬩汉鍛橈細</p>
+              <p><span class="required-span">* </span>鐩戠潱妫�娴嬮」鐩細</p>
             </td>
             <td colspan="2">
-              <el-input v-if="currentStep === 0" v-model="form.testMember"
-                        placeholder="璇疯緭鍏ュ唴瀹�"
-                        size="small">
-              </el-input>
-              <span v-else class="td-info"> {{ form.testMember }}</span>
-            </td>
-            <td class="td-title">
-              <p><span class="required-span">* </span>鐩戠潱鍛橈細</p>
-            </td>
-            <td colspan="2">
-              <el-select v-if="currentStep === 0" @change="usePersonName" v-model="form.supervisor" placeholder="璇烽�夋嫨" size="small" style="width: 100%">
-                <el-option v-for="item in recordUserList" :key="item.userName" :label="item.userName" :value="item.userName"></el-option>
-              </el-select>
-              <span v-else class="td-info"> {{ form.supervisor }}</span>
-            </td>
-          </tr>
-          <tr>
-            <td class="td-title">
-              <p><span class="required-span">* </span>妫�娴嬮」鐩細</p>
-            </td>
-            <td>
               <el-input v-if="currentStep === 0" v-model="form.testItem"
                         placeholder="璇疯緭鍏ュ唴瀹�"
                         size="small">
@@ -43,19 +22,9 @@
               <span v-else class="td-info"> {{ form.testItem }}</span>
             </td>
             <td class="td-title">
-              <p><span class="required-span">* </span>鏍峰搧缂栧彿锛�</p>
+              <p><span class="required-span">* </span>鐩戠潱妫�娴嬫棩鏈燂細</p>
             </td>
-            <td>
-              <el-input v-if="currentStep === 0" v-model="form.sampleNumber"
-                        placeholder="璇疯緭鍏ュ唴瀹�"
-                        size="small">
-              </el-input>
-              <span v-else class="td-info"> {{ form.sampleNumber }}</span>
-            </td>
-            <td class="td-title">
-              <p><span class="required-span">* </span>妫�娴嬫棩鏈燂細</p>
-            </td>
-            <td>
+            <td colspan="2">
               <el-input v-if="currentStep === 0" v-model="form.testDate"
                         placeholder="璇疯緭鍏ュ唴瀹�"
                         size="small">
@@ -65,126 +34,109 @@
           </tr>
           <tr>
             <td class="td-title">
-              <p><span class="required-span">* </span>浜哄憳锛�</p>
+              <p><span class="required-span">* </span>鍙楃洃鐫d汉锛�</p>
             </td>
-            <td colspan="5">
-              <el-input v-if="currentStep === 0" v-model="form.personnel"
-                        placeholder="璇疯緭鍏ュ唴瀹�"
-                        size="small">
-              </el-input>
-              <span v-else class="td-info"> {{ form.personnel }}</span>
+            <td colspan="2">
+              <el-select v-if="currentStep === 0" v-model="superviseeList" multiple filterable collapse-tags
+                         placeholder="璇烽�夋嫨" size="small" style="width: 100%">
+                <el-option v-for="item in personList" :key="item.value" :label="item.label"
+                           :value="item.label"></el-option>
+              </el-select>
+              <span v-else class="td-info"> {{ form.testMember }}</span>
+            </td>
+            <td class="td-title">
+              <p><span class="required-span">* </span>鐩戠潱鍛橈細</p>
+            </td>
+            <td colspan="2">
+              <el-select v-if="currentStep === 0" v-model="form.supervisor" placeholder="璇烽�夋嫨" size="small" style="width: 100%">
+                <el-option v-for="item in recordUserList" :key="item.userId" :label="item.userName" :value="item.userName"></el-option>
+              </el-select>
+              <span v-else class="td-info"> {{ form.supervisor }}</span>
             </td>
           </tr>
           <tr>
             <td class="td-title">
-              <p><span class="required-span">* </span>浠櫒璁惧锛�</p>
+              <p>鐩戠潱鍐呭锛�</p>
             </td>
             <td colspan="5">
-              <el-input v-if="currentStep === 0" v-model="form.device"
-                        placeholder="璇疯緭鍏ュ唴瀹�"
-                        size="small">
-              </el-input>
-              <span v-else class="td-info"> {{ form.device }}</span>
+              <template v-if="currentStep === 0">
+                <div v-for="(rowItems, rowIndex) in contentRows" :key="rowIndex" style="display: flex;">
+                  <el-checkbox v-for="item in rowItems" :key="item" v-model="superviseContentList"
+                               :value="item" style="flex: 1;">{{ item }}</el-checkbox>
+                </div>
+              </template>
+              <span v-else class="td-info"> {{ form.superviseContent }}</span>
             </td>
           </tr>
           <tr>
             <td class="td-title">
-              <p><span class="required-span">* </span>宸ヤ綔鐜锛�</p>
+              <p>鐩戠潱鏂瑰紡锛�</p>
             </td>
             <td colspan="5">
-              <el-input v-if="currentStep === 0" v-model="form.environment"
-                        placeholder="璇疯緭鍏ュ唴瀹�"
-                        size="small">
-              </el-input>
-              <span v-else class="td-info"> {{ form.environment }}</span>
+              <el-select v-if="currentStep === 0" v-model="superviseModeList" multiple filterable collapse-tags
+                         placeholder="璇烽�夋嫨鐩戠潱鏂瑰紡锛堢▼搴�4.2.4锛�" size="small" style="width: 100%">
+                <el-option v-for="item in superviseModeItems" :key="item" :label="item" :value="item"></el-option>
+              </el-select>
+              <span v-else class="td-info"> {{ form.superviseMethod }}</span>
             </td>
           </tr>
           <tr>
             <td class="td-title">
-              <p><span class="required-span">* </span>鏍峰搧閲囬泦锛�</p>
+              <p><span class="required-span">* </span>鐩戠潱璁板綍锛�</p>
             </td>
             <td colspan="5">
-              <el-input v-if="currentStep === 0" v-model="form.sampleCollection"
-                        placeholder="璇疯緭鍏ュ唴瀹�"
-                        size="small">
-              </el-input>
-              <span v-else class="td-info"> {{ form.sampleCollection }}</span>
-            </td>
-          </tr>
-          <tr>
-            <td class="td-title">
-              <p><span class="required-span">* </span>鏍峰搧鐨勫噯澶囷細</p>
-            </td>
-            <td colspan="5">
-              <el-input v-if="currentStep === 0" v-model="form.samplePreparation"
-                        placeholder="璇疯緭鍏ュ唴瀹�"
-                        size="small">
-              </el-input>
-              <span v-else class="td-info"> {{ form.samplePreparation }}</span>
-            </td>
-          </tr>
-          <tr>
-            <td class="td-title">
-              <p><span class="required-span">* </span>妫�娴嬫柟娉曪細</p>
-            </td>
-            <td colspan="5">
-              <el-input v-if="currentStep === 0" v-model="form.detectionMethod"
-                        placeholder="璇疯緭鍏ュ唴瀹�"
-                        size="small">
-              </el-input>
-              <span v-else class="td-info"> {{ form.detectionMethod }}</span>
-            </td>
-          </tr>
-          <tr>
-            <td class="td-title">
-              <p><span class="required-span">* </span>妫�娴嬭褰曪細</p>
-            </td>
-            <td colspan="5">
-              <el-input v-if="currentStep === 0" v-model="form.inspectionRecord"
-                        placeholder="璇疯緭鍏ュ唴瀹�"
-                        size="small">
-              </el-input>
-              <span v-else class="td-info"> {{ form.inspectionRecord }}</span>
-            </td>
-          </tr>
-          <tr>
-            <td class="td-title">
-              <p><span class="required-span">* </span>妫�娴嬫姤鍛婏細</p>
-            </td>
-            <td colspan="5">
-              <el-input v-if="currentStep === 0" v-model="form.examiningReport"
-                        placeholder="璇疯緭鍏ュ唴瀹�"
-                        size="small">
-              </el-input>
-              <span v-else class="td-info"> {{ form.examiningReport }}</span>
-            </td>
-          </tr>
-          <tr>
-            <td class="td-title">
-              <p><span class="required-span">* </span>鐩戠潱鎯呭喌璇勪环锛�</p>
-            </td>
-            <td colspan="5">
-              <el-input v-if="currentStep === 0" v-model="form.supervisionEvaluation"
+              <el-input v-if="currentStep === 0" v-model="form.superviseRecord"
                         :rows="4"
                         placeholder="璇疯緭鍏ュ唴瀹�"
                         size="small"
                         type="textarea">
               </el-input>
-              <span v-else class="td-info"> {{ form.supervisionEvaluation }}</span>
+              <span v-else class="td-info"> {{ form.superviseRecord }}</span>
             </td>
           </tr>
           <tr>
             <td class="td-title">
-              <p><span class="required-span">* </span>涓嶇鍚堝鐞嗘剰瑙侊細</p>
+              <p>瀛樺湪闂锛�</p>
             </td>
             <td colspan="5">
-              <el-input v-if="currentStep === 0" v-model="form.handlingAdvice"
-                        :rows="4"
+              <el-input v-if="currentStep === 0" v-model="form.problemDesc"
+                        :rows="3"
+                        placeholder="涓嶇鍚堥棶棰樻弿杩帮紝鏃犲垯濉�滄棤鈥�"
+                        size="small"
+                        type="textarea">
+              </el-input>
+              <span v-else class="td-info"> {{ form.problemDesc }}</span>
+            </td>
+          </tr>
+          <tr>
+            <td class="td-title">
+              <p>鏁存敼鎰忚锛�</p>
+            </td>
+            <td colspan="5">
+              <el-input v-if="currentStep === 0" v-model="form.rectifyAdvice"
+                        :rows="3"
                         placeholder="璇疯緭鍏ュ唴瀹�"
                         size="small"
                         type="textarea">
               </el-input>
-              <span v-else class="td-info"> {{ form.handlingAdvice }}</span>
+              <span v-else class="td-info"> {{ form.rectifyAdvice }}</span>
+            </td>
+          </tr>
+          <tr>
+            <td class="td-title">
+              <p>琚洃鐫d汉鍛樼‘璁ゆ剰瑙侊細</p>
+            </td>
+            <td colspan="5">
+              <span v-if="form.confirmOpinion" class="td-info">{{ form.confirmOpinion }}</span>
+              <template v-else-if="canConfirm">
+                <el-input v-model="confirmOpinion" :rows="2" size="small" type="textarea"
+                          placeholder="瀵圭洃鐫h褰曠湡瀹炴�ц〃绀鸿鍙��"/>
+                <el-button :loading="confirming" size="small" type="primary" style="margin-top: 6px"
+                           @click="confirmRecord">纭� 璁�</el-button>
+              </template>
+              <span v-else class="td-info">
+                {{ form.superviseDetailsRecordId ? '寰呰鐩戠潱浜哄憳纭' : '鐩戠潱鍛樻彁浜ゅ悗鐢辫鐩戠潱浜哄憳纭' }}
+              </span>
             </td>
           </tr>
           <tr>
@@ -235,7 +187,7 @@
       </div>
       <template #footer><span  class="dialog-footer">
         <el-button @click="closeRecordsDia">鍙� 娑�</el-button>
-        <el-button v-if="currentStep === 0 && userId == supervisedUserId" :loading="editLoad" type="primary" @click="handleEdit">鎻� 浜�</el-button>
+        <el-button v-if="currentStep === 0 && canSubmitRecord" :loading="editLoad" type="primary" @click="handleEdit">鎻� 浜�</el-button>
         <el-button v-if="currentStep === 1 && userId == ratifyUserId" :loading="editLoad" @click="handleEdit(0)">涓嶉�氳繃</el-button>
         <el-button v-if="currentStep === 1 && userId == ratifyUserId" :loading="editLoad" type="primary" @click="handleEdit(1)">閫�
           杩�</el-button>
@@ -247,11 +199,26 @@
 <script>
 import {
   addSuperviseDetailRecord,
-  addSuperviseRecordOpinion, getRecordUser,
+  addSuperviseRecordOpinion, confirmSuperviseRecord, getRecordUser,
   getSuperviseDetailRecord
 } from "@/api/cnas/process/ensureResults/qualitySupervise";
 import {selectUserCondition} from "@/api/business/inspectionTask";
 import {mapGetters} from "@/utils/store-compat";
+
+// 鐩戠潱鍐呭9椤癸紝涓庡彈鎺ц褰曡〃 LMSY-CX29-JL02 鐨勬枃瀛楀強妯帓椤哄簭瀹屽叏涓�鑷�
+const SUPERVISE_CONTENT_ITEMS = [
+  '浜哄憳鎸佽瘉鍙婂煿璁�', '璁炬柦鍙婄幆澧冩潯浠�', '妫�娴嬫柟娉�',
+  '浠櫒璁惧绠$悊', '娴嬮噺婧簮鎬�', '鏍囧噯鐗╄川绠$悊',
+  '鏍峰搧鍒跺鍜屽缃�', '妫�娴嬫暟鎹鐞�', '缁撴灉鎶ュ憡缁撴灉'
+]
+// 鐩戠潱鏂瑰紡锛屽搴斻�婅川閲忕洃鐫g▼搴忋��4.2.4
+const SUPERVISE_MODE_ITEMS = [
+  '鏍告煡鍘熷璁板綍鍜屾姤鍛�',
+  '鐜板満鐩戠潱瀹為檯鎿嶄綔杩囩▼',
+  '涓庤鐩戠潱瀵硅薄浜ゆ祦',
+  '鍐呴儴璐ㄩ噺鎺у埗/澶栭儴璐ㄩ噺璇勪及',
+  '鍩硅鏁堟灉璇勪环'
+]
 
 export default {
   name: 'recordsDialog',
@@ -266,24 +233,19 @@
         superviseDetailsRecordId: '',
         testMember: '',
         supervisor: '',
-        supervisorId: '',
+        superviseContent: '',
+        superviseRecord: '',
+        problemDesc: '',
+        rectifyAdvice: '',
         testItem: '',
-        sampleNumber: '',
         testDate: '',
-        personnel: '',
-        device: '',
-        environment: '',
-        sampleCollection: '',
-        samplePreparation: '',
-        detectionMethod: '',
-        inspectionRecord: '',
-        examiningReport: '',
-        supervisionEvaluation: '',
-        handlingAdvice: '',
         ratifyUserId: '',
         ratifyUserName: '',
         ratifyOpinion: '',
         isAccording: '',
+        isFinish: '',
+        superviseMethod: '',
+        confirmOpinion: '',
       },
       currentStep: 0,
       editLoad: false,
@@ -291,10 +253,42 @@
       recordUserList: [],
       supervisedUserId: '',
       ratifyUserId: '',
+      superviseeList: [],
+      superviseContentList: [],
+      superviseContentItems: SUPERVISE_CONTENT_ITEMS,
+      superviseModeItems: SUPERVISE_MODE_ITEMS,
+      superviseModeList: [],
+      confirmOpinion: '',
+      confirming: false,
     };
   },
   computed: {
-    ...mapGetters(["userId"]),
+    ...mapGetters(["userId", "nickName"]),
+    // 璁板綍宸叉彁浜や笖灏氭湭纭鏃讹紝鍙湁琚洃鐫d汉鍛樻湰浜哄彲浠ョ‘璁わ紙绋嬪簭4.2.5锛�
+    canConfirm() {
+      if (!this.form.superviseDetailsRecordId || this.form.confirmOpinion) {
+        return false
+      }
+      const members = (this.form.testMember || '').split('銆�').map(item => item.trim()).filter(Boolean)
+      if (this.nickName && members.includes(this.nickName)) {
+        return true
+      }
+      // 鍏滃簳锛氳鍒掓槑缁嗕腑鐧昏鐨勮鐩戠潱浜哄憳
+      return !!this.supervisedUserId && Number(this.supervisedUserId) === Number(this.userId)
+    },
+    contentRows() {
+      const rows = []
+      for (let i = 0; i < this.superviseContentItems.length; i += 3) {
+        rows.push(this.superviseContentItems.slice(i, i + 3))
+      }
+      return rows
+    },
+    canSubmitRecord() {
+      if (this.userId == this.supervisedUserId) {
+        return true
+      }
+      return this.recordUserList.some(item => item.userId == this.userId)
+    },
   },
   // 鏂规硶闆嗗悎
   methods: {
@@ -303,12 +297,6 @@
       this.supervisedUserId = row.supervisedUserId
       this.searchInfo(row)
       this.getAuthorizedPerson()
-    },
-    usePersonName (value) {
-      const index = this.recordUserList.findIndex(item => item.userId === value)
-      if (index > -1) {
-        this.form.supervisor = this.recordUserList[index].userName
-      }
     },
     // 鏌ヨ鐩戠潱璁″垝璇︽儏璁板綍娴佺▼淇℃伅
     searchInfo (row) {
@@ -327,6 +315,10 @@
         this.form = res.data
         this.form.superviseDetailsId = row.superviseDetailsId
         this.ratifyUserId = res.data.ratifyUserId
+        this.superviseeList = this.form.testMember ? this.form.testMember.split('銆�').filter(i => i) : []
+        this.superviseContentList = this.form.superviseContent ? this.form.superviseContent.split('銆�').filter(i => i) : []
+        this.superviseModeList = this.form.superviseMethod ? this.form.superviseMethod.split('銆�').filter(i => i) : []
+        this.confirmOpinion = this.form.confirmOpinion || ''
         this.getRecordUser()
       }).catch(err => {
         console.log('err---', err);
@@ -334,12 +326,18 @@
     },
     // 鎻愪氦娴佺▼
     handleEdit (isFinish) {
-      if (!this.form.testMember || !this.form.supervisor || !this.form.testItem || !this.form.sampleNumber
-        || !this.form.testDate) {
-        this.$message.warning('璇峰~鍐欏畬鏁�')
-        return
-      }
       if (this.currentStep === 0) {
+        if (!this.form.testItem || !this.form.testDate || this.superviseeList.length === 0 || !this.form.supervisor) {
+          this.$message.warning('璇峰~鍐欏畬鏁�')
+          return
+        }
+        if (!this.form.superviseRecord) {
+          this.$message.warning('璇峰~鍐欑洃鐫h褰�')
+          return
+        }
+        this.form.testMember = this.superviseeList.join('銆�')
+        this.form.superviseContent = this.superviseContentList.join('銆�')
+        this.form.superviseMethod = this.superviseModeList.join('銆�')
         this.addInfo()
       } else {
         this.editInfo(isFinish)
@@ -363,7 +361,7 @@
         this.$message.warning('璇峰~鍐欏鎵规剰瑙�')
         return
       }
-      if (this.form.isAccording === null) {
+      if (this.form.isAccording !== 0 && this.form.isAccording !== 1) {
         this.$message.warning('璇烽�夋嫨鏄惁绗﹀悎')
         return
       }
@@ -378,15 +376,30 @@
         this.editLoad = false
       })
     },
+    // 琚洃鐫d汉鍛樼‘璁ょ洃鐫h褰曪紙绋嬪簭4.2.5锛�
+    confirmRecord () {
+      const opinion = (this.confirmOpinion || '').trim() || '瀵圭洃鐫h褰曠湡瀹炴�ц〃绀鸿鍙��'
+      this.confirming = true
+      confirmSuperviseRecord({
+        superviseDetailsId: this.form.superviseDetailsId,
+        confirmOpinion: opinion
+      }).then(() => {
+        this.form.confirmOpinion = opinion
+        this.$message.success('宸茬‘璁ょ洃鐫h褰�')
+      }).finally(() => {
+        this.confirming = false
+      })
+    },
     // 鍏抽棴寮规
     closeRecordsDia () {
       this.formDia = false
       this.$emit('closeRecordsDia')
     },
     getAuthorizedPerson() {
-      selectUserCondition({ type: 2 }).then((res) => {
+      // 璐ㄩ噺鐩戠潱闈㈠悜鍏ㄥ疄楠屽, 浜哄憳鍒楄〃涓嶆寜閮ㄩ棬绛涢��
+      selectUserCondition({ type: 1 }).then((res) => {
         let data = [];
-        res.data.forEach((a) => {
+        (res.data || []).forEach((a) => {
           data.push({
             label: a.name,
             value: a.id,
@@ -397,7 +410,12 @@
     },
     getRecordUser () {
       getRecordUser({superviseDetailsId: this.form.superviseDetailsId}).then(res => {
-        this.recordUserList = res.data
+        this.recordUserList = res.data || []
+        // 璁″垝宸叉寚瀹氱洃鐫e憳浣嗗皻鏈骇鐢熻褰曟椂锛岄粯璁ゅ弽鏄剧涓�浣嶇洃鐫e憳锛�
+        // 鍚庣鍙湁鍦ㄥ瓨鍦ㄤ笂鏈堣褰曟椂鎵嶄細鑷姩甯﹀嚭鐩戠潱鍛橈紝棣栨濉啓浼氫负绌恒��
+        if (this.currentStep === 0 && !this.form.supervisor && this.recordUserList.length) {
+          this.form.supervisor = this.recordUserList[0].userName
+        }
       })
     },
   }

--
Gitblit v1.9.3