From 137bf2c0666b60cfc0d98b1a9ca7ead860ee4e7c Mon Sep 17 00:00:00 2001
From: 吴羡 <16976746+Xian-TT3@user.noreply.gitee.com>
Date: 星期三, 28 十月 2026 17:57:29 +0800
Subject: [PATCH] feat(device,supply,satisfaction): 设备计划改造、耗材采购调整与满意度照片上传

---
 src/views/CNAS/externalService/serviceAndSupplyPro/component/Edit.vue |  294 +++++++++++++++++++++++++++++++---------------------------
 1 files changed, 159 insertions(+), 135 deletions(-)

diff --git a/src/views/CNAS/externalService/serviceAndSupplyPro/component/Edit.vue b/src/views/CNAS/externalService/serviceAndSupplyPro/component/Edit.vue
index c569e8b..e83fb8c 100644
--- a/src/views/CNAS/externalService/serviceAndSupplyPro/component/Edit.vue
+++ b/src/views/CNAS/externalService/serviceAndSupplyPro/component/Edit.vue
@@ -1,127 +1,125 @@
 <template>
   <el-dialog
     v-model="dialogVisible"
-    title="娣诲姞鑰楁潗椤圭洰淇℃伅"
-    width="70%"
+    :title="model.id ? '缂栬緫鑰楁潗' : '鏂板鑰楁潗'"
+    width="1100px"
   >
     <el-form ref="modelForm" :model="model" :rules="rules" label-width="100px">
