java需求 按入库单明细货品编码在货品供应商里找出已报价此货品的供应商供应商是有效状态即vendorstatus=‘1’无效供应商不参与比价若未找到则报错未找到该货品的供应商商报价; 若只有一条供应商满足则直接使用此供应商;若有多条供应商满足则根据【供应商比价公式:订单总价=订单数量单价1+价格系数】最后取价格最低的供应商 若有多家供应商比价价格相同则取【价格系数】最小的供应商包含负数且正
实现思路:
- 首先根据入库单明细中的货品编码,查询货品供应商表,找到所有已报价此货品的供应商,并且状态为有效的供应商。
- 如果没有找到,则报错“未找到该货品的供应商商报价”。
- 如果只有一条供应商满足,则直接使用此供应商。
- 如果有多条供应商满足,则根据比价公式计算每个供应商的订单总价,然后取价格最低的供应商。
- 如果有多家供应商比价价格相同,则取价格系数最小的供应商(包含负数且正数大于负数),若前两者都相同,则取序号最小的供应商。
- 更新入库单单头的订单价格、供应商信息和审核状态为审核通过。
实现代码:
//1. 查询货品供应商表,找到所有已报价此货品的供应商,并且状态为有效的供应商
List<Vendor> vendors = vendorDao.findVendorsByProductCode(productCode);
vendors = vendors.stream().filter(vendor -> vendor.getStatus() == 1).collect(Collectors.toList());
//2. 如果没有找到,则报错“未找到该货品的供应商商报价”
if(vendors.isEmpty()){
throw new RuntimeException("未找到该货品的供应商商报价");
}
//3. 如果只有一条供应商满足,则直接使用此供应商
Vendor vendor = null;
if(vendors.size() == 1){
vendor = vendors.get(0);
}else{
//4. 如果有多条供应商满足,则根据比价公式计算每个供应商的订单总价,然后取价格最低的供应商
vendor = vendors.stream()
.min(Comparator.comparingDouble(v -> v.getPriceCoefficient() * v.getPrice() * (1 + v.getPriceCoefficient())))
.orElse(null);
//5. 如果有多家供应商比价价格相同,则取价格系数最小的供应商(包含负数且正数大于负数),若前两者都相同,则取序号最小的供应商
if(vendor != null){
List<Vendor> samePriceVendors = vendors.stream()
.filter(v -> Double.compare(v.getPriceCoefficient() * v.getPrice() * (1 + v.getPriceCoefficient()), vendor.getPriceCoefficient() * vendor.getPrice() * (1 + vendor.getPriceCoefficient())) == 0)
.sorted(Comparator.comparingDouble(Vendor::getPriceCoefficient))
.collect(Collectors.toList());
vendor = samePriceVendors.get(0);
}
}
//6. 更新入库单单头的订单价格、供应商信息和审核状态为审核通过
inboundOrder.setOrderPrice(inboundOrder.getQuantity() * vendor.getPrice());
inboundOrder.setVendor(vendor);
inboundOrder.setAuditStatus(AuditStatus.PASSED);
inboundOrderDao.updateInboundOrder(inboundOrder);
``
原文地址: https://www.cveoy.top/t/topic/gpwH 著作权归作者所有。请勿转载和采集!