实现思路:

  1. 首先根据入库单明细中的货品编码,查询货品供应商表,找到所有已报价此货品的供应商,并且状态为有效的供应商。
  2. 如果没有找到,则报错“未找到该货品的供应商商报价”。
  3. 如果只有一条供应商满足,则直接使用此供应商。
  4. 如果有多条供应商满足,则根据比价公式计算每个供应商的订单总价,然后取价格最低的供应商。
  5. 如果有多家供应商比价价格相同,则取价格系数最小的供应商(包含负数且正数大于负数),若前两者都相同,则取序号最小的供应商。
  6. 更新入库单单头的订单价格、供应商信息和审核状态为审核通过。

实现代码:

//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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录