-      <el-col :span="12">
-        <el-form-item label="鑰楁潗绫诲瀷" prop="consumablesType">
-          <el-select v-model="model.consumablesType" placeholder="璇烽�夋嫨鑰楁潗绫诲瀷" size="small" style="width: 100%">
-            <el-option v-for="(v, i) in dict.type.consumables_type" :key="i" :label="v.label" :value="v.value"></el-option>
-          </el-select>
-        </el-form-item>
-      </el-col>
-      <el-col :span="12">
-        <el-form-item label="璐у彿">
-          <el-input v-model="model.itemNumber" placeholder="璇疯緭鍏ヨ揣鍙�" size="small"></el-input>
-        </el-form-item>
-      </el-col>
-      <el-col :span="12">
-        <el-form-item label="鑰楁潗鍚嶇О">
-          <el-input v-model="model.consumablesName" placeholder="璇疯緭鍏ヨ�楁潗鍚嶇О" size="small"></el-input>
-        </el-form-item>
-      </el-col>
-      <el-col :span="12">
-        <el-form-item label="瑙勬牸">
-          <el-input v-model="model.specifications" placeholder="璇疯緭鍏ヨ鏍�" size="small"></el-input>
-        </el-form-item>
-      </el-col>
-      <el-col :span="12">
-        <el-form-item label="璁¢噺鍗曚綅">
-          <el-input v-model="model.unit" placeholder="璇疯緭鍏ヨ閲忓崟浣�" size="small"></el-input>
-        </el-form-item>
-      </el-col>
-      <el-col :span="12">
-        <el-form-item label="鍙傝�冧环鏍�">
-          <el-input-number v-model="model.referencePrice" :min="0" :precision="2" :step="0.01" placeholder="璇疯緭鍏ュ弬鑰冧环鏍�"
-                           size="small"></el-input-number>
-        </el-form-item>
-      </el-col>
-      <el-col :span="12">
-        <el-form-item label="瀛樻斁浣嶇疆">
-          <el-select v-model="model.contentId" placeholder="璇烽�夋嫨瀛樻斁浣嶇疆" size="small" style="width: 100%">
-            <el-option v-for="(v, i) in procurementSuppliesContentOptions" :key="i" :label="v.nodeName"
-                       :value="v.id"></el-option>
-          </el-select>
-        </el-form-item>
-      </el-col>
-      <el-col :span="12">
-        <el-form-item label="璐熻矗浜�">
-          <el-select v-model="model.personInCharge" placeholder="璇烽�夋嫨璐熻矗浜�" size="small" style="width: 100%">
-            <el-option v-for="(v, i) in userOptions" :key="i" :label="v.name" :value="v.id"></el-option>
-          </el-select>
-        </el-form-item>
-      </el-col>
-      <el-col :span="12">
-        <el-form-item label="搴撳瓨涓婇檺">
-          <el-input-number v-model="model.upperLimit" :min="0" :step="1" placeholder="璇疯緭鍏ュ簱瀛樹笂闄�" size="small"></el-input-number>
-        </el-form-item>
-      </el-col>
-      <el-col :span="12">
-        <el-form-item label="搴撳瓨涓嬮檺">
-          <el-input-number v-model="model.lowerLimit" :min="0" :step="1" placeholder="璇疯緭鍏ュ簱瀛樹笅闄�" size="small"></el-input-number>
-        </el-form-item>
-      </el-col>
-      <el-col :span="24">
-        <el-form-item label="渚涘簲鍟�">
-          <el-select v-model="model.supplier" placeholder="璇烽�夋嫨渚涘簲鍟�" size="small" style="width: 100%">
-            <el-option v-for="(v, i) in supplierOptions" :key="i" :label="v.supplierName"
-                       :value="v.supplierManagementId"></el-option>
-          </el-select>
-        </el-form-item>
-      </el-col>
-      <el-col :span="24">
-        <el-form-item label="鑰楁潗鍥炬爣">
-          <div class="rows">
-            <el-input v-model="model.consumablesIcon" placeholder="璇疯緭鍏ヨ�楁潗鍥炬爣" size="small" style="width: 90%;"/>
-            <el-upload
-              ref="upload"
-              :action="action"
-              :headers="uploadHeader"
-              :on-success="onSuccessIcon"
-              :show-file-list="false"
-              style="float: left; margin: 0 12px 0 20px;"
-            >
-              <template #trigger><el-button  class="uploadFile" size="small" type="primary">娴忚</el-button></template>
-            </el-upload>
-          </div>
-        </el-form-item>
-      </el-col>
-      <el-col :span="24">
-        <el-form-item label="鑰楁潗闄勪欢">
-          <div class="rows">
-            <el-input v-model="model.attachment" placeholder="璇疯緭鍏ヨ�楁潗闄勪欢" size="small" style="width: 90%;"/>
-            <el-upload
-              ref="upload"
-              :action="action"
-              :on-success="onSuccessFile"
-              :show-file-list="false"
-              :headers="uploadHeader"
-              style="float: left; margin: 0 12px 0 20px;"
-            >
-              <template #trigger><el-button  class="uploadFile" size="small" type="primary">娴忚</el-button></template>
-            </el-upload>
-          </div>
-        </el-form-item>
-      </el-col>
-      <el-col :span="24">
-        <el-form-item label="澶囨敞">
-          <el-input
-            v-model="model.remark"
-            :rows="2"
-            placeholder="璇疯緭鍏ュ娉�"
-            size="small"
-            type="textarea"
-          >
-          </el-input>
-        </el-form-item>
-      </el-col>
+      <div class="section-title">鍩烘湰淇℃伅</div>
+      <el-row :gutter="24">
+        <el-col :span="12">
+          <el-form-item label="鑰楁潗绫诲瀷" prop="consumablesType">
+            <el-select v-model="model.consumablesType" placeholder="璇烽�夋嫨鑰楁潗绫诲瀷" style="width: 100%">
+              <el-option v-for="(v, i) in dict.type.consumables_type" :key="i" :label="v.label" :value="v.value"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="鑰楁潗鍚嶇О">
+            <el-input v-model="model.consumablesName" clearable placeholder="璇疯緭鍏ヨ�楁潗鍚嶇О"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="璐у彿">
+            <el-input v-model="model.itemNumber" clearable placeholder="璇疯緭鍏ヨ揣鍙�"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="瑙勬牸">
+            <el-input v-model="model.specifications" clearable placeholder="璇疯緭鍏ヨ鏍�"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="璁¢噺鍗曚綅">
+            <el-input v-model="model.unit" clearable placeholder="璇疯緭鍏ヨ閲忓崟浣�"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="鍙傝�冧环鏍�">
+            <el-input-number v-model="model.referencePrice" :min="0" :precision="2" :step="0.01" placeholder="璇疯緭鍏ュ弬鑰冧环鏍�"
+                             controls-position="right" style="width: 100%"></el-input-number>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="瀛樻斁浣嶇疆">
+            <el-input v-model="model.storageLocation" clearable placeholder="璇疯緭鍏ュ瓨鏀句綅缃�"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="璐熻矗浜�">
+            <el-select v-model="model.personInCharge" placeholder="璇烽�夋嫨璐熻矗浜�" style="width: 100%">
+              <el-option v-for="(v, i) in userOptions" :key="i" :label="v.name" :value="v.id"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <div class="section-title">搴撳瓨涓庝緵搴斿晢</div>
+      <el-row :gutter="24">
+        <el-col :span="12">
+          <el-form-item label="搴撳瓨涓婇檺">
+            <el-input-number v-model="model.upperLimit" :min="0" :step="1" placeholder="璇疯緭鍏ュ簱瀛樹笂闄�"
+                             controls-position="right" style="width: 100%"></el-input-number>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="搴撳瓨涓嬮檺">
+            <el-input-number v-model="model.lowerLimit" :min="0" :step="1" placeholder="璇疯緭鍏ュ簱瀛樹笅闄�"
+                             controls-position="right" style="width: 100%"></el-input-number>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="渚涘簲鍟�">
+            <el-select v-model="model.supplier" placeholder="璇烽�夋嫨渚涘簲鍟�" style="width: 100%">
+              <el-option v-for="(v, i) in supplierOptions" :key="i" :label="v.supplierName"
+                         :value="v.supplierManagementId"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <div class="section-title">鍥炬爣涓庨檮浠�</div>
+      <el-row :gutter="24">
+        <el-col :span="24">
+          <el-form-item label="鑰楁潗鍥炬爣">
+            <div class="upload-row">
+              <el-input v-model="model.consumablesIcon" clearable placeholder="涓婁紶鍚庤嚜鍔ㄥ~鍏咃紝涔熷彲鎵嬪姩濉啓"></el-input>
+              <el-upload
+                :action="action"
+                :headers="uploadHeader"
+                :on-success="onSuccessIcon"
+                :show-file-list="false"
+              >
+                <el-button :icon="$icon('el-icon-upload2')" type="primary" plain>涓婁紶</el-button>
+              </el-upload>
+            </div>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="鑰楁潗闄勪欢">
+            <div class="upload-row">
+              <el-input v-model="model.attachment" clearable placeholder="涓婁紶鍚庤嚜鍔ㄥ~鍏咃紝涔熷彲鎵嬪姩濉啓"></el-input>
+              <el-upload
+                :action="action"
+                :headers="uploadHeader"
+                :on-success="onSuccessFile"
+                :show-file-list="false"
+              >
+                <el-button :icon="$icon('el-icon-upload2')" type="primary" plain>涓婁紶</el-button>
+              </el-upload>
+            </div>
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-form-item class="remark-item" label-width="0">
+        <el-input v-model="model.remark" :rows="4" placeholder="璇疯緭鍏ュ娉�" type="textarea"></el-input>
+      </el-form-item>
     </el-form>
