feat(crm): 添加订单项统计功能

- 在CrmOrderItemController中新增三个统计接口:按订单ID、销售员、合同ID统计配卷汇总
- 实现resolveCoilIdsByOrderId、resolveCoilIdsBySalesman、resolveCoilIdsByContractId辅助方法
- 重构queryCoilsByOrderId、queryCoilsBySalesman、queryCoilsByContractIdPaginated方法逻辑
- 新增queryCoilsByOrderIdStatistics、queryCoilsBySalesmanStatistics、queryCoilsByContractIdStatistics统计方法
- 添加emptyStatistics私有方法返回默认统计值
- 在WmsDeliveryWaybillDetailController中新增按负责人统计已发货钢卷汇总接口
This commit is contained in:
2026-06-29 17:19:28 +08:00
parent bc7b9d2454
commit 70ade4632e
4 changed files with 194 additions and 91 deletions

View File

@@ -148,4 +148,24 @@ public class CrmOrderItemController extends BaseController {
PageQuery pageQuery) { PageQuery pageQuery) {
return iCrmOrderItemService.queryCoilsByContractIdPaginated(contractId, pageQuery); return iCrmOrderItemService.queryCoilsByContractIdPaginated(contractId, pageQuery);
} }
// 根据订单ID统计配卷汇总
@GetMapping("/coils/order/{orderId}/statistics")
public R<java.util.Map<String, java.math.BigDecimal>> getCoilsByOrderIdStatistics(@NotNull(message = "订单ID不能为空")
@PathVariable Long orderId) {
return R.ok(iCrmOrderItemService.queryCoilsByOrderIdStatistics(orderId));
}
// 根据销售员统计生产成果汇总
@GetMapping("/coils/bySalesman/statistics")
public R<java.util.Map<String, java.math.BigDecimal>> getCoilsBySalesmanStatistics(@RequestParam String salesman) {
return R.ok(iCrmOrderItemService.queryCoilsBySalesmanStatistics(salesman));
}
// 根据合同ID统计生产成果汇总
@GetMapping("/coils/byContract/{contractId}/statistics")
public R<java.util.Map<String, java.math.BigDecimal>> getCoilsByContractIdStatistics(@NotNull(message = "合同ID不能为空")
@PathVariable Long contractId) {
return R.ok(iCrmOrderItemService.queryCoilsByContractIdStatistics(contractId));
}
} }

View File

@@ -85,4 +85,19 @@ public interface ICrmOrderItemService {
* 根据合同ID查询生产成果钢卷列表分页 * 根据合同ID查询生产成果钢卷列表分页
*/ */
TableDataInfo<WmsMaterialCoilVo> queryCoilsByContractIdPaginated(Long contractId, PageQuery pageQuery); TableDataInfo<WmsMaterialCoilVo> queryCoilsByContractIdPaginated(Long contractId, PageQuery pageQuery);
/**
* 根据订单ID统计配卷汇总数据数量、毛重、净重
*/
java.util.Map<String, java.math.BigDecimal> queryCoilsByOrderIdStatistics(Long orderId);
/**
* 根据销售员统计生产成果汇总数据(数量、毛重、净重)
*/
java.util.Map<String, java.math.BigDecimal> queryCoilsBySalesmanStatistics(String salesman);
/**
* 根据合同ID统计生产成果汇总数据数量、毛重、净重
*/
java.util.Map<String, java.math.BigDecimal> queryCoilsByContractIdStatistics(Long contractId);
} }

View File

