From e65bfa1d46d255f307eaa057665f01c8bde0e122 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 16 六月 2026 11:14:36 +0800
Subject: [PATCH] 君歌 1.端口修改
---
src/views/productionManagement/processRoute/processRouteItem/index.vue | 320 +++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 273 insertions(+), 47 deletions(-)
diff --git a/src/views/productionManagement/processRoute/processRouteItem/index.vue b/src/views/productionManagement/processRoute/processRouteItem/index.vue
index c310b45..db7905d 100644
--- a/src/views/productionManagement/processRoute/processRouteItem/index.vue
+++ b/src/views/productionManagement/processRoute/processRouteItem/index.vue
@@ -30,24 +30,54 @@
<span class="info-value">{{ routeInfo.model || '-' }}</span>
</div>
</div>
- <div class="info-item">
+ <div class="info-item"
+ v-if="routeInfo.quantity && routeInfo.quantity !== 0">
<div class="info-label-wrapper">
- <span class="info-label">BOM缂栧彿</span>
+ <span class="info-label">闇�姹傛暟閲�</span>
</div>
<div class="info-value-wrapper">
- <span class="info-value">{{ routeInfo.bomNo || '-' }}</span>
+ <span class="info-value">{{ routeInfo.quantity || '-' }}</span>
</div>
</div>
- <div class="info-item full-width"
- v-if="routeInfo.description">
+ <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.description }}</span>
</div>
</div>
</div>
+ </el-card>
+ <!-- 闄勪欢妯″潡 -->
+ <div v-if="pageType === 'order'"
+ class="section-header">
+ <div class="section-title">闄勪欢</div>
+ </div>
+ <el-card v-if="pageType === 'order'"
+ class="attachment-card"
+ shadow="hover"
+ style="margin-top: 10px; margin-bottom: 20px;">
+ <el-table :data="attachmentTableData"
+ border
+ class="attachment-table">
+ <el-table-column label="闄勪欢鍚嶇О"
+ prop="originalFilename"
+ show-overflow-tooltip />
+ <el-table-column fixed="right"
+ label="鎿嶄綔"
+ width="200"
+ align="center">
+ <template #default="scope">
+ <el-button link
+ type="primary"
+ size="small"
+ @click="downloadAttachmentFile(scope.row.downloadURL)">
+ 涓嬭浇
+ </el-button>
+ </template>
+ </el-table-column>
+ </el-table>
</el-card>
<!-- 琛ㄦ牸瑙嗗浘 -->
<div v-if="viewMode === 'table'"
@@ -59,7 +89,8 @@
style="margin-right: 10px;">
鍗$墖瑙嗗浘
</el-button>
- <el-button type="primary"
+ <el-button v-if="editable"
+ type="primary"
@click="handleAdd">鏂板</el-button>
</div>
</div>
@@ -80,7 +111,7 @@
prop="technologyOperationId"
width="200">
<template #default="scope">
- {{ getProcessName(scope.row.technologyOperationId) || '-' }}
+ {{ scope.row.technologyOperationName || scope.row.operationName || '-' }}
</template>
</el-table-column>
<el-table-column label="鍙傛暟鍒楄〃"
@@ -101,11 +132,25 @@
<el-table-column label="鍗曚綅"
prop="unit"
width="100" />
+ <el-table-column label="璁¤垂绫诲瀷"
+ prop="type"
+ width="100">
+ <template #default="scope">
+ {{scope.row.type==0 ? "璁℃椂" : "璁′欢"}}
+ </template>
+ </el-table-column>
<el-table-column label="鏄惁璐ㄦ"
prop="isQuality"
width="100">
<template #default="scope">
{{scope.row.isQuality ? "鏄�" : "鍚�"}}
+ </template>
+ </el-table-column>
+ <el-table-column label="鏄惁鐢熶骇"
+ prop="isProduction"
+ width="100">
+ <template #default="scope">
+ {{scope.row.isProduction ? "鏄�" : "鍚�"}}
</template>
</el-table-column>
<el-table-column label="鎿嶄綔"
@@ -117,12 +162,12 @@
link
size="small"
@click="handleEdit(scope.row)"
- :disabled="scope.row.isComplete">缂栬緫</el-button>
+ :disabled="scope.row.isComplete || !editable">缂栬緫</el-button>
<el-button type="danger"
link
size="small"
@click="handleDelete(scope.row)"
- :disabled="scope.row.isComplete">鍒犻櫎</el-button>
+ :disabled="scope.row.isComplete || !editable">鍒犻櫎</el-button>
</template>
</el-table-column>
</el-table>
@@ -136,7 +181,8 @@
style="margin-right: 10px;">
琛ㄦ牸瑙嗗浘
</el-button>
- <el-button type="primary"
+ <el-button v-if="editable"
+ type="primary"
@click="handleAdd">鏂板</el-button>
</div>
</div>
@@ -151,7 +197,7 @@
<!-- 搴忓彿鍦嗗湀 -->
<div class="card-header">
<div class="card-number">{{ index + 1 }}</div>
- <div class="card-process-name">{{ getProcessName(item.technologyOperationId) || '-' }}</div>
+ <div class="card-process-name">{{ item.technologyOperationName || item.operationName || '-' }}</div>
</div>
<!-- 浜у搧淇℃伅 -->
<div class="card-content">
@@ -163,9 +209,17 @@
{{ item.model }}
<!-- <span v-if="item.unit" class="product-unit">{{ item.unit }}</span> -->
</div>
+ <el-tag class="product-tag"
+ :type="item.type == 1 ? 'primary' : 'success'"
+ style="margin-left: 8px;">{{ item.type==0?'璁℃椂':'璁′欢' }}</el-tag>
<el-tag type="primary"
class="product-tag"
+ style="margin-left: 8px;"
v-if="item.isQuality">璐ㄦ</el-tag>
+ <el-tag type="primary"
+ class="product-tag"
+ style="margin-left: 8px;"
+ v-if="item.isProduction">鐢熶骇</el-tag>
</div>
<div v-else
class="product-info empty">鏆傛棤浜у搧淇℃伅</div>
@@ -176,7 +230,7 @@
link
size="small"
@click="handleEdit(item)"
- :disabled="item.isComplete">缂栬緫</el-button>
+ :disabled="item.isComplete || !editable">缂栬緫</el-button>
<el-button type="info"
link
size="small"
@@ -185,12 +239,24 @@
link
size="small"
@click="handleDelete(item)"
- :disabled="item.isComplete">鍒犻櫎</el-button>
+ :disabled="item.isComplete || !editable">鍒犻櫎</el-button>
</div>
</div>
</div>
</div>
</template>
+ <!-- 涓婁紶缁勪欢寮圭獥 -->
+ <el-dialog v-model="uploadDialogVisible"
+ title="涓婁紶闄勪欢"
+ width="50%"
+ @close="closeAttachmentUpload">
+ <AttachmentUpload v-model:file-list="newFileList" />
+ <template #footer>
+ <el-button @click="saveAttachmentUpload"
+ type="primary">淇濆瓨</el-button>
+ <el-button @click="closeAttachmentUpload">鍏抽棴</el-button>
+ </template>
+ </el-dialog>
<!-- 鏂板/缂栬緫寮圭獥 -->
<el-dialog v-model="dialogVisible"
:title="operationType === 'add' ? '鏂板宸ヨ壓璺嚎椤圭洰' : '缂栬緫宸ヨ壓璺嚎椤圭洰'"
@@ -201,10 +267,12 @@
:rules="rules"
label-width="120px">
<el-form-item label="宸ュ簭"
+ v-if="operationType === 'add' || pageType === 'route'"
prop="technologyOperationId">
<el-select v-model="form.technologyOperationId"
placeholder="璇烽�夋嫨宸ュ簭"
clearable
+ @change="processChange"
style="width: 100%">
<el-option v-for="process in processOptions"
:key="process.id"
@@ -212,27 +280,54 @@
:value="process.id" />
</el-select>
</el-form-item>
+ <el-form-item label="宸ュ簭"
+ v-else>
+ <span>{{ getProcessName(form.technologyOperationId) }}</span>
+ </el-form-item>
<el-form-item label="浜у搧鍚嶇О"
+ v-if="operationType === 'add' || pageType === 'route'"
prop="productModelId">
<el-button type="primary"
@click="showProductSelectDialog = true">
- {{ form.productName && form.model
- ? `${form.productName} - ${form.model}`
+ {{ form.productName
+ ? (form.model ? `${form.productName} - ${form.model}` : form.productName)
: '閫夋嫨浜у搧' }}
</el-button>
</el-form-item>
+ <el-form-item label="浜у搧鍚嶇О"
+ v-else>
+ <span>{{ form.productName }}{{ form.model ? ' - ' + form.model : '' }}</span>
+ </el-form-item>
<el-form-item label="鍗曚綅"
+ v-if="operationType === 'add' || pageType === 'route'"
prop="unit">
<el-input v-model="form.unit"
:placeholder="form.productModelId ? '鏍规嵁閫夋嫨鐨勪骇鍝佽嚜鍔ㄥ甫鍑�' : '璇峰厛閫夋嫨浜у搧'"
clearable
:disabled="true" />
</el-form-item>
+ <el-form-item label="鍗曚綅"
+ v-else>
+ <span>{{ form.unit }}</span>
+ </el-form-item>
+ <el-form-item label="璁¤垂绫诲瀷"
+ prop="type">
+ <el-radio-group v-model="form.type">
+ <el-radio :label="0">璁℃椂</el-radio>
+ <el-radio :label="1">璁′欢</el-radio>
+ </el-radio-group>
+ </el-form-item>
<el-form-item label="鏄惁璐ㄦ"
prop="isQuality">
<el-switch v-model="form.isQuality"
:active-value="true"
- inactive-value="false" />
+ :inactive-value="false" />
+ </el-form-item>
+ <el-form-item label="鏄惁鐢熶骇"
+ prop="isProduction">
+ <el-switch v-model="form.isProduction"
+ :active-value="true"
+ :inactive-value="false" />
</el-form-item>
</el-form>
<template #footer>
@@ -247,14 +342,14 @@
@confirm="handleProductSelect"
single />
<!-- 鍙傛暟鍒楄〃瀵硅瘽妗� -->
- <!-- :editable="!routeInfo.status" -->
<ProcessParamListDialog v-model="showParamListDialog"
- :title="`${currentProcess ? (currentProcess.processName || getProcessName(currentProcess.technologyOperationId)) : ''} - 鍙傛暟鍒楄〃`"
+ :title="`${currentProcess ? (currentProcess.processName || currentProcess.technologyOperationName || currentProcess.operationName) : ''} - 鍙傛暟鍒楄〃`"
:route-id="routeId"
:order-id="orderId"
:process="currentProcess"
:page-type="pageType"
:param-list="paramList"
+ :editable="editable"
@getsyncProcessParamItem="getsyncProcessParamItem"
@refresh="refreshParamList" />
</div>
@@ -279,7 +374,10 @@
batchDeleteProcessRouteItem,
getProcessParamList,
} from "@/api/productionManagement/processRouteItem.js";
- import { syncProcessParamItem } from "@/api/productionManagement/processRouteItem.js";
+ import {
+ syncProcessParamItem,
+ syncProcessParamItemOrder,
+ } from "@/api/productionManagement/processRouteItem.js";
import {
findProductProcessRouteItemList,
deleteRouteItem,
@@ -289,6 +387,13 @@
sortRouteItem,
} from "@/api/productionManagement/productProcessRoute.js";
import { processList } from "@/api/productionManagement/productionProcess.js";
+ import AttachmentUpload from "@/components/AttachmentUpload/file/index.vue";
+ import {
+ attachmentList,
+ deleteAttachment,
+ createAttachment,
+ } from "@/api/basicData/storageAttachment.js";
+
import { useRoute } from "vue-router";
import { ElMessageBox, ElMessage } from "element-plus";
import Sortable from "sortablejs";
@@ -299,6 +404,8 @@
const routeId = computed(() => route.query.id);
const orderId = computed(() => route.query.orderId);
const pageType = computed(() => route.query.type);
+ const editable = computed(() => route.query.editable !== "false");
+ const technologyRoutingId = computed(() => route.query.technologyRoutingId);
const tableLoading = ref(false);
const tableData = ref([]);
@@ -313,9 +420,68 @@
processRouteCode: "",
productName: "",
model: "",
- bomNo: "",
description: "",
+ quantity: 0,
+ technologyRoutingId: "",
});
+
+ // 闄勪欢鐩稿叧
+ const attachmentTableData = ref([]);
+ const uploadDialogVisible = ref(false);
+ const newFileList = ref([]);
+
+ const getAttachmentList = () => {
+ if (!technologyRoutingId.value) return;
+ attachmentList({
+ recordType: "technology_routing",
+ recordId: technologyRoutingId.value,
+ }).then(res => {
+ attachmentTableData.value = (res && res.data) || [];
+ });
+ };
+
+ const handleUploadAttachment = () => {
+ uploadDialogVisible.value = true;
+ };
+
+ const saveAttachmentUpload = async () => {
+ if (newFileList.value.length > 0) {
+ createAttachment({
+ application: "file",
+ recordType: "technology_routing",
+ recordId: technologyRoutingId.value,
+ storageBlobDTOs: [...newFileList.value, ...attachmentTableData.value],
+ })
+ .then(res => {
+ if (res && res.code === 200) {
+ proxy?.$modal?.msgSuccess("涓婁紶鎴愬姛");
+ newFileList.value = [];
+ getAttachmentList();
+ }
+ })
+ .finally(() => {
+ uploadDialogVisible.value = false;
+ });
+ }
+ };
+
+ const closeAttachmentUpload = () => {
+ newFileList.value = [];
+ uploadDialogVisible.value = false;
+ };
+
+ const handleDeleteAttachment = async row => {
+ deleteAttachment([row.storageAttachmentId]).then(res => {
+ if (res && res.code === 200) {
+ proxy?.$modal?.msgSuccess("鍒犻櫎鎴愬姛");
+ getAttachmentList();
+ }
+ });
+ };
+
+ const downloadAttachmentFile = url => {
+ window.open(url, "_blank");
+ };
const processOptions = ref([]);
const showProductSelectDialog = ref(false);
@@ -343,6 +509,8 @@
model: "",
unit: "",
isQuality: false,
+ type: 0,
+ isProduction: false,
});
const rules = {
@@ -361,17 +529,31 @@
type: "warning",
})
.then(() => {
- syncProcessParamItem({
- replaceExisting: true,
- technologyRoutingOperationId: currentProcess.value.id,
- }).then(res => {
- if (res.code === 200) {
- ElMessage.success("鍚屾鎴愬姛");
- refreshParamList();
- } else {
- ElMessage.error(res.msg || "鍚屾澶辫触");
- }
- });
+ if (pageType.value === "order") {
+ syncProcessParamItemOrder({
+ replaceExisting: true,
+ technologyRoutingOperationId: currentProcess.value.id,
+ }).then(res => {
+ if (res.code === 200) {
+ ElMessage.success("鍚屾鎴愬姛");
+ refreshParamList();
+ } else {
+ ElMessage.error(res.msg || "鍚屾澶辫触");
+ }
+ });
+ } else {
+ syncProcessParamItem({
+ replaceExisting: true,
+ technologyRoutingOperationId: currentProcess.value.id,
+ }).then(res => {
+ if (res.code === 200) {
+ ElMessage.success("鍚屾鎴愬姛");
+ refreshParamList();
+ } else {
+ ElMessage.error(res.msg || "鍚屾澶辫触");
+ }
+ });
+ }
})
.catch(() => {});
};
@@ -426,8 +608,9 @@
processRouteCode: route.query.processRouteCode || "",
productName: route.query.productName || "",
model: route.query.model || "",
- bomNo: route.query.bomNo || "",
description: route.query.description || "",
+ quantity: route.query.quantity || 0,
+ technologyRoutingId: route.query.technologyRoutingId || "",
status: !(route.query.status == 1 || route.query.status === "false"),
};
};
@@ -451,6 +634,8 @@
model: row.model || "",
unit: row.unit || "",
isQuality: row.isQuality,
+ type: row.type || 0,
+ isProduction: row.isProduction,
};
dialogVisible.value = true;
};
@@ -483,15 +668,20 @@
// 浜у搧閫夋嫨
const handleProductSelect = products => {
+ console.log(products, "===products===");
if (products && products.length > 0) {
const product = products[0];
- form.value.productModelId = product.id;
- form.value.productName = product.productName;
- form.value.model = product.model;
- form.value.unit = product.unit || "";
+ console.log(product, "product");
+ form.value = {
+ ...form.value,
+ productModelId: product.id,
+ productName: product.productName,
+ model: product.model,
+ unit: product.unit || "",
+ };
showProductSelectDialog.value = false;
// 瑙﹀彂琛ㄥ崟楠岃瘉
- formRef.value?.validateField("productModelId");
+ // formRef.value?.validateField("productModelId");
}
};
@@ -509,11 +699,15 @@
const addPromise = isOrderPage
? addRouteItem({
- productOrderId: orderId.value,
- productRouteId: routeId.value,
+ productionOrderId: Number(orderId.value),
+ orderRoutingId: Number(routeId.value),
technologyOperationId: form.value.technologyOperationId,
+ technologyRoutingId: Number(routeId.value),
+ operationName: getProcessName(form.value.technologyOperationId),
productModelId: form.value.productModelId,
isQuality: form.value.isQuality,
+ type: form.value.type,
+ isProduction: form.value.isProduction,
dragSort,
})
: addOrUpdateProcessRouteItem({
@@ -521,6 +715,8 @@
technologyOperationId: form.value.technologyOperationId,
productModelId: form.value.productModelId,
isQuality: form.value.isQuality,
+ type: form.value.type,
+ isProduction: form.value.isProduction,
dragSort,
});
@@ -544,8 +740,11 @@
? addOrUpdateProductProcessRouteItem({
id: form.value.id,
technologyOperationId: form.value.technologyOperationId,
+ operationName: getProcessName(form.value.technologyOperationId),
productModelId: form.value.productModelId,
isQuality: form.value.isQuality,
+ type: form.value.type,
+ isProduction: form.value.isProduction,
})
: addOrUpdateProcessRouteItem1({
technologyRoutingId: Number(routeId.value),
@@ -553,6 +752,8 @@
productModelId: form.value.productModelId,
id: form.value.id,
isQuality: form.value.isQuality,
+ type: form.value.type,
+ isProduction: form.value.isProduction,
});
updatePromise
@@ -582,6 +783,9 @@
productName: "",
model: "",
unit: "",
+ isQuality: false,
+ type: 0,
+ isProduction: false,
};
formRef.value?.resetFields();
};
@@ -595,15 +799,19 @@
// 鏌ョ湅鍙傛暟鍒楄〃
const handleViewParams = row => {
currentProcess.value = row;
- const query = {
- routeItemId: row.id,
- orderId: orderId.value,
+ const param = {
+ productionOrderRoutingOperationId: row.id,
+ productionOrderId: orderId.value,
+ };
+ const param1 = {
+ technologyRoutingOperationId: row.id,
+ productionOrderId: orderId.value,
};
const apiPromise =
pageType.value === "order"
- ? findProcessParamListOrder(query)
- : getProcessParamList(query);
+ ? findProcessParamListOrder(param)
+ : getProcessParamList(param1);
apiPromise
.then(res => {
@@ -626,6 +834,7 @@
// 鍒濆鍖栨嫋鎷芥帓搴�
const initSortable = () => {
destroySortable();
+ if (!editable.value) return;
if (viewMode.value === "table") {
// 琛ㄦ牸瑙嗗浘鐨勬嫋鎷芥帓搴�
@@ -758,10 +967,27 @@
}
};
- onMounted(() => {
+ const processChange = value => {
+ processOptions.value.forEach(item => {
+ if (item.id == value) {
+ form.value.isQuality = item.isQuality;
+ form.value.type = item.type || 0;
+ form.value.isProduction = item.isProduction;
+ }
+ });
+ };
+
+ const refreshCurrentPage = () => {
getRouteInfo();
getList();
getProcessList();
+ if (pageType.value === "order") {
+ getAttachmentList();
+ }
+ };
+
+ onMounted(() => {
+ refreshCurrentPage();
});
onUnmounted(() => {
@@ -1028,4 +1254,4 @@
line-height: 1.5;
word-break: break-all;
}
-</style>
+</style>
\ No newline at end of file
--
Gitblit v1.9.3