-    <template #footer><span  class="dialog-footer">
-            <el-button @click="resetForm">鍙� 娑�</el-button>
-            <el-button type="primary" @click="submit">淇� 瀛�</el-button>
-        </span></template>
+    <template #footer><span class="dialog-footer">
+      <el-button @click="resetForm">鍙� 娑�</el-button>
+      <el-button type="primary" @click="submit">淇� 瀛�</el-button>
+    </span></template>
   </el-dialog>
 </template>
 
@@ -130,7 +128,6 @@
   addProcurementSuppliesList,
   updateProcurementSuppliesList,
   selectSupplierManagementAll,
-  getProcurementSuppliesContentsNodeNames,
   selectUserCondition
 } from '@/api/cnas/externalService/serviceAndSupplyPro/serviceAndSupplyPro'
 export default {
@@ -142,7 +139,6 @@
         consumablesIcon: undefined,
         attachment: undefined,
       },
-      procurementSuppliesContentOptions: [],
       userOptions: [],
       supplierOptions: [],
       rules: {
@@ -163,7 +159,6 @@
     }
   },
   mounted() {
-    this.findProcurementSuppliesContentOptions()
     this.findUserOptions()
     this.findSupplierOptions()
   },
@@ -178,16 +173,10 @@
         console.log("row", row)
         this.model = row
       } else {
-        this.model = {}
+        // 鏂板鏃舵寕鍦ㄥ綋鍓嶅乏鏍戦�変腑鐨勭洰褰曡妭鐐逛笅锛屽瓨鏀句綅缃敼涓烘墜鍔ㄥ~鍐�
+        this.model = { contentId: this.contentsId }
       }
       this.dialogVisible = true
