From 9646ba4b026e4dbee0c0d5ac3d52b428bfef7b29 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期五, 28 八月 2026 10:49:44 +0800
Subject: [PATCH] 新疆-新聚 1.销售台账中的销售合同按框架合同处理 2.设备台账需按车间/区域汇总设备,车间/位置可自行新增,且支持子父级递归 3.计量器具台账支持通过 Excel 文件批量新增数据 4.设备保养定时任务新增“年度保养”任务频率

---
 src/views/equipmentManagement/inspectionManagement/components/formDia.vue |  179 ++++++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 156 insertions(+), 23 deletions(-)

diff --git a/src/views/equipmentManagement/inspectionManagement/components/formDia.vue b/src/views/equipmentManagement/inspectionManagement/components/formDia.vue
index 74cbb58..e1a0b22 100644
--- a/src/views/equipmentManagement/inspectionManagement/components/formDia.vue
+++ b/src/views/equipmentManagement/inspectionManagement/components/formDia.vue
@@ -5,15 +5,11 @@
       <el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
         <el-row>
           <el-col :span="12">
-            <el-form-item label="璁惧鍚嶇О" prop="taskId">
-              <el-select v-model="form.taskId" @change="setDeviceModel">
-                <el-option
-                  v-for="(item, index) in deviceOptions"
-                  :key="index"
-                  :label="item.deviceName"
-                  :value="item.id"
-                ></el-option>
-              </el-select>
+            <el-form-item label="璁惧鍚嶇О" prop="taskName">
+              <div style="display: flex; gap: 8px; width: 100%">
+                <el-input v-model="form.taskName" placeholder="璇烽�夋嫨璁惧" readonly style="flex: 1" />
+                <el-button @click="openDeviceDialog">閫夋嫨璁惧</el-button>
+              </div>
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -111,6 +107,50 @@
         </div>
       </template>
     </el-dialog>
+
+    <!-- 閫夋嫨宸℃璁惧寮圭獥 -->
+    <el-dialog v-model="deviceDialogVisible" title="閫夋嫨宸℃璁惧" width="760px" draggable append-to-body>
+      <div class="device-select-wrap">
+        <div class="device-select-tree">
+          <div class="all-device-node"
+               :class="{ active: deviceAreaId === null }"
+               @click="selectAllDevice">
+            鍏ㄩ儴璁惧
+          </div>
+          <el-tree
+            ref="deviceAreaTreeRef"
+            v-loading="deviceAreaLoading"
+            :data="areaTree"
+            node-key="id"
+            :props="{ label: 'label', children: 'children' }"
+            default-expand-all
+            :expand-on-click-node="false"
+            highlight-current
+            :current-node-key="deviceAreaId"
+            @node-click="onDeviceAreaClick"
+          />
+        </div>
+        <div class="device-select-list">
+          <el-table
+            :data="deviceList"
+            v-loading="deviceListLoading"
+            border
+            height="420"
+            style="cursor: pointer"
+            @row-click="selectDevice"
+          >
+            <el-table-column prop="deviceName" label="璁惧鍚嶇О" min-width="140" />
+            <el-table-column prop="deviceModel" label="瑙勬牸鍨嬪彿" min-width="120" />
+            <el-table-column prop="areaName" label="鎵�灞炲尯鍩�" min-width="120" />
+            <el-table-column label="鎿嶄綔" width="80" align="center">
+              <template #default="scope">
+                <el-button link type="primary" @click.stop="selectDevice(scope.row)">閫夋嫨</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
@@ -120,6 +160,7 @@
 import {addOrEditTimingTask} from "@/api/inspectionManagement/index.js";
 import {userListNoPageByTenantId} from "@/api/system/user.js";
 import { getDeviceLedger } from "@/api/equipmentManagement/ledger";
+import { getDeviceAreaTree } from "@/api/equipmentManagement/area";
 
 const { proxy } = getCurrentInstance()
 const emit = defineEmits()
@@ -127,6 +168,16 @@
 const dialogVisitable = ref(false);
 const operationType = ref('add');
 const deviceOptions = ref([]);
