Java 需求:供应商比价及订单更新

功能描述

该功能用于根据入库单明细货品编码,自动选取供应商并更新订单信息,具体流程如下:

  1. 供应商查询:
    • 根据入库单明细货品编码,在货品供应商表中查询已报价此货品的供应商。
    • 只选取状态为有效的供应商(vendor.status = '1')。
    • 若未找到符合条件的供应商,则报错“未找到该货品的供应商商报价”。
  2. 供应商比价:
    • 若只有一条供应商满足,则直接使用该供应商。
    • 若有多条供应商满足,则根据以下公式计算每个供应商的订单总价,并选取价格最低的供应商:
      • 订单总价 = 订单数量 * (单价 * (1 + 价格系数))
    • 若有多家供应商比价价格相同,则选取价格系数最小的供应商(包含负数且正数大于负数)。
    • 若前两者都相同,则选取序号最小的供应商。
  3. 订单更新:
    • 更新单头的订单价格(订单价格 = 订单数量 * 单价)。
    • 更新单头供应商信息(从供应商表带出)。
    • 更新审核状态为审核通过。

实现思路

  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);

总结

本文详细介绍了供应商比价及订单更新的实现过程,并提供了相应的 Java 代码示例。希望本文能够帮助你更好地理解和实现相关功能。

Java 需求:供应商比价及订单更新

原文地址: https://www.cveoy.top/t/topic/ovjl 著作权归作者所有。请勿转载和采集!

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