-    },
-    findProcurementSuppliesContentOptions() {
-      getProcurementSuppliesContentsNodeNames().then(res => {
-        if (res.code === 200) {
-          this.procurementSuppliesContentOptions = res.data
-        }
-      })
     },
     findUserOptions() {
       selectUserCondition().then(res => {
@@ -212,6 +201,11 @@
     submit() {
       this.$refs.modelForm.validate((valid) => {
         if (valid) {
+          // 鏂板鐨勮�楁潗鎸傚湪宸︿晶閫変腑鐨勭洰褰曡妭鐐逛笅锛屾湭閫夎妭鐐逛細淇濆瓨鎴愬垪琛ㄩ噷鐪嬩笉鍒扮殑鏁版嵁
+          if (!this.model.id && !this.contentsId) {
+            this.$message.warning('璇峰厛鍦ㄥ乏渚ч�夋嫨鑰楁潗鐩綍鑺傜偣')
+            return
+          }
           if (this.model.id) {
             updateProcurementSuppliesList(this.model).then(res => {
               if (res.code === 200) {
@@ -238,15 +232,45 @@
   margin: 6vh auto 50px !important;
 }
 :deep(.el-dialog__body) {
-  max-height: 42em;
+  max-height: 70vh;
   overflow-y: auto;
+  padding: 24px 32px;
 }
-.rows {
-  width: 100%;
+.section-title {
   display: flex;
-  justify-content: space-between;
+  align-items: center;
+  font-size: 15px;
+  font-weight: 600;
+  color: var(--lims-text);
+  padding-bottom: 10px;
+  border-bottom: 1px solid var(--lims-divider);
+  margin: 8px 0 20px;
 }
-:deep(.el-form-item__content) {
-  line-height: 39px;
+.section-title:not(:first-child) {
+  margin-top: 28px;
+}
+.section-title::before {
+  content: '';
+  display: inline-block;
+  width: 3px;
+  height: 15px;
+  border-radius: 2px;
+  background: var(--el-color-primary);
+  margin-right: 8px;
+}
+.upload-row {
+  display: flex;
+  align-items: center;
+  gap: 10px;
+  width: 100%;
+}
+.upload-row .el-input {
+  flex: 1;
+}
+:deep(.el-form-item) {
+  margin-bottom: 20px;
+}
+.remark-item {
+  margin-top: 28px;
 }
 </style>

--
Gitblit v1.9.3