From f3f5a0c0db0b782401a9a0fcf6176312f420d941 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期三, 25 三月 2026 14:01:19 +0800
Subject: [PATCH] 军泰伟业 1.不要树形结构。根据图纸编号为唯一索引添加产品并可以导入 2.要求可以上传图纸 3.产品可以绑定工艺路线 4.工艺路线改成由工序组成,新增编辑是工序可以挪动顺序 5.工序添加报工权限字段,可以多选人员
---
src/views/productionManagement/processRoute/processRouteItem/index.vue | 141 +++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 137 insertions(+), 4 deletions(-)
diff --git a/src/views/productionManagement/processRoute/processRouteItem/index.vue b/src/views/productionManagement/processRoute/processRouteItem/index.vue
index 3aecfa0..65035ec 100644
--- a/src/views/productionManagement/processRoute/processRouteItem/index.vue
+++ b/src/views/productionManagement/processRoute/processRouteItem/index.vue
@@ -21,12 +21,20 @@
<span class="info-value">{{ routeInfo.productName || '-' }}</span>
</div>
</div>
+ <div class="info-item">
+ <div class="info-label-wrapper">
+ <span class="info-label">鍥剧焊缂栧彿</span>
+ </div>
+ <div class="info-value-wrapper">
+ <span class="info-value">{{ routeInfo.model || '-' }}</span>
+ </div>
+ </div>
<div class="info-item">
<div class="info-label-wrapper">
- <span class="info-label">瑙勬牸鍚嶇О</span>
+ <span class="info-label">瑙勬牸鍨嬪彿</span>
</div>
<div class="info-value-wrapper">
- <span class="info-value">{{ routeInfo.model || '-' }}</span>
+ <span class="info-value">{{ routeInfo.drawingNumber || '-' }}</span>
</div>
</div>
<div class="info-item">
@@ -80,11 +88,17 @@
</template>
</el-table-column>
<el-table-column label="浜у搧鍚嶇О" prop="productName" min-width="160" />
- <el-table-column label="瑙勬牸鍚嶇О" prop="model" min-width="140" />
+ <el-table-column label="鍥剧焊缂栧彿" prop="model" min-width="140" />
+ <el-table-column label="瑙勬牸鍨嬪彿" prop="drawingNumber" min-width="160" />
<el-table-column label="鍗曚綅" prop="unit" width="100" />
<el-table-column label="鏄惁璐ㄦ" prop="isQuality" width="100">
<template #default="scope">
{{scope.row.isQuality ? "鏄�" : "鍚�"}}
+ </template>
+ </el-table-column>
+ <el-table-column label="鎶ュ伐鏉冮檺" prop="userPower" min-width="200">
+ <template #default="scope">
+ {{ scope.row.userPower || '-' }}
</template>
</el-table-column>
<el-table-column label="鎿嶄綔" align="center" fixed="right" width="150">
@@ -131,6 +145,7 @@
<div class="card-content">
<div v-if="item.productName" class="product-info">
<div class="product-name">{{ item.productName }}</div>
+ <div class="product-model">{{ item.drawingNumber || '-' }}</div>
<div v-if="item.model" class="product-model">
{{ item.model }}
<!-- <span v-if="item.unit" class="product-unit">{{ item.unit }}</span> -->
@@ -197,7 +212,22 @@
</el-form-item>
<el-form-item label="鏄惁璐ㄦ" prop="isQuality">
- <el-switch v-model="form.isQuality" :active-value="true" inactive-value="false"/>
+ <el-switch v-model="form.isQuality" :active-value="true" :inactive-value="false"/>
+ </el-form-item>
+ <el-form-item label="鎶ュ伐鏉冮檺" prop="userPower" :rules="[{ required: true, message: '璇烽�夋嫨鎶ュ伐鏉冮檺', trigger: 'change' }]">
+ <el-tree-select
+ v-model="form.userPower"
+ :data="staffList"
+ :props="treeProps"
+ placeholder="璇烽�夋嫨浜哄憳"
+ multiple
+ show-checkbox
+ collapse-tags
+ collapse-tags-tooltip
+ style="width: 100%"
+ node-key="id"
+ :render-after-expand="false"
+ />
</el-form-item>
</el-form>
@@ -222,6 +252,7 @@
import { findProcessRouteItemList, addOrUpdateProcessRouteItem, sortProcessRouteItem, batchDeleteProcessRouteItem } from "@/api/productionManagement/processRouteItem.js";
import { findProductProcessRouteItemList, deleteRouteItem, addRouteItem, addOrUpdateProductProcessRouteItem, sortRouteItem } from "@/api/productionManagement/productProcessRoute.js";
import { processList } from "@/api/productionManagement/productionProcess.js";
+import { listDeptUserTree } from "@/api/basicData/productProcess.js";
import { useRoute } from 'vue-router'
import { ElMessageBox } from 'element-plus'
import Sortable from 'sortablejs'
@@ -245,6 +276,7 @@
const routeInfo = ref({
processRouteCode: '',
productName: '',
+ drawingNumber: '',
model: '',
bomNo: '',
description: ''
@@ -252,6 +284,13 @@
const processOptions = ref([]);
const showProductSelectDialog = ref(false);
+const staffList = ref([]);
+
+const treeProps = {
+ label: 'label',
+ children: 'children',
+};
+
let tableSortable = null;
let cardSortable = null;
@@ -273,6 +312,7 @@
model: "",
unit: "",
isQuality: false,
+ userPower: [],
});
const rules = {
@@ -299,6 +339,7 @@
.then(res => {
tableData.value = res.data || [];
tableLoading.value = false;
+ routeInfo.value = tableData.value[0] || {}
// 鍒楄〃鍔犺浇瀹屾垚鍚庡垵濮嬪寲鎷栨嫿鎺掑簭
nextTick(() => {
initSortable();
@@ -327,6 +368,7 @@
routeInfo.value = {
processRouteCode: route.query.processRouteCode || '',
productName: route.query.productName || '',
+ drawingNumber: route.query.drawingNumber || '',
model: route.query.model || '',
bomNo: route.query.bomNo || '',
description: route.query.description || ''
@@ -343,6 +385,12 @@
// 缂栬緫
const handleEdit = (row) => {
operationType.value = 'edit';
+ const userPowerNames = row.userPower ? row.userPower.split(',') : [];
+ const userPowerIds = userPowerNames.map(name => {
+ const user = findUserByName(name);
+ return user ? user.id : null;
+ }).filter(id => id !== null);
+
form.value = {
id: row.id,
routeId: routeId.value,
@@ -352,8 +400,25 @@
model: row.model || "",
unit: row.unit || "",
isQuality: row.isQuality,
+ userPower: userPowerIds,
};
dialogVisible.value = true;
+};
+
+const findUserByName = (name) => {
+ const findInTree = (nodes) => {
+ for (const node of nodes) {
+ if (node.isUser && node.label === name) {
+ return node;
+ }
+ if (node.children && node.children.length > 0) {
+ const found = findInTree(node.children);
+ if (found) return found;
+ }
+ }
+ return null;
+ };
+ return findInTree(staffList.value);
};
// 鍒犻櫎
@@ -402,6 +467,8 @@
if (valid) {
submitLoading.value = true;
+ const userPowerNames = getAllUserNamesFromSelection(form.value.userPower);
+
if (operationType.value === 'add') {
// 鏂板锛氫紶鍗曚釜瀵硅薄锛屽寘鍚玠ragSort瀛楁
// dragSort = 褰撳墠鍒楄〃闀垮害 + 1锛岃〃绀烘柊澧炶褰曟帓鍦ㄦ渶鍚�
@@ -415,6 +482,7 @@
processId: form.value.processId,
productModelId: form.value.productModelId,
isQuality: form.value.isQuality,
+ userPower: userPowerNames.join(','),
dragSort,
})
: addOrUpdateProcessRouteItem({
@@ -422,6 +490,7 @@
processId: form.value.processId,
productModelId: form.value.productModelId,
isQuality: form.value.isQuality,
+ userPower: userPowerNames.join(','),
dragSort,
});
@@ -447,6 +516,7 @@
processId: form.value.processId,
productModelId: form.value.productModelId,
isQuality: form.value.isQuality,
+ userPower: userPowerNames.join(','),
})
: addOrUpdateProcessRouteItem({
routeId: routeId.value,
@@ -454,6 +524,7 @@
productModelId: form.value.productModelId,
id: form.value.id,
isQuality: form.value.isQuality,
+ userPower: userPowerNames.join(','),
});
updatePromise
@@ -627,8 +698,70 @@
getRouteInfo();
getList();
getProcessList();
+ getStaffList();
});
+const getStaffList = () => {
+ listDeptUserTree().then(res => {
+ const buildTree = (nodes) => {
+ return nodes.map(node => {
+ const deptNode = {
+ id: `dept_${node.deptId}`,
+ label: node.deptName,
+ isUser: false,
+ children: []
+ };
+
+ if (node.userList && node.userList.length > 0) {
+ node.userList.forEach(user => {
+ deptNode.children.push({
+ id: user.userId,
+ label: user.nickName || user.userName,
+ isUser: true,
+ userName: user.userName,
+ nickName: user.nickName
+ });
+ });
+ }
+
+ if (node.childrenList && node.childrenList.length > 0) {
+ const childNodes = buildTree(node.childrenList);
+ deptNode.children = deptNode.children.concat(childNodes);
+ }
+
+ return deptNode;
+ });
+ };
+ staffList.value = buildTree(res.data || []);
+ }).catch(() => {
+ staffList.value = [];
+ });
+};
+
+const getAllUserNamesFromSelection = (selectedIds) => {
+ const names = [];
+ const processNode = (node) => {
+ if (selectedIds.includes(node.id)) {
+ if (node.isUser) {
+ names.push(node.label);
+ } else {
+ if (node.children && node.children.length > 0) {
+ node.children.forEach(child => {
+ if (child.isUser) {
+ names.push(child.label);
+ }
+ });
+ }
+ }
+ }
+ if (node.children && node.children.length > 0) {
+ node.children.forEach(child => processNode(child));
+ }
+ };
+ staffList.value.forEach(node => processNode(node));
+ return [...new Set(names)];
+};
+
onUnmounted(() => {
destroySortable();
});
--
Gitblit v1.9.3