| | |
| | | <el-icon> |
| | | <Document /> |
| | | </el-icon> |
| | | <span class="meta-label">路线描述:</span> |
| | | <span class="meta-label">备注:</span> |
| | | <span class="meta-value">{{ route.description || '暂无描述' }}</span> |
| | | </span> |
| | | </div> |
| | |
| | | <div class="process-number">{{ index + 1 }}</div> |
| | | <div class="process-actions"> |
| | | <el-button link |
| | | type="primary" |
| | | @click="handleEditProcessSelect(route, index, process)"> |
| | | <el-icon> |
| | | <Edit /> |
| | | </el-icon> |
| | | </el-button> |
| | | <el-button link |
| | | type="danger" |
| | | @click="handleDeleteProcess(route.id, process)"> |
| | | <el-icon> |
| | |
| | | </div> |
| | | </div> |
| | | <div class="process-node-body"> |
| | | <div class="process-code">{{ process.no }}</div> |
| | | <div class="process-name">{{ process.name }}</div> |
| | | <div class="process-desc">{{ process.remark || '暂无描述' }}</div> |
| | | <!-- <div class="process-code">{{ process.processId }}</div> --> |
| | | <div class="process-name">{{ process.processName }}</div> |
| | | <!-- <div class="process-desc">{{ process.remark || '暂无描述' }}</div> --> |
| | | </div> |
| | | <div class="process-node-footer"> |
| | | <!-- <el-tag size="small" |
| | |
| | | size="small" |
| | | @click="toggleProcessParams(process)"> |
| | | {{ process.expanded ? '收起参数' : '展开参数' }} |
| | | ({{ process.paramList?.length || 0 }}) |
| | | ({{ process.paramCount }}) |
| | | </el-button> |
| | | </div> |
| | | <div v-if="process.expanded" |
| | |
| | | :key="param.id" |
| | | class="param-item"> |
| | | <div class="param-info"> |
| | | <span class="param-code">{{ param.parameterCode }}</span> |
| | | <span class="param-name">{{ param.parameterName }}</span> |
| | | <span class="param-code">{{ param.paramName }}</span> |
| | | <!-- <span class="param-name">{{ param.paramName }}</span> --> |
| | | <!-- <el-tag size="small" |
| | | style="margin-right: 20px;" |
| | | :type="getParamTypeTag(param.parameterType)"> |
| | | {{ param.parameterType }} |
| | | </el-tag> --> |
| | | <span class="param-value">标准值:{{ param.standardValue }} {{ param.unit }}</span> |
| | | <span v-if="param.valueMode==1" |
| | | class="param-value">标准值:{{ param.standardValue }} {{ param.unit }}</span> |
| | | <span v-else |
| | | class="param-value">标准值:{{ param.minValue }}-{{ param.maxValue }} {{ param.unit }}</span> |
| | | </div> |
| | | <div class="param-actions"> |
| | | <el-button link |
| | |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <!-- 分页控件 --> |
| | | <div class="pagination-container"> |
| | | <el-pagination v-model:current-page="routePage.current" |
| | | v-model:page-size="routePage.size" |
| | | :page-sizes="[10, 20, 50, 100]" |
| | | layout="total, sizes, prev, pager, next, jumper" |
| | | :total="routePage.total" |
| | | @size-change="handleRouteSizeChange" |
| | | @current-change="handleRouteCurrentChange" /> |
| | | </div> |
| | | <!-- 工艺路线新增/编辑对话框 --> |
| | | <el-dialog v-model="routeDialogVisible" |
| | | :title="isRouteEdit ? '编辑工艺路线' : '新增工艺路线'" |
| | |
| | | <el-form-item label="产品名称" |
| | | prop="productModelId"> |
| | | <el-button type="primary" |
| | | @click="showProductSelectDialog = true"> |
| | | @click="handleProcessProductSelectClick2"> |
| | | {{ routeForm.productName && routeForm.productModelName |
| | | ? `${routeForm.productName} - ${routeForm.productModelName}` |
| | | : '选择产品' }} |
| | |
| | | disabled |
| | | placeholder="自动生成" /> |
| | | </el-form-item> |
| | | <el-form-item label="路线描述" |
| | | <el-form-item label="备注" |
| | | prop="description"> |
| | | <el-input v-model="routeForm.description" |
| | | type="textarea" |
| | |
| | | <div class="process-detail-area"> |
| | | <div class="area-title">工序详情</div> |
| | | <el-form v-if="selectedProcessItem" |
| | | :model="selectedProcessItem" |
| | | :model="processForm" |
| | | label-width="100px" |
| | | class="process-detail-form"> |
| | | <el-form-item label="工序编号"> |
| | |
| | | {{ selectedProcessItem.isQuality ? '质检' : '非质检' }} |
| | | </el-tag> |
| | | </el-form-item> |
| | | <!-- <el-form-item label="参数数量"> |
| | | <span class="detail-text">{{ selectedProcessItem.paramCount || 0 }}个</span> |
| | | </el-form-item> --> |
| | | <el-form-item label="产品名称" |
| | | prop="productModelId"> |
| | | <el-button type="primary" |
| | | @click="handleProcessProductSelectClick"> |
| | | {{ processForm.productName && processForm.model |
| | | ? `${processForm.productName} - ${processForm.model}` |
| | | : '选择产品' }} |
| | | </el-button> |
| | | </el-form-item> |
| | | <el-form-item label="单位" |
| | | prop="unit"> |
| | | <el-input v-model="processForm.unit" |
| | | :placeholder="processForm.productModelId ? '根据选择的产品自动带出' : '请先选择产品' " |
| | | clearable |
| | | :disabled="true" /> |
| | | </el-form-item> |
| | | <el-form-item label="是否质检" |
| | | prop="isQuality"> |
| | | <el-switch v-model="processForm.isQuality" |
| | | :active-value="true" |
| | | inactive-value="false" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <el-empty v-else |
| | | description="请从左侧选择工序" /> |
| | |
| | | <span class="dialog-footer"> |
| | | <el-button @click="selectProcessDialogVisible = false">取消</el-button> |
| | | <el-button type="primary" |
| | | :disabled="!selectedProcessItem" |
| | | :disabled="!selectedProcessItem || !processForm.productModelId" |
| | | @click="handleProcessSelectSubmit">确定</el-button> |
| | | </span> |
| | | </template> |
| | |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive, getCurrentInstance } from "vue"; |
| | | import { ref, reactive, getCurrentInstance, onMounted } from "vue"; |
| | | import { ElMessage, ElMessageBox } from "element-plus"; |
| | | import { |
| | | Plus, |
| | |
| | | import { listType } from "@/api/system/dict/type"; |
| | | import { getByModel } from "@/api/productionManagement/productBom.js"; |
| | | import { add, update, del } from "@/api/productionManagement/processRoute.js"; |
| | | import { |
| | | addOrUpdateProcessRouteItem, |
| | | batchDeleteProcessRouteItem, |
| | | sortProcessRouteItem, |
| | | findProcessRouteItemList, |
| | | getProcessParamList, |
| | | addProcessRouteItemParam, |
| | | editProcessRouteItemParam, |
| | | delProcessRouteItemParam, |
| | | } from "@/api/productionManagement/processRouteItem.js"; |
| | | import { list as getProcessListApi } from "@/api/productionManagement/productionProcess.js"; |
| | | import { getBaseParamList } from "@/api/basicData/parameterMaintenance.js"; |
| | | import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue"; |
| | |
| | | // 工艺路线列表 |
| | | const routeList = ref([]); |
| | | const dictTypes = ref([]); |
| | | |
| | | // 工艺路线分页 |
| | | const routePage = reactive({ |
| | | current: 1, |
| | | size: 10, |
| | | total: 0, |
| | | }); |
| | | |
| | | // 获取全局实例 |
| | | const { proxy } = getCurrentInstance(); |
| | |
| | | const getRouteList = () => { |
| | | // 导入 listPage 方法 |
| | | import("@/api/productionManagement/processRoute.js").then(({ listPage }) => { |
| | | listPage({ pageNum: 1, pageSize: 100 }) |
| | | listPage({ pageNum: routePage.current, pageSize: routePage.size }) |
| | | .then(res => { |
| | | // 处理返回的数据,映射到页面需要的格式 |
| | | routeList.value = (res.data?.records || []).map(item => ({ |
| | |
| | | description: item.description || item.description, |
| | | status: item.status, |
| | | expanded: false, |
| | | processList: item.processList || [], |
| | | processList: (item.processList || []).map(process => ({ |
| | | ...process, |
| | | processId: process.processId || process.id, |
| | | expanded: false, |
| | | })), |
| | | })); |
| | | // 更新分页总数 |
| | | routePage.total = res.data?.total || 0; |
| | | }) |
| | | .catch(err => { |
| | | console.error("获取工艺路线列表失败:", err); |
| | | routeList.value = []; |
| | | routePage.total = 0; |
| | | }); |
| | | }); |
| | | }; |
| | |
| | | // 展开/收起工艺路线 |
| | | const toggleExpand = route => { |
| | | route.expanded = !route.expanded; |
| | | if (route.expanded) { |
| | | // 调用接口获取工序列表 |
| | | findProcessRouteItemList({ routeId: route.id }) |
| | | .then(res => { |
| | | route.processList = (res.data || []).map(process => ({ |
| | | ...process, |
| | | processId: process.processId || process.id, |
| | | expanded: false, |
| | | })); |
| | | }) |
| | | .catch(err => { |
| | | console.error("获取工序列表失败:", err); |
| | | route.processList = []; |
| | | }); |
| | | } |
| | | }; |
| | | |
| | | // 展开/收起工序参数 |
| | | const toggleProcessParams = process => { |
| | | process.expanded = !process.expanded; |
| | | if (process.expanded && process.id) { |
| | | // 调用接口获取参数列表 |
| | | getProcessParamList({ |
| | | routeItemId: process.id, |
| | | pageNum: 1, |
| | | pageSize: 1000, |
| | | }) |
| | | .then(res => { |
| | | if (res.code === 200) { |
| | | process.paramList = res.data?.records || []; |
| | | process.paramCount = process.paramList.length; |
| | | } else { |
| | | ElMessage.error(res.msg || "获取参数列表失败"); |
| | | process.paramList = []; |
| | | process.paramCount = 0; |
| | | } |
| | | }) |
| | | .catch(err => { |
| | | console.error("获取参数列表失败:", err); |
| | | ElMessage.error("获取参数列表失败"); |
| | | process.paramList = []; |
| | | process.paramCount = 0; |
| | | }); |
| | | } |
| | | }; |
| | | |
| | | const toggleProcessParams2 = process => { |
| | | if (process.expanded && process.id) { |
| | | // 调用接口获取参数列表 |
| | | getProcessParamList({ |
| | | routeItemId: process.id, |
| | | pageNum: 1, |
| | | pageSize: 1000, |
| | | }) |
| | | .then(res => { |
| | | if (res.code === 200) { |
| | | process.paramList = res.data?.records || []; |
| | | process.paramCount = process.paramList.length; |
| | | } else { |
| | | ElMessage.error(res.msg || "获取参数列表失败"); |
| | | process.paramList = []; |
| | | process.paramCount = 0; |
| | | } |
| | | }) |
| | | .catch(err => { |
| | | console.error("获取参数列表失败:", err); |
| | | ElMessage.error("获取参数列表失败"); |
| | | process.paramList = []; |
| | | process.paramCount = 0; |
| | | }); |
| | | } |
| | | }; |
| | | // 工艺路线操作 |
| | | const handleAddRoute = () => { |
| | | isRouteEdit.value = false; |
| | |
| | | } |
| | | }); |
| | | }; |
| | | const isform2 = ref(null); |
| | | const handleProcessProductSelectClick = () => { |
| | | isform2.value = true; |
| | | showProductSelectDialog.value = true; |
| | | }; |
| | | const handleProcessProductSelectClick2 = () => { |
| | | isform2.value = false; |
| | | showProductSelectDialog.value = true; |
| | | }; |
| | | |
| | | // 产品选择处理 |
| | | const handleProductSelect = async products => { |
| | | if (products && products.length > 0) { |
| | | const product = products[0]; |
| | | // 先查询BOM列表(必选) |
| | | try { |
| | | const res = await getByModel(product.id); |
| | | // 处理返回的BOM数据:可能是数组、对象或包含data字段 |
| | | let bomList = []; |
| | | if (Array.isArray(res)) { |
| | | bomList = res; |
| | | } else if (res && res.data) { |
| | | bomList = Array.isArray(res.data) ? res.data : [res.data]; |
| | | } else if (res && typeof res === "object") { |
| | | bomList = [res]; |
| | | } |
| | | if (isform2.value) { |
| | | // 帮我写工序中的选择产品的回调,并且把字段加进processForm |
| | | if (products && products.length > 0) { |
| | | const product = products[0]; |
| | | console.log("product:", product); |
| | | // 把product中的字段添加到processForm中 |
| | | // Object.assign(processForm, product); |
| | | processForm.productModelId = product.id; |
| | | processForm.productName = product.productName; |
| | | processForm.model = product.model; |
| | | processForm.unit = product.unit || ""; |
| | | console.log("processForm:", processForm); |
| | | |
| | | if (bomList.length > 0) { |
| | | routeForm.productModelId = product.id; |
| | | routeForm.productName = product.productName; |
| | | routeForm.productModelName = product.model; |
| | | routeForm.bomId = undefined; // 重置BOM选择 |
| | | bomOptions.value = bomList; |
| | | showProductSelectDialog.value = false; |
| | | // 触发表单验证更新 |
| | | proxy.$refs["routeFormRef"]?.validateField("productModelId"); |
| | | } else { |
| | | // 触发表单验证更新 |
| | | proxy.$refs["processFormRef"]?.validateField("productModelId"); |
| | | } |
| | | } else { |
| | | if (products && products.length > 0) { |
| | | const product = products[0]; |
| | | // 先查询BOM列表(必选) |
| | | try { |
| | | const res = await getByModel(product.id); |
| | | // 处理返回的BOM数据:可能是数组、对象或包含data字段 |
| | | let bomList = []; |
| | | if (Array.isArray(res)) { |
| | | bomList = res; |
| | | } else if (res && res.data) { |
| | | bomList = Array.isArray(res.data) ? res.data : [res.data]; |
| | | } else if (res && typeof res === "object") { |
| | | bomList = [res]; |
| | | } |
| | | console.log("bomList:", bomList); |
| | | if (bomList.length > 0) { |
| | | routeForm.productModelId = product.id; |
| | | routeForm.productName = product.productName; |
| | | routeForm.productModelName = product.model; |
| | | routeForm.bomId = undefined; // 重置BOM选择 |
| | | bomOptions.value = bomList; |
| | | showProductSelectDialog.value = false; |
| | | // 触发表单验证更新 |
| | | proxy.$refs["routeFormRef"]?.validateField("productModelId"); |
| | | } else { |
| | | proxy.$modal.msgError("该产品没有BOM,请先创建BOM"); |
| | | } |
| | | } catch (error) { |
| | | // 如果接口返回404或其他错误,说明没有BOM |
| | | proxy.$modal.msgError("该产品没有BOM,请先创建BOM"); |
| | | } |
| | | } catch (error) { |
| | | // 如果接口返回404或其他错误,说明没有BOM |
| | | proxy.$modal.msgError("该产品没有BOM,请先创建BOM"); |
| | | } |
| | | } |
| | | }; |
| | |
| | | }); |
| | | }); |
| | | }; |
| | | |
| | | // 工序操作 |
| | | const handleSelectProcess = (route, index) => { |
| | | console.log("route:", route); |
| | | currentRouteId.value = route.id; |
| | | currentRouteIndex.value = index; |
| | | // 获取可选工序列表 |
| | | getProcessListApi() |
| | | .then(res => { |
| | | // 处理返回的数据,映射到页面需要的格式 |
| | | availableProcessList.value = (res.data || []).map(item => ({ |
| | | id: item.id, |
| | | no: item.no || item.no, |
| | | name: item.name || item.name, |
| | | remark: item.remark || item.remark, |
| | | status: item.status, |
| | | isQuality: item.isQuality, |
| | | })); |
| | | filteredProcessList.value = availableProcessList.value; |
| | | processSearchKeyword.value = ""; |
| | | selectedProcessItem.value = null; |
| | | selectProcessDialogVisible.value = true; |
| | | }) |
| | | .catch(() => { |
| | | ElMessage.error("获取工序列表失败"); |
| | | }); |
| | | // 重置搜索和选择状态 |
| | | filteredProcessList.value = availableProcessList.value; |
| | | processSearchKeyword.value = ""; |
| | | selectedProcessItem.value = null; |
| | | selectProcessDialogVisible.value = true; |
| | | }; |
| | | const dragSort = ref(0); |
| | | const currentId = ref(null); |
| | | // 修改工序 |
| | | const handleEditProcessSelect = (route, index, process) => { |
| | | console.log("route:", route); |
| | | console.log("process:", process); |
| | | currentId.value = process.id; |
| | | currentRouteId.value = route.id; |
| | | currentRouteIndex.value = index; |
| | | // 重置搜索和选择状态 |
| | | filteredProcessList.value = availableProcessList.value; |
| | | processSearchKeyword.value = ""; |
| | | // 设置选中的工序 |
| | | filteredProcessList.value.map(item => { |
| | | if (item.id === process.processId) { |
| | | selectedProcessItem.value = item; |
| | | } |
| | | }); |
| | | dragSort.value = process.dragSort; |
| | | // selectedProcessItem.value = process; |
| | | // 填充产品选择表单 |
| | | processForm.productModelId = process.productModelId; |
| | | processForm.productName = process.productName; |
| | | processForm.model = process.model; |
| | | processForm.processId = process.no; |
| | | // processForm.name = process.name; |
| | | processForm.unit = process.unit || ""; |
| | | processForm.isQuality = process.isQuality || false; |
| | | selectProcessDialogVisible.value = true; |
| | | }; |
| | | |
| | | const handleEditProcess = (routeId, process) => { |
| | |
| | | cancelButtonText: "取消", |
| | | type: "warning", |
| | | }).then(() => { |
| | | ElMessage.success("删除成功"); |
| | | getRouteList(); |
| | | // 调用API删除工序 |
| | | batchDeleteProcessRouteItem([process.id]) |
| | | .then(res => { |
| | | ElMessage.success("删除成功"); |
| | | // 调用接口更新工序列表 |
| | | findProcessRouteItemList({ routeId: routeId }) |
| | | .then(res => { |
| | | const route = routeList.value.find(r => r.id === routeId); |
| | | if (route) { |
| | | route.processList = (res.data || []).map(process => ({ |
| | | ...process, |
| | | processId: process.processId || process.id, |
| | | expanded: false, |
| | | })); |
| | | } |
| | | }) |
| | | .catch(err => { |
| | | console.error("获取工序列表失败:", err); |
| | | }); |
| | | }) |
| | | .catch(err => { |
| | | ElMessage.error("删除失败"); |
| | | console.error("删除工序失败:", err); |
| | | }); |
| | | }); |
| | | }; |
| | | |
| | |
| | | if (valid) { |
| | | ElMessage.success(isProcessEdit.value ? "编辑成功" : "新增成功"); |
| | | processDialogVisible.value = false; |
| | | getRouteList(); |
| | | // 调用接口更新工序列表 |
| | | if (currentRouteId.value) { |
| | | findProcessRouteItemList({ routeId: currentRouteId.value }) |
| | | .then(res => { |
| | | const route = routeList.value.find( |
| | | r => r.id === currentRouteId.value |
| | | ); |
| | | if (route) { |
| | | route.processList = (res.data || []).map(process => ({ |
| | | ...process, |
| | | processId: process.processId || process.id, |
| | | expanded: false, |
| | | })); |
| | | } |
| | | }) |
| | | .catch(err => { |
| | | console.error("获取工序列表失败:", err); |
| | | }); |
| | | } |
| | | } |
| | | }); |
| | | }; |
| | |
| | | if (!keyword) { |
| | | filteredProcessList.value = availableProcessList.value; |
| | | } else { |
| | | filteredProcessList.value = availableProcessList.value.filter(item => |
| | | item.name.toLowerCase().includes(keyword) |
| | | filteredProcessList.value = availableProcessList.value.filter( |
| | | item => |
| | | (item.name && item.name.toLowerCase().includes(keyword)) || |
| | | (item.no && item.no.toLowerCase().includes(keyword)) |
| | | ); |
| | | } |
| | | }; |
| | | |
| | | const handleProcessSelect = row => { |
| | | selectedProcessItem.value = row; |
| | | // 重置产品选择表单 |
| | | processForm.productModelId = undefined; |
| | | processForm.productName = ""; |
| | | processForm.productModelName = ""; |
| | | processForm.unit = ""; |
| | | processForm.isQuality = row.isQuality || false; |
| | | }; |
| | | |
| | | // 处理工序选择时的产品选择 |
| | | const handleProcessProductSelect = async products => { |
| | | if (products && products.length > 0) { |
| | | const product = products[0]; |
| | | processForm.productModelId = product.id; |
| | | processForm.productName = product.productName; |
| | | processForm.productModelName = product.model; |
| | | processForm.unit = product.unit || ""; |
| | | showProductSelectDialog.value = false; |
| | | } |
| | | }; |
| | | |
| | | const handleProcessSelectSubmit = () => { |
| | |
| | | return; |
| | | } |
| | | |
| | | // 检查工序是否已存在 |
| | | const route = routeList.value[currentRouteIndex.value]; |
| | | const exists = route.processList.some( |
| | | p => p.id === selectedProcessItem.value.id |
| | | ); |
| | | if (exists) { |
| | | ElMessage.warning("该工序已存在于工艺路线中"); |
| | | if (!processForm.productModelId) { |
| | | ElMessage.warning("请选择产品"); |
| | | return; |
| | | } |
| | | |
| | | // 添加工序到工艺路线 |
| | | const newProcess = { |
| | | id: Date.now(), |
| | | no: selectedProcessItem.value.no, |
| | | name: selectedProcessItem.value.name, |
| | | remark: selectedProcessItem.value.remark, |
| | | status: selectedProcessItem.value.status, |
| | | paramList: [], |
| | | expanded: false, |
| | | // 构建请求参数 |
| | | const params = { |
| | | routeId: currentRouteId.value, |
| | | processId: selectedProcessItem.value.id, |
| | | dragSort: routePage.total + 1, |
| | | ...processForm, |
| | | }; |
| | | |
| | | route.processList.push(newProcess); |
| | | ElMessage.success("添加工序成功"); |
| | | selectProcessDialogVisible.value = false; |
| | | // 如果是修改操作,添加id参数 |
| | | if (selectedProcessItem.value.id) { |
| | | params.id = currentId.value; |
| | | params.dragSort = dragSort.value; |
| | | } |
| | | |
| | | // 调用API添加工序或修改工序 |
| | | addOrUpdateProcessRouteItem(params) |
| | | .then(res => { |
| | | ElMessage.success( |
| | | selectedProcessItem.value.id ? "修改工序成功" : "添加工序成功" |
| | | ); |
| | | selectProcessDialogVisible.value = false; |
| | | // 调用接口更新工序列表 |
| | | findProcessRouteItemList({ routeId: currentRouteId.value }) |
| | | .then(res => { |
| | | const route = routeList.value.find( |
| | | r => r.id === currentRouteId.value |
| | | ); |
| | | if (route) { |
| | | route.processList = (res.data || []).map(process => ({ |
| | | ...process, |
| | | processId: process.processId || process.id, |
| | | expanded: false, |
| | | })); |
| | | } |
| | | }) |
| | | .catch(err => { |
| | | console.error("获取工序列表失败:", err); |
| | | }); |
| | | }) |
| | | .catch(err => { |
| | | ElMessage.error( |
| | | selectedProcessItem.value.id ? "修改工序失败" : "添加工序失败" |
| | | ); |
| | | console.error( |
| | | selectedProcessItem.value.id ? "修改工序失败:" : "添加工序失败:", |
| | | err |
| | | ); |
| | | }); |
| | | }; |
| | | |
| | | // 参数操作 |
| | |
| | | cancelButtonText: "取消", |
| | | type: "warning", |
| | | }).then(() => { |
| | | ElMessage.success("删除成功"); |
| | | getRouteList(); |
| | | // 调用API删除参数 |
| | | delProcessRouteItemParam(param.id) |
| | | .then(res => { |
| | | ElMessage.success("删除成功"); |
| | | // 刷新参数列表 |
| | | toggleProcessParams2(process); |
| | | }) |
| | | .catch(err => { |
| | | ElMessage.error("删除参数失败"); |
| | | console.error("删除参数失败:", err); |
| | | }); |
| | | }); |
| | | }; |
| | | |
| | |
| | | }); |
| | | }; |
| | | |
| | | // 工艺路线分页处理 |
| | | const handleRouteSizeChange = size => { |
| | | routePage.size = size; |
| | | getRouteList(); |
| | | }; |
| | | |
| | | const handleRouteCurrentChange = current => { |
| | | routePage.current = current; |
| | | getRouteList(); |
| | | }; |
| | | |
| | | const handleParamSelectSubmit = () => { |
| | | if (!selectedParam.value) { |
| | | ElMessage.warning("请先选择一个参数"); |
| | |
| | | |
| | | if (route && process) { |
| | | // 检查参数是否已存在 |
| | | const exists = process.paramList?.some( |
| | | p => |
| | | p.paramId === selectedParam.value.id || |
| | | p.parameterCode === selectedParam.value.paramCode |
| | | ); |
| | | if (exists) { |
| | | ElMessage.warning("该参数已存在于工序中"); |
| | | return; |
| | | } |
| | | // const exists = process.paramList?.some( |
| | | // p => |
| | | // p.paramId === selectedParam.value.id || |
| | | // p.parameterCode === selectedParam.value.paramCode |
| | | // ); |
| | | // if (exists) { |
| | | // ElMessage.warning("该参数已存在于工序中"); |
| | | // return; |
| | | // } |
| | | |
| | | // 添加工序到工艺路线 |
| | | const newParam = { |
| | | id: Date.now(), |
| | | // 调用API新增参数 |
| | | addProcessRouteItemParam({ |
| | | routeItemId: process.id, |
| | | paramId: selectedParam.value.id, |
| | | parameterCode: selectedParam.value.paramCode, |
| | | parameterName: selectedParam.value.paramName, |
| | | parameterType2: selectedParam.value.valueMode || "1", |
| | | parameterType: selectedParam.value.paramType, |
| | | parameterFormat: selectedParam.value.paramFormat, |
| | | standardValue: selectedParam.value.standardValue, |
| | | minValue: selectedParam.value.minValue, |
| | | maxValue: selectedParam.value.maxValue, |
| | | unit: selectedParam.value.unit, |
| | | sort: selectedParam.value.sort || 1, |
| | | standardValue: selectedParam.value.standardValue || "", |
| | | minValue: selectedParam.value.minValue || 0, |
| | | maxValue: selectedParam.value.maxValue || 0, |
| | | isRequired: selectedParam.value.isRequired || 0, |
| | | }; |
| | | |
| | | if (!process.paramList) { |
| | | process.paramList = []; |
| | | } |
| | | |
| | | process.paramList.push(newParam); |
| | | ElMessage.success("添加参数成功"); |
| | | selectParamDialogVisible.value = false; |
| | | }) |
| | | .then(res => { |
| | | ElMessage.success("添加参数成功"); |
| | | selectParamDialogVisible.value = false; |
| | | // 刷新参数列表 |
| | | toggleProcessParams2(process); |
| | | }) |
| | | .catch(err => { |
| | | ElMessage.error("添加参数失败"); |
| | | console.error("添加参数失败:", err); |
| | | }); |
| | | } |
| | | }; |
| | | |
| | | const handleEditParamSubmit = () => { |
| | | editParamFormRef.value.validate(valid => { |
| | | if (valid) { |
| | | // 找到对应的工艺路线、工序和参数 |
| | | const route = routeList.value.find(r => r.id === currentRouteId.value); |
| | | const process = route?.processList.find( |
| | | p => p.id === currentProcessId.value |
| | | ); |
| | | const param = process?.paramList.find(p => p.id === editParamForm.id); |
| | | |
| | | if (param) { |
| | | // 更新参数信息 |
| | | param.standardValue = editParamForm.standardValue; |
| | | param.minValue = editParamForm.minValue; |
| | | param.maxValue = editParamForm.maxValue; |
| | | param.sort = editParamForm.sort; |
| | | param.isRequired = editParamForm.isRequired; |
| | | |
| | | ElMessage.success("编辑成功"); |
| | | editParamDialogVisible.value = false; |
| | | } |
| | | // 调用API修改参数 |
| | | editProcessRouteItemParam({ |
| | | id: editParamForm.id, |
| | | routeItemId: currentProcessId.value, |
| | | paramId: editParamForm.paramId, |
| | | standardValue: editParamForm.standardValue || "", |
| | | minValue: editParamForm.minValue || 0, |
| | | maxValue: editParamForm.maxValue || 0, |
| | | isRequired: editParamForm.isRequired || 0, |
| | | }) |
| | | .then(res => { |
| | | ElMessage.success("编辑成功"); |
| | | editParamDialogVisible.value = false; |
| | | // 找到对应的工艺路线和工序 |
| | | const route = routeList.value.find( |
| | | r => r.id === currentRouteId.value |
| | | ); |
| | | const process = route?.processList.find( |
| | | p => p.id === currentProcessId.value |
| | | ); |
| | | // 刷新参数列表 |
| | | if (process) { |
| | | toggleProcessParams2(process); |
| | | } |
| | | }) |
| | | .catch(err => { |
| | | ElMessage.error("编辑参数失败"); |
| | | console.error("编辑参数失败:", err); |
| | | }); |
| | | } |
| | | }); |
| | | }; |
| | |
| | | const route = routeList.value.find(r => r.id === routeId); |
| | | if (route && route.processList) { |
| | | const draggedProcess = route.processList[draggedItem.value]; |
| | | route.processList.splice(draggedItem.value, 1); |
| | | route.processList.splice(dropIndex, 0, draggedProcess); |
| | | ElMessage.success("排序成功"); |
| | | |
| | | // 计算新的排序值 |
| | | const newDragSort = dropIndex + 1; |
| | | |
| | | // 调用API排序工序 |
| | | sortProcessRouteItem({ |
| | | id: draggedProcess.id, |
| | | dragSort: newDragSort, |
| | | }) |
| | | .then(res => { |
| | | // 调用接口获取最新的工序列表 |
| | | findProcessRouteItemList({ routeId: routeId }) |
| | | .then(res => { |
| | | if (route) { |
| | | route.processList = (res.data || []).map(process => ({ |
| | | ...process, |
| | | processId: process.processId || process.id, |
| | | expanded: false, |
| | | })); |
| | | } |
| | | ElMessage.success("排序成功"); |
| | | }) |
| | | .catch(err => { |
| | | console.error("获取工序列表失败:", err); |
| | | ElMessage.success("排序成功"); |
| | | }); |
| | | }) |
| | | .catch(err => { |
| | | ElMessage.error("排序失败"); |
| | | console.error("排序工序失败:", err); |
| | | }); |
| | | } |
| | | }; |
| | | |
| | |
| | | |
| | | getRouteList(); |
| | | getDictTypes(); |
| | | |
| | | // 页面加载时获取工序列表 |
| | | onMounted(() => { |
| | | getProcessListApi() |
| | | .then(res => { |
| | | // 处理返回的数据,映射到页面需要的格式 |
| | | availableProcessList.value = (res.data || []).map(item => ({ |
| | | id: item.id, |
| | | no: item.no || item.no, |
| | | name: item.name || item.name, |
| | | remark: item.remark || item.remark, |
| | | status: item.status, |
| | | isQuality: item.isQuality, |
| | | })); |
| | | filteredProcessList.value = availableProcessList.value; |
| | | }) |
| | | .catch(() => { |
| | | ElMessage.error("获取工序列表失败"); |
| | | }); |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | .app-container { |
| | | padding: 20px; |
| | | padding-bottom: 80px; |
| | | background-color: #f0f2f5; |
| | | min-height: calc(100vh - 84px); |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .route-header { |
| | |
| | | } |
| | | |
| | | .route-card-list { |
| | | display: flex; |
| | | flex-direction: column; |
| | | display: grid; |
| | | grid-template-columns: repeat(1, 1fr); |
| | | gap: 20px; |
| | | max-height: calc(100vh - 240px); |
| | | overflow-y: auto; |
| | | padding-right: 10px; |
| | | } |
| | | |
| | | /* 自定义滚动条样式 */ |
| | | .route-card-list::-webkit-scrollbar { |
| | | width: 8px; |
| | | } |
| | | |
| | | .route-card-list::-webkit-scrollbar-track { |
| | | background: #f1f1f1; |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | .route-card-list::-webkit-scrollbar-thumb { |
| | | background: #c1c1c1; |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | .route-card-list::-webkit-scrollbar-thumb:hover { |
| | | background: #a8a8a8; |
| | | } |
| | | |
| | | .route-card { |
| | |
| | | align-items: center; |
| | | justify-content: center; |
| | | min-width: 100px; |
| | | height: 175px; |
| | | height: 137px; |
| | | border: 2px dashed #dcdfe6; |
| | | border-radius: 12px; |
| | | background: #fafafa; |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 分页控件样式 |
| | | .pagination-container { |
| | | position: fixed; |
| | | bottom: 0; |
| | | left: 0; |
| | | right: 0; |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | padding: 16px 20px; |
| | | background-color: #fff !important; |
| | | border-top: 1px solid #ebeef5; |
| | | box-shadow: 0 -2px 12px 0 rgba(0, 0, 0, 0.1); |
| | | z-index: 100; |
| | | |
| | | .el-pagination { |
| | | .el-pagination__sizes { |
| | | margin-right: 16px; |
| | | } |
| | | |
| | | .el-pagination__jump { |
| | | margin-left: 16px; |
| | | } |
| | | |
| | | .el-pagination__total { |
| | | color: #606266; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .el-pagination__button { |
| | | border-radius: 4px; |
| | | transition: all 0.3s ease; |
| | | |
| | | &:hover:not(:disabled) { |
| | | color: #409eff; |
| | | border-color: #409eff; |
| | | } |
| | | } |
| | | |
| | | .el-pagination__button--active { |
| | | background-color: #409eff; |
| | | border-color: #409eff; |
| | | color: #fff; |
| | | } |
| | | } |
| | | } |
| | | </style> |