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 fc5a2fa9a..9a493a3d2 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 @@ -126,7 +126,7 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { boolean hasCustomerFilter = StringUtils.isNotBlank(bo.getCustomer()); boolean hasSignDateFilter = bo.getSignDateStart() != null || bo.getSignDateEnd() != null; boolean hasDeliveryDateFilter = bo.getDeliveryDateStart() != null || bo.getDeliveryDateEnd() != null; - + if (!hasContractFilter && !hasCustomerFilter && !hasSignDateFilter && !hasDeliveryDateFilter) { return null; } @@ -259,30 +259,18 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { public CrmContractOrderFinanceVo queryFinanceAndObjectionByContractId(Long contractId) { CrmContractOrderFinanceVo result = new CrmContractOrderFinanceVo(); - LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(); - orderWrapper.eq(CrmOrder::getContractId, contractId); - List orders = crmOrderMapper.selectList(orderWrapper); - - if (orders == null || orders.isEmpty()) { - return result; - } - - List orderIds = orders.stream() - .map(CrmOrder::getOrderId) - .collect(Collectors.toList()); - LambdaQueryWrapper objectionWrapper = new LambdaQueryWrapper<>(); - objectionWrapper.in(CrmSalesObjection::getOrderId, orderIds); + objectionWrapper.in(CrmSalesObjection::getOrderId, contractId); List objectionList = crmSalesObjectionMapper.selectVoList(objectionWrapper); result.setObjectionList(objectionList); LambdaQueryWrapper receivableWrapper = new LambdaQueryWrapper<>(); - receivableWrapper.in(WmsReceivable::getOrderId, orderIds); + receivableWrapper.in(WmsReceivable::getOrderId, contractId); List receivableList = wmsReceivableMapper.selectVoList(receivableWrapper); result.setReceivableList(receivableList); LambdaQueryWrapper waybillWrapper = new LambdaQueryWrapper<>(); - waybillWrapper.in(WmsDeliveryWaybill::getOrderId, orderIds); + waybillWrapper.in(WmsDeliveryWaybill::getOrderId, contractId); List wmsDeliveryWaybills = wmsDeliveryWaybillMapper.selectVoList(waybillWrapper); result.setWmsDeliveryWaybills(wmsDeliveryWaybills); @@ -354,19 +342,8 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { * @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::getContractId, contractId); relWrapper.eq(WmsCoilContractRel::getDelFlag, 0); List rels = coilContractRelMapper.selectList(relWrapper); if (rels == null || rels.isEmpty()) { @@ -453,18 +430,9 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { @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()); LambdaQueryWrapper waybillWrapper = new LambdaQueryWrapper<>(); - waybillWrapper.in(WmsDeliveryWaybill::getOrderId, orderIds); + waybillWrapper.eq(WmsDeliveryWaybill::getOrderId, contractId); List waybills = wmsDeliveryWaybillMapper.selectList(waybillWrapper); if (waybills == null || waybills.isEmpty()) { return Collections.emptyList(); diff --git a/klp-ems/src/main/java/com/klp/ems/domain/vo/CoilTotalMergedExportVo.java b/klp-ems/src/main/java/com/klp/ems/domain/vo/CoilTotalMergedExportVo.java index 1dcba1d7c..6f4699ec9 100644 --- a/klp-ems/src/main/java/com/klp/ems/domain/vo/CoilTotalMergedExportVo.java +++ b/klp-ems/src/main/java/com/klp/ems/domain/vo/CoilTotalMergedExportVo.java @@ -31,4 +31,7 @@ public class CoilTotalMergedExportVo implements Serializable { @ExcelProperty("总成本") private Double totalCost; + + @ExcelProperty("钢卷ID") + private Long coilId; } diff --git a/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpContractOptionVo.java b/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpContractOptionVo.java index 1e9f0eaad..3043ceb48 100644 --- a/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpContractOptionVo.java +++ b/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpContractOptionVo.java @@ -1,9 +1,11 @@ package com.klp.erp.domain.vo; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; +import java.util.Date; /** * 采购计划左侧「合同列表」视图对象:crm_order + 该合同已有的采购计划数。 @@ -42,4 +44,101 @@ public class ErpContractOptionVo implements Serializable { /** 该合同已挂接的采购计划数 */ private Integer planCount; + + // ====== 以下为 crm_order 全量补充字段 ====== + + /** 订单类型:pre-预订单,formal-正式订单 */ + private Long orderType; + + /** 交货日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date deliveryDate; + + /** 订单状态 */ + private Long orderStatus; + + /** 财务状态 */ + private Long financeStatus; + + /** 未结款数额 */ + private BigDecimal unpaidAmount; + + /** 签订时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date signTime; + + /** 签订地点 */ + private String signLocation; + + /** 产品内容 */ + private String productContent; + + /** 合同内容 */ + private String contractContent; + + /** 供方地址 */ + private String supplierAddress; + + /** 供方电话 */ + private String supplierPhone; + + /** 供方开户行 */ + private String supplierBank; + + /** 供方账号 */ + private String supplierAccount; + + /** 供方税号 */ + private String supplierTaxNo; + + /** 需方地址 */ + private String customerAddress; + + /** 需方电话 */ + private String customerPhone; + + /** 需方开户行 */ + private String customerBank; + + /** 需方账号 */ + private String customerAccount; + + /** 需方税号 */ + private String customerTaxNo; + + /** 技术附件 */ + private String techAnnex; + + /** 商务附件 */ + private String businessAnnex; + + /** 排产函 */ + private String productionSchedule; + + /** 算单价备注 */ + private String unitPriceRemark; + + /** 应付定金(万元) */ + private BigDecimal depositPayable; + + /** 已付定金(万元) */ + private BigDecimal depositPaid; + + /** 定金比例(%) */ + private BigDecimal depositRatio; + + /** 合同状态 0=草稿 1=生效 2=作废 3=已完成 */ + private Long status; + + /** 关联合同ID */ + private Long contractId; + + /** 附件 */ + private String annexFiles; + + /** 备注 */ + private String remark; + + /** 是否置顶 */ + private Integer isTop; } diff --git a/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpPurchasePlanVo.java b/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpPurchasePlanVo.java index 3700fb25e..c3aecdd64 100644 --- a/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpPurchasePlanVo.java +++ b/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpPurchasePlanVo.java @@ -86,6 +86,9 @@ public class ErpPurchasePlanVo implements Serializable { /** 关联销售合同编号(展示用) */ private List contractCodes; + /** 关联销售合同信息(来自 crm_order,含客户、金额、销售员等) */ + private List contractInfos; + /** 审核历史(每次审核/驳回留痕) */ private List auditLogs; } diff --git a/klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchasePlanMapper.java b/klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchasePlanMapper.java index 00c2cb581..c49b3a72b 100644 --- a/klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchasePlanMapper.java +++ b/klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchasePlanMapper.java @@ -61,4 +61,9 @@ public interface ErpPurchasePlanMapper extends BaseMapperPlus selectDistinctManufacturers(@Param("kw") String kw); + + /** + * 根据合同编号(order_code)批量查询 crm_order 合同信息。 + */ + List selectContractsByOrderCodes(@Param("codes") List codes); } diff --git a/klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchasePlanServiceImpl.java b/klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchasePlanServiceImpl.java index 6f7e5d341..7cd6cdcc2 100644 --- a/klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchasePlanServiceImpl.java +++ b/klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchasePlanServiceImpl.java @@ -73,6 +73,8 @@ public class ErpPurchasePlanServiceImpl implements IErpPurchasePlanService { @Override public ErpPurchasePlanVo queryById(Long planId) { + // 刷新到货进度(含在途统计),确保每次查看都是最新数据 + refreshProgress(planId); ErpPurchasePlanVo vo = baseMapper.selectVoById(planId); if (vo == null) { return null; @@ -88,6 +90,32 @@ public class ErpPurchasePlanServiceImpl implements IErpPurchasePlanService { if (!orderIds.isEmpty()) { vo.setContractCodes(baseMapper.selectOrderCodes(orderIds)); } + // 关联合同详情(从 crm_order 按 contractCodes 批量查) + if (vo.getContractCodes() != null && !vo.getContractCodes().isEmpty()) { + vo.setContractInfos(baseMapper.selectContractsByOrderCodes(vo.getContractCodes())); + } + // 直接从到货明细重新计算到货/在途统计,避免 DB 缓存导致数据不准 + List deliveries = deliveryMapper.selectList( + Wrappers.lambdaQuery(ErpPurchasePlanDelivery.class) + .eq(ErpPurchasePlanDelivery::getPlanId, planId)); + int arrivedCount = 0; + int transitCount = 0; + BigDecimal arrivedWeight = BigDecimal.ZERO; + BigDecimal transitWeight = BigDecimal.ZERO; + for (ErpPurchasePlanDelivery d : deliveries) { + BigDecimal w = d.getCoilWeight() == null ? BigDecimal.ZERO : d.getCoilWeight(); + if (d.getArrived() != null && d.getArrived() == 1) { + arrivedCount++; + arrivedWeight = arrivedWeight.add(w); + } else { + transitCount++; + transitWeight = transitWeight.add(w); + } + } + vo.setArrivedCount(arrivedCount); + vo.setArrivedWeight(arrivedWeight); + vo.setInTransitCount(transitCount); + vo.setInTransitWeight(transitWeight); fillProgress(vo); // 审核历史(含每次驳回理由) vo.setAuditLogs(queryAuditLogs(planId)); @@ -366,7 +394,8 @@ public class ErpPurchasePlanServiceImpl implements IErpPurchasePlanService { } String coil = normCoil(row.getCoilNo()); boolean arrived = !coil.isEmpty() && arrivedSet.contains(coil); - boolean transit = !arrived && !coil.isEmpty() && inTransitSet.contains(coil); + // 在途 = 所有已上传但尚未到货的卷(不论 WMS 中是否有记录) + boolean transit = !arrived && !coil.isEmpty(); ErpPurchasePlanDelivery d = new ErpPurchasePlanDelivery(); d.setPlanId(planId); d.setArrived(arrived ? 1 : 0); @@ -484,6 +513,9 @@ public class ErpPurchasePlanServiceImpl implements IErpPurchasePlanService { if (!orderIds.isEmpty()) { v.setContractCodes(baseMapper.selectOrderCodes(orderIds)); } + if (v.getContractCodes() != null && !v.getContractCodes().isEmpty()) { + v.setContractInfos(baseMapper.selectContractsByOrderCodes(v.getContractCodes())); + } } return TableDataInfo.build(result); } @@ -528,7 +560,8 @@ public class ErpPurchasePlanServiceImpl implements IErpPurchasePlanService { for (ErpPurchasePlanDelivery d : deliveries) { String coil = normCoil(d.getCoilNo()); int nowArrived = !coil.isEmpty() && arrivedSet.contains(coil) ? 1 : 0; - int nowTransit = nowArrived == 0 && !coil.isEmpty() && inTransitSet.contains(coil) ? 1 : 0; + // 在途 = 所有已上传但尚未到货的卷(不论 WMS 中是否有记录) + int nowTransit = nowArrived == 0 && !coil.isEmpty() ? 1 : 0; if (d.getArrived() == null || d.getArrived() != nowArrived || d.getInTransit() == null || d.getInTransit() != nowTransit) { d.setArrived(nowArrived); @@ -539,7 +572,8 @@ public class ErpPurchasePlanServiceImpl implements IErpPurchasePlanService { if (nowArrived == 1) { arrivedCount++; arrivedWeight = arrivedWeight.add(w); - } else if (nowTransit == 1) { + } else { + // 未到货的全部计入在途 transitCount++; transitWeight = transitWeight.add(w); } diff --git a/klp-erp/src/main/resources/mapper/erp/ErpPurchasePlanMapper.xml b/klp-erp/src/main/resources/mapper/erp/ErpPurchasePlanMapper.xml index 9bc505264..f4713426f 100644 --- a/klp-erp/src/main/resources/mapper/erp/ErpPurchasePlanMapper.xml +++ b/klp-erp/src/main/resources/mapper/erp/ErpPurchasePlanMapper.xml @@ -32,17 +32,48 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ORDER BY order_id, item_id - + + + +