+
+// 璁惧閫夋嫨寮圭獥鐩稿叧
+const deviceDialogVisible = ref(false);
+const areaTree = ref([]);
+const deviceAreaId = ref(null);
+const deviceAreaLoading = ref(false);
+const deviceAreaTreeRef = ref();
+const deviceList = ref([]);
+const deviceListLoading = ref(false);
+
 const data = reactive({
   form: {
     taskId: undefined,
@@ -142,7 +193,7 @@
     time: ''
   },
 	rules: {
-		taskId: [{ required: true, message: "璇烽�夋嫨璁惧", trigger: "change" },],
+		taskName: [{ required: true, message: "璇烽�夋嫨璁惧", trigger: "change" },],
 		inspector: [{ required: true, message: "璇疯緭鍏ュ贰妫�浜�", trigger: "blur" },],
 		dateStr: [{ required: true, message: "璇烽�夋嫨鐧昏鏃堕棿", trigger: "change" }],
 		frequencyType: [{ required: true, message: "璇烽�夋嫨浠诲姟棰戠巼", trigger: "change" }],
@@ -207,7 +258,7 @@
 
 const loadDeviceName = async () => {
   const { data } = await getDeviceLedger();
-  deviceOptions.value = data;
+  deviceOptions.value = data || [];
 };
 
 const setDeviceModel = (id) => {
@@ -217,29 +268,82 @@
   }
 }
 
+// 鍔犺浇鍖哄煙鏍�
+const loadDeviceAreaTree = () => {
+  deviceAreaLoading.value = true;
+  getDeviceAreaTree()
+    .then((res) => {
+      areaTree.value = res.data || [];
+    })
+    .finally(() => {
+      deviceAreaLoading.value = false;
+    });
+};
+
+// 鍔犺浇璁惧鍒楄〃
+const loadDevices = (areaId) => {
+  deviceListLoading.value = true;
+  getDeviceLedger(areaId ? { areaId } : undefined)
+    .then((res) => {
+      deviceList.value = res.data || [];
+    })
+    .finally(() => {
+      deviceListLoading.value = false;
+    });
+};
+
+// 鎵撳紑璁惧閫夋嫨寮圭獥
+const openDeviceDialog = () => {
+  deviceDialogVisible.value = true;
+  deviceAreaId.value = null;
+  loadDeviceAreaTree();
+  loadDevices();
+};
+
+// 閫夋嫨鍏ㄩ儴璁惧
+const selectAllDevice = () => {
+  deviceAreaId.value = null;
+  loadDevices();
+};
+
+// 鐐瑰嚮鍖哄煙鑺傜偣
+const onDeviceAreaClick = (data) => {
+  deviceAreaId.value = data.id;
+  loadDevices(data.id);
+};
+
+// 閫変腑璁惧鍥炲~
+const selectDevice = (row) => {
+  form.value.taskId = row.id;
+  form.value.taskName = row.deviceName;
+  deviceDialogVisible.value = false;
+};
+
 // 鎵撳紑寮规
 const openDialog = async (type, row) => {
   dialogVisitable.value = true
   operationType.value = type
-  
+
   // 閲嶇疆琛ㄥ崟
   resetForm();
-  
+
   // 鍔犺浇鐢ㄦ埛鍒楄〃
   userListNoPageByTenantId().then((res) => {
     userList.value = res.data;
   });
-  
-  // 鍔犺浇璁惧鍒楄〃
+
+  // 鍔犺浇璁惧鍒楄〃锛堢紪杈戝洖鏄剧敤锛�
   await loadDeviceName();
-  
+
   if (type === 'edit' && row) {
     form.value = {...row}
     form.value.inspector = form.value.inspectorIds.split(',').map(Number)
-    
+
     // 濡傛灉鏈夎澶嘔D锛岃嚜鍔ㄨ缃澶囦俊鎭�
     if (form.value.taskId) {
-      setDeviceModel(form.value.taskId);
+      if (!form.value.taskName) {
+        setDeviceModel(form.value.taskId);
+      }
     }
   }
 }
@@ -279,16 +383,16 @@
       try {
         form.value.inspectorIds = form.value.inspector.join(',')
         delete form.value.inspector
-        
+
         if (form.value.frequencyType === 'WEEKLY') {
           let frequencyDetail = ''
           frequencyDetail = form.value.week + ',' + form.value.time
           form.value.frequencyDetail = frequencyDetail
         }
-        
+
         let res = await userStore.getInfo()
         form.value.registrantId = res.user.userId
-        
+
         await addOrEditTimingTask(form.value)
         cancel()
         proxy.$modal.msgSuccess('鎻愪氦鎴愬姛')
@@ -302,5 +406,34 @@
 </script>
 
 <style scoped>
-
-</style>
\ No newline at end of file
+.device-select-wrap {
+  display: flex;
+}
+.device-select-tree {
+  width: 260px;
+  flex-shrink: 0;
+  padding-right: 12px;
+  border-right: 1px solid #ebeef5;
+  max-height: 460px;
+  overflow-y: auto;
+}
+.device-select-list {
+  flex: 1;
+  min-width: 0;
+  padding-left: 12px;
+}
+.all-device-node {
+  padding: 8px 12px;
+  cursor: pointer;
+  font-size: 14px;
+  border-radius: 4px;
+  margin-bottom: 8px;
+}
+.all-device-node:hover {
+  background: #f5f7fa;
+}
+.all-device-node.active {
+  background: #ecf5ff;
+  color: #409eff;
+}
+</style>

--
Gitblit v1.9.3