fix:订单配备货相关链路功能调整

dev_1.0.2
jiangpeng 2026-06-01 14:40:36 +08:00
parent 8acc68141d
commit 671bbd5692
7 changed files with 98 additions and 33 deletions

View File

@ -602,8 +602,9 @@ export default {
if (item.allBindList) { if (item.allBindList) {
item.allBindList.forEach(bindItem => { item.allBindList.forEach(bindItem => {
const originalPhNum = bindItem.originalPhNum === '' || bindItem.originalPhNum === null || bindItem.originalPhNum === undefined ? 0 : Number(bindItem.originalPhNum); const originalPhNum = bindItem.originalPhNum === '' || bindItem.originalPhNum === null || bindItem.originalPhNum === undefined ? 0 : Number(bindItem.originalPhNum);
const currentPhNum = this.stockingBindDraftMap[bindItem.purchaseId] !== undefined const key = this.getBindDraftKey(item.productCode, bindItem.purchaseId);
? Number(this.stockingBindDraftMap[bindItem.purchaseId]) const currentPhNum = this.stockingBindDraftMap[key] !== undefined
? Number(this.stockingBindDraftMap[key])
: (bindItem.phNum === '' || bindItem.phNum === null || bindItem.phNum === undefined ? 0 : Number(bindItem.phNum)); : (bindItem.phNum === '' || bindItem.phNum === null || bindItem.phNum === undefined ? 0 : Number(bindItem.phNum));
const price = Number(bindItem.price) || 0; const price = Number(bindItem.price) || 0;
const diff = currentPhNum - originalPhNum; const diff = currentPhNum - originalPhNum;
@ -770,9 +771,13 @@ export default {
this.stockingDetailLoading = false; this.stockingDetailLoading = false;
}); });
}, },
getDraftBindNum(purchaseId, defaultValue) { getBindDraftKey(productCode, purchaseId) {
if (this.stockingBindDraftMap[purchaseId] !== undefined) { return `${productCode}_${purchaseId}`;
return this.stockingBindDraftMap[purchaseId]; },
getDraftBindNum(productCode, purchaseId, defaultValue) {
const key = this.getBindDraftKey(productCode, purchaseId);
if (this.stockingBindDraftMap[key] !== undefined) {
return this.stockingBindDraftMap[key];
} }
return defaultValue; return defaultValue;
}, },
@ -784,7 +789,8 @@ export default {
const validValue = Math.max(minValue, Math.min(rawValue, maxValue)); const validValue = Math.max(minValue, Math.min(rawValue, maxValue));
row.phNum = validValue; row.phNum = validValue;
this.$set(this.stockingBindDraftMap, row.purchaseId, validValue); const key = this.getBindDraftKey(item.productCode, row.purchaseId);
this.$set(this.stockingBindDraftMap, key, validValue);
this.updateItemTotalPhNum(item); this.updateItemTotalPhNum(item);
}, },
calculateMaxPhNum(row, item) { calculateMaxPhNum(row, item) {
@ -795,8 +801,9 @@ export default {
const maxPhysical = originalPhNum + originalKyNum; const maxPhysical = originalPhNum + originalKyNum;
const currentTotalPhNum = this.calculateCurrentTotalPhNum(item); const currentTotalPhNum = this.calculateCurrentTotalPhNum(item);
const currentRowPhNum = this.stockingBindDraftMap[row.purchaseId] !== undefined const key = this.getBindDraftKey(item.productCode, row.purchaseId);
? Number(this.stockingBindDraftMap[row.purchaseId]) const currentRowPhNum = this.stockingBindDraftMap[key] !== undefined
? Number(this.stockingBindDraftMap[key])
: (row.phNum === '' || row.phNum === null || row.phNum === undefined ? 0 : Number(row.phNum)); : (row.phNum === '' || row.phNum === null || row.phNum === undefined ? 0 : Number(row.phNum));
const maxAllowedByOrder = orderNum - currentTotalPhNum + currentRowPhNum; const maxAllowedByOrder = orderNum - currentTotalPhNum + currentRowPhNum;
@ -812,7 +819,7 @@ export default {
}).then(bindResponse => { }).then(bindResponse => {
return (bindResponse.rows || []).map(bindItem => ({ return (bindResponse.rows || []).map(bindItem => ({
...bindItem, ...bindItem,
phNum: this.getDraftBindNum(bindItem.purchaseId, bindItem.phNum), phNum: this.getDraftBindNum(item.productCode, bindItem.purchaseId, bindItem.phNum),
originalPhNum: bindItem.originalPhNum !== undefined ? bindItem.originalPhNum : bindItem.phNum, originalPhNum: bindItem.originalPhNum !== undefined ? bindItem.originalPhNum : bindItem.phNum,
originalKyNum: bindItem.originalKyNum !== undefined ? bindItem.originalKyNum : bindItem.kyNum originalKyNum: bindItem.originalKyNum !== undefined ? bindItem.originalKyNum : bindItem.kyNum
})); }));
@ -849,7 +856,8 @@ export default {
const diff = nextValue - originalPhNum; const diff = nextValue - originalPhNum;
row.kyNum = originalKyNum - diff; row.kyNum = originalKyNum - diff;
this.$set(this.stockingBindDraftMap, row.purchaseId, nextValue); const key = this.getBindDraftKey(item.productCode, row.purchaseId);
this.$set(this.stockingBindDraftMap, key, nextValue);
this.updateItemTotalPhNum(item); this.updateItemTotalPhNum(item);
}, },
@ -858,9 +866,9 @@ export default {
let total = 0; let total = 0;
item.allBindList.forEach(bindItem => { item.allBindList.forEach(bindItem => {
const purchaseId = bindItem.purchaseId; const key = this.getBindDraftKey(item.productCode, bindItem.purchaseId);
if (this.stockingBindDraftMap && this.stockingBindDraftMap[purchaseId] !== undefined) { if (this.stockingBindDraftMap && this.stockingBindDraftMap[key] !== undefined) {
total += Number(this.stockingBindDraftMap[purchaseId]); total += Number(this.stockingBindDraftMap[key]);
} else { } else {
const phNum = bindItem.phNum === '' || bindItem.phNum === null || bindItem.phNum === undefined ? 0 : Number(bindItem.phNum); const phNum = bindItem.phNum === '' || bindItem.phNum === null || bindItem.phNum === undefined ? 0 : Number(bindItem.phNum);
total += phNum; total += phNum;
@ -885,8 +893,9 @@ export default {
this.stockingDetailList.forEach(item => { this.stockingDetailList.forEach(item => {
if (item.allBindList) { if (item.allBindList) {
item.allBindList.forEach(bindItem => { item.allBindList.forEach(bindItem => {
const currentPhNum = this.stockingBindDraftMap[bindItem.purchaseId] !== undefined const key = this.getBindDraftKey(item.productCode, bindItem.purchaseId);
? Number(this.stockingBindDraftMap[bindItem.purchaseId]) const currentPhNum = this.stockingBindDraftMap[key] !== undefined
? Number(this.stockingBindDraftMap[key])
: (bindItem.phNum === '' || bindItem.phNum === null || bindItem.phNum === undefined ? 0 : Number(bindItem.phNum)); : (bindItem.phNum === '' || bindItem.phNum === null || bindItem.phNum === undefined ? 0 : Number(bindItem.phNum));
const originalPhNum = bindItem.originalPhNum === '' || bindItem.originalPhNum === null || bindItem.originalPhNum === undefined ? 0 : Number(bindItem.originalPhNum); const originalPhNum = bindItem.originalPhNum === '' || bindItem.originalPhNum === null || bindItem.originalPhNum === undefined ? 0 : Number(bindItem.originalPhNum);
if (currentPhNum !== originalPhNum) { if (currentPhNum !== originalPhNum) {
@ -922,8 +931,9 @@ export default {
item.originalTotalPhNum = this.calculateCurrentTotalPhNum(item); item.originalTotalPhNum = this.calculateCurrentTotalPhNum(item);
if (item.allBindList) { if (item.allBindList) {
item.allBindList.forEach(bindItem => { item.allBindList.forEach(bindItem => {
if (this.stockingBindDraftMap[bindItem.purchaseId] !== undefined) { const key = this.getBindDraftKey(item.productCode, bindItem.purchaseId);
bindItem.phNum = this.stockingBindDraftMap[bindItem.purchaseId]; if (this.stockingBindDraftMap[key] !== undefined) {
bindItem.phNum = this.stockingBindDraftMap[key];
bindItem.originalPhNum = bindItem.phNum; bindItem.originalPhNum = bindItem.phNum;
const originalKyNum = bindItem.originalKyNum === '' || bindItem.originalKyNum === null || bindItem.originalKyNum === undefined ? 0 : Number(bindItem.originalKyNum); const originalKyNum = bindItem.originalKyNum === '' || bindItem.originalKyNum === null || bindItem.originalKyNum === undefined ? 0 : Number(bindItem.originalKyNum);
const diff = bindItem.phNum - (bindItem.originalPhNum || 0); const diff = bindItem.phNum - (bindItem.originalPhNum || 0);
@ -934,8 +944,9 @@ export default {
} }
if (item.bindList) { if (item.bindList) {
item.bindList.forEach(bindItem => { item.bindList.forEach(bindItem => {
if (this.stockingBindDraftMap[bindItem.purchaseId] !== undefined) { const key = this.getBindDraftKey(item.productCode, bindItem.purchaseId);
bindItem.phNum = this.stockingBindDraftMap[bindItem.purchaseId]; if (this.stockingBindDraftMap[key] !== undefined) {
bindItem.phNum = this.stockingBindDraftMap[key];
bindItem.originalPhNum = bindItem.phNum; bindItem.originalPhNum = bindItem.phNum;
const originalKyNum = bindItem.originalKyNum === '' || bindItem.originalKyNum === null || bindItem.originalKyNum === undefined ? 0 : Number(bindItem.originalKyNum); const originalKyNum = bindItem.originalKyNum === '' || bindItem.originalKyNum === null || bindItem.originalKyNum === undefined ? 0 : Number(bindItem.originalKyNum);
const diff = bindItem.phNum - (bindItem.originalPhNum || 0); const diff = bindItem.phNum - (bindItem.originalPhNum || 0);

View File

@ -61,6 +61,11 @@
</el-row> </el-row>
</el-form> </el-form>
<el-tabs v-model="activePurchaseNo" @tab-click="handleTabClick" v-if="filteredPurchaseOrderList.length > 0">
<el-tab-pane v-for="purchase in filteredPurchaseOrderList" :key="purchase.purchaseNo" :label="`${purchase.purchaseNo} (${purchase.phNum}台)`" :name="purchase.purchaseNo">
</el-tab-pane>
</el-tabs>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleDownloadTemplate"></el-button> <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleDownloadTemplate"></el-button>
@ -100,6 +105,7 @@ import { addDelivery, listProductSn } from '@/api/inventory/delivery';
import {importSnData,exportDownloadTemplate} from '@/api/inventory/outer' import {importSnData,exportDownloadTemplate} from '@/api/inventory/outer'
import PurchaseOrderSelectDialog from '../../../purchaseorder/components/PurchaseOrderSelectDialog.vue'; import PurchaseOrderSelectDialog from '../../../purchaseorder/components/PurchaseOrderSelectDialog.vue';
import {handleTree} from "@/utils/ruoyi"; import {handleTree} from "@/utils/ruoyi";
import { productMatchBindList } from '@/api/project/order';
export default { export default {
name: "GenerateDeliveryForm", name: "GenerateDeliveryForm",
@ -137,7 +143,7 @@ export default {
warehouseId: undefined, warehouseId: undefined,
orderCode: undefined, orderCode: undefined,
}, },
isImported: false, // Flag to track if data is from import isImported: false,
isInitialLoad: false, isInitialLoad: false,
purchaseOrderSelectVisible: false, purchaseOrderSelectVisible: false,
queryProductType: ['1', '2', '99'], queryProductType: ['1', '2', '99'],
@ -145,8 +151,19 @@ export default {
warehouseId: null, warehouseId: null,
taxRate: 0.13, taxRate: 0.13,
warehouseName: '', warehouseName: '',
purchaseOrderList: [],
activePurchaseNo: '',
}; };
}, },
computed: {
filteredPurchaseOrderList() {
return this.purchaseOrderList.filter(purchase => {
const phNum = purchase.phNum || 0;
const bhNum = purchase.bhNum || 0;
return phNum > 0 && phNum > bhNum;
});
}
},
watch: { watch: {
'form.deliveryTimeType'(val) { 'form.deliveryTimeType'(val) {
if (val === '0') { if (val === '0') {
@ -191,11 +208,32 @@ export default {
this.isInitialLoad = true; this.isInitialLoad = true;
this.visible = true; this.visible = true;
this.$nextTick(() => { this.$nextTick(() => {
// resetForm/
this.form.notifierAddress = notifierAddress; this.form.notifierAddress = notifierAddress;
this.getSnList(); this.loadPurchaseOrderList();
}) })
}, },
loadPurchaseOrderList() {
const orderCode = this.queryParams.orderCode;
const productCode = this.queryParams.productCode;
if (!orderCode || !productCode) {
this.getSnList();
return;
}
productMatchBindList(orderCode, productCode).then(response => {
this.purchaseOrderList = response.rows || [];
const filtered = this.filteredPurchaseOrderList;
if (filtered.length > 0) {
this.activePurchaseNo = filtered[0].purchaseNo;
this.queryParams.purchaseNo = this.activePurchaseNo;
} else {
this.activePurchaseNo = '';
this.queryParams.purchaseNo = undefined;
}
this.getSnList();
}).catch(() => {
this.getSnList();
});
},
getSnList() { getSnList() {
listProductSn(this.queryParams).then(response => { listProductSn(this.queryParams).then(response => {
this.snList = response.rows; this.snList = response.rows;
@ -211,6 +249,13 @@ export default {
} }
}); });
}, },
handleTabClick(tab) {
this.activePurchaseNo = tab.name;
this.queryParams.purchaseNo = tab.name;
this.queryParams.pageNum = 1;
this.isInitialLoad = true;
this.getSnList();
},
handleSelectionChange(selection) { handleSelectionChange(selection) {
if (this.isImported && selection.length!=(this.productData.quantity - this.productData.deliveryGenerateQuantity - this.productData.deliveryConfirmQuantity)) { if (this.isImported && selection.length!=(this.productData.quantity - this.productData.deliveryGenerateQuantity - this.productData.deliveryConfirmQuantity)) {
this.$message.error("导入数据不允许取消勾选"); this.$message.error("导入数据不允许取消勾选");
@ -337,6 +382,7 @@ export default {
productCode: undefined, productCode: undefined,
warehouseId: undefined, warehouseId: undefined,
orderCode: undefined, orderCode: undefined,
purchaseNo: undefined,
}; };
this.isImported = false; this.isImported = false;
this.price = null; this.price = null;
@ -344,6 +390,8 @@ export default {
this.warehouseId = null; this.warehouseId = null;
this.purchaseNo = ''; this.purchaseNo = '';
this.warehouseName = ''; this.warehouseName = '';
this.purchaseOrderList = [];
this.activePurchaseNo = '';
} }
} }
}; };

View File

@ -51,6 +51,7 @@ public class InventoryInfo extends BaseEntity
@Excel(name = "出库单号") @Excel(name = "出库单号")
private String outerCode; private String outerCode;
private String orderCode; private String orderCode;
private String purchaseNo;
/** 所属仓库 */ /** 所属仓库 */
@Excel(name = "所属仓库") @Excel(name = "所属仓库")

View File

@ -107,7 +107,8 @@ public interface ProjectOrderInfoMapper
int selectProductMatchSnCountlList(@Param("purchaseNo") String purchaseNo); int selectProductMatchSnCountlList(@Param("purchaseNo") String purchaseNo);
int selectPurchaseOrderMapBindNum(@Param("purchaseNo") String purchaseNo, int selectPurchaseOrderMapBindNum(@Param("purchaseNo") String purchaseNo,
@Param("orderCode") String orderCode); @Param("orderCode") String orderCode,
@Param("productCode") String productCode);
List<OrderProductMatchSnDetailDto> selectProductMatchSnDetailList(@Param("purchaseNo") String purchaseNo, List<OrderProductMatchSnDetailDto> selectProductMatchSnDetailList(@Param("purchaseNo") String purchaseNo,
@Param("productCode") String productCode); @Param("productCode") String productCode);

View File

@ -2913,7 +2913,7 @@ public class ProjectOrderInfoServiceImpl implements IProjectOrderInfoService, To
OrderProductMatchSnDto result = new OrderProductMatchSnDto(); OrderProductMatchSnDto result = new OrderProductMatchSnDto();
List<OrderProductMatchSnDetailDto> snList = projectOrderInfoMapper.selectProductMatchSnDetailList(purchaseNo, productCode); List<OrderProductMatchSnDetailDto> snList = projectOrderInfoMapper.selectProductMatchSnDetailList(purchaseNo, productCode);
result.setTotalQuantity(snList.size()); result.setTotalQuantity(snList.size());
Integer quotaQuantity = projectOrderInfoMapper.selectPurchaseOrderMapBindNum(purchaseNo, orderCode); Integer quotaQuantity = projectOrderInfoMapper.selectPurchaseOrderMapBindNum(purchaseNo, orderCode, productCode);
result.setQuotaQuantity(quotaQuantity); result.setQuotaQuantity(quotaQuantity);
result.setSnList(snList); result.setSnList(snList);
List<OrderProductMatchWarehouseDto> warehouseList = snList.stream() List<OrderProductMatchWarehouseDto> warehouseList = snList.stream()

View File

@ -38,10 +38,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
from oms_inventory_info t1 from oms_inventory_info t1
left join oms_warehouse_info t2 on t1.warehouse_id = t2.id left join oms_warehouse_info t2 on t1.warehouse_id = t2.id
left join product_info t3 on t1.product_code = t3.product_code left join product_info t3 on t1.product_code = t3.product_code
<if test="orderCode != null and orderCode != ''"> <if test="(orderCode != null and orderCode != '') or (purchaseNo != null and purchaseNo != '')">
left join oms_inventory_inner t4 on t1.inner_code = t4.inner_code left join oms_inventory_inner t4 on t1.inner_code = t4.inner_code
</if>
<if test="orderCode != null and orderCode != ''">
left join oms_purchase_order t5 on t4.purchase_no = t5.purchase_no left join oms_purchase_order t5 on t4.purchase_no = t5.purchase_no
left join oms_purchase_order_map t6 on t5.id = t6.purchase_id left join oms_purchase_order_map t6 on t5.id = t6.purchase_id and t6.product_code = t1.product_code
left join project_order_info t7 on t6.order_id = t7.id and t7.order_code = #{orderCode} left join project_order_info t7 on t6.order_id = t7.id and t7.order_code = #{orderCode}
</if> </if>
<where> <where>
@ -65,10 +67,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="orderCode != null and orderCode != ''"> <if test="orderCode != null and orderCode != ''">
and t6.bind_num > 0 and t6.bind_num > 0
</if> </if>
<if test="purchaseNo != null and purchaseNo != ''">
and t4.purchase_no = #{purchaseNo}
</if>
<if test="warehouseId != null ">and t1.warehouse_id = #{warehouseId}</if> <if test="warehouseId != null ">and t1.warehouse_id = #{warehouseId}</if>
<if test="innerPrice != null ">and t1.inner_price = #{innerPrice}</if> <if test="innerPrice != null ">and t1.inner_price = #{innerPrice}</if>
<if test="outerPrice != null ">and t1.outer_price = #{outerPrice}</if> <if test="outerPrice != null ">and t1.outer_price = #{outerPrice}</if>
</where> </where>
</select> </select>

View File

@ -942,12 +942,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
inner join project_order_info as t2 on t1.project_id = t2.project_id inner join project_order_info as t2 on t1.project_id = t2.project_id
inner join product_info as t3 on t1.product_bom_code = t3.product_code inner join product_info as t3 on t1.product_bom_code = t3.product_code
left join oms_purchase_order_item as t4 on t3.product_code = t4.product_code left join oms_purchase_order_item as t4 on t3.product_code = t4.product_code
left join oms_purchase_order_map as t5 on t2.id = t5.order_id and t4.purchase_id = t5.purchase_id left join oms_purchase_order_map as t5 on t2.id = t5.order_id and t4.purchase_id = t5.purchase_id and t5.product_code = t4.product_code
left join ( left join (
select count(1) bh_num, product_code select count(1) bh_num, product_code
from oms_inventory_info from oms_inventory_info
where order_code = #{orderCode} where order_code = #{orderCode}
group by product_code group by product_code
) t6 on t3.product_code = t6.product_code ) t6 on t3.product_code = t6.product_code
left join oms_vendor_info as t7 on t3.vendor_code = t7.vendor_code left join oms_vendor_info as t7 on t3.vendor_code = t7.vendor_code
where t2.order_code = #{orderCode} where t2.order_code = #{orderCode}
@ -966,7 +966,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
max(t4.price) as price, max(t4.price) as price,
t4.quantity as cg_num, t4.quantity as cg_num,
t4.quantity - ifnull((select sum(bind_num) from oms_purchase_order_map as tt t4.quantity - ifnull((select sum(bind_num) from oms_purchase_order_map as tt
where tt.purchase_id = t4.purchase_id and tt.product_code = t4.product_code), 0) as ky_num, where tt.order_id = t2.id and tt.purchase_id = t4.purchase_id and tt.product_code = t4.product_code), 0) as ky_num,
t5.bind_num as ph_num, t5.bind_num as ph_num,
t6.status, t6.status,
( (
@ -985,7 +985,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
inner join oms_purchase_order_item as t4 inner join oms_purchase_order_item as t4
on t3.product_code = t4.product_code on t3.product_code = t4.product_code
left join oms_purchase_order_map as t5 left join oms_purchase_order_map as t5
on t2.id = t5.order_id and t4.purchase_id = t5.purchase_id on t2.id = t5.order_id and t4.purchase_id = t5.purchase_id and t4.product_code = t5.product_code
inner join oms_purchase_order as t6 inner join oms_purchase_order as t6
on t6.id = t4.purchase_id on t6.id = t4.purchase_id
where t2.order_code = #{orderCode} where t2.order_code = #{orderCode}
@ -1004,7 +1004,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
on t1.inner_code = t2.inner_code on t1.inner_code = t2.inner_code
left join oms_warehouse_info as t3 left join oms_warehouse_info as t3
on t2.warehouse_id = t3.id on t2.warehouse_id = t3.id
where t2.purchase_no = #{purchaseNo} and t1.inventory_status=0 where t2.purchase_no = #{purchaseNo}
</select> </select>
<select id="selectPurchaseOrderMapBindNum" resultType="java.lang.Integer"> <select id="selectPurchaseOrderMapBindNum" resultType="java.lang.Integer">
@ -1014,7 +1014,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
inner join project_order_info as t2 inner join project_order_info as t2
on t2.order_code = #{orderCode} on t2.order_code = #{orderCode}
left join oms_purchase_order_map as t3 left join oms_purchase_order_map as t3
on t2.id = t3.order_id and t1.id = t3.purchase_id on t2.id = t3.order_id and t1.id = t3.purchase_id and t3.product_code = #{productCode}
where t1.purchase_no = #{purchaseNo} where t1.purchase_no = #{purchaseNo}
limit 1 limit 1
</select> </select>