@@ -290,16 +290,19 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
return result; return result;
} }
@Override // ==================== 线圈ID解析辅助方法 ====================
public TableDataInfo<WmsMaterialCoilVo> queryCoilsByOrderId(Long orderId, PageQuery pageQuery) {
/**
* 根据订单ID解析关联的线圈ID串通过发货单→发货单明细
* @return 逗号分隔的coilId字符串无数据返回null
*/
private String resolveCoilIdsByOrderId(Long orderId) {
LambdaQueryWrapper<WmsDeliveryWaybill> waybillWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<WmsDeliveryWaybill> waybillWrapper = new LambdaQueryWrapper<>();
waybillWrapper.eq(WmsDeliveryWaybill::getOrderId, orderId); waybillWrapper.eq(WmsDeliveryWaybill::getOrderId, orderId);
List<WmsDeliveryWaybill> waybills = wmsDeliveryWaybillMapper.selectList(waybillWrapper); List<WmsDeliveryWaybill> waybills = wmsDeliveryWaybillMapper.selectList(waybillWrapper);
if (waybills == null || waybills.isEmpty()) { if (waybills == null || waybills.isEmpty()) {
return new TableDataInfo<>(); return null;
} }
List<Long> waybillIds = waybills.stream() List<Long> waybillIds = waybills.stream()
.map(WmsDeliveryWaybill::getWaybillId) .map(WmsDeliveryWaybill::getWaybillId)
.collect(Collectors.toList()); .collect(Collectors.toList());
@@ -307,31 +310,155 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
LambdaQueryWrapper<WmsDeliveryWaybillDetail> detailWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<WmsDeliveryWaybillDetail> detailWrapper = new LambdaQueryWrapper<>();
detailWrapper.in(WmsDeliveryWaybillDetail::getWaybillId, waybillIds); detailWrapper.in(WmsDeliveryWaybillDetail::getWaybillId, waybillIds);
List<WmsDeliveryWaybillDetail> details = wmsDeliveryWaybillDetailMapper.selectList(detailWrapper); List<WmsDeliveryWaybillDetail> details = wmsDeliveryWaybillDetailMapper.selectList(detailWrapper);
if (details == null || details.isEmpty()) { if (details == null || details.isEmpty()) {
return new TableDataInfo<>(); return null;
} }
return details.stream()
String coilIds = details.stream()
.map(WmsDeliveryWaybillDetail::getCoilId) .map(WmsDeliveryWaybillDetail::getCoilId)
.map(String::valueOf) .map(String::valueOf)
.collect(Collectors.joining(",")); .collect(Collectors.joining(","));
}
/**
* 根据销售员解析关联的线圈ID串通过crm_order→wms_coil_contract_rel
* @return 逗号分隔的coilId字符串无数据返回null
*/
private String resolveCoilIdsBySalesman(String salesman) {
LambdaQueryWrapper<CrmOrder> orderWrapper = new LambdaQueryWrapper<>();
orderWrapper.eq(CrmOrder::getSalesman, salesman);
orderWrapper.eq(CrmOrder::getDelFlag, 0);
List<CrmOrder> orders = crmOrderMapper.selectList(orderWrapper);
if (orders == null || orders.isEmpty()) {
return null;
}
List<Long> orderIds = orders.stream()
.map(CrmOrder::getOrderId)
.collect(Collectors.toList());
LambdaQueryWrapper<WmsCoilContractRel> relWrapper = new LambdaQueryWrapper<>();
relWrapper.in(WmsCoilContractRel::getContractId, orderIds);
relWrapper.eq(WmsCoilContractRel::getDelFlag, 0);
List<WmsCoilContractRel> 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<CrmOrder> orderWrapper = new LambdaQueryWrapper<>();
orderWrapper.eq(CrmOrder::getContractId, contractId);
orderWrapper.eq(CrmOrder::getDelFlag, 0);
List<CrmOrder> orders = crmOrderMapper.selectList(orderWrapper);
if (orders == null || orders.isEmpty()) {
return null;
}
List<Long> orderIds = orders.stream()
.map(CrmOrder::getOrderId)
.collect(Collectors.toList());
LambdaQueryWrapper<WmsCoilContractRel> relWrapper = new LambdaQueryWrapper<>();
relWrapper.in(WmsCoilContractRel::getContractId, orderIds);
relWrapper.eq(WmsCoilContractRel::getDelFlag, 0);
List<WmsCoilContractRel> 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<WmsMaterialCoilVo> queryCoilsByOrderId(Long orderId, PageQuery pageQuery) {
String coilIds = resolveCoilIdsByOrderId(orderId);
if (coilIds == null) {
return new TableDataInfo<>();
}
WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo();
coilBo.setCoilIds(coilIds); coilBo.setCoilIds(coilIds);
return iWmsMaterialCoilService.queryPageList(coilBo, pageQuery); return iWmsMaterialCoilService.queryPageList(coilBo, pageQuery);
} }
@Override
public TableDataInfo<WmsMaterialCoilVo> 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<WmsMaterialCoilVo> 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<String, java.math.BigDecimal> 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<String, java.math.BigDecimal> 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<String, java.math.BigDecimal> queryCoilsByContractIdStatistics(Long contractId) {
String coilIds = resolveCoilIdsByContractId(contractId);
if (coilIds == null) {
return emptyStatistics();
}
WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo();
coilBo.setCoilIds(coilIds);
return iWmsMaterialCoilService.getStatistics(coilBo);
}
// ==================== 已有方法(非分页) ====================
@Override @Override
public List<WmsMaterialCoilVo> queryCoilsByContractId(Long contractId) { public List<WmsMaterialCoilVo> queryCoilsByContractId(Long contractId) {
LambdaQueryWrapper<CrmOrder> orderWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<CrmOrder> orderWrapper = new LambdaQueryWrapper<>();
orderWrapper.eq(CrmOrder::getContractId, contractId); orderWrapper.eq(CrmOrder::getContractId, contractId);
List<CrmOrder> orders = crmOrderMapper.selectList(orderWrapper); List<CrmOrder> orders = crmOrderMapper.selectList(orderWrapper);
if (orders == null || orders.isEmpty()) { if (orders == null || orders.isEmpty()) {
return Collections.emptyList(); return Collections.emptyList();
} }
List<Long> orderIds = orders.stream() List<Long> orderIds = orders.stream()
.map(CrmOrder::getOrderId) .map(CrmOrder::getOrderId)
.collect(Collectors.toList()); .collect(Collectors.toList());
@@ -339,11 +466,9 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
LambdaQueryWrapper<WmsDeliveryWaybill> waybillWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<WmsDeliveryWaybill> waybillWrapper = new LambdaQueryWrapper<>();
waybillWrapper.in(WmsDeliveryWaybill::getOrderId, orderIds); waybillWrapper.in(WmsDeliveryWaybill::getOrderId, orderIds);
List<WmsDeliveryWaybill> waybills = wmsDeliveryWaybillMapper.selectList(waybillWrapper); List<WmsDeliveryWaybill> waybills = wmsDeliveryWaybillMapper.selectList(waybillWrapper);
if (waybills == null || waybills.isEmpty()) { if (waybills == null || waybills.isEmpty()) {
return Collections.emptyList(); return Collections.emptyList();
} }
List<Long> waybillIds = waybills.stream() List<Long> waybillIds = waybills.stream()
.map(WmsDeliveryWaybill::getWaybillId) .map(WmsDeliveryWaybill::getWaybillId)
.collect(Collectors.toList()); .collect(Collectors.toList());
@@ -351,11 +476,9 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
LambdaQueryWrapper<WmsDeliveryWaybillDetail> detailWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<WmsDeliveryWaybillDetail> detailWrapper = new LambdaQueryWrapper<>();
detailWrapper.in(WmsDeliveryWaybillDetail::getWaybillId, waybillIds); detailWrapper.in(WmsDeliveryWaybillDetail::getWaybillId, waybillIds);
List<WmsDeliveryWaybillDetail> details = wmsDeliveryWaybillDetailMapper.selectList(detailWrapper); List<WmsDeliveryWaybillDetail> details = wmsDeliveryWaybillDetailMapper.selectList(detailWrapper);
if (details == null || details.isEmpty()) { if (details == null || details.isEmpty()) {
return Collections.emptyList(); return Collections.emptyList();
} }
String coilIds = details.stream() String coilIds = details.stream()
.map(WmsDeliveryWaybillDetail::getCoilId) .map(WmsDeliveryWaybillDetail::getCoilId)
.map(String::valueOf) .map(String::valueOf)
@@ -373,11 +496,9 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
LambdaQueryWrapper<CrmOrder> orderWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<CrmOrder> orderWrapper = new LambdaQueryWrapper<>();
orderWrapper.eq(CrmOrder::getCustomerId, customerId); orderWrapper.eq(CrmOrder::getCustomerId, customerId);
List<CrmOrder> orders = crmOrderMapper.selectList(orderWrapper); List<CrmOrder> orders = crmOrderMapper.selectList(orderWrapper);
if (orders == null || orders.isEmpty()) { if (orders == null || orders.isEmpty()) {
return result; return result;
} }
List<Long> orderIds = orders.stream() List<Long> orderIds = orders.stream()
.map(CrmOrder::getOrderId) .map(CrmOrder::getOrderId)
.collect(Collectors.toList()); .collect(Collectors.toList());
@@ -405,11 +526,9 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
LambdaQueryWrapper<CrmOrder> orderWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<CrmOrder> orderWrapper = new LambdaQueryWrapper<>();
orderWrapper.eq(CrmOrder::getCustomerId, customerId); orderWrapper.eq(CrmOrder::getCustomerId, customerId);
List<CrmOrder> orders = crmOrderMapper.selectList(orderWrapper); List<CrmOrder> orders = crmOrderMapper.selectList(orderWrapper);
if (orders == null || orders.isEmpty()) { if (orders == null || orders.isEmpty()) {
return Collections.emptyList(); return Collections.emptyList();
} }
List<Long> orderIds = orders.stream() List<Long> orderIds = orders.stream()
.map(CrmOrder::getOrderId) .map(CrmOrder::getOrderId)
.collect(Collectors.toList()); .collect(Collectors.toList());
@@ -417,11 +536,9 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
LambdaQueryWrapper<WmsDeliveryWaybill> waybillWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<WmsDeliveryWaybill> waybillWrapper = new LambdaQueryWrapper<>();
waybillWrapper.in(WmsDeliveryWaybill::getOrderId, orderIds); waybillWrapper.in(WmsDeliveryWaybill::getOrderId, orderIds);
List<WmsDeliveryWaybill> waybills = wmsDeliveryWaybillMapper.selectList(waybillWrapper); List<WmsDeliveryWaybill> waybills = wmsDeliveryWaybillMapper.selectList(waybillWrapper);
if (waybills == null || waybills.isEmpty()) { if (waybills == null || waybills.isEmpty()) {
return Collections.emptyList(); return Collections.emptyList();
} }
List<Long> waybillIds = waybills.stream() List<Long> waybillIds = waybills.stream()
.map(WmsDeliveryWaybill::getWaybillId) .map(WmsDeliveryWaybill::getWaybillId)
.collect(Collectors.toList()); .collect(Collectors.toList());
@@ -429,11 +546,9 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
LambdaQueryWrapper<WmsDeliveryWaybillDetail> detailWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<WmsDeliveryWaybillDetail> detailWrapper = new LambdaQueryWrapper<>();
detailWrapper.in(WmsDeliveryWaybillDetail::getWaybillId, waybillIds); detailWrapper.in(WmsDeliveryWaybillDetail::getWaybillId, waybillIds);
List<WmsDeliveryWaybillDetail> details = wmsDeliveryWaybillDetailMapper.selectList(detailWrapper); List<WmsDeliveryWaybillDetail> details = wmsDeliveryWaybillDetailMapper.selectList(detailWrapper);
if (details == null || details.isEmpty()) { if (details == null || details.isEmpty()) {
return Collections.emptyList(); return Collections.emptyList();
} }
String coilIds = details.stream() String coilIds = details.stream()
.map(WmsDeliveryWaybillDetail::getCoilId) .map(WmsDeliveryWaybillDetail::getCoilId)
.map(String::valueOf) .map(String::valueOf)
@@ -444,73 +559,11 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
return iWmsMaterialCoilService.queryList(coilBo); return iWmsMaterialCoilService.queryList(coilBo);
} }
@Override private Map<String, java.math.BigDecimal> emptyStatistics() {
public TableDataInfo<WmsMaterialCoilVo> queryCoilsBySalesman(String salesman, PageQuery pageQuery) { Map<String, java.math.BigDecimal> empty = new HashMap<>();
LambdaQueryWrapper<CrmOrder> orderWrapper = new LambdaQueryWrapper<>(); empty.put("total_count", java.math.BigDecimal.ZERO);
orderWrapper.eq(CrmOrder::getSalesman, salesman); empty.put("total_gross_weight", java.math.BigDecimal.ZERO);
orderWrapper.eq(CrmOrder::getDelFlag, 0); empty.put("total_net_weight", java.math.BigDecimal.ZERO);
List<CrmOrder> orders = crmOrderMapper.selectList(orderWrapper); return empty;
if (orders == null || orders.isEmpty()) {
return new TableDataInfo<>();
}
List<Long> orderIds = orders.stream()
.map(CrmOrder::getOrderId)
.collect(Collectors.toList());
LambdaQueryWrapper<WmsCoilContractRel> relWrapper = new LambdaQueryWrapper<>();
relWrapper.in(WmsCoilContractRel::getContractId, orderIds);
relWrapper.eq(WmsCoilContractRel::getDelFlag, 0);
List<WmsCoilContractRel> 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<WmsMaterialCoilVo> queryCoilsByContractIdPaginated(Long contractId, PageQuery pageQuery) {
LambdaQueryWrapper<CrmOrder> orderWrapper = new LambdaQueryWrapper<>();
orderWrapper.eq(CrmOrder::getContractId, contractId);
orderWrapper.eq(CrmOrder::getDelFlag, 0);
List<CrmOrder> orders = crmOrderMapper.selectList(orderWrapper);
if (orders == null || orders.isEmpty()) {
return new TableDataInfo<>();
}
List<Long> orderIds = orders.stream()
.map(CrmOrder::getOrderId)
.collect(Collectors.toList());
LambdaQueryWrapper<WmsCoilContractRel> relWrapper = new LambdaQueryWrapper<>();
relWrapper.in(WmsCoilContractRel::getContractId, orderIds);
relWrapper.eq(WmsCoilContractRel::getDelFlag, 0);
List<WmsCoilContractRel> 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);
} }
} }

View File

@@ -203,4 +203,19 @@ public class WmsDeliveryWaybillDetailController extends BaseController {
return iWmsMaterialCoilService.queryPageList(wmsMaterialCoilBo, pageQuery); return iWmsMaterialCoilService.queryPageList(wmsMaterialCoilBo, pageQuery);
} }
/**
* 根据负责人(principal)统计已发货绑定钢卷的汇总数据(数量、毛重、净重)
*/
@GetMapping("/coilListByPrincipal/statistics")
public R<java.util.Map<String, java.math.BigDecimal>> getCoilListByPrincipalStatistics(
@RequestParam(required = false) String principal) {
List<Long> 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));
}
} }