| | |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="销售合同号" prop="salesContractNo"> |
| | | <el-input v-model="formState.salesContractNo" placeholder="请输入销售合同号" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="客户名称" prop="customerName"> |
| | | <el-input v-model="formState.customerName" placeholder="请输入客户名称" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="需求数量" prop="quantity"> |
| | | <el-input-number v-model="formState.quantity" :step="1" :min="1" style="width: 100%" /> |
| | | </el-form-item> |
| | |
| | | </el-button> |
| | | </div> |
| | | <div class="table-container"> |
| | | <el-table :data="productionTaskList" border size="small" class="compact-table"> |
| | | <el-table :data="processRouteItems" border size="small" class="compact-table"> |
| | | <el-table-column type="index" label="序号" width="60" /> |
| | | <el-table-column label="工序名称" min-width="150"> |
| | | <template #default="{ row }"> |
| | |
| | | </el-select> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="计划数" min-width="120"> |
| | | <el-table-column label="报工权限" min-width="180"> |
| | | <template #default="{ row }"> |
| | | <el-input-number v-model="row.planQuantity" :min="0" style="width: 100%" /> |
| | | <el-select |
| | | v-model="row.userPower" |
| | | multiple |
| | | collapse-tags |
| | | collapse-tags-tooltip |
| | | placeholder="请选择报工权限" |
| | | style="width: 100%" |
| | | > |
| | | <el-option |
| | | v-for="item in userOptions" |
| | | :key="item.userId" |
| | | :label="item.nickName" |
| | | :value="item.nickName" |
| | | /> |
| | | </el-select> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="报工权限" min-width="150"> |
| | | <el-table-column label="计划数" min-width="100"> |
| | | <template #default="{ row }"> |
| | | <el-input v-model="row.reportPermission" placeholder="请输入报工权限" /> |
| | | <el-input-number v-model="row.planNum" :min="1" size="small" style="width: 100%" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="是否质检" min-width="100"> |
| | | <template #default="{ row }"> |
| | | <el-switch v-model="row.isQuality" :active-value="true" :inactive-value="false" size="small" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="计划开始时间" min-width="180"> |
| | | <template #default="{ row }"> |
| | | <el-date-picker |
| | | v-model="row.planStartTime" |
| | | type="datetime" |
| | | type="date" |
| | | placeholder="选择开始时间" |
| | | style="width: 100%" |
| | | format="YYYY-MM-DD HH:mm" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | format="YYYY-MM-DD" |
| | | value-format="YYYY-MM-DD" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | <template #default="{ row }"> |
| | | <el-date-picker |
| | | v-model="row.planEndTime" |
| | | type="datetime" |
| | | type="date" |
| | | placeholder="选择结束时间" |
| | | style="width: 100%" |
| | | format="YYYY-MM-DD HH:mm" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | format="YYYY-MM-DD" |
| | | value-format="YYYY-MM-DD" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" width="80" fixed="right" align="center"> |
| | | <template #default="{ $index }"> |
| | | <el-button type="danger" link size="small" @click="removeProductionTask($index)"> |
| | | <el-button type="danger" link size="small" @click="removeProcessRouteItem($index)"> |
| | | <el-icon><Delete /></el-icon> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <div v-if="productionTaskList.length === 0" class="empty-tip"> |
| | | <div v-if="processRouteItems.length === 0" class="empty-tip"> |
| | | <el-empty description="暂无生产任务,点击上方按钮添加" :image-size="60" /> |
| | | </div> |
| | | </div> |
| | |
| | | </el-button> |
| | | </div> |
| | | <div class="table-container"> |
| | | <el-table :data="materialList" border size="small" class="compact-table"> |
| | | <el-table :data="productStructureRecords" border size="small" class="compact-table"> |
| | | <el-table-column type="index" label="序号" width="50" align="center" /> |
| | | <el-table-column label="图纸编号" min-width="140"> |
| | | <template #default="{ row }"> |
| | | <el-input v-model="row.drawingNumber" placeholder="请输入图纸编号" size="small" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="产品名称" min-width="140"> |
| | | <template #default="{ row }"> |
| | | <el-input v-model="row.productName" placeholder="请输入产品名称" size="small" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="单位用量" min-width="100"> |
| | | <el-table-column label="单位产出需要数量" min-width="140"> |
| | | <template #default="{ row }"> |
| | | <el-input-number v-model="row.unitQuantity" :min="0" :precision="2" size="small" style="width: 100%" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="库存数量" min-width="100"> |
| | | <el-table-column label="需求数量" min-width="120"> |
| | | <template #default="{ row }"> |
| | | <el-input-number v-model="row.inventoryQuantity" :min="0" size="small" style="width: 100%" /> |
| | | <el-input-number v-model="row.demandedQuantity" :min="0" :precision="2" size="small" style="width: 100%" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="单位" min-width="80"> |
| | | <template #default="{ row }"> |
| | | <el-input v-model="row.unit" placeholder="请输入" size="small" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="bomId" min-width="100"> |
| | | <template #default="{ row }"> |
| | | <el-input-number v-model="row.bomId" :min="0" size="small" style="width: 100%" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" width="80" fixed="right" align="center"> |
| | | <template #default="{ $index }"> |
| | | <el-button type="danger" link size="small" @click="removeMaterialItem($index)"> |
| | | <el-button type="danger" link size="small" @click="removeProductStructureRecord($index)"> |
| | | <el-icon><Delete /></el-icon> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <div v-if="materialList.length === 0" class="empty-tip"> |
| | | <div v-if="productStructureRecords.length === 0" class="empty-tip"> |
| | | <el-empty description="暂无用料清单,点击上方按钮添加" :image-size="60" /> |
| | | </div> |
| | | </div> |
| | |
| | | import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue"; |
| | | import {addProductOrder, listProcessRoute} from "@/api/productionManagement/productionOrder.js"; |
| | | import {list as listProcess} from "@/api/productionManagement/productionProcess.js"; |
| | | import {listDeptUserTree} from "@/api/basicData/productProcess.js"; |
| | | |
| | | const props = defineProps({ |
| | | visible: { |
| | |
| | | unit: "", |
| | | drawingNumber: "", |
| | | quantity: 0, |
| | | salesContractNo: "", |
| | | customerName: "", |
| | | deliveryDate: "", |
| | | }); |
| | | |
| | | // 生产任务列表 |
| | | const productionTaskList = ref([]); |
| | | // 工序路线明细列表 |
| | | const processRouteItems = ref([]); |
| | | |
| | | // 用料清单列表 |
| | | const materialList = ref([]); |
| | | // 物料清单列表 |
| | | const productStructureRecords = ref([]); |
| | | |
| | | // 工序列表 |
| | | const processOptions = ref([]); |
| | | |
| | | // 用户列表 |
| | | const userOptions = ref([]); |
| | | |
| | | // 文件列表 |
| | | const fileList = ref([]); |
| | |
| | | }); |
| | | }; |
| | | |
| | | // 组件挂载时获取工序列表 |
| | | // 获取用户列表 |
| | | const fetchUserOptions = () => { |
| | | listDeptUserTree().then(res => { |
| | | const users = []; |
| | | const extractUsers = (nodes) => { |
| | | nodes.forEach(node => { |
| | | if (node.userList && node.userList.length > 0) { |
| | | node.userList.forEach(user => { |
| | | users.push({ |
| | | userId: user.userId, |
| | | nickName: user.nickName || user.userName |
| | | }); |
| | | }); |
| | | } |
| | | if (node.childrenList && node.childrenList.length > 0) { |
| | | extractUsers(node.childrenList); |
| | | } |
| | | }); |
| | | }; |
| | | extractUsers(res.data || []); |
| | | userOptions.value = users; |
| | | }); |
| | | }; |
| | | |
| | | // 组件挂载时获取数据 |
| | | fetchProcessOptions(); |
| | | fetchUserOptions(); |
| | | |
| | | let { proxy } = getCurrentInstance() |
| | | |
| | |
| | | productModelName: "", |
| | | unit: "", |
| | | quantity: 0, |
| | | salesContractNo: "", |
| | | customerName: "", |
| | | deliveryDate: "", |
| | | }; |
| | | // 重置生产任务和用料清单 |
| | | productionTaskList.value = []; |
| | | materialList.value = []; |
| | | // 重置工序路线明细和物料清单 |
| | | processRouteItems.value = []; |
| | | productStructureRecords.value = []; |
| | | fileList.value = []; |
| | | isShow.value = false; |
| | | }; |
| | |
| | | if (selectedProcess) { |
| | | row.processName = selectedProcess.name; |
| | | row.processNo = selectedProcess.no; |
| | | row.isQuality = selectedProcess.isQuality || false; |
| | | // userPower是逗号分隔的用户名,转换为数组 |
| | | if (selectedProcess.userPower) { |
| | | row.userPower = selectedProcess.userPower.split(','); |
| | | } else { |
| | | row.userPower = []; |
| | | } |
| | | } |
| | | }; |
| | | |
| | | // 添加生产任务 |
| | | const addProductionTask = () => { |
| | | productionTaskList.value.push({ |
| | | processRouteItems.value.push({ |
| | | processId: undefined, |
| | | processName: "", |
| | | processNo: "", |
| | | planQuantity: 1, |
| | | reportPermission: "", |
| | | productModelId: undefined, |
| | | userPower: [], |
| | | planStartTime: "", |
| | | planEndTime: "", |
| | | planNum: 1, |
| | | isQuality: false, |
| | | }); |
| | | }; |
| | | |
| | | // 删除生产任务 |
| | | const removeProductionTask = (index) => { |
| | | productionTaskList.value.splice(index, 1); |
| | | // 删除工序路线明细 |
| | | const removeProcessRouteItem = (index) => { |
| | | processRouteItems.value.splice(index, 1); |
| | | }; |
| | | |
| | | // 添加用料 - 弹出产品选择框 |
| | |
| | | const handleMaterialProductSelect = (products) => { |
| | | if (products && products.length > 0) { |
| | | products.forEach(product => { |
| | | materialList.value.push({ |
| | | productStructureRecords.value.push({ |
| | | productModelId: product.id, |
| | | drawingNumber: product.model, |
| | | productName: product.productName, |
| | | unit: product.unit, |
| | | parentId: undefined, |
| | | productOrderId: undefined, |
| | | processId: undefined, |
| | | unitQuantity: 1, |
| | | inventoryQuantity: 0, |
| | | demandedQuantity: 1, |
| | | unit: product.unit, |
| | | bomId: undefined, |
| | | }); |
| | | }); |
| | | } |
| | | showMaterialProductDialog.value = false; |
| | | }; |
| | | |
| | | // 删除用料 |
| | | const removeMaterialItem = (index) => { |
| | | materialList.value.splice(index, 1); |
| | | // 删除物料清单 |
| | | const removeProductStructureRecord = (index) => { |
| | | productStructureRecords.value.splice(index, 1); |
| | | }; |
| | | |
| | | // 文件上传变更 |
| | |
| | | return; |
| | | } |
| | | |
| | | // 处理提交数据 - 将userPower数组转换为逗号分隔的字符串 |
| | | const processedProcessRouteItems = processRouteItems.value.map(item => ({ |
| | | ...item, |
| | | userPower: Array.isArray(item.userPower) ? item.userPower.join(',') : item.userPower |
| | | })); |
| | | |
| | | // 组装提交数据 |
| | | const submitData = { |
| | | ...formState.value, |
| | | productionTasks: productionTaskList.value, |
| | | materials: materialList.value, |
| | | processRouteItems: processedProcessRouteItems, |
| | | productStructureRecords: productStructureRecords.value, |
| | | files: fileList.value, |
| | | }; |
| | | |