From 70ade4632e927032caf7b7fabdaa19e98942e352 Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Mon, 29 Jun 2026 17:19:28 +0800 Subject: [PATCH] =?UTF-8?q?feat(crm):=20=E6=B7=BB=E5=8A=A0=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E9=A1=B9=E7=BB=9F=E8=AE=A1=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在CrmOrderItemController中新增三个统计接口:按订单ID、销售员、合同ID统计配卷汇总 - 实现resolveCoilIdsByOrderId、resolveCoilIdsBySalesman、resolveCoilIdsByContractId辅助方法 - 重构queryCoilsByOrderId、queryCoilsBySalesman、queryCoilsByContractIdPaginated方法逻辑 - 新增queryCoilsByOrderIdStatistics、queryCoilsBySalesmanStatistics、queryCoilsByContractIdStatistics统计方法 - 添加emptyStatistics私有方法返回默认统计值 - 在WmsDeliveryWaybillDetailController中新增按负责人统计已发货钢卷汇总接口 --- .../controller/CrmOrderItemController.java | 20 ++ .../klp/crm/service/ICrmOrderItemService.java | 15 ++ .../service/impl/CrmOrderItemServiceImpl.java | 235 +++++++++++------- .../WmsDeliveryWaybillDetailController.java | 15 ++ 4 files changed, 194 insertions(+), 91 deletions(-) diff --git a/klp-crm/src/main/java/com/klp/crm/controller/CrmOrderItemController.java b/klp-crm/src/main/java/com/klp/crm/controller/CrmOrderItemController.java index 026147661..e18d2f75b 100644 --- a/klp-crm/src/main/java/com/klp/crm/controller/CrmOrderItemController.java +++ b/klp-crm/src/main/java/com/klp/crm/controller/CrmOrderItemController.java @@ -148,4 +148,24 @@ public class CrmOrderItemController extends BaseController { PageQuery pageQuery) { return iCrmOrderItemService.queryCoilsByContractIdPaginated(contractId, pageQuery); } + + // 根据订单ID统计配卷汇总 + @GetMapping("/coils/order/{orderId}/statistics") + public R> getCoilsByOrderIdStatistics(@NotNull(message = "订单ID不能为空") + @PathVariable Long orderId) { + return R.ok(iCrmOrderItemService.queryCoilsByOrderIdStatistics(orderId)); + } + + // 根据销售员统计生产成果汇总 + @GetMapping("/coils/bySalesman/statistics") + public R> getCoilsBySalesmanStatistics(@RequestParam String salesman) { + return R.ok(iCrmOrderItemService.queryCoilsBySalesmanStatistics(salesman)); + } + + // 根据合同ID统计生产成果汇总 + @GetMapping("/coils/byContract/{contractId}/statistics") + public R> getCoilsByContractIdStatistics(@NotNull(message = "合同ID不能为空") + @PathVariable Long contractId) { + return R.ok(iCrmOrderItemService.queryCoilsByContractIdStatistics(contractId)); + } } diff --git a/klp-crm/src/main/java/com/klp/crm/service/ICrmOrderItemService.java b/klp-crm/src/main/java/com/klp/crm/service/ICrmOrderItemService.java index 544d0283a..29d312fb1 100644 --- a/klp-crm/src/main/java/com/klp/crm/service/ICrmOrderItemService.java +++ b/klp-crm/src/main/java/com/klp/crm/service/ICrmOrderItemService.java @@ -85,4 +85,19 @@ public interface ICrmOrderItemService { * 根据合同ID查询生产成果(钢卷列表)分页 */ TableDataInfo queryCoilsByContractIdPaginated(Long contractId, PageQuery pageQuery); + + /** + * 根据订单ID统计配卷汇总数据(数量、毛重、净重) + */ + java.util.Map queryCoilsByOrderIdStatistics(Long orderId); + + /** + * 根据销售员统计生产成果汇总数据(数量、毛重、净重) + */ + java.util.Map queryCoilsBySalesmanStatistics(String salesman); + + /** + * 根据合同ID统计生产成果汇总数据(数量、毛重、净重) + */ + java.util.Map queryCoilsByContractIdStatistics(Long contractId); } diff --git a/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderItemServiceImpl.java b/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderItemServiceImpl.java index 6f1e473e3..fc5a2fa9a 100644 --- a/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderItemServiceImpl.java +++ b/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderItemServiceImpl.java @@ -290,16 +290,19 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { return result; } - @Override - public TableDataInfo queryCoilsByOrderId(Long orderId, PageQuery pageQuery) { + // ==================== 线圈ID解析辅助方法 ==================== + + /** + * 根据订单ID解析关联的线圈ID串(通过发货单→发货单明细) + * @return 逗号分隔的coilId字符串,无数据返回null + */ + private String resolveCoilIdsByOrderId(Long orderId) { LambdaQueryWrapper waybillWrapper = new LambdaQueryWrapper<>(); waybillWrapper.eq(WmsDeliveryWaybill::getOrderId, orderId); List waybills = wmsDeliveryWaybillMapper.selectList(waybillWrapper); - if (waybills == null || waybills.isEmpty()) { - return new TableDataInfo<>(); + return null; } - List waybillIds = waybills.stream() .map(WmsDeliveryWaybill::getWaybillId) .collect(Collectors.toList()); @@ -307,31 +310,155 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { LambdaQueryWrapper detailWrapper = new LambdaQueryWrapper<>(); detailWrapper.in(WmsDeliveryWaybillDetail::getWaybillId, waybillIds); List details = wmsDeliveryWaybillDetailMapper.selectList(detailWrapper); - if (details == null || details.isEmpty()) { - return new TableDataInfo<>(); + return null; } - - String coilIds = details.stream() + return details.stream() .map(WmsDeliveryWaybillDetail::getCoilId) .map(String::valueOf) .collect(Collectors.joining(",")); + } + /** + * 根据销售员解析关联的线圈ID串(通过crm_order→wms_coil_contract_rel) + * @return 逗号分隔的coilId字符串,无数据返回null + */ + private String resolveCoilIdsBySalesman(String salesman) { + LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(); + orderWrapper.eq(CrmOrder::getSalesman, salesman); + orderWrapper.eq(CrmOrder::getDelFlag, 0); + List orders = crmOrderMapper.selectList(orderWrapper); + if (orders == null || orders.isEmpty()) { + return null; + } + List orderIds = orders.stream() + .map(CrmOrder::getOrderId) + .collect(Collectors.toList()); + + LambdaQueryWrapper relWrapper = new LambdaQueryWrapper<>(); + relWrapper.in(WmsCoilContractRel::getContractId, orderIds); + relWrapper.eq(WmsCoilContractRel::getDelFlag, 0); + List rels = coilContractRelMapper.selectList(relWrapper); + if (rels == null || rels.isEmpty()) { + return null; + } + return rels.stream() + .map(WmsCoilContractRel::getCoilId) + .distinct() + .map(String::valueOf) + .collect(Collectors.joining(",")); + } + + /** + * 根据合同ID解析关联的线圈ID串(通过crm_order→wms_coil_contract_rel) + * @return 逗号分隔的coilId字符串,无数据返回null + */ + private String resolveCoilIdsByContractId(Long contractId) { + LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(); + orderWrapper.eq(CrmOrder::getContractId, contractId); + orderWrapper.eq(CrmOrder::getDelFlag, 0); + List orders = crmOrderMapper.selectList(orderWrapper); + if (orders == null || orders.isEmpty()) { + return null; + } + List orderIds = orders.stream() + .map(CrmOrder::getOrderId) + .collect(Collectors.toList()); + + LambdaQueryWrapper relWrapper = new LambdaQueryWrapper<>(); + relWrapper.in(WmsCoilContractRel::getContractId, orderIds); + relWrapper.eq(WmsCoilContractRel::getDelFlag, 0); + List rels = coilContractRelMapper.selectList(relWrapper); + if (rels == null || rels.isEmpty()) { + return null; + } + return rels.stream() + .map(WmsCoilContractRel::getCoilId) + .distinct() + .map(String::valueOf) + .collect(Collectors.joining(",")); + } + + // ==================== 分页列表查询 ==================== + + @Override + public TableDataInfo queryCoilsByOrderId(Long orderId, PageQuery pageQuery) { + String coilIds = resolveCoilIdsByOrderId(orderId); + if (coilIds == null) { + return new TableDataInfo<>(); + } WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); coilBo.setCoilIds(coilIds); return iWmsMaterialCoilService.queryPageList(coilBo, pageQuery); } + @Override + public TableDataInfo queryCoilsBySalesman(String salesman, PageQuery pageQuery) { + String coilIds = resolveCoilIdsBySalesman(salesman); + if (coilIds == null) { + return new TableDataInfo<>(); + } + WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); + coilBo.setCoilIds(coilIds); + return iWmsMaterialCoilService.queryPageList(coilBo, pageQuery); + } + + @Override + public TableDataInfo queryCoilsByContractIdPaginated(Long contractId, PageQuery pageQuery) { + String coilIds = resolveCoilIdsByContractId(contractId); + if (coilIds == null) { + return new TableDataInfo<>(); + } + WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); + coilBo.setCoilIds(coilIds); + return iWmsMaterialCoilService.queryPageList(coilBo, pageQuery); + } + + // ==================== 统计汇总查询 ==================== + + @Override + public Map queryCoilsByOrderIdStatistics(Long orderId) { + String coilIds = resolveCoilIdsByOrderId(orderId); + if (coilIds == null) { + return emptyStatistics(); + } + WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); + coilBo.setCoilIds(coilIds); + return iWmsMaterialCoilService.getStatistics(coilBo); + } + + @Override + public Map queryCoilsBySalesmanStatistics(String salesman) { + String coilIds = resolveCoilIdsBySalesman(salesman); + if (coilIds == null) { + return emptyStatistics(); + } + WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); + coilBo.setCoilIds(coilIds); + return iWmsMaterialCoilService.getStatistics(coilBo); + } + + @Override + public Map queryCoilsByContractIdStatistics(Long contractId) { + String coilIds = resolveCoilIdsByContractId(contractId); + if (coilIds == null) { + return emptyStatistics(); + } + WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); + coilBo.setCoilIds(coilIds); + return iWmsMaterialCoilService.getStatistics(coilBo); + } + + // ==================== 已有方法(非分页) ==================== + @Override public List queryCoilsByContractId(Long contractId) { LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(); orderWrapper.eq(CrmOrder::getContractId, contractId); List orders = crmOrderMapper.selectList(orderWrapper); - if (orders == null || orders.isEmpty()) { return Collections.emptyList(); } - List orderIds = orders.stream() .map(CrmOrder::getOrderId) .collect(Collectors.toList()); @@ -339,11 +466,9 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { LambdaQueryWrapper waybillWrapper = new LambdaQueryWrapper<>(); waybillWrapper.in(WmsDeliveryWaybill::getOrderId, orderIds); List waybills = wmsDeliveryWaybillMapper.selectList(waybillWrapper); - if (waybills == null || waybills.isEmpty()) { return Collections.emptyList(); } - List waybillIds = waybills.stream() .map(WmsDeliveryWaybill::getWaybillId) .collect(Collectors.toList()); @@ -351,11 +476,9 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { LambdaQueryWrapper detailWrapper = new LambdaQueryWrapper<>(); detailWrapper.in(WmsDeliveryWaybillDetail::getWaybillId, waybillIds); List details = wmsDeliveryWaybillDetailMapper.selectList(detailWrapper); - if (details == null || details.isEmpty()) { return Collections.emptyList(); } - String coilIds = details.stream() .map(WmsDeliveryWaybillDetail::getCoilId) .map(String::valueOf) @@ -373,11 +496,9 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(); orderWrapper.eq(CrmOrder::getCustomerId, customerId); List orders = crmOrderMapper.selectList(orderWrapper); - if (orders == null || orders.isEmpty()) { return result; } - List orderIds = orders.stream() .map(CrmOrder::getOrderId) .collect(Collectors.toList()); @@ -405,11 +526,9 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(); orderWrapper.eq(CrmOrder::getCustomerId, customerId); List orders = crmOrderMapper.selectList(orderWrapper); - if (orders == null || orders.isEmpty()) { return Collections.emptyList(); } - List orderIds = orders.stream() .map(CrmOrder::getOrderId) .collect(Collectors.toList()); @@ -417,11 +536,9 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { LambdaQueryWrapper waybillWrapper = new LambdaQueryWrapper<>(); waybillWrapper.in(WmsDeliveryWaybill::getOrderId, orderIds); List waybills = wmsDeliveryWaybillMapper.selectList(waybillWrapper); - if (waybills == null || waybills.isEmpty()) { return Collections.emptyList(); } - List waybillIds = waybills.stream() .map(WmsDeliveryWaybill::getWaybillId) .collect(Collectors.toList()); @@ -429,11 +546,9 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { LambdaQueryWrapper detailWrapper = new LambdaQueryWrapper<>(); detailWrapper.in(WmsDeliveryWaybillDetail::getWaybillId, waybillIds); List details = wmsDeliveryWaybillDetailMapper.selectList(detailWrapper); - if (details == null || details.isEmpty()) { return Collections.emptyList(); } - String coilIds = details.stream() .map(WmsDeliveryWaybillDetail::getCoilId) .map(String::valueOf) @@ -444,73 +559,11 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { return iWmsMaterialCoilService.queryList(coilBo); } - @Override - public TableDataInfo queryCoilsBySalesman(String salesman, PageQuery pageQuery) { - LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(); - orderWrapper.eq(CrmOrder::getSalesman, salesman); - orderWrapper.eq(CrmOrder::getDelFlag, 0); - List orders = crmOrderMapper.selectList(orderWrapper); - - if (orders == null || orders.isEmpty()) { - return new TableDataInfo<>(); - } - - List orderIds = orders.stream() - .map(CrmOrder::getOrderId) - .collect(Collectors.toList()); - - LambdaQueryWrapper relWrapper = new LambdaQueryWrapper<>(); - relWrapper.in(WmsCoilContractRel::getContractId, orderIds); - relWrapper.eq(WmsCoilContractRel::getDelFlag, 0); - List rels = coilContractRelMapper.selectList(relWrapper); - - if (rels == null || rels.isEmpty()) { - return new TableDataInfo<>(); - } - - String coilIds = rels.stream() - .map(WmsCoilContractRel::getCoilId) - .distinct() - .map(String::valueOf) - .collect(Collectors.joining(",")); - - WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); - coilBo.setCoilIds(coilIds); - return iWmsMaterialCoilService.queryPageList(coilBo, pageQuery); - } - - @Override - public TableDataInfo queryCoilsByContractIdPaginated(Long contractId, PageQuery pageQuery) { - LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(); - orderWrapper.eq(CrmOrder::getContractId, contractId); - orderWrapper.eq(CrmOrder::getDelFlag, 0); - List orders = crmOrderMapper.selectList(orderWrapper); - - if (orders == null || orders.isEmpty()) { - return new TableDataInfo<>(); - } - - List orderIds = orders.stream() - .map(CrmOrder::getOrderId) - .collect(Collectors.toList()); - - LambdaQueryWrapper relWrapper = new LambdaQueryWrapper<>(); - relWrapper.in(WmsCoilContractRel::getContractId, orderIds); - relWrapper.eq(WmsCoilContractRel::getDelFlag, 0); - List rels = coilContractRelMapper.selectList(relWrapper); - - if (rels == null || rels.isEmpty()) { - return new TableDataInfo<>(); - } - - String coilIds = rels.stream() - .map(WmsCoilContractRel::getCoilId) - .distinct() - .map(String::valueOf) - .collect(Collectors.joining(",")); - - WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); - coilBo.setCoilIds(coilIds); - return iWmsMaterialCoilService.queryPageList(coilBo, pageQuery); + private Map emptyStatistics() { + Map empty = new HashMap<>(); + empty.put("total_count", java.math.BigDecimal.ZERO); + empty.put("total_gross_weight", java.math.BigDecimal.ZERO); + empty.put("total_net_weight", java.math.BigDecimal.ZERO); + return empty; } } diff --git a/klp-wms/src/main/java/com/klp/controller/WmsDeliveryWaybillDetailController.java b/klp-wms/src/main/java/com/klp/controller/WmsDeliveryWaybillDetailController.java index 510c2d1bc..8d7c2969d 100644 --- a/klp-wms/src/main/java/com/klp/controller/WmsDeliveryWaybillDetailController.java +++ b/klp-wms/src/main/java/com/klp/controller/WmsDeliveryWaybillDetailController.java @@ -203,4 +203,19 @@ public class WmsDeliveryWaybillDetailController extends BaseController { return iWmsMaterialCoilService.queryPageList(wmsMaterialCoilBo, pageQuery); } + /** + * 根据负责人(principal)统计已发货绑定钢卷的汇总数据(数量、毛重、净重) + */ + @GetMapping("/coilListByPrincipal/statistics") + public R> getCoilListByPrincipalStatistics( + @RequestParam(required = false) String principal) { + List boundCoilIds = iWmsDeliveryWaybillDetailService.getBoundCoilIdsByPrincipal(principal); + if (boundCoilIds == null || boundCoilIds.isEmpty()) { + return R.ok(); + } + WmsMaterialCoilBo wmsMaterialCoilBo = new WmsMaterialCoilBo(); + wmsMaterialCoilBo.setCoilIds(boundCoilIds.stream().map(String::valueOf).collect(Collectors.joining(","))); + return R.ok(iWmsMaterialCoilService.getStatistics(wmsMaterialCoilBo)); + } + }