| src/api/productionManagement/processRoute.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/api/productionManagement/processRouteItem.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/api/productionManagement/productionProcess.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/components/ProcessParamListDialog.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/productionManagement/processRoute/New.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/productionManagement/processRoute/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/productionManagement/processRoute/processRouteItem/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/productionManagement/productStructure/Detail/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/productionManagement/productionProcess/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/productionManagement/processRoute.js
@@ -4,7 +4,7 @@ // 分页查询 export function listPage(query) { return request({ url: "/processRoute/page", url: "/technologyRouting/page", method: "get", params: query, }); @@ -12,31 +12,38 @@ export function add(data) { return request({ url: "/processRoute", url: "/technologyRouting", method: "post", data: data, }); } // export function del(ids) { // return request({ // url: "/processRoute/" + ids, // method: "delete", // }); // } export function del(ids) { return request({ url: '/processRoute/' + ids, method: 'delete', }) url: "/technologyRouting/delete", method: "delete", data: ids, }); } export function update(data) { return request({ url: '/processRoute', method: 'put', url: "/technologyRouting", method: "put", data: data, }) }); } // 获取详情 export function getById(id) { return request({ url: `/processRoute/${id}`, method: 'get', }) method: "get", }); } src/api/productionManagement/processRouteItem.js
@@ -4,7 +4,7 @@ // 列表查询 export function findProcessRouteItemList(query) { return request({ url: "/processRouteItem/list", url: "/technologyRoutingOperation/list", method: "get", params: query, }); @@ -12,8 +12,15 @@ export function addOrUpdateProcessRouteItem(data) { return request({ url: "/processRouteItem", url: "/technologyRoutingOperation", method: "post", data: data, }); } export function addOrUpdateProcessRouteItem1(data) { return request({ url: "/technologyRoutingOperation", method: "put", data: data, }); } @@ -32,14 +39,14 @@ // 将id数组转换为逗号分隔的字符串,拼接到URL后面 const idsStr = Array.isArray(ids) ? ids.join(",") : ids; return request({ url: `/processRouteItem/batchDelete/${idsStr}`, url: `/technologyRoutingOperation/${idsStr}`, method: "delete", }); } // 获取工序参数列表 export function getProcessParamList(query) { return request({ url: `/ProcessRouteItemParam/pageList`, url: `/technologyRoutingOperationParam/list`, method: "get", params: query, }); @@ -47,7 +54,7 @@ // 工艺路线参数新增 export function addProcessRouteItemParam(data) { return request({ url: "/ProcessRouteItemParam/save", url: "/technologyRoutingOperationParam", method: "post", data: data, }); @@ -55,7 +62,7 @@ // 工艺路线参数修改 export function editProcessRouteItemParam(data) { return request({ url: "/ProcessRouteItemParam/edit", url: "/technologyRoutingOperationParam", method: "put", data: data, }); @@ -63,7 +70,15 @@ // 工艺路线参数删除 export function delProcessRouteItemParam(id) { return request({ url: `/ProcessRouteItemParam/remove/${id}`, url: `/technologyRoutingOperationParam/${id}`, method: "delete", }); } // 按工艺路线工序同步工序参数 export function syncProcessParamItem(data) { return request({ url: "/technologyRoutingOperationParam/sync", method: "post", data: data, }); } src/api/productionManagement/productionProcess.js
@@ -18,6 +18,14 @@ }); } // 工序查询 export function list(query) { return request({ url: "/technologyOperation/listPage", method: "get", params: query, }); } export function add(data) { return request({ url: "/technologyOperation/", @@ -39,15 +47,6 @@ url: "/technologyOperation/update", method: "put", data: data, }); } // 工序查询 export function list(query) { return request({ url: "/technologyOperation/listPage", method: "get", params: query, }); } src/components/ProcessParamListDialog.vue
@@ -6,6 +6,7 @@ <div class="param-list-container"> <div class="params-header"> <span>参数列表</span> <div> <el-button v-if="editable" type="primary" link @@ -15,6 +16,16 @@ <Plus /> </el-icon>新增 </el-button> <el-button v-if="editable" type="primary" link size="small" @click="getsyncProcessParamItem"> <el-icon> <Refresh /> </el-icon>同步工序参数 </el-button> </div> </div> <div class="params-list"> <div v-for="param in paramList" @@ -87,8 +98,8 @@ <!-- 分页控件 --> <div class="pagination-container" style="margin-top: 10px;"> <el-pagination v-model:current-page="paramPage.current" v-model:page-size="paramPage.size" <el-pagination :current-page="paramPage.current" :page-size="paramPage.size" :page-sizes="[10, 20, 50, 100]" layout="total, sizes, prev, pager, next, jumper" :total="paramPage.total" @@ -120,17 +131,11 @@ <el-form-item label="标准值" v-if="selectedParam.paramType == '1'"> <el-input v-model="selectedParam.standardValue" type="number" placeholder="请输入默认值" /> </el-form-item> <el-form-item label="排序"> <el-input v-model="selectedParam.sort" type="number" placeholder="请输入排序" /> </el-form-item> <el-form-item label="是否必填"> <el-switch :active-value="true" :inactive-value="false" <el-switch :active-value="1" :inactive-value="0" v-model="selectedParam.isRequired" /> </el-form-item> </el-form> @@ -261,8 +266,7 @@ paramId: null, paramName: "", standardValue: null, sort: 1, isRequired: false, isRequired: 0, paramType: null, paramFormat: "", unit: "", @@ -276,7 +280,7 @@ const handleAddParam = () => { selectedParam.value = null; paramSearchKeyword.value = ""; paramPage.current = 1; paramPage.value.current = 1; // 获取可选参数列表 getBaseParamListData(); selectParamDialogVisible.value = true; @@ -290,8 +294,7 @@ paramId: param.paramId, paramName: param.parameterName || param.paramName, standardValue: param.standardValue, sort: param.sort || 1, isRequired: param.isRequired || false, isRequired: param.isRequired || 0, paramType: param.parameterType || param.paramType, paramFormat: param.parameterFormat || param.paramFormat, unit: param.unit || param.unit, @@ -332,17 +335,22 @@ }) .catch(() => {}); }; const getsyncProcessParamItem = () => { emit("getsyncProcessParamItem"); }; // 获取可选参数列表 const getBaseParamListData = () => { console.log(paramPage, "paramPage.size"); getBaseParamList({ paramName: paramSearchKeyword.value, current: paramPage.current, size: paramPage.size, current: paramPage.value.current, size: paramPage.value.size, }).then(res => { if (res.code === 200) { filteredParamList.value = res.data?.records || []; paramPage.total = res.data?.total || 0; paramPage.value.total = res.data.total || 0; } else { ElMessage.error(res.msg || "查询失败"); } @@ -380,8 +388,7 @@ standardValue: isNumericMode ? selectedParam.value.standardValue || "" : "", isRequired: selectedParam.value.isRequired || false, sort: selectedParam.value.sort || 1, isRequired: selectedParam.value.isRequired || 0, }) .then(res => { if (res.code === 200) { @@ -397,14 +404,15 @@ console.error("添加参数失败:", err); }); } else { console.log(selectedParam.value, "selectedParam"); addProcessRouteItemParam({ routeItemId: props.process.id, technologyRoutingOperationId: props.process.id, paramId: selectedParam.value.id, standardValue: isNumericMode ? selectedParam.value.standardValue || "" : "", isRequired: selectedParam.value.isRequired || false, sort: selectedParam.value.sort || 1, isRequired: selectedParam.value.isRequired || 0, }) .then(res => { if (res.code === 200) { @@ -438,7 +446,7 @@ standardValue: isNumericMode ? editParamForm.value.standardValue || "" : "", isRequired: editParamForm.value.isRequired || false, isRequired: editParamForm.value.isRequired || 0, }) .then(res => { if (res.code === 200) { @@ -457,12 +465,12 @@ // 调用API修改参数 editProcessRouteItemParam({ id: editParamForm.value.id, routeItemId: props.process.id, technologyRoutingOperationId: props.process.id, paramId: editParamForm.value.paramId, standardValue: isNumericMode ? editParamForm.value.standardValue || "" : "", isRequired: editParamForm.value.isRequired || false, isRequired: editParamForm.value.isRequired || 0, }) .then(res => { if (res.code === 200) { @@ -513,7 +521,7 @@ editParamDialogVisible.value = false; selectedParam.value = null; paramSearchKeyword.value = ""; paramPage.current = 1; paramPage.value.current = 1; filteredParamList.value = []; editParamForm.value = { id: null, @@ -521,8 +529,7 @@ paramId: null, paramName: "", standardValue: null, sort: 1, isRequired: false, isRequired: 0, paramType: null, paramFormat: "", unit: "", src/views/productionManagement/processRoute/New.vue
@@ -1,14 +1,14 @@ <template> <div> <el-dialog v-model="isShow" <el-dialog v-model="isShow" title="新增工艺路线" width="400" @close="closeModal" > <el-form label-width="140px" :model="formState" label-position="top" ref="formRef"> <el-form-item label="产品名称" @close="closeModal"> <el-form label-width="140px" :model="formState" label-position="top" ref="formRef"> <el-form-item label="产品名称" prop="productModelId" :rules="[ { @@ -16,17 +16,15 @@ message: '请选择产品', trigger: 'change', } ]" > <el-button type="primary" @click="showProductSelectDialog = true"> ]"> <el-button type="primary" @click="showProductSelectDialog = true"> {{ formState.productName && formState.productModelName ? `${formState.productName} - ${formState.productModelName}` : '选择产品' }} </el-button> </el-form-item> <el-form-item label="BOM" <el-form-item label="BOM" prop="bomId" :rules="[ { @@ -34,38 +32,32 @@ message: '请选择BOM', trigger: 'change', } ]" > <el-select v-model="formState.bomId" ]"> <el-select v-model="formState.bomId" placeholder="请选择BOM" clearable :disabled="!formState.productModelId || bomOptions.length === 0" style="width: 100%" > <el-option v-for="item in bomOptions" style="width: 100%"> <el-option v-for="item in bomOptions" :key="item.id" :label="item.bomNo || `BOM-${item.id}`" :value="item.id" /> :value="item.id" /> </el-select> </el-form-item> <el-form-item label="备注" prop="description"> <el-input v-model="formState.description" type="textarea" /> <el-form-item label="备注" prop="description"> <el-input v-model="formState.description" type="textarea" /> </el-form-item> </el-form> <!-- 产品选择弹窗 --> <ProductSelectDialog v-model="showProductSelectDialog" <ProductSelectDialog v-model="showProductSelectDialog" @confirm="handleProductSelect" single /> single /> <template #footer> <div class="dialog-footer"> <el-button type="primary" @click="handleSubmit">确认</el-button> <el-button type="primary" @click="handleSubmit">确认</el-button> <el-button @click="closeModal">取消</el-button> </div> </template> @@ -86,7 +78,7 @@ }, }); const emit = defineEmits(['update:visible', 'completed']); const emit = defineEmits(["update:visible", "completed"]); // 响应式数据(替代选项式的 data) const formState = ref({ @@ -95,7 +87,7 @@ productName: "", productModelName: "", bomId: undefined, description: '', description: "", }); const isShow = computed({ @@ -103,14 +95,14 @@ return props.visible; }, set(val) { emit('update:visible', val); emit("update:visible", val); }, }); const showProductSelectDialog = ref(false); const bomOptions = ref([]); let { proxy } = getCurrentInstance() let { proxy } = getCurrentInstance(); const closeModal = () => { // 重置表单数据 @@ -120,14 +112,14 @@ productName: "", productModelName: "", bomId: undefined, description: '', description: "", }; bomOptions.value = []; isShow.value = false; }; // 产品选择处理 const handleProductSelect = async (products) => { const handleProductSelect = async products => { if (products && products.length > 0) { const product = products[0]; // 先查询BOM列表(必选) @@ -139,7 +131,7 @@ bomList = res; } else if (res && res.data) { bomList = Array.isArray(res.data) ? res.data : [res.data]; } else if (res && typeof res === 'object') { } else if (res && typeof res === "object") { bomList = [res]; } @@ -151,7 +143,7 @@ bomOptions.value = bomList; showProductSelectDialog.value = false; // 触发表单验证更新 proxy.$refs["formRef"]?.validateField('productModelId'); proxy.$refs["formRef"]?.validateField("productModelId"); } else { proxy.$modal.msgError("该产品没有BOM,请先创建BOM"); } @@ -174,17 +166,18 @@ proxy.$modal.msgError("请选择BOM"); return; } console.log(formState.value, "formState.value===="); add(formState.value).then(res => { // 关闭模态框 isShow.value = false; // 告知父组件已完成 emit('completed'); emit("completed"); proxy.$modal.msgSuccess("提交成功"); }) }); } }) }); }; defineExpose({ closeModal, src/views/productionManagement/processRoute/index.vue
@@ -1,24 +1,33 @@ <template> <div class="app-container"> <div class="search_form"> <el-form :model="searchForm" :inline="true"> <el-form :model="searchForm" :inline="true"> <el-form-item label="规格名称:"> <el-input v-model="searchForm.model" placeholder="请输入" clearable prefix-icon="Search" <el-input v-model="searchForm.model" placeholder="请输入" clearable prefix-icon="Search" style="width: 200px;" @change="handleQuery" /> </el-form-item> <el-form-item> <el-button type="primary" @click="handleQuery">搜索</el-button> <el-button type="primary" @click="handleQuery">搜索</el-button> </el-form-item> </el-form> </div> <div class="table_list"> <div style="text-align: right" class="mb10"> <el-button type="primary" @click="showNewModal">新增工艺路线</el-button> <el-button type="danger" @click="handleDelete" :disabled="selectedRows.length === 0" plain>删除工艺路线</el-button> <div style="text-align: right" class="mb10"> <el-button type="primary" @click="showNewModal">新增工艺路线</el-button> <el-button type="danger" @click="handleDelete" :disabled="selectedRows.length === 0" plain>删除工艺路线</el-button> </div> <PIMTable rowKey="id" <PIMTable rowKey="id" :column="tableColumn" :tableData="tableData" :page="page" @@ -26,28 +35,19 @@ @selection-change="handleSelectionChange" :tableLoading="tableLoading" @pagination="pagination" :total="page.total" /> :total="page.total" /> </div> <new-process v-if="isShowNewModal" <new-process v-if="isShowNewModal" v-model:visible="isShowNewModal" @completed="getList" /> <edit-process v-if="isShowEditModal" @completed="getList" /> <edit-process v-if="isShowEditModal" v-model:visible="isShowEditModal" :record="record" @completed="getList" /> <route-item-form v-if="isShowItemModal" @completed="getList" /> <route-item-form v-if="isShowItemModal" v-model:visible="isShowItemModal" :record="record" @completed="getList" /> @completed="getList" /> </div> </template> @@ -57,9 +57,9 @@ import EditProcess from "@/views/productionManagement/processRoute/Edit.vue"; import RouteItemForm from "@/views/productionManagement/processRoute/ItemsForm.vue"; import {listPage, del} from "@/api/productionManagement/processRoute.js"; import { useRouter } from 'vue-router' import { useRouter } from "vue-router"; const router = useRouter() const router = useRouter(); const data = reactive({ searchForm: { model: "", @@ -97,19 +97,19 @@ { name: "编辑", type: "text", clickFun: (row) => { clickFun: row => { showEditModal(row); } }, }, { name: "路线项目", type: "text", clickFun: (row) => { clickFun: row => { showItemModal(row); } } ] } }, }, ], }, ]); const tableData = ref([]); const selectedRows = ref([]); @@ -123,7 +123,7 @@ size: 100, total: 0, }); const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance(); // 查询列表 /** 搜索按钮操作 */ @@ -132,7 +132,7 @@ getList(); }; const pagination = (obj) => { const pagination = obj => { page.current = obj.page; page.size = obj.limit; getList(); @@ -140,52 +140,54 @@ const getList = () => { tableLoading.value = true; const params = { ...searchForm.value, ...page }; params.entryDate = undefined listPage(params).then(res => { params.entryDate = undefined; listPage(params) .then(res => { tableLoading.value = false; tableData.value = res.data.records.map(item => ({ ...item, })); page.total = res.data.total; }).catch(err => { tableLoading.value = false; }) .catch(err => { tableLoading.value = false; }); }; // 表格选择数据 const handleSelectionChange = (selection) => { const handleSelectionChange = selection => { selectedRows.value = selection; }; // 打开新增弹框 const showNewModal = () => { isShowNewModal.value = true isShowNewModal.value = true; }; const showEditModal = (row) => { isShowEditModal.value = true record.value = row const showEditModal = row => { isShowEditModal.value = true; record.value = row; }; const showItemModal = (row) => { const showItemModal = row => { router.push({ path: '/productionManagement/processRouteItem', path: "/productionManagement/processRouteItem", query: { id: row.id, processRouteCode: row.processRouteCode || '', productName: row.productName || '', model: row.model || '', bomNo: row.bomNo || '', description: row.description || '', type: 'route', } }) processRouteCode: row.processRouteCode || "", productName: row.productName || "", model: row.model || "", bomNo: row.bomNo || "", description: row.description || "", type: "route", }, }); }; // 删除 function handleDelete() { const ids = selectedRows.value.map((item) => item.id); const ids = selectedRows.value.map(item => item.id); proxy.$modal .confirm('是否确认删除已勾选的数据项?') .confirm("是否确认删除已勾选的数据项?") .then(function () { return del(ids); }) src/views/productionManagement/processRoute/processRouteItem/index.vue
@@ -77,10 +77,10 @@ width="60" type="index" /> <el-table-column label="工序名称" prop="processId" prop="technologyOperationId" width="200"> <template #default="scope"> {{ getProcessName(scope.row.processId) || '-' }} {{ getProcessName(scope.row.technologyOperationId) || '-' }} </template> </el-table-column> <el-table-column label="参数列表" @@ -151,7 +151,7 @@ <!-- 序号圆圈 --> <div class="card-header"> <div class="card-number">{{ index + 1 }}</div> <div class="card-process-name">{{ getProcessName(item.processId) || '-' }}</div> <div class="card-process-name">{{ getProcessName(item.technologyOperationId) || '-' }}</div> </div> <!-- 产品信息 --> <div class="card-content"> @@ -191,168 +191,6 @@ </div> </div> </template> <div class="section-BOM"> <div class="section-header"> <div class="section-title">BOM</div> <div class="section-actions"> <el-button type="primary" @click="toggleBomEdit"> {{ bomDataValue.isEdit ? '取消' : '编辑' }} </el-button> <el-button v-if=" bomDataValue.isEdit" type="success" @click="saveBomChanges">保存</el-button> </div> </div> <div> <!-- BOM表格 --> <el-table :data="bomTableData" border :preserve-expanded-content="false" :default-expand-all="true" style="width: 100%"> <el-table-column type="expand"> <template #default="props"> <el-form ref="bomFormRef" :model="bomDataValue"> <el-table :data="props.row.bomList" row-key="tempId" default-expand-all :tree-props="{children: 'children', hasChildren: 'hasChildren'}" style="width: 100%"> <el-table-column prop="productName" label="产品" /> <el-table-column prop="model" label="规格"> <template #default="{ row }"> <el-form-item v-if="bomDataValue.isEdit" :rules="[{ required: true, message: '请选择规格', trigger: ['blur','change'] }]" style="margin: 0"> <el-select v-model="row.model" placeholder="请选择规格" clearable :disabled="!bomDataValue.isEdit" style="width: 100%" @visible-change="(v) => { if (v) openBomProductDialog(row.tempId) }"> <el-option v-if="row.model" :label="row.model" :value="row.model" /> </el-select> </el-form-item> <span v-else>{{ row.model }}</span> </template> </el-table-column> <el-table-column prop="processName" label="消耗工序"> <template #default="{ row }"> <el-form-item v-if="bomDataValue.isEdit" :rules="[{ required: true, message: '请选择消耗工序', trigger: 'change' }]" style="margin: 0"> <el-select v-model="row.processId" placeholder="请选择" filterable clearable :disabled="!bomDataValue.isEdit" style="width: 100%"> <el-option v-for="process in processOptions" :key="process.id" :label="process.name" :value="process.id" /> </el-select> </el-form-item> <span v-else>{{ row.processName }}</span> </template> </el-table-column> <el-table-column prop="unitQuantity" label="单位产出所需数量"> <template #default="{ row }"> <el-form-item v-if="bomDataValue.isEdit" :rules="[{ required: true, message: '请输入单位产出所需数量', trigger: ['blur','change'] }]" style="margin: 0"> <el-input-number v-model="row.unitQuantity" :min="0" :precision="2" :step="1" controls-position="right" style="width: 100%" :disabled="!bomDataValue.isEdit" /> </el-form-item> <span v-else>{{ row.unitQuantity }}</span> </template> </el-table-column> <el-table-column v-if="pageType === 'order'" prop="demandedQuantity" label="需求总量"> <template #default="{ row }"> <el-form-item v-if="bomDataValue.isEdit" :rules="[{ required: true, message: '请输入需求总量', trigger: ['blur','change'] }]" style="margin: 0"> <el-input-number v-model="row.demandedQuantity" :min="0" :precision="2" :step="1" controls-position="right" style="width: 100%" :disabled="!bomDataValue.isEdit" /> </el-form-item> <span v-else>{{ row.demandedQuantity }}</span> </template> </el-table-column> <el-table-column prop="unit" label="单位"> <template #default="{ row }"> <el-form-item v-if="bomDataValue.isEdit" :rules="[{ required: true, message: '请输入单位', trigger: ['blur','change'] }]" style="margin: 0"> <el-input v-model="row.unit" placeholder="请输入单位" clearable :disabled="!bomDataValue.isEdit" /> </el-form-item> <span v-else>{{ row.unit }}</span> </template> </el-table-column> <el-table-column label="操作" fixed="right" width="180"> <template #default="{ row }"> <el-button v-if="bomDataValue.isEdit" type="danger" text size="small" @click="removeBomItem(row.tempId)">删除</el-button> <el-button v-if="bomDataValue.isEdit" type="primary" text size="small" @click="addBomItem2(row.tempId)">添加子项</el-button> </template> </el-table-column> </el-table> </el-form> </template> </el-table-column> <el-table-column label="BOM编号" prop="bomNo" /> <el-table-column label="产品名称" prop="productName" /> <el-table-column label="规格型号" prop="model" /> </el-table> <!-- <div v-if="bomDataValue.isEdit" style="text-align: center;border: 1px solid #e4e7ed;padding: 10px;transition: all 0.3s ease;cursor: pointer;" :class="{'hover-effect': bomDataValue.isEdit}"> <el-button type="primary" text @click="addBomItem"> <el-icon style="vertical-align: middle;margin-right: 5px;"> <Plus /> </el-icon> 添加 </el-button> </div> --> </div> </div> <!-- 新增/编辑弹窗 --> <el-dialog v-model="dialogVisible" :title="operationType === 'add' ? '新增工艺路线项目' : '编辑工艺路线项目'" @@ -363,8 +201,8 @@ :rules="rules" label-width="120px"> <el-form-item label="工序" prop="processId"> <el-select v-model="form.processId" prop="technologyOperationId"> <el-select v-model="form.technologyOperationId" placeholder="请选择工序" clearable style="width: 100%"> @@ -408,19 +246,16 @@ <ProductSelectDialog v-model="showProductSelectDialog" @confirm="handleProductSelect" single /> <!-- BOM产品选择对话框 --> <ProductSelectDialog v-model="bomDataValue.showProductDialog" @confirm="handleBomProductSelect" single /> <!-- 参数列表对话框 --> <!-- :editable="!routeInfo.status" --> <ProcessParamListDialog v-model="showParamListDialog" :title="`${currentProcess ? (currentProcess.processName || getProcessName(currentProcess.processId)) : ''} - 参数列表`" :title="`${currentProcess ? (currentProcess.processName || getProcessName(currentProcess.technologyOperationId)) : ''} - 参数列表`" :route-id="routeId" :order-id="orderId" :process="currentProcess" :page-type="pageType" :param-list="paramList" @getsyncProcessParamItem="getsyncProcessParamItem" @refresh="refreshParamList" /> </div> </template> @@ -439,10 +274,12 @@ import { findProcessRouteItemList, addOrUpdateProcessRouteItem, addOrUpdateProcessRouteItem1, sortProcessRouteItem, batchDeleteProcessRouteItem, getProcessParamList, } from "@/api/productionManagement/processRouteItem.js"; import { syncProcessParamItem } from "@/api/productionManagement/processRouteItem.js"; import { findProductProcessRouteItemList, deleteRouteItem, @@ -452,11 +289,6 @@ sortRouteItem, } from "@/api/productionManagement/productProcessRoute.js"; import { processList } from "@/api/productionManagement/productionProcess.js"; import { queryList2, queryList, add2, } from "@/api/productionManagement/productStructure.js"; import { useRoute } from "vue-router"; import { ElMessageBox, ElMessage } from "element-plus"; import Sortable from "sortablejs"; @@ -490,15 +322,6 @@ const showParamListDialog = ref(false); const currentProcess = ref(null); const paramList = ref([]); const bomTableData = ref([]); const bomFormRef = ref(null); const bomDataValue = ref({ dataList: [], showProductDialog: false, currentRowName: null, loading: false, isEdit: false, }); let tableSortable = null; let cardSortable = null; @@ -514,7 +337,7 @@ const form = ref({ id: undefined, routeId: routeId.value, processId: undefined, technologyOperationId: undefined, productModelId: undefined, productName: "", model: "", @@ -523,16 +346,42 @@ }); const rules = { processId: [{ required: true, message: "请选择工序", trigger: "change" }], technologyOperationId: [ { required: true, message: "请选择工序", trigger: "change" }, ], productModelId: [ { required: true, message: "请选择产品", trigger: "change" }, ], }; const getsyncProcessParamItem = () => { ElMessageBox.confirm("是否覆盖当前工序已存在参数?", "提示", { confirmButtonText: "确定", cancelButtonText: "取消", type: "warning", }) .then(() => { syncProcessParamItem({ replaceExisting: true, technologyRoutingOperationId: currentProcess.value.id, }).then(res => { if (res.code === 200) { ElMessage.success("同步成功"); refreshParamList(); } else { ElMessage.error(res.msg || "同步失败"); } }); }) .catch(() => {}); }; // 根据工序ID获取工序名称 const getProcessName = processId => { if (!processId) return ""; const process = processOptions.value.find(p => p.id === processId); const getProcessName = technologyOperationId => { if (!technologyOperationId) return ""; const process = processOptions.value.find( p => p.id === technologyOperationId ); return process ? process.name : ""; }; @@ -562,9 +411,9 @@ // 获取工序列表 const getProcessList = () => { processList({}) processList({ size: -1, current: -1 }) .then(res => { processOptions.value = res.data || []; processOptions.value = res.data.records || []; }) .catch(err => { console.error("获取工序失败:", err); @@ -581,73 +430,6 @@ description: route.query.description || "", status: !(route.query.status == 1 || route.query.status === "false"), }; if (pageType.value === "order") { queryList2(route.query.orderId) .then(res => { if (res.data) { // 为BOM数据设置tempId const setTempIdRecursively = items => { items.forEach(item => { item.tempId = item.id || new Date().getTime(); if (item.children && item.children.length > 0) { setTempIdRecursively(item.children); } }); }; setTempIdRecursively(res.data); bomTableData.value = [ { bomNo: routeInfo.value.bomNo, dictLabel: routeInfo.value.dictLabel, productCode: "", productName: routeInfo.value.productName, model: routeInfo.value.model, bomList: res.data, }, ]; // 保存原始BOM数据 bomDataValue.value.dataList = res.data; } }) .catch(err => { console.error("获取BOM数据失败:", err); }); } else { queryList(Number(route.query.bomId)) .then(res => { if (res.data) { // 为BOM数据设置tempId const setTempIdRecursively = items => { items.forEach(item => { item.tempId = item.id || new Date().getTime(); if (item.children && item.children.length > 0) { setTempIdRecursively(item.children); } }); }; setTempIdRecursively(res.data); bomTableData.value = [ { bomNo: routeInfo.value.bomNo, dictLabel: routeInfo.value.dictLabel, productCode: "", productName: routeInfo.value.productName, model: routeInfo.value.model, bomList: res.data, }, ]; // 保存原始BOM数据 bomDataValue.value.dataList = res.data; } }) .catch(err => { console.error("获取BOM数据失败:", err); }); } }; // 新增 @@ -663,7 +445,7 @@ form.value = { id: row.id, routeId: routeId.value, processId: row.processId, technologyOperationId: row.technologyOperationId, productModelId: row.productModelId, productName: row.productName || "", model: row.model || "", @@ -729,14 +511,14 @@ ? addRouteItem({ productOrderId: orderId.value, productRouteId: routeId.value, processId: form.value.processId, technologyOperationId: form.value.technologyOperationId, productModelId: form.value.productModelId, isQuality: form.value.isQuality, dragSort, }) : addOrUpdateProcessRouteItem({ routeId: routeId.value, processId: form.value.processId, technologyRoutingId: Number(routeId.value), technologyOperationId: form.value.technologyOperationId, productModelId: form.value.productModelId, isQuality: form.value.isQuality, dragSort, @@ -761,13 +543,13 @@ const updatePromise = isOrderPage ? addOrUpdateProductProcessRouteItem({ id: form.value.id, processId: form.value.processId, technologyOperationId: form.value.technologyOperationId, productModelId: form.value.productModelId, isQuality: form.value.isQuality, }) : addOrUpdateProcessRouteItem({ routeId: routeId.value, processId: form.value.processId, : addOrUpdateProcessRouteItem1({ technologyRoutingId: Number(routeId.value), technologyOperationId: form.value.technologyOperationId, productModelId: form.value.productModelId, id: form.value.id, isQuality: form.value.isQuality, @@ -795,7 +577,7 @@ form.value = { id: undefined, routeId: routeId.value, processId: undefined, technologyOperationId: undefined, productModelId: undefined, productName: "", model: "", @@ -839,231 +621,6 @@ if (currentProcess.value) { handleViewParams(currentProcess.value); } }; // BOM相关方法 // 切换BOM编辑模式 const toggleBomEdit = () => { bomDataValue.value.isEdit = !bomDataValue.value.isEdit; if (!bomDataValue.value.isEdit) { // 取消编辑时重新加载数据 getRouteInfo(); } }; // 添加BOM项 const addBomItem = () => { if (bomTableData.value.length > 0) { const newItem = { parentId: "", parentTempId: "", productName: "", productId: "", model: undefined, productModelId: undefined, processId: "", processName: "", unitQuantity: 0, demandedQuantity: 0, unit: "", children: [], tempId: new Date().getTime(), }; bomTableData.value[0].bomList.push(newItem); } }; // 添加BOM子项 const addBomItem2 = tempId => { const addChildItem = (items, tempId) => { for (let i = 0; i < items.length; i++) { const item = items[i]; if (item.tempId === tempId) { if (!item.children) { item.children = []; } item.children.push({ parentId: item.id || "", parentTempId: item.tempId || "", productName: "", productId: "", model: undefined, productModelId: undefined, processId: "", processName: "", unitQuantity: 0, demandedQuantity: 0, unit: "", children: [], tempId: new Date().getTime(), }); return true; } if (item.children && item.children.length > 0) { if (addChildItem(item.children, tempId)) { return true; } } } return false; }; if (bomTableData.value.length > 0) { addChildItem(bomTableData.value[0].bomList, tempId); } }; // 删除BOM项 const removeBomItem = tempId => { if (bomTableData.value.length > 0) { const removeFromList = (items, tempId) => { for (let i = 0; i < items.length; i++) { const item = items[i]; if (item.tempId === tempId) { items.splice(i, 1); return true; } if (item.children && item.children.length > 0) { if (removeFromList(item.children, tempId)) { return true; } } } return false; }; removeFromList(bomTableData.value[0].bomList, tempId); } }; // 打开BOM产品选择对话框 const openBomProductDialog = tempId => { bomDataValue.value.currentRowName = tempId; bomDataValue.value.showProductDialog = true; }; // 处理BOM产品选择 const handleBomProductSelect = products => { if (products && products.length > 0) { const product = products[0]; const updateProductInfo = (items, tempId, productData) => { for (let i = 0; i < items.length; i++) { const item = items[i]; if (item.tempId === tempId) { item.productName = productData.productName; item.model = productData.model; item.productModelId = productData.id; item.unit = productData.unit || ""; return true; } if (item.children && item.children.length > 0) { if (updateProductInfo(item.children, tempId, productData)) { return true; } } } return false; }; if (bomTableData.value.length > 0) { updateProductInfo( bomTableData.value[0].bomList, bomDataValue.value.currentRowName, product ); } bomDataValue.value.showProductDialog = false; } }; // 保存BOM更改 const saveBomChanges = () => { const validateBomData = (items, isTopLevel = false) => { for (let i = 0; i < items.length; i++) { const item = items[i]; if (!item.productModelId) { ElMessage.error("请选择产品"); return false; } if (!isTopLevel && !item.processId) { ElMessage.error("请选择消耗工序"); return false; } if ( item.unitQuantity === undefined || item.unitQuantity === null || item.unitQuantity === 0 ) { ElMessage.error("请填写单位产出所需数量"); return false; } if ( pageType.value === "order" && (item.demandedQuantity === undefined || item.demandedQuantity === null || item.demandedQuantity === 0) ) { ElMessage.error("请输入需求总量"); return false; } if (item.children && item.children.length > 0) { if (!validateBomData(item.children, false)) { return false; } } } return true; }; if (bomTableData.value.length > 0) { if (!validateBomData(bomTableData.value[0].bomList, true)) { return; } } const processBomItem = (item, parentId = null, parentTempId = null) => { const cleanItem = { id: item.id || null, orderId: Number(orderId.value) || null, parentId: parentId, parentTempId: parentTempId || null, productModelId: item.productModelId || null, processId: item.processId || null, unitQuantity: item.unitQuantity || 0, demandedQuantity: item.demandedQuantity || 0, unit: item.unit || "", tempId: item.tempId || new Date().getTime(), bomId: Number(route.query.bomId) || null, children: [], }; if (item.children && item.children.length > 0) { cleanItem.children = item.children.map(child => processBomItem(child, item.id, item.tempId) ); } return cleanItem; }; const saveData = { orderId: Number(orderId.value), bomId: Number(route.query.bomId), children: bomTableData.value[0].bomList.map(item => processBomItem(item)), }; const savePromise = pageType.value === "order" ? add2(saveData) : add(saveData); savePromise .then(() => { proxy?.$modal?.msgSuccess("保存成功"); bomDataValue.value.isEdit = false; getRouteInfo(); }) .catch(err => { console.error("保存BOM失败:", err); proxy?.$modal?.msgError("保存失败"); }); }; // 初始化拖拽排序 @@ -1470,16 +1027,5 @@ font-weight: 500; line-height: 1.5; word-break: break-all; } .section-BOM { margin-top: 20px; } .hover-effect:hover { border-color: #409eff; background-color: #ecf5ff; transform: translateY(-2px); box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); } </style> src/views/productionManagement/productStructure/Detail/index.vue
@@ -163,7 +163,10 @@ reactive, ref, } from "vue"; import { queryList, addBomDetail } from "@/api/productionManagement/productStructure.js"; import { queryList, addBomDetail, } from "@/api/productionManagement/productStructure.js"; import { listProcessBom } from "@/api/productionManagement/productionOrder.js"; import { list } from "@/api/productionManagement/productionProcess"; import { ElMessage } from "element-plus"; @@ -228,9 +231,11 @@ if (id === undefined || id === null || id === "") { return null; } return normalizeListData(dataValue.processOptions).find( return ( normalizeListData(dataValue.processOptions).find( option => String(option.id) === String(id) ) || null; ) || null ); }; const syncProcessOperationFields = (item: any) => { @@ -502,7 +507,7 @@ processName: "", operationId: "", operationName: "", unitQuantity: 0, unitQuantity: 1, demandedQuantity: 0, unit: "", children: [], @@ -531,7 +536,7 @@ processName: "", operationId: "", operationName: "", unitQuantity: 0, unitQuantity: 1, demandedQuantity: 0, children: [], unit: "", src/views/productionManagement/productionProcess/index.vue
@@ -44,7 +44,7 @@ <div class="card-body"> <!-- <div class="process-name">{{ process.name }}</div> --> <div class="process-desc">{{ process.remark || '暂无描述' }}</div> <div class="process-device">关联设备: {{ deviceOptions.find(item => item.id === Number(process.deviceLedgerId)).deviceName|| '未关联' }}</div> <div class="process-device">关联设备: {{ deviceOptions.find(item => item.id === Number(process.deviceLedgerId))?.deviceName|| '未关联' }}</div> </div> <div class="card-footer"> <div class="status-tag"> @@ -453,6 +453,10 @@ getProcessListApi({ size: -1, current: -1 }) .then(res => { processValueList.value = res.data.records || []; console.log( processValueList.value, "reprocessValueList.value==========s" ); }) .catch(() => { ElMessage.error("获取工序列表失败");