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