| src/views/productionPlan/productionPlan/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/salesManagement/deliveryLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/salesManagement/salesLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/views/productionPlan/productionPlan/index.vue
@@ -135,7 +135,6 @@ <el-form-item label="生产数量"> <el-input-number v-model="mergeForm.totalAssignedQuantity" :min="0" :max="sumAssignedQuantity" @change="onBlur" style="width: 100%" /> </el-form-item> @@ -435,19 +434,23 @@ name: "下发", type: "text", showHide: row => { return row.status != 2; return true; }, clickFun: row => { mergeForm.productName = row.productName || ""; mergeForm.model = row.model || ""; mergeForm.totalAssignedQuantity = Number(row.qtyRequired || 0) - Number(row.quantityIssued || 0); mergeForm.totalAssignedQuantity = Math.max( 0, Number(row.qtyRequired || 0) - Number(row.quantityIssued || 0) ); mergeForm.planCompleteTime = row.requiredDate || ""; mergeForm.productId = row.productId || ""; mergeForm.createTime = dayjs().format("YYYY-MM-DD HH:mm:ss"); mergeForm.ids = [row.id]; sumAssignedQuantity.value = Number(row.qtyRequired || 0) - Number(row.quantityIssued || 0); sumAssignedQuantity.value = Math.max( 0, Number(row.qtyRequired || 0) - Number(row.quantityIssued || 0) ); isShowNewModal.value = true; }, }, @@ -735,16 +738,6 @@ // 判断行是否可选择 const isSelectable = row => { // 如果是已下发状态,禁止勾选 if (row.status == 2) { return false; } // 计算剩余数量 const remainingQty = (row.qtyRequired || 0) - (row.quantityIssued || 0); // 如果剩余数量小于等于0,禁止选择 if (remainingQty <= 0) { return false; } // 如果没有选中的行,所有行都可选择 if (!selectedProductModelId.value) { return true; @@ -766,9 +759,12 @@ const firstRow = selectedRows.value[0]; const productName = firstRow.productName || ""; // 计算总制造数量 (默认qtyRequired的和) // 计算总制造数量 (默认qtyRequired剩余数量的和) const totalAssignedQuantity = selectedRows.value.reduce((sum, row) => { return sum + Number(row.qtyRequired || 0) - Number(row.quantityIssued || 0); return ( sum + Math.max(0, Number(row.qtyRequired || 0) - Number(row.quantityIssued || 0)) ); }, 0); sumAssignedQuantity.value = totalAssignedQuantity; console.log(totalAssignedQuantity); @@ -779,7 +775,7 @@ mergeForm.planCompleteTime = firstRow.requiredDate || ""; mergeForm.productId = firstRow.productId || ""; mergeForm.createTime = dayjs().format("YYYY-MM-DD HH:mm:ss"); mergeForm.ids = selectedRows.value.map(row => row.id); mergeForm.ids = [...new Set(selectedRows.value.map(row => row.id))]; // 打开弹窗 isShowNewModal.value = true; @@ -800,12 +796,6 @@ return; } console.log(sumAssignedQuantity.value, "sumAssignedQuantity"); // 验证totalAssignedQuantity不能大于总方数 if (mergeForm.totalAssignedQuantity > sumAssignedQuantity.value) { ElMessage.error("生产数量不能大于当前计算的总值"); return; } console.log(mergeForm, "mergeForm"); const payload = { src/views/salesManagement/deliveryLedger/index.vue
@@ -107,6 +107,11 @@ show-overflow-tooltip /> <el-table-column label="发货地址" prop="shippingAddress" show-overflow-tooltip /> <el-table-column label="审核状态" prop="status" align="center" @@ -202,6 +207,17 @@ </el-col> </el-row> <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="发货地址:" prop="shippingAddress"> <el-input v-model="form.shippingAddress" placeholder="请输入发货地址" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="24" v-if="form.type === '货车'"> <el-form-item label="发货车牌号:" prop="shippingCarNumber"> <el-input @@ -289,6 +305,9 @@ }}</el-descriptions-item> <el-descriptions-item label="快递单号" :span="2">{{ detailRow.expressNumber || "--" }}</el-descriptions-item> <el-descriptions-item label="发货地址" :span="2">{{ detailRow.shippingAddress || "--" }}</el-descriptions-item> <el-descriptions-item label="出库单号" :span="2">{{ detailRow.outboundBatches || "--" @@ -388,6 +407,7 @@ shippingCarNumber: "", expressCompany: "", expressNumber: "", // 快递单号 shippingAddress: "", }, rules: { salesContractNo: [ @@ -479,6 +499,7 @@ shippingCarNumber: row.shippingCarNumber ?? "", expressCompany: row.expressCompany ?? "", expressNumber: row.expressNumber ?? "", shippingAddress: row.shippingAddress ?? "", }; deliveryFileList.value = row.storageBlobVOs || []; } @@ -590,6 +611,7 @@ form.value.type === "快递" ? form.value.expressCompany : "", expressNumber: form.value.type === "快递" ? form.value.expressNumber : "", shippingAddress: form.value.shippingAddress, storageBlobDTOs: deliveryFileList.value || [], }; deductStock(payload).then((res) => { src/views/salesManagement/salesLedger/index.vue
@@ -1066,6 +1066,17 @@ </el-col> </el-row> <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="发货地址:" prop="shippingAddress"> <el-input v-model="deliveryForm.shippingAddress" placeholder="请输入发货地址" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="24" v-if="deliveryForm.type === '货车'"> <el-form-item label="发货车牌号:" prop="shippingCarNumber"> <el-input @@ -1337,47 +1348,17 @@ item?.stockQuantity; return quantity ?? 0; }; const getCurrentDeliveryRowQuantity = () => { return Number(currentDeliveryRow.value?.noQuantity || 0); }; const getDeliveryBatchDeliveryMax = (row) => { const productQuantity = getCurrentDeliveryRowQuantity(); const batchQuantity = Number(getDeliveryBatchQuantity(row) || 0); const otherBatchTotal = (deliveryForm.value.batchNoList || []).reduce( (sum, item) => { if (item?.id === row?.id) return sum; return sum + Number(item?.deliveryQuantity || 0); }, 0 ); const remainingProductQuantity = Math.max( 0, productQuantity - otherBatchTotal ); return Math.max(0, Math.min(batchQuantity, remainingProductQuantity)); return Math.max(0, batchQuantity); }; const handleDeliveryBatchQuantityChange = (row) => { const productQuantity = getCurrentDeliveryRowQuantity(); const batchQuantity = Number(getDeliveryBatchQuantity(row) || 0); const otherBatchTotal = (deliveryForm.value.batchNoList || []).reduce( (sum, item) => { if (item?.id === row?.id) return sum; return sum + Number(item?.deliveryQuantity || 0); }, 0 ); const remainingProductQuantity = Math.max( 0, productQuantity - otherBatchTotal ); const currentValue = Number(row?.deliveryQuantity || 0); if (currentValue > batchQuantity) { row.deliveryQuantity = batchQuantity; proxy.$modal.msgWarning("发货数量不能大于库存数量"); } else if (currentValue > remainingProductQuantity) { row.deliveryQuantity = remainingProductQuantity; proxy.$modal.msgWarning("所有批次发货数量之和不能大于待发货数量"); } }; const getSelectedDeliveryBatchRows = () => { @@ -1422,6 +1403,7 @@ shippingCarNumber: "", expressCompany: "", expressNumber: "", shippingAddress: "", type: "货车", // 货车, 快递 }, deliveryRules: { @@ -2822,27 +2804,8 @@ * @param row 行数据 */ const canShip = (row) => { // 产品状态必须是充足(approveStatus === 1) if (row.approveStatus !== 1) { return false; } // 获取发货状态 const shippingStatus = row.shippingStatus; // 如果已发货,不能再次发货 if (shippingStatus === "已发货") { return false; } // 发货状态必须是"待发货"、"审批中"、"审核拒绝"或"部分发货" const statusStr = shippingStatus ? String(shippingStatus).trim() : ""; return ( statusStr === "待发货" || statusStr === "审批中" || statusStr === "审核拒绝" || statusStr === "部分发货" ); // 不再根据销售产品状态或已发货状态限制发货,发货合法性由库存批次和后端校验控制 return true; }; // 打开附件弹窗 @@ -2857,14 +2820,6 @@ // 打开发货弹框 const openDeliveryForm = async (row) => { // 检查是否可以发货 if (!canShip(row)) { proxy.$modal.msgWarning( "只有在产品状态是充足,发货状态是待发货、审批中、审核拒绝或部分发货的时候才可以发货" ); return; } // 审批中时提示用户已有待审批的发货记录 const statusStr = row.shippingStatus ? String(row.shippingStatus).trim() : ""; if (statusStr === "审批中") { @@ -2879,6 +2834,7 @@ shippingCarNumber: "", expressCompany: "", expressNumber: "", shippingAddress: "", type: "货车", batchNo: [], batchNoList, @@ -2894,20 +2850,6 @@ const selectedBatchRows = getSelectedDeliveryBatchRows(); if (selectedBatchRows.length === 0) { proxy.$modal.msgWarning("请至少填写一个批号的发货数量"); return; } const totalDeliveryQuantity = selectedBatchRows.reduce( (sum, item) => sum + Number(item.deliveryQuantity || 0), 0 ); const currentRowNoQuantity = Number( currentDeliveryRow.value?.noQuantity || 0 ); if ( currentRowNoQuantity > 0 && totalDeliveryQuantity > currentRowNoQuantity ) { proxy.$modal.msgWarning("批号发货总数不能超过待发货数量"); return; } // 保存当前展开的行ID,以便发货后重新加载子表格数据 @@ -2933,6 +2875,7 @@ deliveryForm.value.type === "快递" ? deliveryForm.value.expressNumber : "", shippingAddress: deliveryForm.value.shippingAddress, storageBlobDTOs: deliveryFileList.value || [], batchNo: deliveryForm.value.batchNo, batchNoDetailList: selectedBatchRows.map((item) => ({ @@ -2967,6 +2910,8 @@ }); } }); }).catch(() => { // 后端库存不足等错误已由 request 拦截器统一提示 }); } });