From 8657873b0a4c57904bcecdab121f6b261c92ef6e Mon Sep 17 00:00:00 2001
From: 张诺 <zhang_12370@163.com>
Date: 星期二, 28 四月 2026 14:35:32 +0800
Subject: [PATCH] feat(productionProcess): 新增工序编辑和新增功能
---
src/views/productionManagement/productionProcess/index.vue | 9 +++
src/views/productionManagement/productionProcess/Edit.vue | 76 +++++++++++++++++++++++++
src/views/productionManagement/productionProcess/New.vue | 59 +++++++++++++++++--
3 files changed, 136 insertions(+), 8 deletions(-)
diff --git a/src/views/productionManagement/productionProcess/Edit.vue b/src/views/productionManagement/productionProcess/Edit.vue
index d9d1400..35b05a3 100644
--- a/src/views/productionManagement/productionProcess/Edit.vue
+++ b/src/views/productionManagement/productionProcess/Edit.vue
@@ -74,6 +74,35 @@
/>
</el-select>
</el-form-item>
+ <el-form-item
+ label="鎶ュ伐浜�"
+ prop="ids"
+ :rules="[
+ {
+ required: true,
+ message: '璇烽�夋嫨鎶ュ伐浜�',
+ trigger: 'change',
+ }
+ ]"
+ >
+ <el-select
+ v-model="formState.ids"
+ multiple
+ filterable
+ clearable
+ collapse-tags
+ collapse-tags-tooltip
+ placeholder="璇烽�夋嫨鎶ュ伐浜�"
+ @change="handleReportUsersChange"
+ >
+ <el-option
+ v-for="item in userOptions"
+ :key="item.userId"
+ :label="item.nickName"
+ :value="item.userId"
+ />
+ </el-select>
+ </el-form-item>
<!-- <el-form-item-->
<!-- label="宸ュ簭绫诲瀷"-->
<!-- prop="type"-->
@@ -110,9 +139,10 @@
</template>
<script setup>
-import { ref, computed, getCurrentInstance, watch, reactive, nextTick, onBeforeUnmount } from "vue";
+import { ref, computed, getCurrentInstance, watch, reactive, nextTick, onBeforeUnmount, onMounted } from "vue";
import { update } from "@/api/productionManagement/productionProcess.js";
import { getLedgerPage } from "@/api/equipmentManagement/ledger.js";
+import { userListNoPageByTenantId } from "@/api/system/user.js";
const props = defineProps({
visible: {
@@ -136,6 +166,8 @@
no: props.record.no,
deviceId: props.record.deviceId,
deviceName: props.record.deviceName,
+ ids: [],
+ reportWorkerList: [],
remark: props.record.remark,
salaryQuota: props.record.salaryQuota,
isQuality: props.record.isQuality,
@@ -152,6 +184,7 @@
const deviceQuery = ref("");
const deviceScrollWrap = ref(null);
const __deviceLoadMoreSentinel = "__deviceLoadMoreSentinel";
+const userOptions = ref([]);
const deviceHasMore = computed(() => {
const total = Number(page.total ?? 0);
@@ -163,6 +196,36 @@
const handleDeviceChange = (val) => {
formState.value.deviceName = equipmentList.value.find(item => item.id === val)?.deviceName || "";
+};
+
+const normalizeReportUserIds = (record) => {
+ const raw = record?.ids;
+ if (Array.isArray(raw)) {
+ return raw.map(item => item?.userId ?? item).filter(Boolean);
+ }
+ if (typeof raw === "string") {
+ return raw.split(/[,锛�;锛沑s]+/g).map(item => item.trim()).filter(Boolean);
+ }
+ if (Array.isArray(record?.reportWorkerList)) {
+ return record.reportWorkerList.map(item => item?.userId).filter(Boolean);
+ }
+ return [];
+};
+
+const handleReportUsersChange = (val) => {
+ const userMap = new Map(userOptions.value.map(item => [item.userId, item.nickName]));
+ formState.value.reportWorkerList = (val || []).map(userId => ({
+ userId,
+ userName: userMap.get(userId) || "",
+ }));
+};
+
+const getUserOptions = async () => {
+ const res = await userListNoPageByTenantId();
+ userOptions.value = Array.isArray(res?.data) ? res.data : [];
+ if (formState.value.ids?.length) {
+ handleReportUsersChange(formState.value.ids);
+ }
};
const isShow = computed({
@@ -278,6 +341,7 @@
};
const applyRecordToForm = (record) => {
+ const ids = normalizeReportUserIds(record);
formState.value = {
id: record.id,
name: record.name || "",
@@ -285,10 +349,15 @@
type: record.type,
deviceId: record.deviceId,
deviceName: record.deviceName || "",
+ ids,
+ reportWorkerList: Array.isArray(record.reportWorkerList) ? record.reportWorkerList : [],
remark: record.remark || "",
salaryQuota: record.salaryQuota || "",
isQuality: record.isQuality,
};
+ if (!formState.value.reportWorkerList.length && ids.length) {
+ handleReportUsersChange(ids);
+ }
ensureSelectedDeviceOption();
};
@@ -306,6 +375,10 @@
let { proxy } = getCurrentInstance()
+onMounted(() => {
+ getUserOptions();
+});
+
const closeModal = () => {
isShow.value = false;
};
@@ -313,6 +386,7 @@
const handleSubmit = () => {
proxy.$refs["formRef"].validate(valid => {
if (valid) {
+ handleReportUsersChange(formState.value.ids);
update(formState.value).then(() => {
// 鍏抽棴妯℃�佹
isShow.value = false;
diff --git a/src/views/productionManagement/productionProcess/New.vue b/src/views/productionManagement/productionProcess/New.vue
index a17ec91..c878a45 100644
--- a/src/views/productionManagement/productionProcess/New.vue
+++ b/src/views/productionManagement/productionProcess/New.vue
@@ -39,13 +39,6 @@
</el-form-item>
<el-form-item
label="宸ュ簭鏈哄彴"
- prop="deviceId"
- :rules="[
- {
- required: true,
- message: '璇烽�夋嫨宸ュ簭鏈哄彴',
- }
- ]"
>
<el-select
v-model="formState.deviceId"
@@ -67,6 +60,35 @@
:value="__deviceLoadMoreSentinel"
label="鍔犺浇鏇村鈥�"
disabled
+ />
+ </el-select>
+ </el-form-item>
+ <el-form-item
+ label="鎶ュ伐浜�"
+ prop="ids"
+ :rules="[
+ {
+ required: true,
+ message: '璇烽�夋嫨鎶ュ伐浜�',
+ trigger: 'change',
+ }
+ ]"
+ >
+ <el-select
+ v-model="formState.ids"
+ multiple
+ filterable
+ clearable
+ collapse-tags
+ collapse-tags-tooltip
+ placeholder="璇烽�夋嫨鎶ュ伐浜�"
+ @change="handleReportUsersChange"
+ >
+ <el-option
+ v-for="item in userOptions"
+ :key="item.userId"
+ :label="item.nickName"
+ :value="item.userId"
/>
</el-select>
</el-form-item>
@@ -111,6 +133,7 @@
import { ref, computed, onMounted, getCurrentInstance, reactive, nextTick, onBeforeUnmount } from "vue";
import {add} from "@/api/productionManagement/productionProcess.js";
import {getLedgerPage} from "@/api/equipmentManagement/ledger.js";
+import {userListNoPageByTenantId} from "@/api/system/user.js";
const props = defineProps({
visible: {
@@ -123,7 +146,12 @@
// 鍝嶅簲寮忔暟鎹紙鏇夸唬閫夐」寮忕殑 data锛�
const formState = ref({
+ no: "",
name: '',
+ deviceId: "",
+ deviceName: "",
+ ids: [],
+ reportWorkerList: [],
type: 0,
remark: '',
salaryQuota: '',
@@ -139,10 +167,26 @@
onMounted(() => {
resetDeviceOptions();
+ getUserOptions();
});
const handleDeviceChange = (val) => {
formState.value.deviceName = equipmentList.value.find(item => item.id === val)?.deviceName || '';
+};
+
+const userOptions = ref([]);
+
+const handleReportUsersChange = (val) => {
+ const userMap = new Map(userOptions.value.map(item => [item.userId, item.nickName]));
+ formState.value.reportWorkerList = (val || []).map(userId => ({
+ userId,
+ userName: userMap.get(userId) || "",
+ }));
+};
+
+const getUserOptions = async () => {
+ const res = await userListNoPageByTenantId();
+ userOptions.value = Array.isArray(res?.data) ? res.data : [];
};
const isShow = computed({
@@ -269,6 +313,7 @@
const handleSubmit = () => {
proxy.$refs["formRef"].validate(valid => {
if (valid) {
+ handleReportUsersChange(formState.value.ids);
add(formState.value).then(res => {
// 鍏抽棴妯℃�佹
isShow.value = false;
diff --git a/src/views/productionManagement/productionProcess/index.vue b/src/views/productionManagement/productionProcess/index.vue
index f81faf8..9355ffb 100644
--- a/src/views/productionManagement/productionProcess/index.vue
+++ b/src/views/productionManagement/productionProcess/index.vue
@@ -103,6 +103,15 @@
label: "宸ュ簭鏈哄彴",
prop: "deviceName",
},
+ {
+ label: "鎶ュ伐浜�",
+ prop: "userNames",
+ dataType: 'tag',
+ formatData: (params) => {
+ if (!params) return []
+ return params.split(',')
+ }
+ },
// {
// label: "宸ヨ祫瀹氶",
// prop: "salaryQuota",
--
Gitblit v1.9.3