| | |
| | | prefix-icon="Search" /> |
| | | </div> |
| | | <div class="search-item"> |
| | | <span class="search_title">生产订单号:</span> |
| | | <el-input v-model="searchForm.productOrderNpsNo" |
| | | style="width: 240px" |
| | | placeholder="请输入" |
| | | @change="handleQuery" |
| | | clearable |
| | | prefix-icon="Search" /> |
| | | </div> |
| | | <div class="search-item"> |
| | | <el-button type="primary" |
| | | @click="handleQuery">搜索</el-button> |
| | | </div> |
| | |
| | | </template> |
| | | </el-dialog> |
| | | |
| | | <el-dialog v-model="materialDialogVisible" |
| | | title="物料" |
| | | width="1200px" |
| | | @close="handleCloseMaterialDialog"> |
| | | <el-table v-loading="materialTableLoading" |
| | | :data="materialTableData" |
| | | border |
| | | row-key="id"> |
| | | <el-table-column label="工序名称" |
| | | prop="processName" |
| | | min-width="140" /> |
| | | <el-table-column label="原料名称" |
| | | prop="materialName" |
| | | min-width="140" /> |
| | | <el-table-column label="原料型号" |
| | | prop="materialModel" |
| | | min-width="140" /> |
| | | <el-table-column label="计量单位" |
| | | prop="unit" |
| | | min-width="100" /> |
| | | <el-table-column label="领用数量" |
| | | prop="pickQty" |
| | | min-width="100" /> |
| | | <el-table-column label="补料数量" |
| | | prop="supplementQty" |
| | | min-width="100" /> |
| | | <el-table-column label="退料数量" |
| | | prop="returnQty" |
| | | min-width="100" /> |
| | | <el-table-column label="实际数量" |
| | | prop="actualQty" |
| | | min-width="100" /> |
| | | <el-table-column label="操作" |
| | | align="center" |
| | | fixed="right" |
| | | width="220"> |
| | | <template #default="{ row }"> |
| | | <el-button type="primary" |
| | | link |
| | | @click="openSupplementDialog(row)">补料</el-button> |
| | | <el-button type="warning" |
| | | link |
| | | @click="openReturnDialog(row)">退料</el-button> |
| | | <el-button type="info" |
| | | link |
| | | @click="openSupplementRecordDialog(row)">补料记录</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-dialog> |
| | | |
| | | <FormDialog v-model="supplementDialogVisible" |
| | | title="补料" |
| | | width="500px" |
| | | @confirm="handleSubmitSupplement"> |
| | | <el-form ref="supplementFormRef" |
| | | :model="supplementForm" |
| | | :rules="supplementRules" |
| | | label-width="100px"> |
| | | <el-form-item label="补料数量" |
| | | prop="supplementQty"> |
| | | <el-input-number v-model="supplementForm.supplementQty" |
| | | :min="0.001" |
| | | :precision="3" |
| | | :step="1" |
| | | style="width: 100%;" /> |
| | | </el-form-item> |
| | | <el-form-item label="补料原因" |
| | | prop="supplementReason"> |
| | | <el-input v-model="supplementForm.supplementReason" |
| | | type="textarea" |
| | | :rows="3" |
| | | maxlength="200" |
| | | show-word-limit |
| | | placeholder="请输入补料原因" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button type="primary" |
| | | :loading="supplementSubmitting" |
| | | @click="handleSubmitSupplement">确定</el-button> |
| | | <el-button @click="supplementDialogVisible = false">取消</el-button> |
| | | </span> |
| | | </template> |
| | | </FormDialog> |
| | | |
| | | <FormDialog v-model="returnDialogVisible" |
| | | title="退料" |
| | | width="500px" |
| | | @confirm="handleSubmitReturn"> |
| | | <el-form ref="returnFormRef" |
| | | :model="returnForm" |
| | | :rules="returnRules" |
| | | label-width="120px"> |
| | | <el-form-item label="退料数量" |
| | | prop="returnQty"> |
| | | <el-input-number v-model="returnForm.returnQty" |
| | | :min="0.001" |
| | | :precision="3" |
| | | :step="1" |
| | | style="width: 100%;" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button type="primary" |
| | | :loading="returnSubmitting" |
| | | @click="handleSubmitReturn">确定</el-button> |
| | | <el-button @click="returnDialogVisible = false">取消</el-button> |
| | | </span> |
| | | </template> |
| | | </FormDialog> |
| | | |
| | | <el-dialog v-model="supplementRecordDialogVisible" |
| | | title="补料记录" |
| | | width="900px"> |
| | | <el-table v-loading="supplementRecordLoading" |
| | | :data="supplementRecordTableData" |
| | | border |
| | | row-key="id"> |
| | | <el-table-column label="补料数量" |
| | | prop="supplementQty" |
| | | min-width="100" /> |
| | | <el-table-column label="补料原因" |
| | | prop="supplementReason" |
| | | min-width="200" /> |
| | | <el-table-column label="补料人" |
| | | prop="supplementUserName" |
| | | min-width="120" /> |
| | | <el-table-column label="补料日期" |
| | | prop="supplementTime" |
| | | min-width="160" /> |
| | | </el-table> |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button @click="supplementRecordDialogVisible = false">关闭</el-button> |
| | | </span> |
| | | </template> |
| | | </el-dialog> |
| | | <MaterialDialog |
| | | v-model="materialDialogVisible" |
| | | :row-data="currentMaterialOrderRow" |
| | | @refresh="getList" |
| | | /> |
| | | |
| | | <FilesDia ref="workOrderFilesRef" /> |
| | | </div> |
| | |
| | | productWorkOrderPage, |
| | | addProductMain, |
| | | downProductWorkOrder, |
| | | listWorkOrderMaterialLedger, |
| | | addWorkOrderMaterialSupplement, |
| | | addWorkOrderMaterialReturn, |
| | | listWorkOrderMaterialSupplementRecord, |
| | | } from "@/api/productionManagement/workOrder.js"; |
| | | import { getUserProfile, userListNoPageByTenantId } from "@/api/system/user.js"; |
| | | import QRCode from "qrcode"; |
| | | import { getCurrentInstance, reactive, toRefs } from "vue"; |
| | | import FilesDia from "./components/filesDia.vue"; |
| | | import FormDialog from "@/components/Dialog/FormDialog.vue"; |
| | | import MaterialDialog from "./components/MaterialDialog.vue"; |
| | | const { proxy } = getCurrentInstance(); |
| | | |
| | | const tableColumn = ref([ |
| | |
| | | quantity: [{ required: true, validator: validateQuantity, trigger: "blur" }], |
| | | scrapQty: [{ validator: validateScrapQty, trigger: "blur" }], |
| | | }; |
| | | const supplementRules = { |
| | | supplementQty: [{ required: true, message: "请输入补料数量", trigger: "blur" }], |
| | | supplementReason: [{ required: true, message: "请输入补料原因", trigger: "blur" }], |
| | | }; |
| | | const returnRules = { |
| | | returnQty: [{ required: true, message: "请输入退料数量", trigger: "blur" }], |
| | | }; |
| | | |
| | | // 处理本次生产数量输入,限制必须大于等于1 |
| | | const handleQuantityInput = value => { |
| | |
| | | |
| | | const currentReportRowData = ref(null); |
| | | const materialDialogVisible = ref(false); |
| | | const materialTableLoading = ref(false); |
| | | const materialTableData = ref([]); |
| | | const currentMaterialRow = ref(null); |
| | | const currentMaterialOrderRow = ref(null); |
| | | const supplementDialogVisible = ref(false); |
| | | const supplementSubmitting = ref(false); |
| | | const supplementFormRef = ref(null); |
| | | const supplementForm = reactive({ |
| | | supplementQty: null, |
| | | supplementReason: "", |
| | | }); |
| | | const returnDialogVisible = ref(false); |
| | | const returnSubmitting = ref(false); |
| | | const returnFormRef = ref(null); |
| | | const returnForm = reactive({ |
| | | returnQty: null, |
| | | }); |
| | | const supplementRecordDialogVisible = ref(false); |
| | | const supplementRecordLoading = ref(false); |
| | | const supplementRecordTableData = ref([]); |
| | | const page = reactive({ |
| | | current: 1, |
| | | size: 100, |
| | |
| | | const data = reactive({ |
| | | searchForm: { |
| | | workOrderNo: "", |
| | | productOrderNpsNo: "", |
| | | }, |
| | | }); |
| | | const { searchForm } = toRefs(data); |
| | |
| | | reportDialogVisible.value = true; |
| | | }; |
| | | |
| | | const openMaterialDialog = async row => { |
| | | const openMaterialDialog = row => { |
| | | currentMaterialOrderRow.value = row; |
| | | materialDialogVisible.value = true; |
| | | materialTableLoading.value = true; |
| | | materialTableData.value = []; |
| | | try { |
| | | const res = await listWorkOrderMaterialLedger({ |
| | | workOrderId: row.id, |
| | | processId: row.processId, |
| | | productProcessRouteItemId: row.productProcessRouteItemId, |
| | | }); |
| | | materialTableData.value = res.data || []; |
| | | } catch (e) { |
| | | console.error("获取物料台账失败", e); |
| | | proxy.$modal.msgError("获取物料台账失败"); |
| | | } finally { |
| | | materialTableLoading.value = false; |
| | | } |
| | | }; |
| | | |
| | | const handleCloseMaterialDialog = () => { |
| | | materialTableData.value = []; |
| | | currentMaterialRow.value = null; |
| | | currentMaterialOrderRow.value = null; |
| | | }; |
| | | |
| | | const openSupplementDialog = row => { |
| | | currentMaterialRow.value = row; |
| | | supplementForm.supplementQty = null; |
| | | supplementForm.supplementReason = ""; |
| | | supplementDialogVisible.value = true; |
| | | nextTick(() => { |
| | | supplementFormRef.value?.clearValidate(); |
| | | }); |
| | | }; |
| | | |
| | | const handleSubmitSupplement = () => { |
| | | supplementFormRef.value?.validate(async valid => { |
| | | if (!valid) return; |
| | | if (!currentMaterialRow.value?.id) { |
| | | proxy.$modal.msgWarning("缺少物料明细ID"); |
| | | return; |
| | | } |
| | | supplementSubmitting.value = true; |
| | | try { |
| | | await addWorkOrderMaterialSupplement({ |
| | | materialLedgerId: currentMaterialRow.value.id, |
| | | supplementQty: Number(supplementForm.supplementQty), |
| | | supplementReason: supplementForm.supplementReason, |
| | | workOrderId: currentMaterialOrderRow.value?.id, |
| | | }); |
| | | proxy.$modal.msgSuccess("补料成功"); |
| | | supplementDialogVisible.value = false; |
| | | await openMaterialDialog(currentMaterialOrderRow.value); |
| | | } catch (e) { |
| | | console.error("补料失败", e); |
| | | proxy.$modal.msgError("补料失败"); |
| | | } finally { |
| | | supplementSubmitting.value = false; |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | const openReturnDialog = row => { |
| | | currentMaterialRow.value = row; |
| | | returnForm.returnQty = null; |
| | | returnDialogVisible.value = true; |
| | | nextTick(() => { |
| | | returnFormRef.value?.clearValidate(); |
| | | }); |
| | | }; |
| | | |
| | | const handleSubmitReturn = () => { |
| | | returnFormRef.value?.validate(async valid => { |
| | | if (!valid) return; |
| | | if (!currentMaterialRow.value?.id) { |
| | | proxy.$modal.msgWarning("缺少物料明细ID"); |
| | | return; |
| | | } |
| | | const returnQty = Number(returnForm.returnQty); |
| | | const minQty = |
| | | Number(currentMaterialRow.value.pickQty || 0) + |
| | | Number(currentMaterialRow.value.supplementQty || 0); |
| | | if (returnQty < minQty) { |
| | | proxy.$modal.msgWarning(`退料数量不能低于领用数量+补料数量(${minQty})`); |
| | | return; |
| | | } |
| | | returnSubmitting.value = true; |
| | | try { |
| | | await addWorkOrderMaterialReturn({ |
| | | materialLedgerId: currentMaterialRow.value.id, |
| | | returnQty, |
| | | workOrderId: currentMaterialOrderRow.value?.id, |
| | | }); |
| | | proxy.$modal.msgSuccess("退料成功"); |
| | | returnDialogVisible.value = false; |
| | | await openMaterialDialog(currentMaterialOrderRow.value); |
| | | } catch (e) { |
| | | console.error("退料失败", e); |
| | | proxy.$modal.msgError("退料失败"); |
| | | } finally { |
| | | returnSubmitting.value = false; |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | const openSupplementRecordDialog = async row => { |
| | | supplementRecordDialogVisible.value = true; |
| | | supplementRecordLoading.value = true; |
| | | supplementRecordTableData.value = []; |
| | | try { |
| | | const res = await listWorkOrderMaterialSupplementRecord({ |
| | | materialLedgerId: row.id, |
| | | }); |
| | | supplementRecordTableData.value = res.data || []; |
| | | } catch (e) { |
| | | console.error("获取补料记录失败", e); |
| | | proxy.$modal.msgError("获取补料记录失败"); |
| | | } finally { |
| | | supplementRecordLoading.value = false; |
| | | } |
| | | }; |
| | | |
| | | const handleReport = () => { |
| | |
| | | height: 140px !important; |
| | | } |
| | | } |
| | | </style> |
| | | </style> |