From d91aadca0b3d214bb67a5b8be67a51c4ecbc4867 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Tue, 11 Aug 2026 09:16:28 +0800 Subject: [PATCH 01/37] =?UTF-8?q?feat(oms):=20=E5=85=A5=E4=BB=93=E5=A7=94?= =?UTF-8?q?=E6=89=98=E5=8D=95=E3=80=8C=E4=B8=8B=E5=8F=91=E5=88=B0WMS?= =?UTF-8?q?=E3=80=8D=E5=8A=9F=E8=83=BD=E5=BC=80=E5=8F=91=20=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=C2=A0issueOrder=C2=A0=E4=B8=8B=E5=8F=91=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E6=8E=A8=E9=80=81=E4=B8=BB=E5=8D=95=E4=B8=8E?= =?UTF-8?q?=E6=98=8E=E7=BB=86=E8=87=B3=20WMS=EF=BC=9B=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=B7=B2=E5=AE=A1=E6=A0=B8=E6=A0=A1=E9=AA=8C=E3=80=81=E9=98=B2?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E4=B8=8B=E5=8F=91=E3=80=81=E4=BB=93=E5=BA=93?= =?UTF-8?q?=E5=BF=85=E5=A1=AB=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ReservationStockInOrderDomainService.java | 71 ++++++++++++++----- 1 file changed, 52 insertions(+), 19 deletions(-) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java index 6a3566dce..5a55e93e2 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java @@ -468,6 +468,31 @@ public class ReservationStockInOrderDomainService { */ @Transactional(rollbackFor = Exception.class) public Boolean issueOrder(ReservationStockInOrderDO stockInOrderDO) { + + // ===== 新增校验 ===== + List inOrderIds = stockInOrderDO.getInOrderIds(); + if (inOrderIds == null || inOrderIds.isEmpty()) { + throw new ServiceException("下发失败:未选择单据"); + } + List checkOrders = stockInOrderService.list( + new QueryWrapper().lambda() + .in(ReservationStockInOrder::getInOrderId, inOrderIds)); + for (ReservationStockInOrder order : checkOrders) { + // 校验1:必须已审核(issueStatus==2 表示审核成功) + if (order.getIssueStatus() == null || order.getIssueStatus() != 2) { + throw new ServiceException("下发失败:单据[" + order.getInOrderNumber() + "]未审核,无法下发"); + } + // 校验2:防止重复下发(issueTime 有值表示已下发过) + if (order.getIssueTime() != null) { + throw new ServiceException("下发失败:单据[" + order.getInOrderNumber() + "]已下发,不可重复下发"); + } + // 校验3:WMS 必填字段(warehouseId 不能为空) + if (order.getWarehouseId() == null) { + throw new ServiceException("下发失败:单据[" + order.getInOrderNumber() + "]缺少入库仓库,无法下发"); + } + } + // ===== 校验结束 ===== + LoginUser loginUser = SecurityUtils.getLoginUser(); // 获取用户姓名(优先从UserPo获取,如果为空则使用realname,最后使用username作为兜底) @@ -485,26 +510,34 @@ public class ReservationStockInOrderDomainService { .in(ReservationStockInOrder::getInOrderId, stockInOrderDO.getInOrderIds())); //todo下发推送到wms -// List inOrderIds = stockInOrderDO.getInOrderIds(); -// for (Long inOrderId : inOrderIds) { -// ReservationStockInOrder byId = stockInOrderService.getById(inOrderId); -// StockInOrder stockInOrder = new StockInOrder(); -// BeanUtils.copyProperties(byId, stockInOrder,"inOrderId"); -// stockInOrder.setOmsStockInOrderId(String.valueOf(byId.getInOrderId())); -// wmsServiceFeign.omsInOrderAdd(stockInOrder); -// String inOrderNumber = stockInOrder.getInOrderNumber(); -// List materialDetailList = materialDetailService.list(new QueryWrapper().lambda().eq(ReservationInMaterialDetail::getInOrderNumber, inOrderNumber)); -// List inMaterialDetailList = new ArrayList<>(); -// for (ReservationInMaterialDetail reservationInMaterialDetail : materialDetailList) { -// InMaterialDetail inMaterialDetail = new InMaterialDetail(); -// BeanUtils.copyProperties(reservationInMaterialDetail, inMaterialDetail,"materialDetailId"); -// inMaterialDetail.setOmsInMaterialDetail(String.valueOf(reservationInMaterialDetail.getMaterialDetailId())); -// inMaterialDetailList.add(inMaterialDetail); -// } -// wmsServiceFeign.omsInOrderAddDetail(inMaterialDetailList); -// } + for (Long inOrderId : inOrderIds) { + ReservationStockInOrder byId = stockInOrderService.getById(inOrderId); + StockInOrder stockInOrder = new StockInOrder(); + BeanUtils.copyProperties(byId, stockInOrder, "inOrderId"); + stockInOrder.setOmsStockInOrderId(String.valueOf(byId.getInOrderId())); + + try { + wmsServiceFeign.omsInOrderAdd(stockInOrder); // 推主单 + + String inOrderNumber = stockInOrder.getInOrderNumber(); + List materialDetailList = materialDetailService.list( + new QueryWrapper().lambda() + .eq(ReservationInMaterialDetail::getInOrderNumber, inOrderNumber)); + List inMaterialDetailList = new ArrayList<>(); + for (ReservationInMaterialDetail reservationInMaterialDetail : materialDetailList) { + InMaterialDetail inMaterialDetail = new InMaterialDetail(); + BeanUtils.copyProperties(reservationInMaterialDetail, inMaterialDetail, "materialDetailId"); + inMaterialDetail.setOmsInMaterialDetail(String.valueOf(reservationInMaterialDetail.getMaterialDetailId())); + inMaterialDetailList.add(inMaterialDetail); + } + wmsServiceFeign.omsInOrderAddDetail(inMaterialDetailList); // 推明细(会触发WMS自动审核) + log.info("下发到WMS成功,单据号:{}", byId.getInOrderNumber()); + } catch (Exception e) { + log.error("下发到WMS失败,单据号:{}", byId.getInOrderNumber(), e); + throw new ServiceException("下发到WMS失败:" + e.getMessage()); + } + } //todo下发推送到入库业务单 - List inOrderIds = stockInOrderDO.getInOrderIds(); for (Long inOrderId : inOrderIds) { // Long inOrderId = stockInOrderDO.getInOrderId(); ReservationStockInOrder byId = stockInOrderService.getById(inOrderId); From 40a906a9fb4434c33757adec8a19efa2128c680c Mon Sep 17 00:00:00 2001 From: zhaoqing <3160641494@qq.com> Date: Tue, 11 Aug 2026 11:07:40 +0800 Subject: [PATCH 02/37] =?UTF-8?q?fix(system):=E4=BF=AE=E6=94=B9=E5=BA=93?= =?UTF-8?q?=E5=8C=BA=E5=BA=93=E4=BD=8D=E6=9F=A5=E8=AF=A2=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0nullify=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/domain/warehouse/service/WarehouseDomainService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/warehouse/service/WarehouseDomainService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/warehouse/service/WarehouseDomainService.java index aa2d571e6..4bd24e1f2 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/warehouse/service/WarehouseDomainService.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/warehouse/service/WarehouseDomainService.java @@ -168,9 +168,11 @@ public class WarehouseDomainService { warehouseLinkagePO.setName(warehousePO.getWarehouseName()); StorageSectionDO storageSectionDO = new StorageSectionDO(); storageSectionDO.setWarehouseId(warehousePO.getWarehouseId()); + storageSectionDO.setNullify(1); List storageSectionPOList = storageSectionService.queryList(storageSectionDO); StorageLocationDO storageLocationDO = new StorageLocationDO(); storageLocationDO.setWarehouseId(warehousePO.getWarehouseId()); + storageLocationDO.setNullify(1); List storageLocationPOList = storageLocationService.queryList(storageLocationDO); //根据库区唯一标识进行分组 Map> storageLocationListMap = storageLocationPOList.stream().collect(Collectors.groupingBy(StorageLocationPO::getStorageCode)); From 8b4e785de38766e5ede522039bdcffa120beb09d Mon Sep 17 00:00:00 2001 From: zhaoqing <3160641494@qq.com> Date: Tue, 11 Aug 2026 17:46:49 +0800 Subject: [PATCH 03/37] =?UTF-8?q?fix(wms):=E5=87=BA=E5=85=A5=E5=BA=93?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=92=8C=E5=AF=BC=E5=87=BA=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StockInOrderApplicationService.java | 32 +++++++++++++++++++ .../StockOutOrderApplicationService.java | 24 ++++++++++++++ .../facade/IInMaterialDetailService.java | 6 ++++ .../mapper/InMaterialDetailMapper.java | 7 ++++ .../persistence/InMaterialDetailImpl.java | 10 ++++++ .../repository/po/InStockListMaterialAgg.java | 12 +++++++ .../facade/IOutMaterialDetailService.java | 5 +++ .../mapper/OutMaterialDetailMapper.java | 5 +++ .../persistence/OutMaterialDetailImpl.java | 8 +++++ .../po/OutStockListMaterialAgg.java | 2 ++ .../repository/po/StockInOrderPO.java | 3 ++ .../repository/todo/StockInOrderDO.java | 3 ++ .../repository/po/StockOutOrderPO.java | 3 ++ .../repository/todo/StockOutOrderDO.java | 3 ++ .../dto/stockInOrder/StockInOrderDTO.java | 3 ++ .../dto/stockOutOrder/StockOutOrderDTO.java | 3 ++ .../OutMaterialDetailMapper.xml | 16 ++++++++++ .../InMaterialDetailMapper.xml | 16 ++++++++++ 18 files changed, 161 insertions(+) create mode 100644 mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/po/InStockListMaterialAgg.java diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java index f07aca537..d7e1b1138 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java @@ -36,6 +36,7 @@ import com.mhd.wms.domain.handoverTaskOrder.repository.facade.IHandoverTaskOrder import com.mhd.wms.domain.inMaterialDetail.entity.InMaterialDetail; import com.mhd.wms.domain.inMaterialDetail.repository.facade.IInMaterialDetailService; import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailPO; +import com.mhd.wms.domain.inMaterialDetail.repository.po.InStockListMaterialAgg; import com.mhd.wms.domain.inMaterialDetail.repository.todo.InMaterialDetailDO; import com.mhd.wms.domain.materialBaseInfo.entity.MaterialBaseInfo; import com.mhd.wms.domain.materialBaseInfo.repository.facade.IMaterialBaseInfoService; @@ -242,7 +243,38 @@ public class StockInOrderApplicationService { } } List stockInOrderPOS = stockInOrderDomainService.queryList(stockInOrderDO); + if (CollectionUtils.isEmpty(stockInOrderPOS)) { + return stockInOrderPOS; + } + List inOrderNumbers = stockInOrderPOS.stream() + .map(StockInOrderPO::getInOrderNumber) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + // 列表页展示:按入库单号批量取去重后的 Invoice No + Map invoiceNoByNum = new HashMap<>(); + inMaterialDetailService.selectDistinctInvoiceNoForStockInList(inOrderNumbers) + .stream() + .filter(a -> StringUtils.isNotBlank(a.getInvoiceNo())) + .forEach(a -> invoiceNoByNum.merge(a.getInOrderNumber(), a.getInvoiceNo().trim(), (o, n) -> o + "," + n)); + + // 导出场景(needDetail=true):批量取出完整明细树(level=1 父行 + children),按入库单号分组挂到列表 + Map> detailByNum = Collections.emptyMap(); + if (Boolean.TRUE.equals(stockInOrderDO.getNeedDetail()) && !CollectionUtils.isEmpty(inOrderNumbers)) { + InMaterialDetailDO detailQuery = new InMaterialDetailDO(); + detailQuery.setInOrderNumberList(inOrderNumbers); + List detailTreeList = inMaterialDetailService.queryListChildren(detailQuery); + detailByNum = detailTreeList.stream() + .collect(Collectors.groupingBy(InMaterialDetailPO::getInOrderNumber)); + } + for (StockInOrderPO stockInOrderPO : stockInOrderPOS) { + if (invoiceNoByNum.containsKey(stockInOrderPO.getInOrderNumber())) { + stockInOrderPO.setInvoiceNo(invoiceNoByNum.get(stockInOrderPO.getInOrderNumber())); + } + if (Boolean.TRUE.equals(stockInOrderDO.getNeedDetail())) { + stockInOrderPO.setMaterialDetailList(detailByNum.getOrDefault(stockInOrderPO.getInOrderNumber(), Collections.emptyList())); + } Long inOrderId = stockInOrderPO.getInOrderId(); List list = receiptOrderAccountService.list(new LambdaQueryWrapper().eq(ReceiptOrderAccount::getOrderId, inOrderId).eq(ReceiptOrderAccount::getInOrOut, "in")); stockInOrderPO.setReceiptOrderAccountList(list); diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java index 26de7300b..9dbe157ba 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java @@ -253,9 +253,33 @@ public class StockOutOrderApplicationService { accountByOrderId = accounts.stream().collect(Collectors.groupingBy(ReceiptOrderAccount::getOrderId)); } + // 列表页展示:按出库单号批量取去重后的 Invoice No + Map invoiceNoByNum = new HashMap<>(); + outMaterialDetailService.selectDistinctInvoiceNoForStockOutList(outOrderNumbers) + .stream() + .filter(a -> StringUtils.isNotBlank(a.getInvoiceNo())) + .forEach(a -> invoiceNoByNum.merge(a.getOutOrderNumber(), a.getInvoiceNo().trim(), (o, n) -> o + "," + n)); + + // 导出场景(needDetail=true):批量取出完整明细树(level=1 父行 + children),按出库单号分组挂到列表 + Map> detailByNum = Collections.emptyMap(); + if (Boolean.TRUE.equals(stockOutOrderDO.getNeedDetail()) && !CollectionUtils.isEmpty(outOrderNumbers)) { + OutMaterialDetailDO detailQuery = new OutMaterialDetailDO(); + detailQuery.setOutOrderNumberList(outOrderNumbers); + List detailTreeList = outMaterialDetailService.queryListChildren(detailQuery); + detailByNum = detailTreeList.stream() + .collect(Collectors.groupingBy(OutMaterialDetailPO::getOutOrderNumber)); + } + for (StockOutOrderPO stockOutOrderPO : stockOutOrderPOS) { String outOrderNumber = stockOutOrderPO.getOutOrderNumber(); + if (invoiceNoByNum.containsKey(outOrderNumber)) { + stockOutOrderPO.setInvoiceNo(invoiceNoByNum.get(outOrderNumber)); + } + if (Boolean.TRUE.equals(stockOutOrderDO.getNeedDetail())) { + stockOutOrderPO.setMaterialDetailList(detailByNum.getOrDefault(outOrderNumber, Collections.emptyList())); + } + List list = deliveryDetailsLinkService.list(new LambdaQueryWrapper().eq(DeliveryDetailsLink::getOrderNumber, outOrderNumber)); stockOutOrderPO.setDeliveryDetailsLinkList(list); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/facade/IInMaterialDetailService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/facade/IInMaterialDetailService.java index 851a3a7f0..6e1e83472 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/facade/IInMaterialDetailService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/facade/IInMaterialDetailService.java @@ -3,6 +3,7 @@ package com.mhd.wms.domain.inMaterialDetail.repository.facade; import com.baomidou.mybatisplus.extension.service.IService; import com.mhd.wms.domain.inMaterialDetail.entity.InMaterialDetail; import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailPO; +import com.mhd.wms.domain.inMaterialDetail.repository.po.InStockListMaterialAgg; import com.mhd.wms.domain.inMaterialDetail.repository.todo.InMaterialDetailBaseDO; import com.mhd.wms.domain.inMaterialDetail.repository.todo.InMaterialDetailDO; import com.mhd.wms.domain.overStock.repository.todo.QueryOrderOverStockDO; @@ -31,6 +32,11 @@ public interface IInMaterialDetailService extends IService */ public List queryListChildren(InMaterialDetailDO inMaterialDetailDO); + /** + * 入库列表页:按入库单号批量取去重后的 Invoice No(仅 level=1) + */ + List selectDistinctInvoiceNoForStockInList(List inOrderNumbers); + /** * 新增物料明细 */ diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/mapper/InMaterialDetailMapper.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/mapper/InMaterialDetailMapper.java index 618bf84c9..92a00e1a1 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/mapper/InMaterialDetailMapper.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/mapper/InMaterialDetailMapper.java @@ -3,8 +3,10 @@ package com.mhd.wms.domain.inMaterialDetail.repository.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.mhd.wms.domain.inMaterialDetail.entity.InMaterialDetail; import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailPO; +import com.mhd.wms.domain.inMaterialDetail.repository.po.InStockListMaterialAgg; import com.mhd.wms.domain.inMaterialDetail.repository.todo.InMaterialDetailDO; import com.mhd.wms.domain.overStock.repository.todo.QueryOrderOverStockDO; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -26,4 +28,9 @@ public interface InMaterialDetailMapper extends BaseMapper */ public List queryInOrderList(QueryOrderOverStockDO queryOrderOverStockDO); + /** + * 入库列表页:按入库单号批量取去重后的 Invoice No(仅 level=1) + */ + List selectDistinctInvoiceNoForStockInList(@Param("inOrderNumbers") List inOrderNumbers); + } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/persistence/InMaterialDetailImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/persistence/InMaterialDetailImpl.java index f95edc930..761c3d6b4 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/persistence/InMaterialDetailImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/persistence/InMaterialDetailImpl.java @@ -14,6 +14,7 @@ import com.mhd.wms.domain.inMaterialDetail.entity.InMaterialDetail; import com.mhd.wms.domain.inMaterialDetail.repository.facade.IInMaterialDetailService; import com.mhd.wms.domain.inMaterialDetail.repository.mapper.InMaterialDetailMapper; import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailPO; +import com.mhd.wms.domain.inMaterialDetail.repository.po.InStockListMaterialAgg; import com.mhd.wms.domain.inMaterialDetail.repository.todo.InMaterialDetailBaseDO; import com.mhd.wms.domain.inMaterialDetail.repository.todo.InMaterialDetailDO; import com.mhd.wms.domain.materialBaseInfo.repository.facade.IMaterialBaseInfoService; @@ -26,6 +27,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.util.ArrayList; +import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Map; @@ -86,6 +88,14 @@ public class InMaterialDetailImpl extends ServiceImpl selectDistinctInvoiceNoForStockInList(List inOrderNumbers) { + if (CollectionUtils.isEmpty(inOrderNumbers)) { + return Collections.emptyList(); + } + return inMaterialDetailMapper.selectDistinctInvoiceNoForStockInList(inOrderNumbers); + } + private List getChildren(Long parentUniqueId, List inMaterialDetailPOList, Integer maxLevel){ List childrenCityList = inMaterialDetailPOList.stream().filter(materialDetailPO -> parentUniqueId.equals(materialDetailPO.getParentUniqueId())).collect(Collectors.toList()); if (!CollectionUtils.isEmpty(childrenCityList)){ diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/po/InStockListMaterialAgg.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/po/InStockListMaterialAgg.java new file mode 100644 index 000000000..2b1ff0d01 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/po/InStockListMaterialAgg.java @@ -0,0 +1,12 @@ +package com.mhd.wms.domain.inMaterialDetail.repository.po; + +import lombok.Data; + +/** + * 入库列表页批量取去重后的 Invoice No。 + */ +@Data +public class InStockListMaterialAgg { + private String inOrderNumber; + private String invoiceNo; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/facade/IOutMaterialDetailService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/facade/IOutMaterialDetailService.java index 5a2c6c4fc..d562a6faa 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/facade/IOutMaterialDetailService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/facade/IOutMaterialDetailService.java @@ -41,6 +41,11 @@ public interface IOutMaterialDetailService extends IService */ List selectAggregatesForStockOutList(List outOrderNumbers); + /** + * 出库列表页:按出库单号批量取去重后的 Invoice No(仅 level=1) + */ + List selectDistinctInvoiceNoForStockOutList(List outOrderNumbers); + /** * 新增物料明细 */ diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/mapper/OutMaterialDetailMapper.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/mapper/OutMaterialDetailMapper.java index 9dc295f5a..2a854e320 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/mapper/OutMaterialDetailMapper.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/mapper/OutMaterialDetailMapper.java @@ -60,4 +60,9 @@ public interface OutMaterialDetailMapper extends BaseMapper * 出库列表页:按出库单号批量聚合(仅 level=1) */ List selectAggregatesForStockOutList(@Param("outOrderNumbers") List outOrderNumbers); + + /** + * 出库列表页:按出库单号批量取去重后的 Invoice No(仅 level=1) + */ + List selectDistinctInvoiceNoForStockOutList(@Param("outOrderNumbers") List outOrderNumbers); } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/persistence/OutMaterialDetailImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/persistence/OutMaterialDetailImpl.java index 1cbe42c5e..eeb450474 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/persistence/OutMaterialDetailImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/persistence/OutMaterialDetailImpl.java @@ -130,6 +130,14 @@ public class OutMaterialDetailImpl extends ServiceImpl selectDistinctInvoiceNoForStockOutList(List outOrderNumbers) { + if (CollectionUtils.isEmpty(outOrderNumbers)) { + return Collections.emptyList(); + } + return outMaterialDetailMapper.selectDistinctInvoiceNoForStockOutList(outOrderNumbers); + } + private List getChildren(Long parentUniqueId, List materialDetailPOList, Integer maxLevel){ List childrenCityList = materialDetailPOList.stream().filter(materialDetailPO -> parentUniqueId.equals(materialDetailPO.getParentUniqueId())).collect(Collectors.toList()); if (!CollectionUtils.isEmpty(childrenCityList)){ diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/po/OutStockListMaterialAgg.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/po/OutStockListMaterialAgg.java index 9970582a4..6e8e71ab1 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/po/OutStockListMaterialAgg.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/po/OutStockListMaterialAgg.java @@ -13,4 +13,6 @@ public class OutStockListMaterialAgg { private BigDecimal totalOutboundQuantity; private BigDecimal checkQuantitySum; private Integer materialKindCountDistinct; + /** 列表页展示用:该出库单的 Invoice No */ + private String invoiceNo; } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/repository/po/StockInOrderPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/repository/po/StockInOrderPO.java index ea9facb43..20c92b22b 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/repository/po/StockInOrderPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/repository/po/StockInOrderPO.java @@ -235,6 +235,9 @@ public class StockInOrderPO extends BaseVOEntity { @Excel(name = "备注") private String remark; + @ApiModelProperty("Invoice No(多个用逗号隔开)") + private String invoiceNo; + @ApiModelProperty("物料明细") private List materialDetailList; diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/repository/todo/StockInOrderDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/repository/todo/StockInOrderDO.java index 24a41d5ce..c18ae7f4f 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/repository/todo/StockInOrderDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/repository/todo/StockInOrderDO.java @@ -448,4 +448,7 @@ public class StockInOrderDO extends BaseVOEntity { @ApiModelProperty("任务移除用户ID") private String removeUserId; + + @ApiModelProperty("是否返回物料明细(导出时传 true)") + private Boolean needDetail; } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/po/StockOutOrderPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/po/StockOutOrderPO.java index 73ce5b5bf..552da5d76 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/po/StockOutOrderPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/po/StockOutOrderPO.java @@ -256,6 +256,9 @@ public class StockOutOrderPO extends BaseVOEntity { @Excel(name = "备注") private String remark; + @ApiModelProperty("Invoice No(多个用逗号隔开)") + private String invoiceNo; + @ApiModelProperty("物料明细") private List materialDetailList; diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/todo/StockOutOrderDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/todo/StockOutOrderDO.java index 559c21fe9..b7ae141d7 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/todo/StockOutOrderDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/todo/StockOutOrderDO.java @@ -513,4 +513,7 @@ public class StockOutOrderDO extends BaseVOEntity { @ApiModelProperty("任务移除用户ID") private String removeUserId; + + @ApiModelProperty("是否返回物料明细(导出时传 true)") + private Boolean needDetail; } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockInOrder/StockInOrderDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockInOrder/StockInOrderDTO.java index b70a0c7a7..738b81cc3 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockInOrder/StockInOrderDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockInOrder/StockInOrderDTO.java @@ -445,4 +445,7 @@ public class StockInOrderDTO extends StockInOrderBaseDTO { @ApiModelProperty("任务移除用户ID") private String removeUserId; + + @ApiModelProperty("是否返回物料明细(导出时传 true)") + private Boolean needDetail; } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockOutOrder/StockOutOrderDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockOutOrder/StockOutOrderDTO.java index 39e3c8793..a81b2a649 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockOutOrder/StockOutOrderDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockOutOrder/StockOutOrderDTO.java @@ -502,4 +502,7 @@ public class StockOutOrderDTO extends StockOutOrderBaseDTO { @ApiModelProperty("任务移除用户ID") private String removeUserId; + + @ApiModelProperty("是否返回物料明细(导出时传 true)") + private Boolean needDetail; } \ No newline at end of file diff --git a/mhd_wms/src/main/resources/mapper/OutMaterialDetail/OutMaterialDetailMapper.xml b/mhd_wms/src/main/resources/mapper/OutMaterialDetail/OutMaterialDetailMapper.xml index 02df3d80f..e50a7b25d 100644 --- a/mhd_wms/src/main/resources/mapper/OutMaterialDetail/OutMaterialDetailMapper.xml +++ b/mhd_wms/src/main/resources/mapper/OutMaterialDetail/OutMaterialDetailMapper.xml @@ -451,4 +451,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" GROUP BY a.out_order_number + + + \ No newline at end of file diff --git a/mhd_wms/src/main/resources/mapper/inMaterialDetail/InMaterialDetailMapper.xml b/mhd_wms/src/main/resources/mapper/inMaterialDetail/InMaterialDetailMapper.xml index cfee42bf1..b671a31eb 100644 --- a/mhd_wms/src/main/resources/mapper/inMaterialDetail/InMaterialDetailMapper.xml +++ b/mhd_wms/src/main/resources/mapper/inMaterialDetail/InMaterialDetailMapper.xml @@ -356,4 +356,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + \ No newline at end of file From 6a84abf6dd07714523471538106538184e4b59c4 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Tue, 11 Aug 2026 18:03:09 +0800 Subject: [PATCH 04/37] =?UTF-8?q?feat(system=E6=A8=A1=E5=9D=97lease):=20?= =?UTF-8?q?=E7=A7=9F=E8=B5=81=E7=AE=A1=E7=90=86=E5=A2=9E=E5=8A=A0=E5=81=9C?= =?UTF-8?q?=E7=94=A8=E5=8A=9F=E8=83=BD=EF=BC=8C=E5=81=9C=E7=94=A8=E5=90=8E?= =?UTF-8?q?=E4=B8=8D=E5=8F=82=E4=B8=8E=E5=87=BA=E7=A7=9F=E7=8E=87=E8=AE=A1?= =?UTF-8?q?=E7=AE=97=20-=20LEASE=20=E8=A1=A8=E6=96=B0=E5=A2=9E=20status=20?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=EF=BC=881=3D=E5=90=AF=E7=94=A8=EF=BC=8C0=3D?= =?UTF-8?q?=E5=81=9C=E7=94=A8=EF=BC=89=20-=20Lease/LeasePO/LeaseDO/LeaseDT?= =?UTF-8?q?O=20=E6=96=B0=E5=A2=9E=20status=20=E5=AD=97=E6=AE=B5=20-=20Leas?= =?UTF-8?q?eMapper.xml=20=E5=A2=9E=E5=8A=A0=20status=20=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E4=B8=8E=E8=BF=87=E6=BB=A4=E6=9D=A1=E4=BB=B6?= =?UTF-8?q?=20-=20=E6=96=B0=E5=A2=9E=20LeaseApi.updateStatus=20=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=88PUT=20/updateStatus/{leaseIds}/{status}?= =?UTF-8?q?=EF=BC=89=20-=20=E5=87=BA=E7=A7=9F=E7=8E=87=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=EF=BC=88shipperLeaseDetails=EF=BC=89=E8=BF=87=E6=BB=A4=20statu?= =?UTF-8?q?s=3D1=EF=BC=8C=E5=81=9C=E7=94=A8=E7=A7=9F=E8=B5=81=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=E7=94=9F=E6=88=90=E5=87=BA=E7=A7=9F=E7=8E=87=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=20=E4=B8=80=E4=B8=AASQL=E6=96=87=E4=BB=B6=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E4=B8=80=E4=B8=AA=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=EF=BC=8C=E5=9C=A8=E6=B5=8B=E8=AF=95=E5=92=8C=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E9=83=BD=E9=9C=80=E8=A6=81=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=20=E5=AF=B9=E5=BA=94=E9=9C=80=E6=B1=82=EF=BC=9A=E4=BB=93?= =?UTF-8?q?=E5=BA=93=E5=87=BA=E7=A7=9F=E7=8E=87=20-=20=E7=A7=9F=E8=B5=81?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=A2=9E=E5=8A=A0=E5=81=9C=E7=94=A8=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Lease/LeaseApplicationService.java | 91 ++++++++++++++++++- .../mhd/basic/domain/lease/entity/Lease.java | 3 + .../domain/lease/repository/po/LeasePO.java | 3 + .../domain/lease/repository/todo/LeaseDO.java | 3 + .../lease/service/LeaseDomainService.java | 18 ++++ .../basic/interfaces/dto/lease/LeaseDTO.java | 3 + .../interfaces/facadeApi/lease/LeaseApi.java | 14 +++ .../mapper/basic/lease/LeaseMapper.xml | 8 +- sql/20260803_alter_table_lease_add_status.sql | 16 ++++ 9 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 sql/20260803_alter_table_lease_add_status.sql diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/Lease/LeaseApplicationService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/Lease/LeaseApplicationService.java index 611298729..0ffbd7612 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/Lease/LeaseApplicationService.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/Lease/LeaseApplicationService.java @@ -40,6 +40,14 @@ import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; +import com.mhd.basic.interfaces.dto.shipperLeaseDetailsApi.WarehouseLeaseExportVO; +import com.mhd.common.core.utils.poi.ExcelUtil; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.net.URLEncoder; +import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.Map; import java.math.BigDecimal; import java.time.LocalDate; @@ -277,7 +285,8 @@ public class LeaseApplicationService { final Date yesterday = DateUtil.beginOfDay(DateUtil.offsetDay(new Date(), -1)); LeaseDO leaseDO = new LeaseDO(); - leaseDO.setTime(yesterday); + leaseDO.setTime(yesterday); // 设置查询时间 + leaseDO.setStatus(1); // 只查询启用状态的租赁,停用的不参与出租率计算 //查询有效期内的租赁 List leasePOS = queryList(leaseDO); List entireUnit = leasePOS.stream() @@ -494,6 +503,67 @@ public class LeaseApplicationService { return warehouseOccupancyRatesList; } + /** + * 导出仓库出租率及客户租赁明细(单 sheet,明细行带仓库当日汇总列) + * 参数与 /warehouseOccupancyRate、/list 一致 + */ + public void exportOccupancyRate(HttpServletResponse response, ShipperLeaseDetailsDO shipperLeaseDetailsDO) throws IOException { + // ===== 1. 查出租率(注意:该方法内部会修改传入的 DO,所以先查它)===== + List rateList = warehouseOccupancyRate(shipperLeaseDetailsDO); + + // ===== 2. 用副本查明细,避免被上面改过的 DO 影响 ===== + ShipperLeaseDetailsDO detailDO = new ShipperLeaseDetailsDO(); + BeanUtils.copyProperties(shipperLeaseDetailsDO, detailDO); + List detailList = shipperLeaseDetailsService.queryList(detailDO); + + // ===== 3. 出租率按 (业务日期 + 仓库ID) 建映射,方便明细行查汇总 ===== + SimpleDateFormat keySdf = new SimpleDateFormat("yyyy-MM-dd"); + Map rateMap = new HashMap<>(); + for (WarehouseOccupancyRate r : rateList) { + String key = (r.getBusinessDate() == null ? "" : keySdf.format(r.getBusinessDate())) + + "_" + r.getWarehouseId(); + rateMap.put(key, r); + } + + // ===== 4. 明细为主,每行拼上对应仓库当天的汇总 ===== + List exportList = new ArrayList<>(); + for (ShipperLeaseDetailsPO d : detailList) { + WarehouseLeaseExportVO vo = new WarehouseLeaseExportVO(); + // 明细列 + vo.setBusinessDate(d.getBusinessDate()); + vo.setOrganizationName(d.getOrganizationName()); + vo.setWarehouseName(d.getWarehouseName()); + vo.setCargoOwnerName(d.getCargoOwnerName()); + vo.setLeaseType(d.getLeaseType()); + vo.setLeaseArea(d.getLeaseArea()); + // 汇总列(从映射取,找不到就留空) + String key = (d.getBusinessDate() == null ? "" : keySdf.format(d.getBusinessDate())) + + "_" + d.getWarehouseId(); + WarehouseOccupancyRate r = rateMap.get(key); + if (r != null) { + vo.setEntireLeaseArea(r.getEntireLeaseArea()); + vo.setFractionalLeaseArea(r.getFractionalLeaseArea()); + vo.setTotalArea(r.getTotalArea()); + vo.setDailyRentalRate(r.getDailyRentalRate()); + } + exportList.add(vo); + } + + // ===== 5. 按业务日期降序排序(null 排最后)===== + exportList.sort(Comparator + .comparing(WarehouseLeaseExportVO::getBusinessDate, Comparator.nullsLast(Comparator.reverseOrder())) + .thenComparing(WarehouseLeaseExportVO::getWarehouseName, Comparator.nullsLast(Comparator.naturalOrder()))); + + // ===== 6. 用 ExcelUtil 导出(项目通用做法,单 sheet)===== + String fileName = URLEncoder.encode("仓库出租率导出", "UTF-8").replaceAll("\\+", "%20"); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); + + ExcelUtil util = new ExcelUtil<>(WarehouseLeaseExportVO.class); + util.exportExcel(response, exportList, "仓库出租率"); + } + /** * 定时任务整租推送到bms @@ -581,6 +651,25 @@ public class LeaseApplicationService { } } + /** + * 启用/停用租赁 + * @param leaseIds 租赁ID列表 + * @param status 目标状态:1=启用,0=停用 + */ + public Boolean updateStatus(List leaseIds, Integer status) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + Long updateBy = loginUser != null ? loginUser.getUserid() : null; + String updateByName = loginUser != null ? loginUser.getUsername() : null; + if (leaseIds == null || leaseIds.isEmpty()) { + throw new ServiceException("租赁ID不能为空"); + } + if (status == null || (status != 0 && status != 1)) { + throw new ServiceException("状态值无效:1=启用,0=停用"); + } + log.info("启用/停用租赁--结束,leaseIds={},状态={},更新人id={},更新人名称={}",leaseIds,status==0?"停用":"启用",updateBy,updateByName); + return leaseDomainService.updateStatus(leaseIds, status, updateBy, updateByName); + } + // /** // * @description 设置数据字典键值 // * @author ZhouGY diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/lease/entity/Lease.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/lease/entity/Lease.java index 2ebd21a80..55d7175fc 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/lease/entity/Lease.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/lease/entity/Lease.java @@ -96,4 +96,7 @@ public class Lease extends BaseVOEntity{ @ApiModelProperty("业务员ID") private String salesmanId; + + @ApiModelProperty("状态:1=正常,0=停用") + private Integer status; } \ No newline at end of file diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/lease/repository/po/LeasePO.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/lease/repository/po/LeasePO.java index 3bf1cef18..0c67573d5 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/lease/repository/po/LeasePO.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/lease/repository/po/LeasePO.java @@ -97,4 +97,7 @@ public class LeasePO extends BaseVOEntity{ @ApiModelProperty("业务员ID") private String salesmanId; + + @ApiModelProperty("状态:1=正常,0=停用") + private Integer status; } \ No newline at end of file diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/lease/repository/todo/LeaseDO.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/lease/repository/todo/LeaseDO.java index 27e5621ce..6d20f8f1b 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/lease/repository/todo/LeaseDO.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/lease/repository/todo/LeaseDO.java @@ -113,4 +113,7 @@ public class LeaseDO extends BaseVOEntity{ @ApiModelProperty("业务员ID") private String salesmanId; + + @ApiModelProperty("状态:1=正常,0=停用") + private Integer status; } \ No newline at end of file diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/lease/service/LeaseDomainService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/lease/service/LeaseDomainService.java index 82ade3d75..1b264e189 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/lease/service/LeaseDomainService.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/lease/service/LeaseDomainService.java @@ -89,4 +89,22 @@ public class LeaseDomainService { .in(Lease::getId, leaseIds) .eq(Lease::getDelFlag, 1)); } + + /** + * 启用/停用租赁 + * @param leaseIds 租赁ID列表 + * @param status 目标状态:1=启用,0=停用 + * @param updateBy 操作人ID + * @param updateByName 操作人名称 + */ + public Boolean updateStatus(List leaseIds, Integer status, Long updateBy, String updateByName) { + return leaseService.update(new UpdateWrapper().lambda() + .set(Lease::getStatus, status) + .set(Lease::getUpdateBy, updateBy) + .set(Lease::getUpdateByName, updateByName) + .set(Lease::getUpdateTime, new Date()) + .in(Lease::getId, leaseIds) + .eq(Lease::getDelFlag, 1)); + } + } \ No newline at end of file diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/lease/LeaseDTO.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/lease/LeaseDTO.java index 4d045da4b..926b8201c 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/lease/LeaseDTO.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/lease/LeaseDTO.java @@ -110,4 +110,7 @@ public class LeaseDTO extends BaseVOEntity{ @ApiModelProperty("业务员ID") private String salesmanId; + + @ApiModelProperty("状态:1=正常,0=停用") + private Integer status; } \ No newline at end of file diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/lease/LeaseApi.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/lease/LeaseApi.java index fe8dc5b3f..a8cd3b53e 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/lease/LeaseApi.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/lease/LeaseApi.java @@ -130,4 +130,18 @@ public class LeaseApi extends BaseController{ return AjaxResult.success(); } + /** + * 启用/停用租赁 + * @param leaseIds 租赁ID集合 + * @param status 目标状态(启用/停用) + * @return 操作结果 + */ + @ApiOperation("启用/停用租赁") + @PutMapping("/updateStatus/{leaseIds}/{status}") + public AjaxResult updateStatus(@PathVariable("leaseIds") List leaseIds, + @PathVariable("status") Integer status) + { + return toAjax(leaseApplicationService.updateStatus(leaseIds, status)); + } + } diff --git a/mhd-modules/mhd-system/src/main/resources/mapper/basic/lease/LeaseMapper.xml b/mhd-modules/mhd-system/src/main/resources/mapper/basic/lease/LeaseMapper.xml index fc99a9216..831005fdf 100644 --- a/mhd-modules/mhd-system/src/main/resources/mapper/basic/lease/LeaseMapper.xml +++ b/mhd-modules/mhd-system/src/main/resources/mapper/basic/lease/LeaseMapper.xml @@ -35,6 +35,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -68,7 +69,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" a.bill_time, a.salesman_name, a.settlement_currency, - a.salesman_id + a.salesman_id, + a.status from lease a LEFT JOIN warehouse w ON a.warehouse_id = w.warehouse_id AND w.del_flag = 1 @@ -136,6 +138,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND a.start_date <= #{time} AND a.end_date >= #{time} + + + AND a.status = #{status} + and a.del_flag = #{delFlag} diff --git a/sql/20260803_alter_table_lease_add_status.sql b/sql/20260803_alter_table_lease_add_status.sql new file mode 100644 index 000000000..c67fbe76b --- /dev/null +++ b/sql/20260803_alter_table_lease_add_status.sql @@ -0,0 +1,16 @@ +-- ============================================================ +-- 功能:租赁表新增 status 状态字段(启用/停用) +-- 数据库:达梦(Dameng)192.168.0.49:5236 +-- 模式:NGWL_TEST_SYSTEM +-- 表名:LEASE +-- 日期:2026-08-03 +-- 说明:status 字段用于控制租赁的启用/停用 +-- 1=启用(参与仓库出租率计算) +-- 0=停用(不参与仓库出租率计算) +-- ============================================================ + +-- 1. 添加字段 +ALTER TABLE NGWL_TEST_SYSTEM.LEASE ADD status TINYINT DEFAULT 1; + +-- 2. 添加注释(达梦必须单独写) +COMMENT ON COLUMN NGWL_TEST_SYSTEM.LEASE.status IS '状态:1=启用,0=停用'; From 9e2dc508a817fa6590838121d7a3c9caee83f23b Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Tue, 11 Aug 2026 18:05:00 +0800 Subject: [PATCH 05/37] =?UTF-8?q?feat(lease):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E4=BB=93=E5=BA=93=E5=87=BA=E7=A7=9F=E7=8E=87=E5=8F=8A=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E7=A7=9F=E8=B5=81=E6=98=8E=E7=BB=86=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=20-=20=E6=96=B0=E5=A2=9E=20WarehouseLeaseExp?= =?UTF-8?q?ortVO=EF=BC=8810=E5=88=97=EF=BC=9A=E4=BB=93=E5=BA=93/=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E6=97=A5=E6=9C=9F/=E6=95=B4=E7=A7=9F=E9=9D=A2?= =?UTF-8?q?=E7=A7=AF/=E6=95=A3=E7=A7=9F=E9=9D=A2=E7=A7=AF/=E6=80=BB?= =?UTF-8?q?=E9=9D=A2=E7=A7=AF/=E6=97=A5=E7=A7=9F=E7=8E=87/=E7=BB=84?= =?UTF-8?q?=E7=BB=87/=E8=B4=A7=E4=B8=BB/=E7=A7=9F=E8=B5=81=E6=96=B9?= =?UTF-8?q?=E5=BC=8F/=E7=A7=9F=E8=B5=81=E9=9D=A2=E7=A7=AF=EF=BC=89=20-=20L?= =?UTF-8?q?easeApplicationService=20=E6=96=B0=E5=A2=9E=20exportOccupancyRa?= =?UTF-8?q?te=20=E6=96=B9=E6=B3=95=EF=BC=8C=E5=A4=8D=E7=94=A8=E5=87=BA?= =?UTF-8?q?=E7=A7=9F=E7=8E=87=E4=B8=8E=E6=98=8E=E7=BB=86=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=EF=BC=8C=E6=8C=89=E6=97=A5=E6=9C=9F+=E4=BB=93=E5=BA=93?= =?UTF-8?q?=E6=98=A0=E5=B0=84=E6=8B=BC=E6=8E=A5=E6=B1=87=E6=80=BB=E5=88=97?= =?UTF-8?q?=20-=20ShipperLeaseDetailsApi=20=E6=96=B0=E5=A2=9E=20GET=20/exp?= =?UTF-8?q?ort=20=E6=8E=A5=E5=8F=A3=EF=BC=8C=E5=85=A5=E5=8F=82=E4=B8=8E?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3=E4=B8=80=E8=87=B4=EF=BC=8C?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E9=A1=B9=E7=9B=AE=E9=80=9A=E7=94=A8=20ExcelU?= =?UTF-8?q?til=20=E5=AF=BC=E5=87=BA=20-=20=E4=B8=9A=E5=8A=A1=E6=97=A5?= =?UTF-8?q?=E6=9C=9F=E6=8C=89=E9=99=8D=E5=BA=8F=E6=8E=92=E5=BA=8F=EF=BC=8C?= =?UTF-8?q?=E6=97=A5=E6=9C=9F=E6=A0=BC=E5=BC=8F=20yyyy-MM-dd=20=E5=AF=B9?= =?UTF-8?q?=E5=BA=94=E9=9C=80=E6=B1=82=EF=BC=9A=E4=BB=93=E5=BA=93=E5=87=BA?= =?UTF-8?q?=E7=A7=9F=E7=8E=87=20-=20=E5=A2=9E=E5=8A=A0=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=88=E5=87=BA=E7=A7=9F=E7=8E=87+?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=A7=9F=E8=B5=81=E6=98=8E=E7=BB=86=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WarehouseLeaseExportVO.java | 65 +++++++++++++++++++ .../ShipperLeaseDetailsApi.java | 14 ++++ 2 files changed, 79 insertions(+) create mode 100644 mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/shipperLeaseDetailsApi/WarehouseLeaseExportVO.java diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/shipperLeaseDetailsApi/WarehouseLeaseExportVO.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/shipperLeaseDetailsApi/WarehouseLeaseExportVO.java new file mode 100644 index 000000000..e18caf1e3 --- /dev/null +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/shipperLeaseDetailsApi/WarehouseLeaseExportVO.java @@ -0,0 +1,65 @@ +package com.mhd.basic.interfaces.dto.shipperLeaseDetailsApi; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.annotation.Excel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 仓库出租率及客户租赁明细 导出VO(单 sheet) + * 明细为主行,附该仓库当日汇总列 + */ +@Data +public class WarehouseLeaseExportVO { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("仓库") + @Excel(name = "仓库") + private String warehouseName; + + @ApiModelProperty("业务日期") + @Excel(name = "业务日期", width = 20, dateFormat = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date businessDate; + + @ApiModelProperty("整租面积(m²)") + @Excel(name = "整租面积(m²)") + private BigDecimal entireLeaseArea; + + @ApiModelProperty("散租面积(m²)") + @Excel(name = "散租面积(m²)") + private BigDecimal fractionalLeaseArea; + + @ApiModelProperty("总面积(m²)") + @Excel(name = "总面积(m²)") + private BigDecimal totalArea; + + @ApiModelProperty("日租率(%)") + @Excel(name = "日租率(%)") + private BigDecimal dailyRentalRate; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("货主名称") + @Excel(name = "货主名称") + private String cargoOwnerName; + + @ApiModelProperty("租赁方式") + @Excel(name = "租赁方式") + private String leaseType; + + @ApiModelProperty("租赁面积(m²)") + @Excel(name = "租赁面积(m²)") + private BigDecimal leaseArea; + + // ===== 以下为仓库当日汇总列(同一仓库同一天的多行会重复,属正常)===== + +} \ No newline at end of file diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/shipperLeaseDetails/ShipperLeaseDetailsApi.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/shipperLeaseDetails/ShipperLeaseDetailsApi.java index 4f560e24d..f8437e12a 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/shipperLeaseDetails/ShipperLeaseDetailsApi.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/shipperLeaseDetails/ShipperLeaseDetailsApi.java @@ -20,6 +20,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -157,5 +159,17 @@ public class ShipperLeaseDetailsApi extends BaseController{ return getDataTable(warehouseOccupancyRates); } + /** + * 导出仓库出租率及客户租赁明细 + * 参数与 /warehouseOccupancyRate、/list 一致 + */ + @ApiOperation("导出仓库出租率及客户租赁明细") + @GetMapping(value = "/export", produces = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + public void export(ShipperLeaseDetailsDTO shipperLeaseDetailsDTO, HttpServletResponse response) throws IOException + { + ShipperLeaseDetailsDO shipperLeaseDetailsDO = shipperLeaseDetailsAssembler.toDO(shipperLeaseDetailsDTO); + leaseApplicationService.exportOccupancyRate(response, shipperLeaseDetailsDO); + } + } From a10cfb0f5559b93474f56638dda8f7d106317569 Mon Sep 17 00:00:00 2001 From: zhaoqing <3160641494@qq.com> Date: Wed, 12 Aug 2026 10:19:57 +0800 Subject: [PATCH 06/37] =?UTF-8?q?fix(bms):=E6=94=B6=E6=AC=BE=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E6=94=B6=E6=AC=BE=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../receiptManage/service/ReceiptManageDomainService.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/receiptManage/service/ReceiptManageDomainService.java b/mhd_bms/src/main/java/com/mhd/bms/domain/receiptManage/service/ReceiptManageDomainService.java index 93857f3fb..c22c5f92d 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/receiptManage/service/ReceiptManageDomainService.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/receiptManage/service/ReceiptManageDomainService.java @@ -180,6 +180,9 @@ public class ReceiptManageDomainService { receiptManageDO.setCreateBy(loginUser.getUserPo().getUserId()); receiptManageDO.setCreateByName(loginUser.getUserPo().getUserName()); receiptManageDO.setCreateTime(new Date()); + if (receiptManageDO.getCollectionTime() == null) { + receiptManageDO.setCollectionTime(new Date()); + } ReceiptManage receiptManage = new ReceiptManage(); BeanUtils.copyProperties(receiptManageDO,receiptManage); Boolean flagTwo = receiptManageService.save(receiptManage); From 5032cf24132205aaca186da2b52ce99c98b1b45f Mon Sep 17 00:00:00 2001 From: zhaoqing <3160641494@qq.com> Date: Wed, 12 Aug 2026 11:40:13 +0800 Subject: [PATCH 07/37] =?UTF-8?q?fix(bms):=E6=94=B6=E6=AC=BE=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/billManage/repository/po/BillManagePO.java | 5 +++++ mhd_bms/src/main/resources/mapper/BillManageMapper.xml | 9 ++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/po/BillManagePO.java b/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/po/BillManagePO.java index a4c4e3403..9a3225e96 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/po/BillManagePO.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/po/BillManagePO.java @@ -262,4 +262,9 @@ public class BillManagePO extends BaseVOEntity{ @ApiModelProperty("收款帐户名称") private String paymentAccountName; private List billDetailList; + + @ApiModelProperty("最近收款时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "最近收款时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date collectionTime; } \ No newline at end of file diff --git a/mhd_bms/src/main/resources/mapper/BillManageMapper.xml b/mhd_bms/src/main/resources/mapper/BillManageMapper.xml index 6be84c7ad..5c9b10211 100644 --- a/mhd_bms/src/main/resources/mapper/BillManageMapper.xml +++ b/mhd_bms/src/main/resources/mapper/BillManageMapper.xml @@ -8,7 +8,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + From df51abe33fe0690987e40de21c465b5780d144cc Mon Sep 17 00:00:00 2001 From: zhaoqing <3160641494@qq.com> Date: Wed, 12 Aug 2026 17:53:31 +0800 Subject: [PATCH 09/37] =?UTF-8?q?fix(wms):total=5Fvolume=EF=BC=8Ctotal=5Fa?= =?UTF-8?q?rea=E5=AD=97=E6=AE=B5=E5=8F=AF=E4=B8=BA=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ReceiptMaterialDetailImpl.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java index 5226eb019..ae0bfd10f 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java @@ -492,6 +492,8 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl receiptMaterialDetailList) { + if (CollectionUtils.isEmpty(receiptMaterialDetailList)) { + return; + } + // 列名组合 -> materialDetailId 列表(total_volume / total_area / 两者) + Map> columnsToIds = new HashMap<>(); + for (ReceiptMaterialDetail detail : receiptMaterialDetailList) { + if (detail == null || detail.getMaterialDetailId() == null) { + continue; + } + StringBuilder columns = new StringBuilder(); + if (detail.getTotalVolume() == null) { + columns.append("total_volume"); + } + if (detail.getTotalArea() == null) { + if (columns.length() > 0) { + columns.append(","); + } + columns.append("total_area"); + } + if (columns.length() == 0) { + continue; + } + columnsToIds.computeIfAbsent(columns.toString(), k -> new ArrayList<>()) + .add(detail.getMaterialDetailId()); + } + if (columnsToIds.isEmpty()) { + return; + } + for (Map.Entry> entry : columnsToIds.entrySet()) { + UpdateWrapper wrapper = new UpdateWrapper<>(); + for (String column : entry.getKey().split(",")) { + wrapper.set(column, null); + } + wrapper.in("material_detail_id", entry.getValue()); + receiptMaterialDetailMapper.update(null, wrapper); + } + } + private void setMore(ReceiptMaterialDetailDO receiptMaterialDetailDO) { List materialMoreDetailList = receiptMaterialDetailDO.getMaterialMoreDetailList(); if (!CollectionUtils.isEmpty(materialMoreDetailList)) { From d6037d5846ed518c60ee8b1d59a2eab88cdecd21 Mon Sep 17 00:00:00 2001 From: zhaoqing <3160641494@qq.com> Date: Wed, 12 Aug 2026 18:01:34 +0800 Subject: [PATCH 10/37] =?UTF-8?q?fix(bms):=E5=8D=95=E4=BD=8D=20=E6=95=B0?= =?UTF-8?q?=E9=87=8F=20=E5=8D=95=E4=BB=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mhd/bms/domain/billManage/entity/BillDetail.java | 6 ++++++ .../bms/domain/billManage/repository/po/BillDetailPO.java | 6 ++++++ .../bms/domain/billManage/repository/todo/BillDetailDO.java | 6 ++++++ .../mhd/bms/interfaces/dto/billManage/BillDetailDTO.java | 6 ++++++ 4 files changed, 24 insertions(+) diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/entity/BillDetail.java b/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/entity/BillDetail.java index 546cf0e14..6bd28ad64 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/entity/BillDetail.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/entity/BillDetail.java @@ -88,4 +88,10 @@ public class BillDetail extends BaseVOEntity{ private String invoiceItemName; @ApiModelProperty(value = "费用类别") private String feeType; + @ApiModelProperty(value = "计费单位") + private String billingUnit; + @ApiModelProperty(value = "计费数量") + private BigDecimal billingNum; + @ApiModelProperty(value = "计费单价") + private BigDecimal billingUnitPrice; } \ No newline at end of file diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/po/BillDetailPO.java b/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/po/BillDetailPO.java index 5c4c7bac5..acd96caf2 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/po/BillDetailPO.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/po/BillDetailPO.java @@ -134,5 +134,11 @@ public class BillDetailPO extends BaseVOEntity{ private String invoiceItemName; @ApiModelProperty(value = "费用类别") private String feeType; + @ApiModelProperty(value = "计费单位") + private String billingUnit; + @ApiModelProperty(value = "计费数量") + private BigDecimal billingNum; + @ApiModelProperty(value = "计费单价") + private BigDecimal billingUnitPrice; } \ No newline at end of file diff --git a/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/todo/BillDetailDO.java b/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/todo/BillDetailDO.java index e443f47f0..b1d521d77 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/todo/BillDetailDO.java +++ b/mhd_bms/src/main/java/com/mhd/bms/domain/billManage/repository/todo/BillDetailDO.java @@ -98,4 +98,10 @@ public class BillDetailDO extends BaseVOEntity{ private String invoiceItemName; @ApiModelProperty(value = "费用类别") private String feeType; + @ApiModelProperty(value = "计费单位") + private String billingUnit; + @ApiModelProperty(value = "计费数量") + private BigDecimal billingNum; + @ApiModelProperty(value = "计费单价") + private BigDecimal billingUnitPrice; } \ No newline at end of file diff --git a/mhd_bms/src/main/java/com/mhd/bms/interfaces/dto/billManage/BillDetailDTO.java b/mhd_bms/src/main/java/com/mhd/bms/interfaces/dto/billManage/BillDetailDTO.java index 9c42728a0..acb35ff99 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/interfaces/dto/billManage/BillDetailDTO.java +++ b/mhd_bms/src/main/java/com/mhd/bms/interfaces/dto/billManage/BillDetailDTO.java @@ -139,4 +139,10 @@ public class BillDetailDTO extends BaseVOEntity{ private String invoiceItemName; @ApiModelProperty(value = "费用类别") private String feeType; + @ApiModelProperty(value = "计费单位") + private String billingUnit; + @ApiModelProperty(value = "计费数量") + private BigDecimal billingNum; + @ApiModelProperty(value = "计费单价") + private BigDecimal billingUnitPrice; } \ No newline at end of file From f6125e68bfa69f3e166a5478c7f80736e37f1a6e Mon Sep 17 00:00:00 2001 From: zhaoqing <3160641494@qq.com> Date: Wed, 12 Aug 2026 18:04:51 +0800 Subject: [PATCH 11/37] fix(bms):sql --- sql/20260803_alter_table_lease_add_status.sql | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/sql/20260803_alter_table_lease_add_status.sql b/sql/20260803_alter_table_lease_add_status.sql index c67fbe76b..c764a4411 100644 --- a/sql/20260803_alter_table_lease_add_status.sql +++ b/sql/20260803_alter_table_lease_add_status.sql @@ -14,3 +14,14 @@ ALTER TABLE NGWL_TEST_SYSTEM.LEASE ADD status TINYINT DEFAULT 1; -- 2. 添加注释(达梦必须单独写) COMMENT ON COLUMN NGWL_TEST_SYSTEM.LEASE.status IS '状态:1=启用,0=停用'; + + + + +-- bms +ALTER TABLE "NGWL_TEST_BMS"."BILL_DETAIL" ADD BILLING_UNIT VARCHAR2(100); +ALTER TABLE "NGWL_TEST_BMS"."BILL_DETAIL" ADD BILLING_NUM NUMBER(18,2); +ALTER TABLE "NGWL_TEST_BMS"."BILL_DETAIL" ADD BILLING_UNIT_PRICE NUMBER(18,2); +COMMENT ON COLUMN "NGWL_TEST_BMS"."BILL_DETAIL".BILLING_UNIT IS '计费单位'; +COMMENT ON COLUMN "NGWL_TEST_BMS"."BILL_DETAIL".BILLING_NUM IS '计费数量'; +COMMENT ON COLUMN "NGWL_TEST_BMS"."BILL_DETAIL".BILLING_UNIT_PRICE IS '计费单价'; From b37edf7c63160349cf0030307ee9f6c32f99b8af Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Wed, 12 Aug 2026 18:17:29 +0800 Subject: [PATCH 12/37] =?UTF-8?q?feat(oms):=20=E4=B8=9A=E5=8A=A1=E5=8D=95?= =?UTF-8?q?=E5=8F=B7=E6=94=B9=E4=B8=BAyyMMdd+=E6=AF=8F=E6=97=A5=E5=BA=8F?= =?UTF-8?q?=E5=8F=B7(=E6=AF=8F=E6=97=A5=E9=87=8D=E7=BD=AE,=E5=AF=B9?= =?UTF-8?q?=E9=BD=90TMS=E9=95=BF=E5=BA=A6)=20=E5=AF=B9=E5=BA=94=E9=9C=80?= =?UTF-8?q?=E6=B1=82#072703=EF=BC=8C=E5=8D=95=E5=8F=B7=E8=A7=84=E5=88=99:?= =?UTF-8?q?=E5=B9=B4=E6=9C=88=E6=97=A5001,=E5=90=8E=E9=9D=A2001=E6=AF=8F?= =?UTF-8?q?=E5=A4=A9=E9=87=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/BusinessDocumentOrderMapper.java | 6 ++ .../BusinessDocumentOrderImpl.java | 52 ++----------- .../BusinessDocumentOrderDomainService.java | 73 ++----------------- .../service/GoodsNumberGenerator.java | 53 ++++++++++++++ .../BusinessDocumentOrderMapper.xml | 7 ++ 5 files changed, 79 insertions(+), 112 deletions(-) create mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/GoodsNumberGenerator.java diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/repository/mapper/BusinessDocumentOrderMapper.java b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/repository/mapper/BusinessDocumentOrderMapper.java index 5d887bacd..3d11a02d8 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/repository/mapper/BusinessDocumentOrderMapper.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/repository/mapper/BusinessDocumentOrderMapper.java @@ -37,4 +37,10 @@ public interface BusinessDocumentOrderMapper extends BaseMapper ids, Long reviewStatus, String SalesManager,String reviewOpinion ) { LoginUser loginUser = SecurityUtils.getLoginUser();//获取登录人 @@ -225,7 +207,6 @@ public class BusinessDocumentOrderImpl extends ServiceImpl checkOrderCodes = businessDocumentOrderMapper.selectList( - new QueryWrapper().eq("goods_number", orderCode) - ); - - if (CollectionUtils.isEmpty(checkOrderCodes)) { - break; - } - - if (retryCount >= maxRetryCount) { - throw new com.aliyun.oss.ServiceException("生成唯一订单编号失败,已达到最大重试次数:" + maxRetryCount); - } - } - - //生成货源单号 + //生成子单货源单号(yyMMdd + 当日顺序号) + String orderCode = goodsNumberGenerator.generateUniqueGoodsNumber(subOrder.getDocumentDate()); subOrder.setGoodsNumber(orderCode); - businessDocumentOrderMapper.insert(subOrder); subOrderCount++; // 增加子单计数 diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/BusinessDocumentOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/BusinessDocumentOrderDomainService.java index 0befdc8f8..2f4012cff 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/BusinessDocumentOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/BusinessDocumentOrderDomainService.java @@ -102,6 +102,9 @@ public class BusinessDocumentOrderDomainService { @Autowired private UserServiceFeign userServiceFeign; + @Autowired + private GoodsNumberGenerator goodsNumberGenerator; + /** * 分页查询【请填写功能名称】列表 */ @@ -109,26 +112,6 @@ public class BusinessDocumentOrderDomainService { return businessDocumentOrderService.queryList(businessDocumentOrderDO); } - public static String getOrderCodeByDate(Date date){ - return new StringBuffer() - .append(getSecondPartByDate(date)) - .append(getThreePart()) - .toString(); - } - private static String getSecondPartByDate(Date date) { - if (date == null) { - date = new Date(); - } - String temp_current_time = DateUtil.format(date, datePattern()); - return temp_current_time.substring(2, temp_current_time.length()); - } - private static String datePattern() { - return "yyyyMMddHHmmss"; - } - private static String getThreePart() { - return RandomUtil.randomNumbers(4); - } - /** * 新增【请填写功能名称】 */ @@ -302,30 +285,8 @@ public class BusinessDocumentOrderDomainService { } } - //生成货源单号 - - String orderCode = null; - int maxRetryCount = 100; - int retryCount = 0; - - while (retryCount < maxRetryCount) { - orderCode = getOrderCodeByDate(tmsOrder.getDocumentDate()); - retryCount++; - - List checkOrderCodes = businessDocumentOrderMapper.selectList( - new QueryWrapper().eq("goods_number", orderCode) - ); - - if (CollectionUtils.isEmpty(checkOrderCodes)) { - break; - } - - if (retryCount >= maxRetryCount) { - throw new ServiceException("生成唯一订单编号失败,已达到最大重试次数:" + maxRetryCount); - } - } - - //生成货源单号 + //生成货源单号(yyMMdd + 当日顺序号,每日重置) + String orderCode = goodsNumberGenerator.generateUniqueGoodsNumber(tmsOrder.getDocumentDate()); tmsOrder.setGoodsNumber(orderCode); ReservationStockOutOrder reservationStockOutOrder = reservationStockOutOrderMapper.selectOne(new LambdaQueryWrapper() @@ -774,28 +735,8 @@ public class BusinessDocumentOrderDomainService { // boolean istrue=businessDocumentOrderService.update(businessDocumentOrderDO); - String orderCode = null; - int maxRetryCount = 100; - int retryCount = 0; - - while (retryCount < maxRetryCount) { - orderCode = getOrderCodeByDate(tmsOrder.getDocumentDate()); - retryCount++; - - List checkOrderCodes = businessDocumentOrderMapper.selectList( - new QueryWrapper().eq("goods_number", orderCode) - ); - - if (CollectionUtils.isEmpty(checkOrderCodes)) { - break; - } - - if (retryCount >= maxRetryCount) { - throw new ServiceException("生成唯一订单编号失败,已达到最大重试次数:" + maxRetryCount); - } - } - - //生成货源单号 + //生成货源单号(yyMMdd + 当日顺序号,每日重置) 原更新操作会将 电脑更细为当日的日期。默认和之前的逻辑一样保持不变 + String orderCode = goodsNumberGenerator.generateUniqueGoodsNumber(tmsOrder.getDocumentDate()); tmsOrder.setGoodsNumber(orderCode); ReservationStockOutOrder reservationStockOutOrder = reservationStockOutOrderMapper.selectOne(new LambdaQueryWrapper() diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/GoodsNumberGenerator.java b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/GoodsNumberGenerator.java new file mode 100644 index 000000000..285c8a89f --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/GoodsNumberGenerator.java @@ -0,0 +1,53 @@ +package com.mhd.oms.domain.businessDocumentOrder.service; + +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.mhd.common.core.exception.ServiceException; +import com.mhd.oms.domain.businessDocumentOrder.entity.BusinessDocumentOrder; +import com.mhd.oms.domain.businessDocumentOrder.repository.mapper.BusinessDocumentOrderMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Date; +import java.util.List; + +/** + * 业务单据订单(goodsNumber)单号生成器 + * 规则: yyMMdd(取自单据日期) + 当日顺序号(每日重置, 3位起步, 超999自动扩位) + * 示例: 260804001、260804999、2608041000 + */ +@Component +public class GoodsNumberGenerator { + + private static final int MAX_RETRY = 100; + + @Autowired + private BusinessDocumentOrderMapper businessDocumentOrderMapper; + + /** + * 生成唯一业务单号 + * @param documentDate 单据日期(为空取当前日期) + */ + public String generateUniqueGoodsNumber(Date documentDate) { + Date date = (documentDate == null) ? new Date() : documentDate; + String datePart = DateUtil.format(date, "yyMMdd"); + + // count 只查一次作为序号基线 + long seq = (long) businessDocumentOrderMapper.countByGoodsNumberPrefix(datePart) + 1; + int retryCount = 0; + while (retryCount < MAX_RETRY) { + String orderCode = datePart + String.format("%03d", seq); + retryCount++; + + List exist = businessDocumentOrderMapper.selectList( + new QueryWrapper().eq("goods_number", orderCode) + ); + if (CollectionUtils.isEmpty(exist)) { + return orderCode; + } + seq++; // ← 关键:查重失败,序号往后递增找空位,而不是重新count + } + throw new ServiceException("生成唯一业务单号失败,已达到最大重试次数:" + MAX_RETRY); + } +} \ No newline at end of file diff --git a/mhd_oms/src/main/resources/mapper/businessDocumentOrder/BusinessDocumentOrderMapper.xml b/mhd_oms/src/main/resources/mapper/businessDocumentOrder/BusinessDocumentOrderMapper.xml index 144f5917d..e000874e1 100644 --- a/mhd_oms/src/main/resources/mapper/businessDocumentOrder/BusinessDocumentOrderMapper.xml +++ b/mhd_oms/src/main/resources/mapper/businessDocumentOrder/BusinessDocumentOrderMapper.xml @@ -1272,4 +1272,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select PUSH_VERIFY from NGWL_TEST_PRODUCT.SYS_ORGANIZATION where ORGANIZATION_ID = #{organizationId} + + From 44e9eb47bcd2e9ff22f9dee035aebc2f2fc0875f Mon Sep 17 00:00:00 2001 From: zhaoqing <3160641494@qq.com> Date: Wed, 12 Aug 2026 18:34:35 +0800 Subject: [PATCH 13/37] =?UTF-8?q?fix(system):=E5=8D=95=E4=BD=8D=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E5=80=BC=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExpenseAccountApplicationService.java | 12 ++++++++++-- .../repository/po/ExpenseAccountPO.java | 4 ++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/expenseAccount/ExpenseAccountApplicationService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/expenseAccount/ExpenseAccountApplicationService.java index d1c391c38..8359c1e83 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/expenseAccount/ExpenseAccountApplicationService.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/expenseAccount/ExpenseAccountApplicationService.java @@ -581,7 +581,7 @@ public class ExpenseAccountApplicationService { } /** - * 根据编码和组织ID查询费用科目信息 + * 根据编码和组织ID查询 */ public ExpenseAccountPO getInfoByOrgAndCode(String subjectCode, Long organizationId) { if(!StringUtils.isNotEmpty(subjectCode)){ @@ -590,7 +590,15 @@ public class ExpenseAccountApplicationService { if(organizationId == null){ throw new ServiceException("组织ID不能为空"); } - return expenseAccountDomainService.getInfoByOrgAndCode(subjectCode, organizationId); + ExpenseAccountPO expenseAccountPO = expenseAccountDomainService.getInfoByOrgAndCode(subjectCode, organizationId); + // 组装计费单位列表:单位-单位英文 + List unit = new ArrayList<>(); + if (expenseAccountPO != null) { + unit.add(expenseAccountPO.getBillingUnit() + "-" + expenseAccountPO.getBillingUnitEn()); + unit.add(expenseAccountPO.getBillingUnit2() + "-" + expenseAccountPO.getBillingUnitEn2()); + expenseAccountPO.setUnit(unit); + } + return expenseAccountPO; } public List selectExpenseAccount(SearchExpenseAccountDO searchExpenseAccountDO){ diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/repository/po/ExpenseAccountPO.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/repository/po/ExpenseAccountPO.java index 07cca5026..2f4f54d44 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/repository/po/ExpenseAccountPO.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/repository/po/ExpenseAccountPO.java @@ -159,4 +159,8 @@ public class ExpenseAccountPO extends BaseVOEntity{ @ApiModelProperty("nc科目编码") private String ncSubjectCode; + + @ApiModelProperty("计费单位列表(单位-单位英文)") + private List unit; + } \ No newline at end of file From d17146dc4b6c6cc9147d128c2071e7ed24ffd6d4 Mon Sep 17 00:00:00 2001 From: zhaoqing <1670883518@qq.com> Date: Thu, 13 Aug 2026 10:03:39 +0800 Subject: [PATCH 14/37] =?UTF-8?q?fix(oms):=E8=BF=90=E8=BE=93=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E5=8D=95=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../businessDocumentOrder/BusinessDocumentOrderMapper.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mhd_oms/src/main/resources/mapper/businessDocumentOrder/BusinessDocumentOrderMapper.xml b/mhd_oms/src/main/resources/mapper/businessDocumentOrder/BusinessDocumentOrderMapper.xml index e000874e1..cf5376d8b 100644 --- a/mhd_oms/src/main/resources/mapper/businessDocumentOrder/BusinessDocumentOrderMapper.xml +++ b/mhd_oms/src/main/resources/mapper/businessDocumentOrder/BusinessDocumentOrderMapper.xml @@ -709,7 +709,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" From 84d4df0809ced5f52e17e3c100d01faa8b04aee2 Mon Sep 17 00:00:00 2001 From: zhaoqing <1670883518@qq.com> Date: Thu, 13 Aug 2026 10:31:49 +0800 Subject: [PATCH 15/37] =?UTF-8?q?fix(system):=E4=BF=AE=E6=94=B9=E5=8D=95?= =?UTF-8?q?=E4=BD=8D=E8=BF=94=E5=9B=9E=E5=80=BC=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExpenseAccountApplicationService.java | 27 ++++++++++++------- .../repository/po/ExpenseAccountPO.java | 3 ++- .../expenseAccount/ExpenseAccountApi.java | 2 +- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/expenseAccount/ExpenseAccountApplicationService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/expenseAccount/ExpenseAccountApplicationService.java index 8359c1e83..08586ea17 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/expenseAccount/ExpenseAccountApplicationService.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/expenseAccount/ExpenseAccountApplicationService.java @@ -30,11 +30,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Objects; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -591,11 +587,24 @@ public class ExpenseAccountApplicationService { throw new ServiceException("组织ID不能为空"); } ExpenseAccountPO expenseAccountPO = expenseAccountDomainService.getInfoByOrgAndCode(subjectCode, organizationId); - // 组装计费单位列表:单位-单位英文 - List unit = new ArrayList<>(); +// // 组装计费单位列表:单位-单位英文 +// List unit = new ArrayList<>(); +// if (expenseAccountPO != null) { +// unit.add(expenseAccountPO.getBillingUnit() + "-" + expenseAccountPO.getBillingUnitEn()); +// unit.add(expenseAccountPO.getBillingUnit2() + "-" + expenseAccountPO.getBillingUnitEn2()); +// expenseAccountPO.setUnit(unit); +// } + // 组装计费单位列表(数组) + List> unit = new ArrayList<>(); if (expenseAccountPO != null) { - unit.add(expenseAccountPO.getBillingUnit() + "-" + expenseAccountPO.getBillingUnitEn()); - unit.add(expenseAccountPO.getBillingUnit2() + "-" + expenseAccountPO.getBillingUnitEn2()); + Map unit1 = new HashMap<>(); + unit1.put("unit", expenseAccountPO.getBillingUnit() + "-" + expenseAccountPO.getBillingUnitEn()); + unit.add(unit1); + + Map unit2 = new HashMap<>(); + unit2.put("unit", expenseAccountPO.getBillingUnit2() + "-" + expenseAccountPO.getBillingUnitEn2()); + unit.add(unit2); + expenseAccountPO.setUnit(unit); } return expenseAccountPO; diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/repository/po/ExpenseAccountPO.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/repository/po/ExpenseAccountPO.java index 2f4f54d44..611f0751b 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/repository/po/ExpenseAccountPO.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/repository/po/ExpenseAccountPO.java @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.math.BigDecimal; import java.util.List; +import java.util.Map; import com.mhd.common.core.web.domain.BaseVOEntity; @@ -161,6 +162,6 @@ public class ExpenseAccountPO extends BaseVOEntity{ private String ncSubjectCode; @ApiModelProperty("计费单位列表(单位-单位英文)") - private List unit; + private List> unit; } \ No newline at end of file diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facade/expenseAccount/ExpenseAccountApi.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facade/expenseAccount/ExpenseAccountApi.java index 9d6d5d3bf..8c22cd084 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facade/expenseAccount/ExpenseAccountApi.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facade/expenseAccount/ExpenseAccountApi.java @@ -333,7 +333,7 @@ public class ExpenseAccountApi extends BaseController{ public AjaxResult getInfoByOrgAndCode(@RequestParam("subjectCode") String subjectCode,@RequestParam("organizationId") Long organizationId) { ExpenseAccountPO expenseAccountPO = expenseAccountApplicationService.getInfoByOrgAndCode(subjectCode, organizationId); - return AjaxResult.success(expenseAccountPO); + return AjaxResult.success(expenseAccountPO.getUnit()); } From da31a8141538ca5d9932186e688c518572488c3c Mon Sep 17 00:00:00 2001 From: zhaoqing <3160641494@qq.com> Date: Thu, 13 Aug 2026 13:54:20 +0800 Subject: [PATCH 16/37] =?UTF-8?q?fix(oms):=E5=A4=8D=E5=88=B6=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/BusinessDocumentOrderDomainService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/BusinessDocumentOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/BusinessDocumentOrderDomainService.java index 2f4012cff..93585eeb6 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/BusinessDocumentOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/BusinessDocumentOrderDomainService.java @@ -474,6 +474,8 @@ public class BusinessDocumentOrderDomainService { tmsOrderAccount.setOrderId(String.valueOf(tmsOrder.getId())); tmsOrderAccount.setCreateBy(String.valueOf(u.getUserid())); tmsOrderAccount.setCreateTime(new Date()); + // 复制新增时科目行会带原订单的id,避免报错 + tmsOrderAccount.setId(null); // 设置组织信息 if (businessDocumentOrderDO.getOrganizationId() != null) { tmsOrderAccount.setOrganizationId(businessDocumentOrderDO.getOrganizationId()); From 123a5af24184833414d003d137bab1354ab58c2c Mon Sep 17 00:00:00 2001 From: zhaoqing <1670883518@qq.com> Date: Thu, 13 Aug 2026 14:15:03 +0800 Subject: [PATCH 17/37] =?UTF-8?q?fix(oms):=E8=BF=90=E8=BE=93=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E5=8D=95=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../businessDocumentOrder/BusinessDocumentOrderMapper.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mhd_oms/src/main/resources/mapper/businessDocumentOrder/BusinessDocumentOrderMapper.xml b/mhd_oms/src/main/resources/mapper/businessDocumentOrder/BusinessDocumentOrderMapper.xml index cf5376d8b..1a7f2d51c 100644 --- a/mhd_oms/src/main/resources/mapper/businessDocumentOrder/BusinessDocumentOrderMapper.xml +++ b/mhd_oms/src/main/resources/mapper/businessDocumentOrder/BusinessDocumentOrderMapper.xml @@ -709,7 +709,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" From 3d3036cebf736321913f5e766c21377012c8c2b8 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Thu, 13 Aug 2026 15:06:08 +0800 Subject: [PATCH 18/37] =?UTF-8?q?feat(wms):=20=E5=87=BA=E5=BA=93=E6=8A=A5?= =?UTF-8?q?=E5=85=B3=E6=B5=81=E7=A8=8B=E6=94=B9=E9=80=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 交接环节增加 needDeclareFlag 判断:需报关单置为「已交接(13)」不扣库存, 不需报关单维持原逻辑直接「已出库(9)」扣库存。 2. 新增定时任务每小时调 sendDec 查报关结果,dec_status=P(海关已放行) 时 状态 13→9 并扣库存+推OMS。 3. 新增 /stockOutOrderApi/customsConfirmOut 接口支持人工触发报关确认出库。 4. 出库单状态枚举新增 13-已交接。 5. WMS 启动类新增 @EnableScheduling 开启定时任务支持。 --- .../mhd/system/api/domain/StockOutOrder.java | 4 +- .../java/com/mhd/wms/MhdWmsApplication.java | 2 + .../HandoverTaskOrderApplicationService.java | 7 +- .../HandoverTaskOrderDomainService.java | 442 +++++++++++------- .../repository/po/StockOutOrderPO.java | 4 +- .../repository/todo/StockOutOrderDO.java | 4 +- .../dto/stockOutOrder/StockOutOrderDTO.java | 4 +- .../stockOutOrder/StockOutOrderApi.java | 9 + 8 files changed, 303 insertions(+), 173 deletions(-) diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/StockOutOrder.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/StockOutOrder.java index f94c49b5d..2ac0c76e6 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/StockOutOrder.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/StockOutOrder.java @@ -50,8 +50,8 @@ public class StockOutOrder extends BaseVOEntity { @Excel(name = "出库单号") private String outOrderNumber; - @ApiModelProperty("出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 12-已复核") - @Excel(name = "出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 12-已复核") + @ApiModelProperty("出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 12-已复核 13-已交接") + @Excel(name = "出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 12-已复核 13-已交接") private Integer status; @ApiModelProperty("出库单审核状态: 1-未审核 2-审核不通过 3-审核通过") diff --git a/mhd_wms/src/main/java/com/mhd/wms/MhdWmsApplication.java b/mhd_wms/src/main/java/com/mhd/wms/MhdWmsApplication.java index a848debd3..92f286e66 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/MhdWmsApplication.java +++ b/mhd_wms/src/main/java/com/mhd/wms/MhdWmsApplication.java @@ -8,6 +8,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.context.annotation.ComponentScan; import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @EnableRyFeignClients @@ -15,6 +16,7 @@ import org.springframework.scheduling.annotation.EnableAsync; @MapperScan("com.mhd.wms.domain.**.mapper") @EnableMethodCache(basePackages = "com.mhd.platform.domain.**.cache") @EnableAsync +@EnableScheduling @ComponentScan(basePackages = { "com.mhd.wms", "com.mhd.system.api.factory" diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/handoverTaskOrder/HandoverTaskOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/handoverTaskOrder/HandoverTaskOrderApplicationService.java index 4b4a8aaf5..4c9775cd2 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/handoverTaskOrder/HandoverTaskOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/handoverTaskOrder/HandoverTaskOrderApplicationService.java @@ -270,10 +270,13 @@ public class HandoverTaskOrderApplicationService { .eq(HandoverTaskOrder::getOrderNumber, orderNumber) .set(HandoverTaskOrder::getBillingJson, handoverTaskOrderDO.getBillingJson()) .set(HandoverTaskOrder::getPictureApp, handoverTaskOrderDO.getPictureApp())); - // 2. PDA上传图片插入出库管理,状态改为已出库 + // 2. 状态按是否报关:需报关→已交接(13),否则→已出库(9) + StockOutOrder soo = stockOutOrderService.getOne(new LambdaQueryWrapper() + .eq(StockOutOrder::getOutOrderNumber, orderNumber)); + int targetStatus = (soo != null && "1".equals(soo.getNeedDeclareFlag())) ? 13 : 9; stockOutOrderService.update(new LambdaUpdateWrapper() .eq(StockOutOrder::getOutOrderNumber, orderNumber) - .set(StockOutOrder::getStatus, "9") + .set(StockOutOrder::getStatus, targetStatus) .set(StockOutOrder::getBillingJson, handoverTaskOrderDO.getBillingJson()) .set(StockOutOrder::getPictureApp, handoverTaskOrderDO.getPictureApp())); // 3. 参考PC端完成交接:根据orderNumber查询交接单ID,执行库存扣减+交接状态更新 diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java index 1d409b159..504e379fe 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java @@ -1,5 +1,18 @@ package com.mhd.wms.domain.handoverTaskOrder.service; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.mhd.common.core.web.domain.AjaxResult; +import com.mhd.wms.domain.customsDeclarationDetail.repository.todo.CustomsDeclarationDetailDO; +import com.mhd.wms.domain.customsDeclarationDetail.repository.facade.ICustomsDeclarationDetailService; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.util.EntityUtils; +import org.springframework.scheduling.annotation.Scheduled; +import java.text.SimpleDateFormat; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; @@ -86,6 +99,17 @@ public class HandoverTaskOrderDomainService { private CopyCodeReferenceDomainService copyCodeReferenceDomainService; @Autowired private OmsServiceFeign omsServiceFeign; + @Autowired + private ICustomsDeclarationDetailService customsDeclarationDetailService; + + // 报关回写相关常量 + private static final String CUSTOMS_PUSH_API_URL = "http://10.102.192.15/nagu-erp-api/transfer/pushData"; + private static final String CUSTOMS_VERIFY = "ESLuxAmB6VXCgbqP1eFzxTPVRagkQ62BUkfhElrgQ6XmE/g2reHVflY/SiCSU7JD"; + // 视为「海关已放行/结关」的状态码(建议做成 @Value("${gw.customs.pass-status:P,I,R,F,K,B}")) + // 视为「海关已放行」的状态码(ERP 确认:只有 P=海关已放行 才表示货物可出库) + private static final String[] CUSTOMS_PASS_STATUS = {"P"}; + // 退单/失败状态码(记告警用) + private static final String[] CUSTOMS_FAIL_STATUS = {"E", "A", "D", "Z", "c", "H"}; /** @@ -293,8 +317,17 @@ public class HandoverTaskOrderDomainService { LoginUser loginUser = SecurityUtils.getLoginUser(); //修改库存 xgkc(handoverTaskOrderIds,loginUser); - //推送oms + //推送oms(需报关的单子等海关确认放行后再推) for (Long handoverTaskOrderId : handoverTaskOrderIds) { + HandoverTaskOrder hto = handoverTaskOrderService.getById(handoverTaskOrderId); + if (hto == null) { + continue; + } + StockOutOrder soo = stockOutOrderMapper.selectOne(new QueryWrapper().lambda() + .eq(StockOutOrder::getOutOrderNumber, hto.getOrderNumber())); + if (soo != null && "1".equals(soo.getNeedDeclareFlag())) { + continue; // 需报关,跳过 + } pushOms(handoverTaskOrderId); } HandoverTaskOrder handoverTaskOrder = handoverTaskOrderService.getById(handoverTaskOrderIds.get(0)); @@ -339,178 +372,261 @@ public class HandoverTaskOrderDomainService { if (stockOutOrder == null) { continue; } - //完成交接状态改为已出库 + // 需要报关:交接时只改状态为「已交接(13)」,不扣库存/不推OMS,等海关确认放行后再处理 + if ("1".equals(stockOutOrder.getNeedDeclareFlag())) { + stockOutOrder.setStatus(13); + stockOutOrderMapper.updateById(stockOutOrder); + continue; // 跳过下方扣库存逻辑(B/C/D/E 全部延后到海关确认) + } + // 不需要报关:维持原逻辑,状态改「已出库(9)」+ 扣库存 stockOutOrder.setStatus(9); stockOutOrderMapper.updateById(stockOutOrder); - List outMaterialDetailList = outMaterialDetailMapper.selectList(new QueryWrapper().lambda() - .eq(OutMaterialDetail::getOutOrderNumber, orderNumber) - .eq(OutMaterialDetail::getDelFlag, 1)); - Integer review = stockOutOrder != null ? stockOutOrder.getReview() : null; - for (OutMaterialDetail outMaterialDetail : outMaterialDetailList) { - //oms详情同步 - OMSWarehouseEntryDetails(outMaterialDetail); - if (outMaterialDetail.getCopyCodeReferenceIds() != null){ - List copyCodeReferenceIds = Arrays.stream(outMaterialDetail.getCopyCodeReferenceIds().split(",")) - .map(Integer::parseInt).collect(Collectors.toList()); - copyCodeReferenceService.lambdaUpdate() - .set(CopyCodeReference::getMaterialStatusCode, 3) - .set(CopyCodeReference::getMaterialStatusName, "已出库") - .in(CopyCodeReference::getId, copyCodeReferenceIds); - } - Long materialInventoryId = outMaterialDetail.getMaterialInventoryId(); - // 复核什么扣减什么:需要复核用check_quantity,不需要复核用picking_quantity - BigDecimal effectiveQuantity = Integer.valueOf(1).equals(review) - ? outMaterialDetail.getCheckQuantity() - : (outMaterialDetail.getPickingQuantity() != null ? outMaterialDetail.getPickingQuantity() : outMaterialDetail.getQuantity()); - if (materialInventoryId == null || effectiveQuantity == null || effectiveQuantity.compareTo(BigDecimal.ZERO) <= 0) { + doStockOutDeduct(orderNumber, stockOutOrder, loginUser); + } + } + + /** + * 出库扣减:同步OMS明细 + 联单状态 + 扣实物库存 + 推OMS库存 + * (从 xgkc 抽取,供「不需报关交接」和「海关确认」两处复用) + */ + private void doStockOutDeduct(String orderNumber, StockOutOrder stockOutOrder, LoginUser loginUser) { + List outMaterialDetailList = outMaterialDetailMapper.selectList(new QueryWrapper().lambda() + .eq(OutMaterialDetail::getOutOrderNumber, orderNumber) + .eq(OutMaterialDetail::getDelFlag, 1)); + Integer review = stockOutOrder.getReview(); + for (OutMaterialDetail outMaterialDetail : outMaterialDetailList) { + // === 以下把原 L349-513 的循环体【原样】搬进来,一行不改 === + // oms详情同步 + OMSWarehouseEntryDetails(outMaterialDetail); + if (outMaterialDetail.getCopyCodeReferenceIds() != null) { + List copyCodeReferenceIds = Arrays.stream(outMaterialDetail.getCopyCodeReferenceIds().split(",")) + .map(Integer::parseInt).collect(Collectors.toList()); + copyCodeReferenceService.lambdaUpdate() + .set(CopyCodeReference::getMaterialStatusCode, 3) + .set(CopyCodeReference::getMaterialStatusName, "已出库") + .in(CopyCodeReference::getId, copyCodeReferenceIds); + } + Long materialInventoryId = outMaterialDetail.getMaterialInventoryId(); + BigDecimal effectiveQuantity = Integer.valueOf(1).equals(review) + ? outMaterialDetail.getCheckQuantity() + : (outMaterialDetail.getPickingQuantity() != null ? outMaterialDetail.getPickingQuantity() : outMaterialDetail.getQuantity()); + if (materialInventoryId == null || effectiveQuantity == null || effectiveQuantity.compareTo(BigDecimal.ZERO) <= 0) { + continue; + } + BigDecimal checkQuantity = effectiveQuantity; + BigDecimal checkArea = outMaterialDetail.getCheckArea(); + BigDecimal checkVolume = outMaterialDetail.getCheckVolume(); + BigDecimal checkGrossWeight = outMaterialDetail.getCheckGrossWeight(); + BigDecimal checkNetWeight = outMaterialDetail.getCheckNetWeight(); + checkQuantity = checkQuantity != null ? checkQuantity : BigDecimal.ZERO; + checkArea = checkArea != null ? checkArea : BigDecimal.ZERO; + checkVolume = checkVolume != null ? checkVolume : BigDecimal.ZERO; + checkGrossWeight = checkGrossWeight != null ? checkGrossWeight : BigDecimal.ZERO; + checkNetWeight = checkNetWeight != null ? checkNetWeight : BigDecimal.ZERO; + + MaterialInventory materialInventoryPO = materialInventoryMapper.selectById(materialInventoryId); + if (materialInventoryPO != null) { + MaterialInventoryParamDO materialInventoryParamDO = new MaterialInventoryParamDO(); + materialInventoryParamDO.setArea(checkArea); + materialInventoryParamDO.setVolume(checkVolume); + materialInventoryParamDO.setGrossWeight(checkGrossWeight); + materialInventoryParamDO.setNetWeight(checkNetWeight); + materialInventoryParamDO.setQuantity(checkQuantity); + materialInventoryParamDO.setMaterialInventoryId(materialInventoryPO.getMaterialInventoryId()); + materialInventoryParamDO.setMaterialBaseInfoId(materialInventoryPO.getMaterialBaseInfoId()); + materialInventoryParamDO.setLotNumber(outMaterialDetail.getLotNo()); + materialInventoryParamDO.setBatchNumber(outMaterialDetail.getBatchNumber()); + materialInventoryParamDO.setInOrderNumber(materialInventoryPO.getInOrderNumber()); + materialInventoryParamDO.setProductionDate(materialInventoryPO.getProductionDate()); + materialInventoryParamDO.setExpiryDate(materialInventoryPO.getExpiryDate()); + materialInventoryParamDO.setType("4"); + materialInventoryParamDO.setWarehouseId(materialInventoryPO.getWarehouseId()); + materialInventoryService.kctzjl(materialInventoryParamDO, "出库", loginUser); + materialInventoryService.xgkc(materialInventoryParamDO); + MaterialInventoryOmsParamDO materialInventoryOmsParamDO = new MaterialInventoryOmsParamDO(); + BeanUtils.copyProperties(materialInventoryParamDO, materialInventoryOmsParamDO); + materialInventoryOmsParamDO.setKctzType("出库"); + materialInventoryOmsParamDO.setLoginUser(loginUser); + omsServiceFeign.omsEdit(materialInventoryOmsParamDO); + } + } + } + + /** + * 定时任务入口:每小时整点扫描「已交接(13)」状态的需报关出库单,调 sendDec 查报关结果, + * 放行/结关的 → 状态 13→9 + 扣库存 + 推OMS;未放行 → 跳过下次再查。 + * 由 @Scheduled 触发,无需在 sys_job 表配置。 + */ + @Scheduled(cron = "0 0 * * * ?") + public void scheduledCustomsConfirm() { + log.info("【报关确认出库】定时任务开始执行"); + try { + AjaxResult result = customsConfirmOut(null); + log.info("【报关确认出库】定时任务执行完成 result={}", result); + } catch (Exception e) { + log.error("【报关确认出库】定时任务执行异常", e); + } + } + + /** + * 海关确认出库(轮询/手动入口) + * 对 status=13(已交接)的需报关出库单,调 sendDec 查报关状态: + * ✅ 放行/结关 → 状态 13→9 + 扣库存 + 推OMS + * ❌ 退单 → 保持13,记告警 + * ⏳ 进行中 → 跳过,下次再查 + * @param outOrderNumbers 传空则扫全部 status=13;传值则按指定单号处理 + */ + @Transactional(rollbackFor = Exception.class) + public AjaxResult customsConfirmOut(List outOrderNumbers) { + // 1. 确定处理范围(只处理 status=13 且需要报关的出库单) + LambdaQueryWrapper qw = new LambdaQueryWrapper() + .eq(StockOutOrder::getStatus, 13) + .eq(StockOutOrder::getNeedDeclareFlag, "1"); + if (outOrderNumbers != null && !outOrderNumbers.isEmpty()) { + qw.in(StockOutOrder::getOutOrderNumber, outOrderNumbers); + } + List list = stockOutOrderService.list(qw); + + int pass = 0, pending = 0, fail = 0; + LoginUser loginUser = SecurityUtils.getLoginUser(); + + for (StockOutOrder soo : list) { + try { + // 2. 调 sendDec 查报关状态 + JSONArray decData = queryCustomsDeclaration( + soo.getOutOrderNumber(), + soo.getOrganizationId(), + soo.getOrganizationName()); + if (decData == null || decData.isEmpty()) { + pending++; // ERP 里还没报关单,下次再查 continue; } - BigDecimal checkQuantity = effectiveQuantity; - BigDecimal checkArea = outMaterialDetail.getCheckArea(); - BigDecimal checkVolume = outMaterialDetail.getCheckVolume(); - BigDecimal checkGrossWeight = outMaterialDetail.getCheckGrossWeight(); - BigDecimal checkNetWeight = outMaterialDetail.getCheckNetWeight(); - // 初始化检查数据,避免空指针 - checkQuantity = checkQuantity != null ? checkQuantity : BigDecimal.ZERO; - checkArea = checkArea != null ? checkArea : BigDecimal.ZERO; - checkVolume = checkVolume != null ? checkVolume : BigDecimal.ZERO; - checkGrossWeight = checkGrossWeight != null ? checkGrossWeight : BigDecimal.ZERO; - checkNetWeight = checkNetWeight != null ? checkNetWeight : BigDecimal.ZERO; + // 3. 判断状态(遍历全部明细,任一命中放行即整单放行) + String decStatus = null; + boolean passed = false, failed = false; + for (int i = 0; i < decData.size(); i++) { + JSONObject item = decData.getJSONObject(i); + decStatus = item.getString("dec_status"); + if (isInList(decStatus, CUSTOMS_PASS_STATUS)) { + passed = true; + // 报关单号写入 customs_declaration_detail(补全出库单关联) + saveCustomsDetail(soo, item); + break; + } + if (isInList(decStatus, CUSTOMS_FAIL_STATUS)) { + failed = true; + } + } - MaterialInventory materialInventoryPO = materialInventoryMapper.selectById(materialInventoryId); + if (passed) { + // ✅ 放行:状态 13→9 + 扣库存 + 推 OMS + soo.setStatus(9); + stockOutOrderMapper.updateById(soo); + doStockOutDeduct(soo.getOutOrderNumber(), soo, loginUser); + pushOmsByOrderNumber(soo.getOutOrderNumber()); + pass++; + } else if (failed) { + // ❌ 退单:保持13,记告警日志(暂留人工处理) + log.warn("报关退单,请人工处理 outOrderNumber={} decStatus={}", + soo.getOutOrderNumber(), decStatus); + fail++; + } else { + pending++; // 进行中 + } + } catch (Exception e) { + log.error("海关确认出库异常 outOrderNumber={}", soo.getOutOrderNumber(), e); + fail++; + } + } + Map r = new HashMap<>(); + r.put("pass", pass); + r.put("pending", pending); + r.put("fail", fail); + return AjaxResult.success(r); + } - //oms库存同步 - //OMSInventorySynchronization(outMaterialDetail,checkQuantity); - if (materialInventoryPO != null) { - MaterialInventoryParamDO materialInventoryParamDO = new MaterialInventoryParamDO(); - //更新库存数量 + /** + * sendDec 查询报关回写(参考 PickingOrderApplicationService.java:771-818 模板) + * 关键改造:① erpBillNo 传出库单号 ② 返回整个 data 数组(不只第0条) ③ 不在这里处理 dec_status + */ + private JSONArray queryCustomsDeclaration(String erpBillNo, Long organizationId, String organizationName) throws Exception { + Map param = new HashMap<>(); + param.put("beginDate", "2020-01-01"); + param.put("endDate", new SimpleDateFormat("yyyy-MM-dd").format(new Date())); + param.put("erpBillNo", erpBillNo); + param.put("pageIndex", 1); + param.put("pageSize", 100); + List> body = new ArrayList<>(); + body.add(param); -// //库存数量 -// BigDecimal oldInventoryQuantity = materialInventoryPO.getInventoryQuantity(); -// oldInventoryQuantity = oldInventoryQuantity != null ? oldInventoryQuantity : BigDecimal.ZERO; -// //可用数量 -// BigDecimal oldAllocationQuantity = materialInventoryPO.getAllocationQuantity(); -// oldAllocationQuantity = oldAllocationQuantity != null ? oldAllocationQuantity : BigDecimal.ZERO; -// //冻结数量(出库交接不变动冻结数量) -// BigDecimal oldFreezeQuantity = materialInventoryPO.getFreezeQuantity(); -// oldFreezeQuantity = oldFreezeQuantity != null ? oldFreezeQuantity : BigDecimal.ZERO; -// //扣减后库存数量 -// BigDecimal newInventoryQuantity = oldInventoryQuantity.subtract(checkQuantity); -// //扣减后可用数量 -// BigDecimal newAllocationQuantity = oldAllocationQuantity.subtract(checkQuantity); -// BigDecimal newFreezeQuantity = oldFreezeQuantity; -// -// -// -// BigDecimal oldArea = materialInventoryPO.getArea(); -// BigDecimal oldVolume = materialInventoryPO.getVolume(); -// BigDecimal oldGrossWeight = materialInventoryPO.getGrossWeight(); -// BigDecimal oldNetWeight = materialInventoryPO.getNetWeight(); -// -// // 初始化旧数据,避免空指针 -// oldArea = oldArea != null ? oldArea : BigDecimal.ZERO; -// oldVolume = oldVolume != null ? oldVolume : BigDecimal.ZERO; -// oldGrossWeight = oldGrossWeight != null ? oldGrossWeight : BigDecimal.ZERO; -// oldNetWeight = oldNetWeight != null ? oldNetWeight : BigDecimal.ZERO; -// -// BigDecimal newArea = oldArea.subtract(checkArea); -// BigDecimal newVolume = oldVolume.subtract(checkVolume); -// BigDecimal newGrossWeight = oldGrossWeight.subtract(checkGrossWeight); -// BigDecimal newNetWeight = oldNetWeight.subtract(checkNetWeight); -// -// materialInventoryPO.setInventoryQuantity(newInventoryQuantity); -// materialInventoryPO.setAllocationQuantity(materialInventoryPO.getAllocationQuantity()); -// materialInventoryPO.setFreezeQuantity(materialInventoryPO.getFreezeQuantity().subtract(outMaterialDetail.getCheckQuantity()) ); -// materialInventoryPO.setArea(newArea); -// materialInventoryPO.setVolume(newVolume); -// materialInventoryPO.setGrossWeight(newGrossWeight); -// materialInventoryPO.setNetWeight(newNetWeight); -// MaterialInventory materialInventory = new MaterialInventory(); -// BeanUtils.copyProperties(materialInventoryPO, materialInventory); - //materialInventoryMapper.updateById(materialInventory); - materialInventoryParamDO.setArea(checkArea); - materialInventoryParamDO.setVolume(checkVolume); - materialInventoryParamDO.setGrossWeight(checkGrossWeight); - materialInventoryParamDO.setNetWeight(checkNetWeight); - materialInventoryParamDO.setQuantity(checkQuantity); - materialInventoryParamDO.setMaterialInventoryId(materialInventoryPO.getMaterialInventoryId()); - materialInventoryParamDO.setMaterialBaseInfoId(materialInventoryPO.getMaterialBaseInfoId()); - materialInventoryParamDO.setLotNumber(outMaterialDetail.getLotNo()); - materialInventoryParamDO.setBatchNumber(outMaterialDetail.getBatchNumber()); - materialInventoryParamDO.setInOrderNumber(materialInventoryPO.getInOrderNumber()); - materialInventoryParamDO.setProductionDate(materialInventoryPO.getProductionDate()); - materialInventoryParamDO.setExpiryDate(materialInventoryPO.getExpiryDate()); - materialInventoryParamDO.setType("4"); - materialInventoryParamDO.setWarehouseId(materialInventoryPO.getWarehouseId()); - materialInventoryService.kctzjl(materialInventoryParamDO,"出库",loginUser); - materialInventoryService.xgkc(materialInventoryParamDO); - MaterialInventoryOmsParamDO materialInventoryOmsParamDO = new MaterialInventoryOmsParamDO(); - BeanUtils.copyProperties(materialInventoryParamDO, materialInventoryOmsParamDO); - materialInventoryOmsParamDO.setKctzType("出库"); - materialInventoryOmsParamDO.setLoginUser(loginUser); - //库存推送oms - omsServiceFeign.omsEdit(materialInventoryOmsParamDO); - //库存调整记录 -// InventoryAdjustmentRecord inventoryAdjustmentRecord = new InventoryAdjustmentRecord(); -// inventoryAdjustmentRecord.setAdjustAction("出库"); -// inventoryAdjustmentRecord.setRelateNo(orderNumber); -// inventoryAdjustmentRecord.setAdjustAfterStatusCode(materialInventory.getMaterialStatusCode() == null ? "" : materialInventory.getMaterialStatusCode()); -// inventoryAdjustmentRecord.setAdjustBeforeStatusCode(materialInventory.getMaterialStatusCode() == null ? "" : materialInventory.getMaterialStatusCode()); -// inventoryAdjustmentRecord.setAdjustAfterStatusName(materialInventory.getMaterialStatusName() == null ? "" : materialInventory.getMaterialStatusName()); -// inventoryAdjustmentRecord.setAdjustBeforeStatusName(materialInventory.getMaterialStatusName() == null ? "" : materialInventory.getMaterialStatusName()); -//// inventoryAdjustmentRecord.setAdjustBeforeStatusCode("he_ge"); -//// inventoryAdjustmentRecord.setAdjustBeforeStatusName("合格"); -// inventoryAdjustmentRecord.setMaterialBaseInfoId(materialInventoryPO.getMaterialBaseInfoId()); -// inventoryAdjustmentRecord.setMaterialCode(outMaterialDetail.getMaterialNo()); -// inventoryAdjustmentRecord.setMaterialName(outMaterialDetail.getCommodityName()); -// inventoryAdjustmentRecord.setBarCode(outMaterialDetail.getBarCode()); -// if (inventoryAdjustmentRecord.getBarCode() == null || inventoryAdjustmentRecord.getBarCode().isEmpty()){ -// getBarCode(materialInventoryPO, inventoryAdjustmentRecord); -// } -// inventoryAdjustmentRecord.setMaterialBaseInfoId(outMaterialDetail.getMaterialBaseInfoId()); -// inventoryAdjustmentRecord.setAdjustType(1L); -// inventoryAdjustmentRecord.setOrganizationId(stockOutOrder.getOrganizationId()); -// inventoryAdjustmentRecord.setOrganizationName(stockOutOrder.getOrganizationName()); -// inventoryAdjustmentRecord.setTopOrganizationId(stockOutOrder.getTopOrganizationId()); -// inventoryAdjustmentRecord.setWarehouseCode(stockOutOrder.getWarehouseCode()); -// inventoryAdjustmentRecord.setWarehouseName(stockOutOrder.getWarehouseName()); -// inventoryAdjustmentRecord.setWarehouseId(stockOutOrder.getWarehouseId()); -// inventoryAdjustmentRecord.setStorageCode(materialInventoryPO.getStorageCode()); -// inventoryAdjustmentRecord.setStorageName(materialInventoryPO.getStorageName()); -// inventoryAdjustmentRecord.setStorageLocationId(materialInventoryPO.getStorageLocationId()); -// inventoryAdjustmentRecord.setStorageLocationCode(materialInventoryPO.getStorageLocationCode()); -// inventoryAdjustmentRecord.setStorageLocationName(materialInventoryPO.getStorageLocationName()); -// inventoryAdjustmentRecord.setMaterialInventoryId(materialInventoryPO.getMaterialInventoryId()); -// inventoryAdjustmentRecord.setMaterialBaseInfoId(materialInventoryPO.getMaterialBaseInfoId()); -// inventoryAdjustmentRecord.setShipperId(stockOutOrder.getShipperId()); -// inventoryAdjustmentRecord.setShipperName(stockOutOrder.getShipperName()); -// inventoryAdjustmentRecord.setStorageSectionId(materialInventoryPO.getStorageSectionId()); -// inventoryAdjustmentRecord.setStorageLocationId(materialInventoryPO.getStorageLocationId()); -// inventoryAdjustmentRecord.setCreateBy(loginUser.getUserid()); -// UserPo userPo = loginUser.getUserPo(); -// if (userPo != null) inventoryAdjustmentRecord.setCreateByName(userPo.getUserName()); -// inventoryAdjustmentRecord.setCreateTime(new Date()); -// inventoryAdjustmentRecord.setAllocationBeforeQuantity(oldAllocationQuantity); -// inventoryAdjustmentRecord.setAllocationAfterQuantity(oldAllocationQuantity); -// inventoryAdjustmentRecord.setFreezeBeforeQuantity(oldFreezeQuantity); -// inventoryAdjustmentRecord.setFreezeAfterQuantity(newFreezeQuantity.subtract(outMaterialDetail.getCheckQuantity()));//调整后 冻结-出库 -// inventoryAdjustmentRecord.setInventoryBeforeQuantity(oldInventoryQuantity); -// inventoryAdjustmentRecord.setInventoryAfterQuantity(newInventoryQuantity); -// // 调整前:库存数量(净重、毛重、体积、面积) -// inventoryAdjustmentRecord.setNetWeight(oldNetWeight); -// inventoryAdjustmentRecord.setGrossWeight(oldGrossWeight); -// inventoryAdjustmentRecord.setVolume(oldVolume); -// inventoryAdjustmentRecord.setArea(oldArea); -// // 调整后:库存数量 - 复核时填写的数量 -// inventoryAdjustmentRecord.setAdjustedNetWeight(newNetWeight); -// inventoryAdjustmentRecord.setAdjustedGrossWeight(newGrossWeight); -// inventoryAdjustmentRecord.setAdjustedVolume(newVolume); -// inventoryAdjustmentRecord.setAdjustedArea(newArea); -// -// inventoryAdjustmentRecordMapper.insert(inventoryAdjustmentRecord); + // 多租户 URL(保证查的地址和推 save_order_e 的地址一致) + String ncUrl = pickingMaterialDetailMapper.getNcUrl("gw", organizationName, organizationId); + String url = (ncUrl != null) ? ncUrl : CUSTOMS_PUSH_API_URL; + + HttpPost post = new HttpPost(url); + post.setEntity(new StringEntity(JSONObject.toJSONString(body), "UTF-8")); + post.setHeader("Content-type", "application/json"); + post.setHeader("apiName", "sendDec"); + post.setHeader("verify", CUSTOMS_VERIFY); + log.info("sendDec 请求 erpBillNo={} url={} body={}", erpBillNo, url,body); + + try (CloseableHttpClient client = HttpClients.createDefault(); + CloseableHttpResponse resp = client.execute(post)) { + String respStr = EntityUtils.toString(resp.getEntity()); + log.info("sendDec 响应 erpBillNo={} resp={}", erpBillNo, respStr); + if (resp.getStatusLine().getStatusCode() == 200) { + JSONObject json = JSONObject.parseObject(respStr); + Integer code = json.getInteger("code"); + if (code != null && code == 200) { + return json.getJSONArray("data"); } } + return null; + } + } + + private boolean isInList(String v, String[] arr) { + if (v == null) return false; + for (String s : arr) { + if (s.equalsIgnoreCase(v)) return true; + } + return false; + } + + /** + * 报关明细写入 customs_declaration_detail + * (补 set outOrderNumber/outOrderId,原 PickingOrder 代码这两字段漏 set 了) + */ + private void saveCustomsDetail(StockOutOrder soo, JSONObject item) { + try { + CustomsDeclarationDetailDO d = new CustomsDeclarationDetailDO(); + d.setDocumentNumber(soo.getOutOrderNumber()); + d.setBondInvtNo(item.getString("entry_id")); + Object erpGNo = item.get("erp_g_no"); + if (erpGNo != null) { + d.setInvtRow(erpGNo instanceof Number + ? ((Number) erpGNo).intValue() + : Integer.parseInt(erpGNo.toString())); + } + d.setOutOrderNumber(soo.getOutOrderNumber()); + d.setOutOrderId(soo.getOutOrderId()); + d.setOrganizationId(soo.getOrganizationId()); + d.setOrganizationName(soo.getOrganizationName()); + d.setTopOrganizationId(soo.getTopOrganizationId()); + customsDeclarationDetailService.insert(d); + } catch (Exception e) { + log.error("写报关明细失败 outOrderNumber={}", soo.getOutOrderNumber(), e); + } + } + + /** 按 orderNumber 推 OMS(pushOms 入参是 handoverTaskOrderId,这里包一层) */ + private void pushOmsByOrderNumber(String orderNumber) { + List htoList = handoverTaskOrderService.list( + new LambdaQueryWrapper() + .eq(HandoverTaskOrder::getOrderNumber, orderNumber)); + for (HandoverTaskOrder hto : htoList) { + pushOms(hto.getHandoverTaskOrderId()); } } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/po/StockOutOrderPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/po/StockOutOrderPO.java index 552da5d76..52bb67a96 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/po/StockOutOrderPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/po/StockOutOrderPO.java @@ -53,8 +53,8 @@ public class StockOutOrderPO extends BaseVOEntity { @Excel(name = "出库单号") private String outOrderNumber; - @ApiModelProperty("出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭") - @Excel(name = "出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭") + @ApiModelProperty("出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 12-已复核 13-已交接") + @Excel(name = "出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 12-已复核 13-已交接") private Integer status; @ApiModelProperty("出库单审核状态: 1-未审核 2-审核不通过 3-审核通过") diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/todo/StockOutOrderDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/todo/StockOutOrderDO.java index b7ae141d7..2b036c595 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/todo/StockOutOrderDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/todo/StockOutOrderDO.java @@ -49,8 +49,8 @@ public class StockOutOrderDO extends BaseVOEntity { @Excel(name = "出库单号") private String outOrderNumber; - @ApiModelProperty("出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭") - @Excel(name = "出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭") + @ApiModelProperty("出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 12-已复核 13-已交接") + @Excel(name = "出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 12-已复核 13-已交接") private Integer status; @ApiModelProperty("出库单审核状态: 1-未审核 2-审核不通过 3-审核通过") diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockOutOrder/StockOutOrderDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockOutOrder/StockOutOrderDTO.java index a81b2a649..278b10162 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockOutOrder/StockOutOrderDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockOutOrder/StockOutOrderDTO.java @@ -47,8 +47,8 @@ public class StockOutOrderDTO extends StockOutOrderBaseDTO { @Excel(name = "出库单号") private String outOrderNumber; - @ApiModelProperty("出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭") - @Excel(name = "出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭") + @ApiModelProperty("出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 12-已复核 13-已交接") + @Excel(name = "出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 12-已复核 13-已交接") private Integer status; @ApiModelProperty("出库单审核状态: 1-未审核 2-审核不通过 3-审核通过") diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockOutOrder/StockOutOrderApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockOutOrder/StockOutOrderApi.java index e35ddf4e5..b10e122ef 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockOutOrder/StockOutOrderApi.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockOutOrder/StockOutOrderApi.java @@ -12,6 +12,7 @@ import com.mhd.wms.domain.copyCodeReference.entity.CopyCodeReference; import com.mhd.wms.domain.copyCodeReference.repository.po.CopyCodeReferencePO; import com.mhd.wms.domain.handoverTaskOrder.entity.HandoverTaskOrder; import com.mhd.wms.domain.handoverTaskOrder.repository.facade.IHandoverTaskOrderService; +import com.mhd.wms.domain.handoverTaskOrder.service.HandoverTaskOrderDomainService; import com.mhd.wms.domain.inMaterialDetail.entity.InMaterialDetail; import com.mhd.wms.domain.materialInventory.repository.po.MaterialInventoryPO; import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail; @@ -68,6 +69,8 @@ public class StockOutOrderApi extends BaseController { private IStockOutOrderService stockOutOrderService; @Autowired private ExcelParseService excelParseService; + @Autowired + private HandoverTaskOrderDomainService handoverTaskOrderDomainService; /** * 提货单大标题:未选时为「提货单」;可传副标题如「谷丰--营销部」,或与弹窗一致传整段「提货单--谷丰--营销部」(后者原样作标题,并将 -- 规范为 ——)。 @@ -107,6 +110,12 @@ public class StockOutOrderApi extends BaseController { return getDataTable(list); } + @ApiOperation("海关确认出库(人工批量触发,参数为空则扫全部已交接状态)") + @PostMapping("/customsConfirmOut") + public AjaxResult customsConfirmOut(@RequestBody(required = false) List outOrderNumbers) { + return handoverTaskOrderDomainService.customsConfirmOut(outOrderNumbers); + } + /** * 上传并解析出仓委托单Excel */ From d5bdb5b4193c9f27f785b274e598b870416d64aa Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Thu, 13 Aug 2026 17:20:41 +0800 Subject: [PATCH 19/37] =?UTF-8?q?feat(oms):=20=E8=BF=90=E8=BE=93=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E5=8D=95=E6=96=B0=E5=A2=9E=E5=8F=8D=E5=AE=A1=E6=A0=B8?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=20=E5=AE=A1=E6=A0=B8=E9=80=9A=E8=BF=87?= =?UTF-8?q?=E5=90=8E=E6=94=AF=E6=8C=81=E5=8F=8D=E5=AE=A1=E6=A0=B8=EF=BC=8C?= =?UTF-8?q?=E6=81=A2=E5=A4=8D=E8=AE=A2=E5=8D=95=E5=88=B0=E5=BE=85=E5=AE=A1?= =?UTF-8?q?=E6=A0=B8=E7=8A=B6=E6=80=81=E4=BB=A5=E4=BE=BF=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=20-=20=E6=96=B0=E5=A2=9E=20/businessDocumentOrderApi/cancelAud?= =?UTF-8?q?it=20=E6=8E=A5=E5=8F=A3=20-=20=E4=BB=85"=E5=AE=A1=E6=A0=B8?= =?UTF-8?q?=E9=80=9A=E8=BF=87(reviewStatus=3D1)"=E4=B8=94=E6=9C=AA?= =?UTF-8?q?=E7=94=9F=E6=88=90=E6=89=A7=E8=A1=8C=E5=8D=95=E7=9A=84=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E5=85=81=E8=AE=B8=E5=8F=8D=E5=AE=A1=E6=A0=B8=20-=20?= =?UTF-8?q?=E6=8B=86=E5=8D=95=E4=B8=BB=E5=8D=95=E5=8F=8D=E5=AE=A1=E6=A0=B8?= =?UTF-8?q?=E6=97=B6=E7=BA=A7=E8=81=94=E6=B8=85=E7=90=86=E7=94=9F=E6=88=90?= =?UTF-8?q?=E7=9A=84=E5=AD=90=E5=8D=95=E3=80=81=E5=AD=90=E5=8D=95=E5=9C=B0?= =?UTF-8?q?=E5=9D=80=E5=8F=8A=E9=85=8D=E9=80=81=E6=98=8E=E7=BB=86=E5=9B=9E?= =?UTF-8?q?=E5=A1=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...sinessDocumentOrderApplicationService.java | 8 ++ .../facade/IBusinessDocumentOrderService.java | 5 ++ .../BusinessDocumentOrderImpl.java | 83 +++++++++++++++++++ .../BusinessDocumentOrderDomainService.java | 9 ++ .../BusinessDocumentOrderApi.java | 10 +++ 5 files changed, 115 insertions(+) diff --git a/mhd_oms/src/main/java/com/mhd/oms/application/service/businessDocumentOrder/BusinessDocumentOrderApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/application/service/businessDocumentOrder/BusinessDocumentOrderApplicationService.java index b3e99f7f0..776b4b2b1 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/application/service/businessDocumentOrder/BusinessDocumentOrderApplicationService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/application/service/businessDocumentOrder/BusinessDocumentOrderApplicationService.java @@ -147,6 +147,14 @@ public class BusinessDocumentOrderApplicationService { { return businessDocumentOrderDomainService.audit(businessAuditDTO); } + + /** + * 业务单反审核 + */ + public Boolean cancelAudit(BusinessAuditDTO businessAuditDTO) + { + return businessDocumentOrderDomainService.cancelAudit(businessAuditDTO); + } public boolean execute(List ids) { return businessDocumentOrderDomainService.execute(ids); } diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/repository/facade/IBusinessDocumentOrderService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/repository/facade/IBusinessDocumentOrderService.java index 948412564..b638970e9 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/repository/facade/IBusinessDocumentOrderService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/repository/facade/IBusinessDocumentOrderService.java @@ -49,6 +49,11 @@ public interface IBusinessDocumentOrderService extends IService ids, Long reviewStatus, String SalesManager,String reviewOpinion); + /** + * 业务单反审核(将已审核订单恢复到待审核) + */ + public Boolean cancelAudit(List ids); + String selectByMakerCodeNc(String salesmanCodeNc); String selectByMakerCodeNc1(String salesmanCodeNc); diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/repository/persistence/BusinessDocumentOrderImpl.java b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/repository/persistence/BusinessDocumentOrderImpl.java index 9d4ee46ea..44f7ac880 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/repository/persistence/BusinessDocumentOrderImpl.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/repository/persistence/BusinessDocumentOrderImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.RandomUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.mhd.common.core.domain.po.UserPo; import com.mhd.common.core.utils.OrderSequence; @@ -298,6 +299,88 @@ public class BusinessDocumentOrderImpl extends ServiceImpl ids) { // 取消审核 后端暂时未加鉴权 + if (CollectionUtils.isEmpty(ids)) { + throw new ServiceException("未选择反审核的业务单"); + } + for (Long id : ids) { + BusinessDocumentOrder order = businessDocumentOrderMapper.selectById(id); + if (ObjectUtil.isNull(order)) { + throw new ServiceException("未查询到业务单信息"); + } + // 校验1:子单(splicingOrderType=3)不允许单独反审核,需对主单操作 + if (order.getSplicingOrderType() != null && order.getSplicingOrderType() == 3L) { + throw new ServiceException("业务单【" + order.getGoodsNumber() + "】为子单,请对主单进行反审核"); + } + // 校验2:仅"审核通过(reviewStatus=1)"可反审核 + if (order.getReviewStatus() == null || order.getReviewStatus() != 1L) { + throw new ServiceException("业务单【" + order.getGoodsNumber() + "】非已审核状态,无法反审核"); + } + // 校验3:已生成执行单的不允许反审核,需先取消执行 + ExecuteOrder existExec = executeOrderMapper.selectOne(new LambdaQueryWrapper() + .eq(ExecuteOrder::getBusinessDocumentId, id) + .eq(ExecuteOrder::getDelFlag, 1).last("LIMIT 1")); + if (ObjectUtil.isNotNull(existExec)) { + throw new ServiceException("业务单【" + order.getGoodsNumber() + "】已生成执行单,请先取消执行"); + } + + boolean isMain = order.getSplicingOrderType() != null && order.getSplicingOrderType() == 4L; + // 拆单主单(isMain):清理审核时生成的子单、子单地址、以及回填到配送明细的 subOrderId + if (isMain) { + List subOrders = businessDocumentOrderMapper.selectList( + new LambdaQueryWrapper() + .eq(BusinessDocumentOrder::getMainOrderId, String.valueOf(id)) + .eq(BusinessDocumentOrder::getDelFlag, 1)); + if (subOrders != null && !subOrders.isEmpty()) { + List subIdStrs = new ArrayList<>(); + for (BusinessDocumentOrder sub : subOrders) { + // 校验4:子单若已生成执行单,主单不可反审核 + ExecuteOrder subExec = executeOrderMapper.selectOne(new LambdaQueryWrapper() + .eq(ExecuteOrder::getBusinessDocumentId, sub.getId()) + .eq(ExecuteOrder::getDelFlag, 1).last("LIMIT 1")); + if (ObjectUtil.isNotNull(subExec)) { + throw new ServiceException("子单【" + sub.getGoodsNumber() + "】已生成执行单,无法反审核主单"); + } + subIdStrs.add(String.valueOf(sub.getId())); + // 逻辑删除子单(与 delete() 方法一致:delFlag 2) + sub.setDelFlag(2); + businessDocumentOrderMapper.updateById(sub); + } + // 逻辑删除子单的地址(审核时按 orderId=子单id 生成) + businessDocumentAddressMultiMapper.update(null, + new LambdaUpdateWrapper() + .in(BusinessDocumentAddressMulti::getOrderId, subIdStrs) + .set(BusinessDocumentAddressMulti::getDelFlag, 2)); + // 清空审核时回填到 business_delivery_details_link.sub_order_id 的子单id + businessDeliveryDetailsLinkMapper.update(null, + new LambdaUpdateWrapper() + .eq(BusinessDeliveryDetailsLink::getOrderId, id) + .isNotNull(BusinessDeliveryDetailsLink::getSubOrderId) + .set(BusinessDeliveryDetailsLink::getSubOrderId, null)); + } + } + + // 状态复位 + 清空审核信息(用 UpdateWrapper.set 确保 null 能写入;updateById 默认不更新 null) + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper() + .eq(BusinessDocumentOrder::getId, id) + .set(BusinessDocumentOrder::getReviewStatus, 0L) // 未审核 + .set(BusinessDocumentOrder::getOrderStatus, 0L) // 待审核 + .set(BusinessDocumentOrder::getExecuteStatus, 0L) // 无状态 + .set(BusinessDocumentOrder::getReviewId, null) + .set(BusinessDocumentOrder::getReview, null) + .set(BusinessDocumentOrder::getReviewTime, null) + .set(BusinessDocumentOrder::getReviewOpinion, null) + .set(BusinessDocumentOrder::getSalesManager, null); + if (isMain) { + updateWrapper.set(BusinessDocumentOrder::getDeliveryProgress, null); // 清空主单拆单数 + } + businessDocumentOrderMapper.update(null, updateWrapper); + } + return true; + } + @Override @Transactional(rollbackFor = Exception.class) public Boolean execute(List ids) { diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/BusinessDocumentOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/BusinessDocumentOrderDomainService.java index 93585eeb6..385e3c3f9 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/BusinessDocumentOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/BusinessDocumentOrderDomainService.java @@ -932,6 +932,15 @@ public class BusinessDocumentOrderDomainService { return businessDocumentOrderService.audit(businessAuditDTO.getIds(),businessAuditDTO.getReviewStatus(),businessAuditDTO.getSalesManager(),businessAuditDTO.getReviewOpinion()); } + + /** + * 业务单反审核 + */ + public Boolean cancelAudit(BusinessAuditDTO businessAuditDTO) + { + return businessDocumentOrderService.cancelAudit(businessAuditDTO.getIds()); + } + public Boolean execute(List ids) { return businessDocumentOrderService.execute(ids); } diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/businessDocumentOrder/BusinessDocumentOrderApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/businessDocumentOrder/BusinessDocumentOrderApi.java index eb5c6df23..abce60fdb 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/businessDocumentOrder/BusinessDocumentOrderApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/businessDocumentOrder/BusinessDocumentOrderApi.java @@ -108,6 +108,16 @@ public class BusinessDocumentOrderApi extends BaseController{ return AjaxResult.success(businessDocumentOrderApplicationService.audit(businessAuditDTO)); } + /** + * 业务单反审核(将已审核订单恢复到待审核,便于修改) + */ + @ApiOperation("业务单反审核") + @PostMapping(value = "/cancelAudit") + public AjaxResult cancelAudit(@RequestBody BusinessAuditDTO businessAuditDTO) + { + return toAjax(businessDocumentOrderApplicationService.cancelAudit(businessAuditDTO)); + } + /** * 批量执行【业务单】 */ From 3240e57c3ec06e75536a011d3ffe38c099a89cd9 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Thu, 13 Aug 2026 17:43:44 +0800 Subject: [PATCH 20/37] =?UTF-8?q?fix(lease):=20=E4=BF=AE=E5=A4=8D=E4=BB=93?= =?UTF-8?q?=E5=BA=93=E5=87=BA=E7=A7=9F=E7=8E=87=E5=AF=BC=E5=87=BA=E6=80=BB?= =?UTF-8?q?=E9=9D=A2=E7=A7=AF=E3=80=81=E6=97=A5=E7=A7=9F=E7=8E=87=E8=AE=A1?= =?UTF-8?q?=E7=AE=97=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 导出时总面积被算成全系统所有仓库库区面积之和(6168),日租率因此也错误(0.16)。 根因:导出方法调用 warehouseOccupancyRate(),该方法在不传 warehouseId 时 totalArea 会累加所有仓库面积。 - 导出方法不再调用 warehouseOccupancyRate(),改为自行按(业务日期+仓库)维度计算 - 总面积按仓库单独累加库区面积(通宇关务测试仓库 100,不再 6168) - 整租/散租面积按(日期+仓库)聚合 - 日租率 = (整租+散租)/该仓库总面积×100,直接输出百分比(10.00) - 增加总面积为0的除零保护 - 查询接口 warehouseOccupancyRate() 不受影响 --- .../Lease/LeaseApplicationService.java | 78 ++++++++++++++----- 1 file changed, 57 insertions(+), 21 deletions(-) diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/Lease/LeaseApplicationService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/Lease/LeaseApplicationService.java index 0ffbd7612..b951552ee 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/Lease/LeaseApplicationService.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/Lease/LeaseApplicationService.java @@ -508,24 +508,53 @@ public class LeaseApplicationService { * 参数与 /warehouseOccupancyRate、/list 一致 */ public void exportOccupancyRate(HttpServletResponse response, ShipperLeaseDetailsDO shipperLeaseDetailsDO) throws IOException { - // ===== 1. 查出租率(注意:该方法内部会修改传入的 DO,所以先查它)===== - List rateList = warehouseOccupancyRate(shipperLeaseDetailsDO); + // 注意:本方法不调用 warehouseOccupancyRate(),因为该方法在不传 warehouseId 时 + // totalArea 会算成全系统所有仓库库区面积之和(如 6168),导致导出面积/日租率错误。 + // 这里自行按 (业务日期 + 仓库) 维度计算,保证多仓库导出时每个仓库的面积/日租率正确。 - // ===== 2. 用副本查明细,避免被上面改过的 DO 影响 ===== + // ===== 1. 查全部明细(用副本 DO,避免影响外部)===== ShipperLeaseDetailsDO detailDO = new ShipperLeaseDetailsDO(); BeanUtils.copyProperties(shipperLeaseDetailsDO, detailDO); List detailList = shipperLeaseDetailsService.queryList(detailDO); - - // ===== 3. 出租率按 (业务日期 + 仓库ID) 建映射,方便明细行查汇总 ===== - SimpleDateFormat keySdf = new SimpleDateFormat("yyyy-MM-dd"); - Map rateMap = new HashMap<>(); - for (WarehouseOccupancyRate r : rateList) { - String key = (r.getBusinessDate() == null ? "" : keySdf.format(r.getBusinessDate())) - + "_" + r.getWarehouseId(); - rateMap.put(key, r); + if (detailList == null) { + detailList = new ArrayList<>(); } - // ===== 4. 明细为主,每行拼上对应仓库当天的汇总 ===== + // ===== 2. 预算每个仓库的总面积(启用库区的 storageRegion 累加),建 warehouseId -> totalArea 映射 ===== + Set warehouseIds = detailList.stream() + .map(ShipperLeaseDetailsPO::getWarehouseId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + Map warehouseTotalAreaMap = new HashMap<>(); + for (Long wid : warehouseIds) { + StorageSectionDO storageSectionDO = new StorageSectionDO(); + storageSectionDO.setWarehouseId(wid); + storageSectionDO.setOpeningUp(1); + List sections = storageSectionApplicationService.queryList(storageSectionDO); + BigDecimal area = BigDecimal.ZERO; + for (StorageSectionPO s : sections) { + area = area.add(s.getStorageRegion() == null ? BigDecimal.ZERO : s.getStorageRegion()); + } + warehouseTotalAreaMap.put(wid, area); + } + + // ===== 3. 按 (业务日期 + 仓库ID) 聚合,算每个仓库当天的整租/散租面积 ===== + // summaryMap: key -> [整租面积, 散租面积] + SimpleDateFormat keySdf = new SimpleDateFormat("yyyy-MM-dd"); + Map summaryMap = new HashMap<>(); + for (ShipperLeaseDetailsPO d : detailList) { + String key = (d.getBusinessDate() == null ? "" : keySdf.format(d.getBusinessDate())) + + "_" + d.getWarehouseId(); + BigDecimal[] arr = summaryMap.computeIfAbsent(key, k -> new BigDecimal[]{BigDecimal.ZERO, BigDecimal.ZERO}); + BigDecimal leaseArea = d.getLeaseArea() == null ? BigDecimal.ZERO : d.getLeaseArea(); + if ("整租".equals(d.getLeaseType())) { + arr[0] = arr[0].add(leaseArea); + } else { + arr[1] = arr[1].add(leaseArea); + } + } + + // ===== 4. 明细为主,每行拼上对应仓库当天的汇总(总面积/日租率按仓库单独算)===== List exportList = new ArrayList<>(); for (ShipperLeaseDetailsPO d : detailList) { WarehouseLeaseExportVO vo = new WarehouseLeaseExportVO(); @@ -536,20 +565,27 @@ public class LeaseApplicationService { vo.setCargoOwnerName(d.getCargoOwnerName()); vo.setLeaseType(d.getLeaseType()); vo.setLeaseArea(d.getLeaseArea()); - // 汇总列(从映射取,找不到就留空) + // 汇总列 String key = (d.getBusinessDate() == null ? "" : keySdf.format(d.getBusinessDate())) + "_" + d.getWarehouseId(); - WarehouseOccupancyRate r = rateMap.get(key); - if (r != null) { - vo.setEntireLeaseArea(r.getEntireLeaseArea()); - vo.setFractionalLeaseArea(r.getFractionalLeaseArea()); - vo.setTotalArea(r.getTotalArea()); - vo.setDailyRentalRate(r.getDailyRentalRate()); - } + BigDecimal[] arr = summaryMap.get(key); + BigDecimal entireLeaseArea = (arr != null) ? arr[0] : BigDecimal.ZERO; + BigDecimal fractionalLeaseArea = (arr != null) ? arr[1] : BigDecimal.ZERO; + vo.setEntireLeaseArea(entireLeaseArea); + vo.setFractionalLeaseArea(fractionalLeaseArea); + // 该仓库的总面积(按仓库单独算,不再用全局总和) + BigDecimal widTotalArea = warehouseTotalAreaMap.getOrDefault(d.getWarehouseId(), BigDecimal.ZERO); + vo.setTotalArea(widTotalArea); + // 日租率 = (整租+散租) / 总面积 × 100,保留2位小数(直接输出百分比值,如 10.00) + BigDecimal leaseSum = entireLeaseArea.add(fractionalLeaseArea); + BigDecimal dailyRate = widTotalArea.compareTo(BigDecimal.ZERO) == 0 + ? BigDecimal.ZERO + : leaseSum.multiply(new BigDecimal("100")).divide(widTotalArea, 2, BigDecimal.ROUND_HALF_UP); + vo.setDailyRentalRate(dailyRate); exportList.add(vo); } - // ===== 5. 按业务日期降序排序(null 排最后)===== + // ===== 5. 按业务日期降序、仓库名升序排序(null 排最后)===== exportList.sort(Comparator .comparing(WarehouseLeaseExportVO::getBusinessDate, Comparator.nullsLast(Comparator.reverseOrder())) .thenComparing(WarehouseLeaseExportVO::getWarehouseName, Comparator.nullsLast(Comparator.naturalOrder()))); From c80e4b3ca3a35c0051ab6929f3ddf185c022822b Mon Sep 17 00:00:00 2001 From: zhaoqing <3160641494@qq.com> Date: Thu, 13 Aug 2026 18:08:49 +0800 Subject: [PATCH 21/37] =?UTF-8?q?fix(wms):=E5=B0=BA=E5=AF=B8=E8=B5=8B?= =?UTF-8?q?=E5=80=BC=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StockReceiptOrderApplicationService.java | 1 + .../persistence/ReceiptMaterialDetailImpl.java | 10 ++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java index e90b63607..1dd52dac3 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java @@ -2915,6 +2915,7 @@ public class StockReceiptOrderApplicationService { returnReceiptMaterialDetailDO.setTotalGrossWeight(receiptMaterialDetailDO.getTotalGrossWeight()); returnReceiptMaterialDetailDO.setTotalVolume(receiptMaterialDetailDO.getTotalVolume()); returnReceiptMaterialDetailDO.setTotalArea(receiptMaterialDetailDO.getTotalArea()); + returnReceiptMaterialDetailDO.setDimensions(receiptMaterialDetailDO.getDimensions()); BigDecimal parentRetAlreadyQty = receiptMaterialDetailDO.getAlreadyReceiptQuantity() != null ? receiptMaterialDetailDO.getAlreadyReceiptQuantity() : BigDecimal.ZERO; returnReceiptMaterialDetailDO.setAlreadyReceiptQuantity(parentRetAlreadyQty); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java index ae0bfd10f..78ad82483 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java @@ -660,14 +660,14 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl receiptMaterialDetailList) { if (CollectionUtils.isEmpty(receiptMaterialDetailList)) { return; } - // 列名组合 -> materialDetailId 列表(total_volume / total_area / 两者) + // 列名组合 -> materialDetailId 列表(total_volume / total_area / dimensions / 任意组合) Map> columnsToIds = new HashMap<>(); for (ReceiptMaterialDetail detail : receiptMaterialDetailList) { if (detail == null || detail.getMaterialDetailId() == null) { @@ -683,6 +683,12 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl 0) { + columns.append(","); + } + columns.append("dimensions"); + } if (columns.length() == 0) { continue; } From 63dcfaf028e42f168be990a994edc491b8ae1a05 Mon Sep 17 00:00:00 2001 From: zhaoqing <3160641494@qq.com> Date: Fri, 14 Aug 2026 09:39:41 +0800 Subject: [PATCH 22/37] =?UTF-8?q?fix(wms):=E5=A4=8D=E5=88=B6=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/StockInOrderDomainService.java | 48 +++++++++++++++ .../service/StockOutOrderDomainService.java | 59 +++++++++++++++++++ 2 files changed, 107 insertions(+) diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java index 05a15484b..bfdc6b5c2 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java @@ -178,6 +178,51 @@ public class StockInOrderDomainService { return maxSeq; } + /** + * 新增入库单(含复制新建)时重置单据生命周期状态 + * + *

前端「复制」入库单是取原单详情(getInfo)后按新单提交(/edit 不带 inOrderId), + * 若原单已审核,审核状态等字段会被原样带入新单,导致新单状态是「已创建」但审核时提示「已审核」等问题。 + * 此处统一重置,保证新单从初始态开始。

+ */ + private void resetNewOrderState(StockInOrderDO stockInOrderDO) { + //单据状态回到已创建 + stockInOrderDO.setStatus(1); + //审核状态回到未审核,清空审核信息 + stockInOrderDO.setAuditStatus(1); + stockInOrderDO.setAuditRemark(null); + stockInOrderDO.setAuditBy(null); + stockInOrderDO.setAuditByName(null); + stockInOrderDO.setAuditTime(null); + //取消/关闭复位 + stockInOrderDO.setCancelOrder(2); + stockInOrderDO.setCancelRemark(null); + stockInOrderDO.setCancelBy(null); + stockInOrderDO.setCancelByName(null); + stockInOrderDO.setCancelTime(null); + stockInOrderDO.setCloseOrder(2); + stockInOrderDO.setCloseRemark(null); + stockInOrderDO.setCloseBy(null); + stockInOrderDO.setCloseByName(null); + stockInOrderDO.setCloseTime(null); + //推送状态复位 + stockInOrderDO.setPushStatus(1); + stockInOrderDO.setPushTime(null); + stockInOrderDO.setPushBy(null); + stockInOrderDO.setPushByName(null); + //作业任务复位 + stockInOrderDO.setWorkUserId(null); + stockInOrderDO.setWorkUserName(null); + stockInOrderDO.setWorkTaskReceiveStatus(null); + stockInOrderDO.setTaskIssueUserId(null); + //签名状态复位 + stockInOrderDO.setSignatureStatus(null); + stockInOrderDO.setSignatureTime(null); + stockInOrderDO.setSignaturePic(null); + stockInOrderDO.setEvidencePics(null); + stockInOrderDO.setSignatureRemark(null); + } + /** * 新增入库单 @@ -186,6 +231,9 @@ public class StockInOrderDomainService { public Boolean insert(StockInOrderDO stockInOrderDO) { // stockInOrderDO.setInOrderNumber(OrderSequence.getOrderCode("RK")); + //新增单必须从「已创建/未审核」初始态开始(复制新建时原单状态不能带入新单) + resetNewOrderState(stockInOrderDO); + //设置入库单号 Long warehouseId = stockInOrderDO.getWarehouseId(); AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoByWarehouseId(warehouseId); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java index 427055070..4de4955b9 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java @@ -231,6 +231,62 @@ public class StockOutOrderDomainService { return maxSeq; } + /** + * 新增出库单(含复制新建)时重置单据生命周期状态 + * + *

前端「复制」出库单是取原单详情(getInfo)后按新单提交(/edit 不带 outOrderId), + * 若原单已审核/已分配/已出库,审核状态、分配数量、复核/推送/作业任务等字段会被原样带入新单, + * 导致新单状态是「已创建」但审核时提示「已审核」等问题。此处统一重置,保证新单从初始态开始。

+ */ + private void resetNewOrderState(StockOutOrderDO stockOutOrderDO) { + //单据状态回到已创建 + stockOutOrderDO.setStatus(1); + //审核状态回到未审核,清空审核信息 + stockOutOrderDO.setAuditStatus(1); + stockOutOrderDO.setAuditRemark(null); + stockOutOrderDO.setAuditBy(null); + stockOutOrderDO.setAuditByName(null); + stockOutOrderDO.setAuditTime(null); + //清空分配/拣货/复核数量,等待重新分配产生 + stockOutOrderDO.setAllocationQuantity(BigDecimal.ZERO); + stockOutOrderDO.setAlreadyAllocationQuantity(BigDecimal.ZERO); + stockOutOrderDO.setPickingQuantity(BigDecimal.ZERO); + stockOutOrderDO.setCheckQuantity(BigDecimal.ZERO); + //复核状态复位 + stockOutOrderDO.setCheckStatus(1); + stockOutOrderDO.setCheckTaskDistribution(2); + stockOutOrderDO.setCheckTaskDistributionTime(null); + stockOutOrderDO.setCheckOperatorsBy(null); + stockOutOrderDO.setCheckOperatorsName(null); + //推送状态复位 + stockOutOrderDO.setPushStatus(1); + stockOutOrderDO.setPushTime(null); + stockOutOrderDO.setPushBy(null); + stockOutOrderDO.setPushByName(null); + //取消/关闭复位 + stockOutOrderDO.setCancelOrder(2); + stockOutOrderDO.setCancelRemark(null); + stockOutOrderDO.setCancelBy(null); + stockOutOrderDO.setCancelByName(null); + stockOutOrderDO.setCancelTime(null); + stockOutOrderDO.setCloseOrder(2); + stockOutOrderDO.setCloseRemark(null); + stockOutOrderDO.setCloseBy(null); + stockOutOrderDO.setCloseByName(null); + stockOutOrderDO.setCloseTime(null); + //作业任务复位 + stockOutOrderDO.setWorkUserId(null); + stockOutOrderDO.setWorkUserName(null); + stockOutOrderDO.setWorkTaskReceiveStatus(null); + stockOutOrderDO.setTaskIssueUserId(null); + //签名状态复位 + stockOutOrderDO.setSignatureStatus(null); + stockOutOrderDO.setSignatureTime(null); + stockOutOrderDO.setSignaturePic(null); + stockOutOrderDO.setEvidencePics(null); + stockOutOrderDO.setSignatureRemark(null); + } + /** * 新增出库单 @@ -239,6 +295,9 @@ public class StockOutOrderDomainService { public Boolean insert(StockOutOrderDO stockOutOrderDO) { // stockOutOrderDO.setOutOrderNumber(OrderSequence.getOrderCode("CK")); + //新增单必须从「已创建/未审核」初始态开始(复制新建时原单状态不能带入新单) + resetNewOrderState(stockOutOrderDO); + //设置单号 Long warehouseId = stockOutOrderDO.getWarehouseId(); AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoByWarehouseId(warehouseId); From 6a87c5a75a2b1f2a16369784d4ef7386321462f0 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Fri, 14 Aug 2026 11:02:18 +0800 Subject: [PATCH 23/37] =?UTF-8?q?fix(oms):=20=E9=A2=84=E7=BA=A6=E5=85=A5?= =?UTF-8?q?=E5=BA=93=E5=8D=95=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3=E8=A1=A5?= =?UTF-8?q?=E5=85=85=E7=94=B3=E6=8A=A5=E6=95=B0=E9=87=8F=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit reservationStockInOrderApi/list 返回缺少申报数量,原因为查询只查主表、 未关联明细表汇总,且返回对象无对应字段 - ReservationStockInOrderPO 新增 declaredQuantity 字段 - StockInOrderResult resultMap 增加 declaredQuantity 映射 - selectStockInOrderPo 片段增加 reservation_in_material_detail 的 DECLARED_QUANTITY 汇总子查询(按 level=1 过滤主明细行) --- .../repository/po/ReservationStockInOrderPO.java | 7 +++++++ .../ReservationStockInOrderMapper.xml | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/po/ReservationStockInOrderPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/po/ReservationStockInOrderPO.java index 0fbd2e06a..9f3e61c01 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/po/ReservationStockInOrderPO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/po/ReservationStockInOrderPO.java @@ -163,6 +163,13 @@ public class ReservationStockInOrderPO extends BaseVOEntity { @Excel(name = "入库数量") private BigDecimal inQuantity; + /** + * 申报数量:入库单明细中申报数量(DECLARED_QUANTITY)汇总 + */ + @ApiModelProperty("申报数量") + @Excel(name = "申报数量") + private BigDecimal declaredQuantity; + /** * 计划入库数量:取入库单明细中的入库数量汇总 */ diff --git a/mhd_oms/src/main/resources/mapper/reservationStockInOrder/ReservationStockInOrderMapper.xml b/mhd_oms/src/main/resources/mapper/reservationStockInOrder/ReservationStockInOrderMapper.xml index dd5b3f7cf..e1e55aa0f 100644 --- a/mhd_oms/src/main/resources/mapper/reservationStockInOrder/ReservationStockInOrderMapper.xml +++ b/mhd_oms/src/main/resources/mapper/reservationStockInOrder/ReservationStockInOrderMapper.xml @@ -33,6 +33,7 @@ + @@ -136,6 +137,13 @@ + -- 申报数量:入库单明细表 reservation_in_material_detail 的 DECLARED_QUANTITY 汇总 + (select ifnull(sum(imd.declared_quantity), 0) + from reservation_in_material_detail imd + where imd.in_order_number = a.in_order_number + and imd.del_flag = 1 + and (imd.level is null or imd.level = 1) + ) as declared_quantity, a.weight_limit, a.volume_limit, a.cancel_order, a.cancel_remark, a.cancel_by,a.PICTURE_URL, a.cancel_by_name, a.cancel_time, a.close_order, a.close_remark, a.close_by, a.close_by_name, a.close_time, a.remark, a.create_time, a.create_by, a.create_by_name, a.update_time, a.update_by, a.update_by_name, a.del_flag, a.over_stock_id, a.over_stock_status, a.over_stock_type, From e5fea5046658957eccf52d8e13fe81a9cb291f05 Mon Sep 17 00:00:00 2001 From: zhaoqing <3160641494@qq.com> Date: Fri, 14 Aug 2026 11:36:08 +0800 Subject: [PATCH 24/37] =?UTF-8?q?fix(wms):=E4=BF=AE=E6=94=B9=E5=AF=BC?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stockInOrder/StockInOrderApplicationService.java | 10 ++++++---- .../stockOutOrder/StockOutOrderApplicationService.java | 10 ++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java index 62294a361..99e6dc2b8 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java @@ -259,8 +259,10 @@ public class StockInOrderApplicationService { .forEach(a -> invoiceNoByNum.merge(a.getInOrderNumber(), a.getInvoiceNo().trim(), (o, n) -> o + "," + n)); // 导出场景(needDetail=true):批量取出完整明细树(level=1 父行 + children),按入库单号分组挂到列表 + // 注释掉 needDetail 判断:列表/导出统一返回明细 Map> detailByNum = Collections.emptyMap(); - if (Boolean.TRUE.equals(stockInOrderDO.getNeedDetail()) && !CollectionUtils.isEmpty(inOrderNumbers)) { + // if (Boolean.TRUE.equals(stockInOrderDO.getNeedDetail()) && !CollectionUtils.isEmpty(inOrderNumbers)) { + if (!CollectionUtils.isEmpty(inOrderNumbers)) { InMaterialDetailDO detailQuery = new InMaterialDetailDO(); detailQuery.setInOrderNumberList(inOrderNumbers); List detailTreeList = inMaterialDetailService.queryListChildren(detailQuery); @@ -272,9 +274,9 @@ public class StockInOrderApplicationService { if (invoiceNoByNum.containsKey(stockInOrderPO.getInOrderNumber())) { stockInOrderPO.setInvoiceNo(invoiceNoByNum.get(stockInOrderPO.getInOrderNumber())); } - if (Boolean.TRUE.equals(stockInOrderDO.getNeedDetail())) { - stockInOrderPO.setMaterialDetailList(detailByNum.getOrDefault(stockInOrderPO.getInOrderNumber(), Collections.emptyList())); - } + // if (Boolean.TRUE.equals(stockInOrderDO.getNeedDetail())) { + stockInOrderPO.setMaterialDetailList(detailByNum.getOrDefault(stockInOrderPO.getInOrderNumber(), Collections.emptyList())); + // } Long inOrderId = stockInOrderPO.getInOrderId(); List list = receiptOrderAccountService.list(new LambdaQueryWrapper().eq(ReceiptOrderAccount::getOrderId, inOrderId).eq(ReceiptOrderAccount::getInOrOut, "in")); stockInOrderPO.setReceiptOrderAccountList(list); diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java index f3b4cda24..8762d34b0 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java @@ -261,8 +261,10 @@ public class StockOutOrderApplicationService { .forEach(a -> invoiceNoByNum.merge(a.getOutOrderNumber(), a.getInvoiceNo().trim(), (o, n) -> o + "," + n)); // 导出场景(needDetail=true):批量取出完整明细树(level=1 父行 + children),按出库单号分组挂到列表 + // 注释掉 needDetail 判断:列表/导出统一返回明细 Map> detailByNum = Collections.emptyMap(); - if (Boolean.TRUE.equals(stockOutOrderDO.getNeedDetail()) && !CollectionUtils.isEmpty(outOrderNumbers)) { + // if (Boolean.TRUE.equals(stockOutOrderDO.getNeedDetail()) && !CollectionUtils.isEmpty(outOrderNumbers)) { + if (!CollectionUtils.isEmpty(outOrderNumbers)) { OutMaterialDetailDO detailQuery = new OutMaterialDetailDO(); detailQuery.setOutOrderNumberList(outOrderNumbers); List detailTreeList = outMaterialDetailService.queryListChildren(detailQuery); @@ -276,9 +278,9 @@ public class StockOutOrderApplicationService { if (invoiceNoByNum.containsKey(outOrderNumber)) { stockOutOrderPO.setInvoiceNo(invoiceNoByNum.get(outOrderNumber)); } - if (Boolean.TRUE.equals(stockOutOrderDO.getNeedDetail())) { - stockOutOrderPO.setMaterialDetailList(detailByNum.getOrDefault(outOrderNumber, Collections.emptyList())); - } + // if (Boolean.TRUE.equals(stockOutOrderDO.getNeedDetail())) { + stockOutOrderPO.setMaterialDetailList(detailByNum.getOrDefault(outOrderNumber, Collections.emptyList())); + // } List list = deliveryDetailsLinkService.list(new LambdaQueryWrapper().eq(DeliveryDetailsLink::getOrderNumber, outOrderNumber)); stockOutOrderPO.setDeliveryDetailsLinkList(list); From 061c5bc600df76ffc0c09e45094b3b00e105baf9 Mon Sep 17 00:00:00 2001 From: zhaoqing <3160641494@qq.com> Date: Fri, 14 Aug 2026 14:08:41 +0800 Subject: [PATCH 25/37] =?UTF-8?q?fix(wms):=E5=87=BA=E5=85=A5=E5=BA=93?= =?UTF-8?q?=E5=A4=8D=E5=88=B6=E6=96=B0=E5=A2=9E=E6=97=B6=E6=B8=85=E7=A9=BA?= =?UTF-8?q?=E6=95=B0=E9=87=8F=E7=9B=B8=E5=85=B3=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/StockInOrderDomainService.java | 10 ++++++++++ .../service/StockOutOrderDomainService.java | 13 +++++++++++++ 2 files changed, 23 insertions(+) diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java index bfdc6b5c2..75f4b8cbb 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java @@ -280,6 +280,16 @@ public class StockInOrderDomainService { // //统计总体积 // BigDecimal volumeLimit = stockInOrderDO.getMaterialDetailList().stream().map(InMaterialDetailDO::getVolumeLimit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); // stockInOrderDO.setVolumeLimit(volumeLimit); + //复制新建时原单明细的收货数量、上架数量、作业数量等执行数据不能带入新单,统一清空 + if (!CollectionUtils.isEmpty(stockInOrderDO.getMaterialDetailList())) { + stockInOrderDO.getMaterialDetailList().forEach(detail -> { + if (detail != null) { + detail.setReceiptQuantity(null); + detail.setShelvesQuantity(null); + detail.setActualQuantity(null); + } + }); + } stockInOrderService.insert(stockInOrderDO); return materialDetailService.batchInsert(stockInOrderDO.getInOrderNumber(), stockInOrderDO.getMaterialDetailList()); } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java index 4de4955b9..3d431a636 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java @@ -349,6 +349,19 @@ public class StockOutOrderDomainService { if (stockOutOrderDO.getCheckTaskDistribution() == null) { stockOutOrderDO.setCheckTaskDistribution(2); } + //复制新建时原单明细的库存数量、分配数量、拣货/复核数量等执行数据不能带入新单,统一清空 + if (!CollectionUtils.isEmpty(stockOutOrderDO.getMaterialDetailList())) { + stockOutOrderDO.getMaterialDetailList().forEach(detail -> { + if (detail != null) { + detail.setInventoryQuantity(null); + detail.setAllocationQuantity(null); + detail.setAlreadyAllocationQuantity(null); + detail.setPickingQuantity(null); + detail.setCheckQuantity(null); + detail.setActualQuantity(null); + } + }); + } stockOutOrderService.insert(stockOutOrderDO); return outMaterialDetailService.batchInsert(stockOutOrderDO.getOutOrderNumber(), stockOutOrderDO.getMaterialDetailList()); } From 5c472ad04e6547237ab27a1ecf4b78722a4a468d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=A5=8E=E5=85=B4?= <2220574228@qq.com> Date: Fri, 14 Aug 2026 14:39:20 +0800 Subject: [PATCH 26/37] =?UTF-8?q?=E5=88=86=E9=85=8D=E9=80=BB=E8=BE=91;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/persistence/OutMaterialDetailImpl.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/persistence/OutMaterialDetailImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/persistence/OutMaterialDetailImpl.java index e1b93136d..ec551a253 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/persistence/OutMaterialDetailImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/persistence/OutMaterialDetailImpl.java @@ -400,7 +400,7 @@ public class OutMaterialDetailImpl extends ServiceImpl stockOutOrderList = stockOutOrderMapper.selectList(new QueryWrapper().lambda() .eq(StockOutOrder::getOutOrderNumber, outOrderNumber) .eq(StockOutOrder::getDelFlag, 1)); - if (!CollectionUtils.isEmpty(stockOutOrderList) && "yang_pin_chu_ku".equals(stockOutOrderList.get(0).getBusinessType())) { + if (!CollectionUtils.isEmpty(stockOutOrderList) && !"yang_pin_chu_ku".equals(stockOutOrderList.get(0).getBusinessType())) { xgkc(outMaterialDetailList,outOrderNumber,loginUser); } //保存物料明细信息 @@ -535,7 +535,7 @@ public class OutMaterialDetailImpl extends ServiceImpl stockOutOrderList = stockOutOrderMapper.selectList(new QueryWrapper().lambda() .eq(StockOutOrder::getOutOrderNumber, outOrderNumber) .eq(StockOutOrder::getDelFlag, 1)); - if (!CollectionUtils.isEmpty(stockOutOrderList) && "yang_pin_chu_ku".equals(stockOutOrderList.get(0).getBusinessType())) { + if (!CollectionUtils.isEmpty(stockOutOrderList) && !"yang_pin_chu_ku".equals(stockOutOrderList.get(0).getBusinessType())) { qxfp(outMaterialDetailDOList,outOrderNumber,loginUser); } @@ -979,7 +979,7 @@ public class OutMaterialDetailImpl extends ServiceImpl stockOutOrderList = stockOutOrderMapper.selectList(new QueryWrapper().lambda() .eq(StockOutOrder::getOutOrderNumber, outOrderNumber) .eq(StockOutOrder::getDelFlag, 1)); - if (!CollectionUtils.isEmpty(stockOutOrderList) && "yang_pin_chu_ku".equals(stockOutOrderList.get(0).getBusinessType())) { + if (!CollectionUtils.isEmpty(stockOutOrderList) && !"yang_pin_chu_ku".equals(stockOutOrderList.get(0).getBusinessType())) { qxfp(outMaterialDetailDOList,outOrderNumber,loginUser); } @@ -1088,7 +1088,7 @@ public class OutMaterialDetailImpl extends ServiceImpl stockOutOrderList = stockOutOrderMapper.selectList(new QueryWrapper().lambda() .eq(StockOutOrder::getOutOrderNumber, outOrderNumber) .eq(StockOutOrder::getDelFlag, 1)); - if (!CollectionUtils.isEmpty(stockOutOrderList) && "yang_pin_chu_ku".equals(stockOutOrderList.get(0).getBusinessType())) { + if (!CollectionUtils.isEmpty(stockOutOrderList) && !"yang_pin_chu_ku".equals(stockOutOrderList.get(0).getBusinessType())) { childrenqxfp(children,outOrderNumber,loginUser); } } From 5963f6ed3a4ff188ac175a58809fb66af4e23773 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Fri, 14 Aug 2026 14:49:13 +0800 Subject: [PATCH 27/37] =?UTF-8?q?fix(oms)=20:=20=E8=BF=90=E8=BE=93?= =?UTF-8?q?=E7=AE=A1=E7=90=86=20-=20=E8=BF=90=E8=BE=93=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E5=8D=95=20-=20=E5=8F=8D=E5=AE=A1=E6=A0=B8=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=20=EF=BC=9A=20=E4=BC=98=E5=8C=96=E5=BC=82=E5=B8=B8=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/persistence/BusinessDocumentOrderImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/repository/persistence/BusinessDocumentOrderImpl.java b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/repository/persistence/BusinessDocumentOrderImpl.java index 44f7ac880..4b5f43efa 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/repository/persistence/BusinessDocumentOrderImpl.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/repository/persistence/BusinessDocumentOrderImpl.java @@ -323,7 +323,7 @@ public class BusinessDocumentOrderImpl extends ServiceImpl Date: Fri, 14 Aug 2026 15:30:04 +0800 Subject: [PATCH 28/37] =?UTF-8?q?=E5=8F=91=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/mhd/system/api/BmsServiceFeign.java | 2 +- .../src/main/java/com/mhd/system/api/OmsServiceFeign.java | 2 +- .../main/java/com/mhd/system/api/WlhyServiceFeign.java | 2 +- .../src/main/java/com/mhd/system/api/WmsServiceFeign.java | 2 +- .../src/main/java/com/mhd/system/api/YmsServiceFeign.java | 2 +- mhd-modules/mhd-system/src/main/resources/bootstrap.yml | 8 ++++---- mhd_oms/src/main/resources/bootstrap.yml | 8 ++++---- mhd_wms/src/main/resources/bootstrap.yml | 8 ++++---- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/BmsServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/BmsServiceFeign.java index 8cc8bfd57..91f2f8a11 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/BmsServiceFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/BmsServiceFeign.java @@ -18,7 +18,7 @@ import java.util.Set; /** * bms财务结算系统feign调用接口 */ -@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.32:8019",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.33.0.109:8019",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) public interface BmsServiceFeign { diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java index 8ef01baad..916c79df0 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; import java.util.List; import java.util.concurrent.CompletableFuture; -@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.33:8017", fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE, url = "http://10.33.0.99:8017",fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) public interface OmsServiceFeign { diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java index d976fcc98..ba9a45148 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java @@ -26,7 +26,7 @@ import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; -@FeignClient(contextId = "commonWlhyServiceFeign",value = ServiceNameConstants.WLHY_SERVICE,url = "http://10.102.192.31:8014",configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "commonWlhyServiceFeign",value = ServiceNameConstants.WLHY_SERVICE,url = "http://10.33.0.129:8014",configuration = FeignAutoConfiguration.class) public interface WlhyServiceFeign { /** diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WmsServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WmsServiceFeign.java index 28bee652c..1af737bf0 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WmsServiceFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WmsServiceFeign.java @@ -21,7 +21,7 @@ import java.util.Map; * @description: TODO * @date 2024/5/10 8:58 **/ -@FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE, url = "http://10.102.192.32:8016", fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE, url = "http://10.33.0.109:8016",fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class) public interface WmsServiceFeign { /** diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/YmsServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/YmsServiceFeign.java index 238ec5f81..beba5b1af 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/YmsServiceFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/YmsServiceFeign.java @@ -9,7 +9,7 @@ import com.mhd.system.api.feign.FeignAutoConfiguration; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; -@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,fallbackFactory = RemoteBmsFeignFallbackFactory.class,url = "http://10.102.192.33:8018", configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,url = "http://10.33.0.99:8018",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) public interface YmsServiceFeign { /** diff --git a/mhd-modules/mhd-system/src/main/resources/bootstrap.yml b/mhd-modules/mhd-system/src/main/resources/bootstrap.yml index aa660b126..58c770a17 100644 --- a/mhd-modules/mhd-system/src/main/resources/bootstrap.yml +++ b/mhd-modules/mhd-system/src/main/resources/bootstrap.yml @@ -14,18 +14,18 @@ spring: nacos: discovery: # server-addr: 127.0.0.1:8848 -# server-addr: 10.33.0.129:6010 + server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.30:6848 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 # server-addr: 10.102.192.105:6848 config: # server-addr: 127.0.0.1:8848 -# server-addr: 10.33.0.129:6010 + server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.30:6848 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 diff --git a/mhd_oms/src/main/resources/bootstrap.yml b/mhd_oms/src/main/resources/bootstrap.yml index ee058f0f6..88471e390 100644 --- a/mhd_oms/src/main/resources/bootstrap.yml +++ b/mhd_oms/src/main/resources/bootstrap.yml @@ -18,15 +18,15 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 -# server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 + server-addr: 10.33.0.129:6010 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 -# server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 + server-addr: 10.33.0.129:6010 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 diff --git a/mhd_wms/src/main/resources/bootstrap.yml b/mhd_wms/src/main/resources/bootstrap.yml index fc7380c20..39eb710cb 100644 --- a/mhd_wms/src/main/resources/bootstrap.yml +++ b/mhd_wms/src/main/resources/bootstrap.yml @@ -14,18 +14,18 @@ spring: nacos: discovery: # server-addr: 127.0.0.1:8848 -# server-addr: 10.33.0.129:6010 + server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.30:6848 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 # server-addr: 10.102.192.105:6848 config: # server-addr: 127.0.0.1:8848 -# server-addr: 10.33.0.129:6010 + server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.30:6848 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 From ac349ea8a860efc3557a13b1db91b266d05599c8 Mon Sep 17 00:00:00 2001 From: zhaoqing <3160641494@qq.com> Date: Fri, 14 Aug 2026 15:55:28 +0800 Subject: [PATCH 29/37] =?UTF-8?q?fix(wms):=E5=87=BA=E5=85=A5=E5=BA=93?= =?UTF-8?q?=E5=A4=8D=E5=88=B6=E6=96=B0=E5=A2=9E=E6=97=B6=E6=B8=85=E7=A9=BA?= =?UTF-8?q?=E6=95=B0=E9=87=8F=E7=9B=B8=E5=85=B3=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/StockOutOrderDomainService.java | 166 ++++++++++++++++-- 1 file changed, 154 insertions(+), 12 deletions(-) diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java index 3d431a636..ac4c1cd4e 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java @@ -285,6 +285,159 @@ public class StockOutOrderDomainService { stockOutOrderDO.setSignaturePic(null); stockOutOrderDO.setEvidencePics(null); stockOutOrderDO.setSignatureRemark(null); + //复制新增时原单的衍生业务/流程字段不能带入新单(新增时前端不传,保持初始值) + //注意:组织/创建人/货主/客户等由 Assembler 与 App 层重新赋值,不在本处清理 + stockOutOrderDO.setOutOrderId(null); + stockOutOrderDO.setNoticeNumber(null); + stockOutOrderDO.setExpectTime(null); + stockOutOrderDO.setSupplyChainNumber(null); + stockOutOrderDO.setPriorityLevelCode(null); + stockOutOrderDO.setPriorityLevelName(null); + stockOutOrderDO.setDirectWarehouse(null); + stockOutOrderDO.setReview(null); + stockOutOrderDO.setAnnexUrl(null); + stockOutOrderDO.setWeightLimit(null); + stockOutOrderDO.setVolumeLimit(null); + stockOutOrderDO.setMobilizeCode(null); + stockOutOrderDO.setTransportModeCode(null); + stockOutOrderDO.setSupervisionModeCode(null); + stockOutOrderDO.setContainerNoName(null); + stockOutOrderDO.setDocumentCreator(null); + stockOutOrderDO.setDocumentCreatorName(null); + stockOutOrderDO.setDocumentDate(null); + stockOutOrderDO.setCarrierName(null); + stockOutOrderDO.setBillingJson(null); + stockOutOrderDO.setReceiptOrderAccountList(null); + stockOutOrderDO.setReturnQuantity(null); + stockOutOrderDO.setTrainNo(null); + } + + /** + * 新增出库单(含复制新建)时重置明细的「执行态」字段 + * + *

前端「复制」出库单是把原单详情(getInfo)整体提交到新增接口,明细会带出原单的 + * 主键、已分配库存/批次/库区库位/容器、拣货复核数量、抄码重量、收费等执行数据。 + * 规则:只清空「复制时额外多传」的字段(新增时前端不传的),让新单与直接新增行为一致; + * 新增时前端会传的业务属性(料号、规格、申报要素、报关字段、备注、出库数量等)保留不清理。 + * 明细的组织/创建人/计划数量等由 batchInsert 按当前登录人重新赋值,清理后即恢复初始态。

+ */ + private void resetNewOrderDetailState(List detailList) { + if (CollectionUtils.isEmpty(detailList)) { + return; + } + detailList.forEach(detail -> { + if (detail == null) { + return; + } + //主键与唯一键:重新生成,避免与原单重复/冲突 + detail.setMaterialDetailId(null); + detail.setUniqueId(null); + detail.setOutOrderNumber(null); + //单据组织、审计字段:由 batchInsert 按当前登录人重新赋值 + detail.setOrganizationId(null); + detail.setOrganizationName(null); + detail.setTopOrganizationId(null); + detail.setCreateBy(null); + detail.setCreateByName(null); + detail.setCreateTime(null); + detail.setUpdateBy(null); + detail.setUpdateByName(null); + detail.setUpdateTime(null); + detail.setDelFlag(null); + //计划数量:由 batchInsert 按出库数量重新计算 + detail.setQuantity(null); + //执行数量 + detail.setInventoryQuantity(null); + detail.setAllocationQuantity(null); + detail.setAlreadyAllocationQuantity(null); + detail.setNowAllocationQuantity(null); + detail.setPickingQuantity(null); + detail.setCheckQuantity(null); + detail.setActualQuantity(null); + //重量/体积限制 + detail.setWeightLimit(null); + detail.setVolumeLimit(null); + //物料基础信息(batchInsert 会按主数据重填条码/商品名称等) + detail.setMaterialCode(null); + detail.setMaterialName(null); + detail.setBarCode(null); + detail.setCommodityName(null); + detail.setCommodityNo(null); + //包装/单位 + detail.setPackId(null); + detail.setPackCode(null); + detail.setPackName(null); + detail.setPackDetailId(null); + detail.setUnitCode(null); + detail.setUnitName(null); + detail.setUnitNumber(null); + detail.setMaterialWarehouseControlId(null); + detail.setSerialNumberManage(null); + //已分配库存、批次、库区/库位、容器 + detail.setWarehouseId(null); + detail.setWarehouseCode(null); + detail.setWarehouseName(null); + detail.setMaterialInventoryId(null); + detail.setBatchNumber(null); + detail.setMaterialStatusCode(null); + detail.setMaterialStatusName(null); + detail.setStorageSectionId(null); + detail.setStorageCode(null); + detail.setStorageName(null); + detail.setStorageLocationId(null); + detail.setStorageLocationCode(null); + detail.setStorageLocationName(null); + detail.setContainerId(null); + detail.setContainerCode(null); + detail.setContainerType(null); + detail.setContainerTypeName(null); + //层级结构:新单均为一级父行(子行由 batchInsert 忽略,不落库) + detail.setLevel(null); + detail.setParentUniqueId(null); + detail.setAllowModify(null); + detail.setGenPickingOrder(null); + detail.setChildren(null); + //复核重量、状态标识 + detail.setCheckNetWeight(null); + detail.setCheckGrossWeight(null); + detail.setCheckVolume(null); + detail.setCheckArea(null); + detail.setIsAllocated(null); + //抄码数据 + detail.setCopyCodeReferenceIds(null); + detail.setCopyTotalWeight(null); + detail.setOutWeight(null); + detail.setOutVolume(null); + detail.setOutQuantity(null); + //库存展示/费用/批次信息 + detail.setStockQuantity(null); + detail.setStockUnit(null); + detail.setLotNo(null); + detail.setContractFee(null); + detail.setMonthlyWarehouseFee(null); + detail.setHalfMonthWhFee(null); + detail.setDiscountRate(null); + detail.setSingleVolume(null); + detail.setSingleGrossWeight(null); + detail.setInOrderNumber(null); + detail.setProductionDate(null); + //报关推送映射字段 + detail.setLineNumGw(null); + detail.setSpecGw(null); + detail.setUnitGw(null); + detail.setQtyGw(null); + detail.setErpCurrGw(null); + detail.setErpPriceGw(null); + detail.setAmountGw(null); + detail.setInOrderNumberGw(null); + detail.setInLineNumGw(null); + detail.setOpWhLocGw(null); + detail.setWarehouseGw(null); + detail.setInvtRowGw(null); + detail.setBondInvtNoGw(null); + detail.setWhNoGw(null); + detail.setSeatNoGw(null); + }); } @@ -350,18 +503,7 @@ public class StockOutOrderDomainService { stockOutOrderDO.setCheckTaskDistribution(2); } //复制新建时原单明细的库存数量、分配数量、拣货/复核数量等执行数据不能带入新单,统一清空 - if (!CollectionUtils.isEmpty(stockOutOrderDO.getMaterialDetailList())) { - stockOutOrderDO.getMaterialDetailList().forEach(detail -> { - if (detail != null) { - detail.setInventoryQuantity(null); - detail.setAllocationQuantity(null); - detail.setAlreadyAllocationQuantity(null); - detail.setPickingQuantity(null); - detail.setCheckQuantity(null); - detail.setActualQuantity(null); - } - }); - } + resetNewOrderDetailState(stockOutOrderDO.getMaterialDetailList()); stockOutOrderService.insert(stockOutOrderDO); return outMaterialDetailService.batchInsert(stockOutOrderDO.getOutOrderNumber(), stockOutOrderDO.getMaterialDetailList()); } From a400a34b0c7c5c51ff013048faaabe2870642c38 Mon Sep 17 00:00:00 2001 From: zhaoqing <3160641494@qq.com> Date: Fri, 14 Aug 2026 16:35:29 +0800 Subject: [PATCH 30/37] =?UTF-8?q?fix(wms):=E5=87=BA=E5=85=A5=E5=BA=93?= =?UTF-8?q?=E5=A4=8D=E5=88=B6=E6=96=B0=E5=A2=9E=E6=97=B6=E6=B8=85=E7=A9=BA?= =?UTF-8?q?=E6=95=B0=E9=87=8F=E7=9B=B8=E5=85=B3=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/StockInOrderDomainService.java | 130 ++++++++++++++++-- 1 file changed, 121 insertions(+), 9 deletions(-) diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java index 75f4b8cbb..aeffc45f4 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java @@ -221,6 +221,126 @@ public class StockInOrderDomainService { stockInOrderDO.setSignaturePic(null); stockInOrderDO.setEvidencePics(null); stockInOrderDO.setSignatureRemark(null); + //复制新增时原单的衍生业务/流程字段不能带入新单(新增时前端不传,保持初始值) + //注意:组织/创建人/货主/供应商/仓库等由 Assembler 与 App 层重新赋值或单号生成依赖,不在本处清理 + stockInOrderDO.setInOrderId(null); + stockInOrderDO.setNoticeNumber(null); + stockInOrderDO.setExpectTime(null); + stockInOrderDO.setSupplyChainNumber(null); + stockInOrderDO.setPriorityLevelCode(null); + stockInOrderDO.setPriorityLevelName(null); + stockInOrderDO.setDirectWarehouse(null); + stockInOrderDO.setAnnexUrl(null); + stockInOrderDO.setWeightLimit(null); + stockInOrderDO.setVolumeLimit(null); + stockInOrderDO.setQuantity(null); + stockInOrderDO.setMobilizeCode(null); + stockInOrderDO.setBusinessOrderNo(null); + stockInOrderDO.setDocumentCreator(null); + stockInOrderDO.setDocumentCreatorName(null); + stockInOrderDO.setDocumentDate(null); + stockInOrderDO.setBillingJson(null); + stockInOrderDO.setReceiptOrderAccountList(null); + } + + /** + * 新增入库单(含复制新建)时重置明细的「执行态」字段 + * + *

前端「复制」入库单是把原单详情(getInfo)整体提交到新增接口,明细会带出原单的 + * 主键、收货/上架状态、已分配库区库位/容器、验收/质检结果、费用等执行数据。 + * 规则:只清空「复制时额外多传」的字段(新增时前端不传的),让新单与直接新增行为一致; + * 新增时前端会传的业务属性(料号、名称、规格、申报要素、报关字段、备注、入库数量等)保留不清理。 + * 明细的组织/创建人/唯一键等由 batchInsert 按当前登录人重新赋值,清理后即恢复初始态。

+ */ + private void resetNewOrderDetailState(List detailList) { + if (CollectionUtils.isEmpty(detailList)) { + return; + } + detailList.forEach(detail -> { + if (detail == null) { + return; + } + //唯一键、单号、组织、审计字段:由 batchInsert 重新生成/赋值 + detail.setUniqueId(null); + detail.setInOrderNumber(null); + detail.setOrganizationId(null); + detail.setOrganizationName(null); + detail.setTopOrganizationId(null); + detail.setCreateBy(null); + detail.setCreateByName(null); + detail.setCreateTime(null); + detail.setUpdateBy(null); + detail.setUpdateByName(null); + detail.setUpdateTime(null); + detail.setDelFlag(null); + //计划数量:由 batchInsert 按入库数量补齐 + detail.setQuantity(null); + //重量/体积限制 + detail.setWeightLimit(null); + detail.setVolumeLimit(null); + //收货/上架执行数据 + detail.setReceiptQuantity(null); + detail.setShelvesQuantity(null); + detail.setActualQuantity(null); + detail.setReceiptStatus(null); + detail.setShelvesStatus(null); + //包装/单位 + detail.setPackId(null); + detail.setPackCode(null); + detail.setPackName(null); + detail.setPackDetailId(null); + detail.setUnitCode(null); + detail.setUnitName(null); + detail.setUnitNumber(null); + detail.setMaterialWarehouseControlId(null); + detail.setSerialNumberManage(null); + detail.setBarCode(null); + //批次、仓库/库区/库位、容器 + detail.setBatchNumber(null); + detail.setMaterialStatusCode(null); + detail.setMaterialStatusName(null); + detail.setWarehouseId(null); + detail.setWarehouseCode(null); + detail.setWarehouseName(null); + detail.setStorageSectionId(null); + detail.setStorageCode(null); + detail.setStorageName(null); + detail.setStorageLocationId(null); + detail.setStorageLocationCode(null); + detail.setStorageLocationName(null); + detail.setContainerId(null); + detail.setContainerCode(null); + detail.setContainerType(null); + detail.setContainerTypeName(null); + //层级结构:新单均为一级父行(level 由 batchInsert 强制为 1) + detail.setParentUniqueId(null); + detail.setChildren(null); + //验收/质检结果 + detail.setArrivalAcceptQualified(null); + detail.setPackageDamaged(null); + detail.setIsThawWaterstain(null); + detail.setNotifyCustomerAbnormal(null); + detail.setQualityInspectionResults(null); + //费用/展示 + detail.setContractFee(null); + detail.setMonthlyWarehouseFee(null); + detail.setHalfMonthWhFee(null); + detail.setDiscountRate(null); + detail.setSingleVolume(null); + detail.setSingleGrossWeight(null); + detail.setLotNo(null); + //执行数据 + detail.setCollectQuantity(null); + detail.setShelfJson(null); + //报关推送映射字段 + detail.setLineNumGw(null); + detail.setSpecGw(null); + detail.setUnitGw(null); + detail.setQtyGw(null); + detail.setErpCurrGw(null); + detail.setErpPriceGw(null); + detail.setAmountGw(null); + }); } @@ -281,15 +401,7 @@ public class StockInOrderDomainService { // BigDecimal volumeLimit = stockInOrderDO.getMaterialDetailList().stream().map(InMaterialDetailDO::getVolumeLimit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); // stockInOrderDO.setVolumeLimit(volumeLimit); //复制新建时原单明细的收货数量、上架数量、作业数量等执行数据不能带入新单,统一清空 - if (!CollectionUtils.isEmpty(stockInOrderDO.getMaterialDetailList())) { - stockInOrderDO.getMaterialDetailList().forEach(detail -> { - if (detail != null) { - detail.setReceiptQuantity(null); - detail.setShelvesQuantity(null); - detail.setActualQuantity(null); - } - }); - } + resetNewOrderDetailState(stockInOrderDO.getMaterialDetailList()); stockInOrderService.insert(stockInOrderDO); return materialDetailService.batchInsert(stockInOrderDO.getInOrderNumber(), stockInOrderDO.getMaterialDetailList()); } From e7e64252e7df820798d51e26a9ed5b78a39e94d6 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Fri, 14 Aug 2026 16:38:48 +0800 Subject: [PATCH 31/37] =?UTF-8?q?feat(wms):=20=E5=87=BA=E5=BA=93=E6=8A=A5?= =?UTF-8?q?=E5=85=B3=E6=B5=81=E7=A8=8B=E5=A2=9E=E5=8A=A0=E9=80=9A=E5=AE=87?= =?UTF-8?q?=E7=BB=84=E7=BB=87=E9=99=90=E5=88=B6=EF=BC=8C=E4=BB=85=E9=80=9A?= =?UTF-8?q?=E5=AE=87(2830)=E5=90=AF=E7=94=A8=E6=8A=A5=E5=85=B3=E5=88=A4?= =?UTF-8?q?=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HandoverTaskOrderApplicationService.java | 7 ++++-- .../HandoverTaskOrderDomainService.java | 23 +++++++++++++++---- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/handoverTaskOrder/HandoverTaskOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/handoverTaskOrder/HandoverTaskOrderApplicationService.java index 4c9775cd2..dc8d448ac 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/handoverTaskOrder/HandoverTaskOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/handoverTaskOrder/HandoverTaskOrderApplicationService.java @@ -270,10 +270,13 @@ public class HandoverTaskOrderApplicationService { .eq(HandoverTaskOrder::getOrderNumber, orderNumber) .set(HandoverTaskOrder::getBillingJson, handoverTaskOrderDO.getBillingJson()) .set(HandoverTaskOrder::getPictureApp, handoverTaskOrderDO.getPictureApp())); - // 2. 状态按是否报关:需报关→已交接(13),否则→已出库(9) + // 2. 状态按是否报关:仅通宇(2830)+需报关→已交接(13),否则→已出库(9) StockOutOrder soo = stockOutOrderService.getOne(new LambdaQueryWrapper() .eq(StockOutOrder::getOutOrderNumber, orderNumber)); - int targetStatus = (soo != null && "1".equals(soo.getNeedDeclareFlag())) ? 13 : 9; + boolean needCustoms = soo != null + && Long.valueOf(2830L).equals(soo.getOrganizationId()) + && "1".equals(soo.getNeedDeclareFlag()); + int targetStatus = needCustoms ? 13 : 9; stockOutOrderService.update(new LambdaUpdateWrapper() .eq(StockOutOrder::getOutOrderNumber, orderNumber) .set(StockOutOrder::getStatus, targetStatus) diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java index 033cbae2f..e2745aa2b 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java @@ -105,12 +105,24 @@ public class HandoverTaskOrderDomainService { // 报关回写相关常量 private static final String CUSTOMS_PUSH_API_URL = "http://10.102.192.15/nagu-erp-api/transfer/pushData"; private static final String CUSTOMS_VERIFY = "ESLuxAmB6VXCgbqP1eFzxTPVRagkQ62BUkfhElrgQ6XmE/g2reHVflY/SiCSU7JD"; + // 通宇组织ID(只有通宇才启用报关出库流程) + private static final Long TONGYU_ORGANIZATION_ID = 2830L; // 视为「海关已放行/结关」的状态码(建议做成 @Value("${gw.customs.pass-status:P,I,R,F,K,B}")) // 视为「海关已放行」的状态码(ERP 确认:只有 P=海关已放行 才表示货物可出库) private static final String[] CUSTOMS_PASS_STATUS = {"P"}; // 退单/失败状态码(记告警用) private static final String[] CUSTOMS_FAIL_STATUS = {"E", "A", "D", "Z", "c", "H"}; + /** + * 判断是否需要走报关出库流程(仅通宇 + needDeclareFlag=1) + * 其它组织一律走老流程(交接直接出库) + */ + private boolean isCustomsDeclareOrder(StockOutOrder stockOutOrder) { + return stockOutOrder != null + && TONGYU_ORGANIZATION_ID.equals(stockOutOrder.getOrganizationId()) + && "1".equals(stockOutOrder.getNeedDeclareFlag()); + } + /** * 分页查询交接作业单列表 @@ -325,8 +337,8 @@ public class HandoverTaskOrderDomainService { } StockOutOrder soo = stockOutOrderMapper.selectOne(new QueryWrapper().lambda() .eq(StockOutOrder::getOutOrderNumber, hto.getOrderNumber())); - if (soo != null && "1".equals(soo.getNeedDeclareFlag())) { - continue; // 需报关,跳过 + if (isCustomsDeclareOrder(soo)) { + continue; // 需报关(仅通宇),跳过 } if (soo != null && !"yang_pin_chu_ku".equals(soo.getBusinessType())) { pushOms(handoverTaskOrderId); @@ -374,8 +386,8 @@ public class HandoverTaskOrderDomainService { if (stockOutOrder == null) { continue; } - // 需要报关:交接时只改状态为「已交接(13)」,不扣库存/不推OMS,等海关确认放行后再处理 - if ("1".equals(stockOutOrder.getNeedDeclareFlag())) { + // 需要报关(仅通宇+needDeclareFlag=1):交接时只改状态为「已交接(13)」,不扣库存/不推OMS,等海关确认放行后再处理 + if (isCustomsDeclareOrder(stockOutOrder)) { stockOutOrder.setStatus(13); stockOutOrderMapper.updateById(stockOutOrder); continue; // 跳过下方扣库存逻辑(B/C/D/E 全部延后到海关确认) @@ -484,8 +496,9 @@ public class HandoverTaskOrderDomainService { */ @Transactional(rollbackFor = Exception.class) public AjaxResult customsConfirmOut(List outOrderNumbers) { - // 1. 确定处理范围(只处理 status=13 且需要报关的出库单) + // 1. 确定处理范围(只处理通宇、status=13 且需要报关的出库单) LambdaQueryWrapper qw = new LambdaQueryWrapper() + .eq(StockOutOrder::getOrganizationId, TONGYU_ORGANIZATION_ID) .eq(StockOutOrder::getStatus, 13) .eq(StockOutOrder::getNeedDeclareFlag, "1"); if (outOrderNumbers != null && !outOrderNumbers.isEmpty()) { From 39ebcb70edede9cdb6be326234b08445e757be75 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Fri, 14 Aug 2026 16:53:22 +0800 Subject: [PATCH 32/37] =?UTF-8?q?wip(wms):=20=E5=87=BA=E5=BA=93=E6=8A=A5?= =?UTF-8?q?=E5=85=B3=E6=B5=81=E7=A8=8B=E6=9A=82=E6=97=B6=E6=90=81=E7=BD=AE?= =?UTF-8?q?=EF=BC=8C=E6=B3=A8=E9=87=8A=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=81=A2=E5=A4=8D=E5=8E=9F=E5=87=BA=E5=BA=93=E4=BA=A4=E6=8E=A5?= =?UTF-8?q?=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mhd/wms/MhdWmsApplication.java | 2 +- .../HandoverTaskOrderApplicationService.java | 17 +- .../HandoverTaskOrderDomainService.java | 432 +++++++++--------- .../stockOutOrder/StockOutOrderApi.java | 16 +- 4 files changed, 236 insertions(+), 231 deletions(-) diff --git a/mhd_wms/src/main/java/com/mhd/wms/MhdWmsApplication.java b/mhd_wms/src/main/java/com/mhd/wms/MhdWmsApplication.java index 92f286e66..3d9055551 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/MhdWmsApplication.java +++ b/mhd_wms/src/main/java/com/mhd/wms/MhdWmsApplication.java @@ -16,7 +16,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; @MapperScan("com.mhd.wms.domain.**.mapper") @EnableMethodCache(basePackages = "com.mhd.platform.domain.**.cache") @EnableAsync -@EnableScheduling +//@EnableScheduling @ComponentScan(basePackages = { "com.mhd.wms", "com.mhd.system.api.factory" diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/handoverTaskOrder/HandoverTaskOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/handoverTaskOrder/HandoverTaskOrderApplicationService.java index dc8d448ac..98363eecb 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/handoverTaskOrder/HandoverTaskOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/handoverTaskOrder/HandoverTaskOrderApplicationService.java @@ -270,16 +270,17 @@ public class HandoverTaskOrderApplicationService { .eq(HandoverTaskOrder::getOrderNumber, orderNumber) .set(HandoverTaskOrder::getBillingJson, handoverTaskOrderDO.getBillingJson()) .set(HandoverTaskOrder::getPictureApp, handoverTaskOrderDO.getPictureApp())); - // 2. 状态按是否报关:仅通宇(2830)+需报关→已交接(13),否则→已出库(9) - StockOutOrder soo = stockOutOrderService.getOne(new LambdaQueryWrapper() - .eq(StockOutOrder::getOutOrderNumber, orderNumber)); - boolean needCustoms = soo != null - && Long.valueOf(2830L).equals(soo.getOrganizationId()) - && "1".equals(soo.getNeedDeclareFlag()); - int targetStatus = needCustoms ? 13 : 9; +// // 2. 状态按是否报关:仅通宇(2830)+需报关→已交接(13),否则→已出库(9) +// StockOutOrder soo = stockOutOrderService.getOne(new LambdaQueryWrapper() +// .eq(StockOutOrder::getOutOrderNumber, orderNumber)); +// boolean needCustoms = soo != null +// && Long.valueOf(2830L).equals(soo.getOrganizationId()) +// && "1".equals(soo.getNeedDeclareFlag()); +// int targetStatus = needCustoms ? 13 : 9; stockOutOrderService.update(new LambdaUpdateWrapper() .eq(StockOutOrder::getOutOrderNumber, orderNumber) - .set(StockOutOrder::getStatus, targetStatus) +// .set(StockOutOrder::getStatus, targetStatus) + .set(StockOutOrder::getStatus, 9) // 不注释之后需要删除 .set(StockOutOrder::getBillingJson, handoverTaskOrderDO.getBillingJson()) .set(StockOutOrder::getPictureApp, handoverTaskOrderDO.getPictureApp())); // 3. 参考PC端完成交接:根据orderNumber查询交接单ID,执行库存扣减+交接状态更新 diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java index e2745aa2b..3d9730886 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java @@ -99,29 +99,29 @@ public class HandoverTaskOrderDomainService { private CopyCodeReferenceDomainService copyCodeReferenceDomainService; @Autowired private OmsServiceFeign omsServiceFeign; - @Autowired - private ICustomsDeclarationDetailService customsDeclarationDetailService; +// @Autowired +// private ICustomsDeclarationDetailService customsDeclarationDetailService; - // 报关回写相关常量 - private static final String CUSTOMS_PUSH_API_URL = "http://10.102.192.15/nagu-erp-api/transfer/pushData"; - private static final String CUSTOMS_VERIFY = "ESLuxAmB6VXCgbqP1eFzxTPVRagkQ62BUkfhElrgQ6XmE/g2reHVflY/SiCSU7JD"; - // 通宇组织ID(只有通宇才启用报关出库流程) - private static final Long TONGYU_ORGANIZATION_ID = 2830L; - // 视为「海关已放行/结关」的状态码(建议做成 @Value("${gw.customs.pass-status:P,I,R,F,K,B}")) - // 视为「海关已放行」的状态码(ERP 确认:只有 P=海关已放行 才表示货物可出库) - private static final String[] CUSTOMS_PASS_STATUS = {"P"}; - // 退单/失败状态码(记告警用) - private static final String[] CUSTOMS_FAIL_STATUS = {"E", "A", "D", "Z", "c", "H"}; - - /** - * 判断是否需要走报关出库流程(仅通宇 + needDeclareFlag=1) - * 其它组织一律走老流程(交接直接出库) - */ - private boolean isCustomsDeclareOrder(StockOutOrder stockOutOrder) { - return stockOutOrder != null - && TONGYU_ORGANIZATION_ID.equals(stockOutOrder.getOrganizationId()) - && "1".equals(stockOutOrder.getNeedDeclareFlag()); - } +// // 报关回写相关常量 +// private static final String CUSTOMS_PUSH_API_URL = "http://10.102.192.15/nagu-erp-api/transfer/pushData"; +// private static final String CUSTOMS_VERIFY = "ESLuxAmB6VXCgbqP1eFzxTPVRagkQ62BUkfhElrgQ6XmE/g2reHVflY/SiCSU7JD"; +// // 通宇组织ID(只有通宇才启用报关出库流程) +// private static final Long TONGYU_ORGANIZATION_ID = 2830L; +// // 视为「海关已放行/结关」的状态码(建议做成 @Value("${gw.customs.pass-status:P,I,R,F,K,B}")) +// // 视为「海关已放行」的状态码(ERP 确认:只有 P=海关已放行 才表示货物可出库) +// private static final String[] CUSTOMS_PASS_STATUS = {"P"}; +// // 退单/失败状态码(记告警用) +// private static final String[] CUSTOMS_FAIL_STATUS = {"E", "A", "D", "Z", "c", "H"}; +// +// /** +// * 判断是否需要走报关出库流程(仅通宇 + needDeclareFlag=1) +// * 其它组织一律走老流程(交接直接出库) +// */ +// private boolean isCustomsDeclareOrder(StockOutOrder stockOutOrder) { +// return stockOutOrder != null +// && TONGYU_ORGANIZATION_ID.equals(stockOutOrder.getOrganizationId()) +// && "1".equals(stockOutOrder.getNeedDeclareFlag()); +// } /** @@ -331,18 +331,20 @@ public class HandoverTaskOrderDomainService { xgkc(handoverTaskOrderIds,loginUser); //推送oms(需报关的单子等海关确认放行后再推) for (Long handoverTaskOrderId : handoverTaskOrderIds) { - HandoverTaskOrder hto = handoverTaskOrderService.getById(handoverTaskOrderId); - if (hto == null) { - continue; - } - StockOutOrder soo = stockOutOrderMapper.selectOne(new QueryWrapper().lambda() - .eq(StockOutOrder::getOutOrderNumber, hto.getOrderNumber())); - if (isCustomsDeclareOrder(soo)) { - continue; // 需报关(仅通宇),跳过 - } - if (soo != null && !"yang_pin_chu_ku".equals(soo.getBusinessType())) { - pushOms(handoverTaskOrderId); - } +// HandoverTaskOrder hto = handoverTaskOrderService.getById(handoverTaskOrderId); +// if (hto == null) { +// continue; +// } +// StockOutOrder soo = stockOutOrderMapper.selectOne(new QueryWrapper().lambda() +// .eq(StockOutOrder::getOutOrderNumber, hto.getOrderNumber())); +// if (isCustomsDeclareOrder(soo)) { +// continue; // 需报关(仅通宇),跳过 +// } +// if (soo != null && !"yang_pin_chu_ku".equals(soo.getBusinessType())) { +// pushOms(handoverTaskOrderId); +// } + // 推送 oms ,当上面不注释时,需要将这个删除 + pushOms(handoverTaskOrderId); } HandoverTaskOrder handoverTaskOrder = handoverTaskOrderService.getById(handoverTaskOrderIds.get(0)); stockOutOrderService.update(null,new UpdateWrapper().lambda().set(StockOutOrder::getBillingJson,handoverTaskOrderDO.getBillingJson()).eq(StockOutOrder::getOutOrderNumber,handoverTaskOrder.getOrderNumber())); @@ -386,13 +388,15 @@ public class HandoverTaskOrderDomainService { if (stockOutOrder == null) { continue; } - // 需要报关(仅通宇+needDeclareFlag=1):交接时只改状态为「已交接(13)」,不扣库存/不推OMS,等海关确认放行后再处理 - if (isCustomsDeclareOrder(stockOutOrder)) { - stockOutOrder.setStatus(13); - stockOutOrderMapper.updateById(stockOutOrder); - continue; // 跳过下方扣库存逻辑(B/C/D/E 全部延后到海关确认) - } - // 不需要报关:维持原逻辑,状态改「已出库(9)」+ 扣库存 +// // 需要报关(仅通宇+needDeclareFlag=1):交接时只改状态为「已交接(13)」,不扣库存/不推OMS,等海关确认放行后再处理 +// if (isCustomsDeclareOrder(stockOutOrder)) { +// stockOutOrder.setStatus(13); +// stockOutOrderMapper.updateById(stockOutOrder); +// continue; // 跳过下方扣库存逻辑(B/C/D/E 全部延后到海关确认) +// } +// // 不需要报关:维持原逻辑,状态改「已出库(9)」+ 扣库存 + + //完成交接状态改为已出库 stockOutOrder.setStatus(9); stockOutOrderMapper.updateById(stockOutOrder); doStockOutDeduct(orderNumber, stockOutOrder, loginUser); @@ -470,184 +474,184 @@ public class HandoverTaskOrderDomainService { } } - /** - * 定时任务入口:每小时整点扫描「已交接(13)」状态的需报关出库单,调 sendDec 查报关结果, - * 放行/结关的 → 状态 13→9 + 扣库存 + 推OMS;未放行 → 跳过下次再查。 - * 由 @Scheduled 触发,无需在 sys_job 表配置。 - */ - @Scheduled(cron = "0 0 * * * ?") - public void scheduledCustomsConfirm() { - log.info("【报关确认出库】定时任务开始执行"); - try { - AjaxResult result = customsConfirmOut(null); - log.info("【报关确认出库】定时任务执行完成 result={}", result); - } catch (Exception e) { - log.error("【报关确认出库】定时任务执行异常", e); - } - } +// /** +// * 定时任务入口:每小时整点扫描「已交接(13)」状态的需报关出库单,调 sendDec 查报关结果, +// * 放行/结关的 → 状态 13→9 + 扣库存 + 推OMS;未放行 → 跳过下次再查。 +// * 由 @Scheduled 触发,无需在 sys_job 表配置。 +// */ +// @Scheduled(cron = "0 0 * * * ?") +// public void scheduledCustomsConfirm() { +// log.info("【报关确认出库】定时任务开始执行"); +// try { +// AjaxResult result = customsConfirmOut(null); +// log.info("【报关确认出库】定时任务执行完成 result={}", result); +// } catch (Exception e) { +// log.error("【报关确认出库】定时任务执行异常", e); +// } +// } - /** - * 海关确认出库(轮询/手动入口) - * 对 status=13(已交接)的需报关出库单,调 sendDec 查报关状态: - * ✅ 放行/结关 → 状态 13→9 + 扣库存 + 推OMS - * ❌ 退单 → 保持13,记告警 - * ⏳ 进行中 → 跳过,下次再查 - * @param outOrderNumbers 传空则扫全部 status=13;传值则按指定单号处理 - */ - @Transactional(rollbackFor = Exception.class) - public AjaxResult customsConfirmOut(List outOrderNumbers) { - // 1. 确定处理范围(只处理通宇、status=13 且需要报关的出库单) - LambdaQueryWrapper qw = new LambdaQueryWrapper() - .eq(StockOutOrder::getOrganizationId, TONGYU_ORGANIZATION_ID) - .eq(StockOutOrder::getStatus, 13) - .eq(StockOutOrder::getNeedDeclareFlag, "1"); - if (outOrderNumbers != null && !outOrderNumbers.isEmpty()) { - qw.in(StockOutOrder::getOutOrderNumber, outOrderNumbers); - } - List list = stockOutOrderService.list(qw); +// /** +// * 海关确认出库(轮询/手动入口) +// * 对 status=13(已交接)的需报关出库单,调 sendDec 查报关状态: +// * ✅ 放行/结关 → 状态 13→9 + 扣库存 + 推OMS +// * ❌ 退单 → 保持13,记告警 +// * ⏳ 进行中 → 跳过,下次再查 +// * @param outOrderNumbers 传空则扫全部 status=13;传值则按指定单号处理 +// */ +// @Transactional(rollbackFor = Exception.class) +// public AjaxResult customsConfirmOut(List outOrderNumbers) { +// // 1. 确定处理范围(只处理通宇、status=13 且需要报关的出库单) +// LambdaQueryWrapper qw = new LambdaQueryWrapper() +// .eq(StockOutOrder::getOrganizationId, TONGYU_ORGANIZATION_ID) +// .eq(StockOutOrder::getStatus, 13) +// .eq(StockOutOrder::getNeedDeclareFlag, "1"); +// if (outOrderNumbers != null && !outOrderNumbers.isEmpty()) { +// qw.in(StockOutOrder::getOutOrderNumber, outOrderNumbers); +// } +// List list = stockOutOrderService.list(qw); +// +// int pass = 0, pending = 0, fail = 0; +// LoginUser loginUser = SecurityUtils.getLoginUser(); +// +// for (StockOutOrder soo : list) { +// try { +// // 2. 调 sendDec 查报关状态 +// JSONArray decData = queryCustomsDeclaration( +// soo.getOutOrderNumber(), +// soo.getOrganizationId(), +// soo.getOrganizationName()); +// if (decData == null || decData.isEmpty()) { +// pending++; // ERP 里还没报关单,下次再查 +// continue; +// } +// +// // 3. 判断状态(遍历全部明细,任一命中放行即整单放行) +// String decStatus = null; +// boolean passed = false, failed = false; +// for (int i = 0; i < decData.size(); i++) { +// JSONObject item = decData.getJSONObject(i); +// decStatus = item.getString("dec_status"); +// if (isInList(decStatus, CUSTOMS_PASS_STATUS)) { +// passed = true; +// // 报关单号写入 customs_declaration_detail(补全出库单关联) +// saveCustomsDetail(soo, item); +// break; +// } +// if (isInList(decStatus, CUSTOMS_FAIL_STATUS)) { +// failed = true; +// } +// } +// +// if (passed) { +// // ✅ 放行:状态 13→9 + 扣库存 + 推 OMS +// soo.setStatus(9); +// stockOutOrderMapper.updateById(soo); +// doStockOutDeduct(soo.getOutOrderNumber(), soo, loginUser); +// pushOmsByOrderNumber(soo.getOutOrderNumber()); +// pass++; +// } else if (failed) { +// // ❌ 退单:保持13,记告警日志(暂留人工处理) +// log.warn("报关退单,请人工处理 outOrderNumber={} decStatus={}", +// soo.getOutOrderNumber(), decStatus); +// fail++; +// } else { +// pending++; // 进行中 +// } +// } catch (Exception e) { +// log.error("海关确认出库异常 outOrderNumber={}", soo.getOutOrderNumber(), e); +// fail++; +// } +// } +// Map r = new HashMap<>(); +// r.put("pass", pass); +// r.put("pending", pending); +// r.put("fail", fail); +// return AjaxResult.success(r); +// } - int pass = 0, pending = 0, fail = 0; - LoginUser loginUser = SecurityUtils.getLoginUser(); +// /** +// * sendDec 查询报关回写(参考 PickingOrderApplicationService.java:771-818 模板) +// * 关键改造:① erpBillNo 传出库单号 ② 返回整个 data 数组(不只第0条) ③ 不在这里处理 dec_status +// */ +// private JSONArray queryCustomsDeclaration(String erpBillNo, Long organizationId, String organizationName) throws Exception { +// Map param = new HashMap<>(); +// param.put("beginDate", "2020-01-01"); +// param.put("endDate", new SimpleDateFormat("yyyy-MM-dd").format(new Date())); +// param.put("erpBillNo", erpBillNo); +// param.put("pageIndex", 1); +// param.put("pageSize", 100); +// List> body = new ArrayList<>(); +// body.add(param); +// +// // 多租户 URL(保证查的地址和推 save_order_e 的地址一致) +// String ncUrl = pickingMaterialDetailMapper.getNcUrl("gw", organizationName, organizationId); +// String url = (ncUrl != null) ? ncUrl : CUSTOMS_PUSH_API_URL; +// +// HttpPost post = new HttpPost(url); +// post.setEntity(new StringEntity(JSONObject.toJSONString(body), "UTF-8")); +// post.setHeader("Content-type", "application/json"); +// post.setHeader("apiName", "sendDec"); +// post.setHeader("verify", CUSTOMS_VERIFY); +// log.info("sendDec 请求 erpBillNo={} url={} body={}", erpBillNo, url,body); +// +// try (CloseableHttpClient client = HttpClients.createDefault(); +// CloseableHttpResponse resp = client.execute(post)) { +// String respStr = EntityUtils.toString(resp.getEntity()); +// log.info("sendDec 响应 erpBillNo={} resp={}", erpBillNo, respStr); +// if (resp.getStatusLine().getStatusCode() == 200) { +// JSONObject json = JSONObject.parseObject(respStr); +// Integer code = json.getInteger("code"); +// if (code != null && code == 200) { +// return json.getJSONArray("data"); +// } +// } +// return null; +// } +// } - for (StockOutOrder soo : list) { - try { - // 2. 调 sendDec 查报关状态 - JSONArray decData = queryCustomsDeclaration( - soo.getOutOrderNumber(), - soo.getOrganizationId(), - soo.getOrganizationName()); - if (decData == null || decData.isEmpty()) { - pending++; // ERP 里还没报关单,下次再查 - continue; - } +// private boolean isInList(String v, String[] arr) { +// if (v == null) return false; +// for (String s : arr) { +// if (s.equalsIgnoreCase(v)) return true; +// } +// return false; +// } - // 3. 判断状态(遍历全部明细,任一命中放行即整单放行) - String decStatus = null; - boolean passed = false, failed = false; - for (int i = 0; i < decData.size(); i++) { - JSONObject item = decData.getJSONObject(i); - decStatus = item.getString("dec_status"); - if (isInList(decStatus, CUSTOMS_PASS_STATUS)) { - passed = true; - // 报关单号写入 customs_declaration_detail(补全出库单关联) - saveCustomsDetail(soo, item); - break; - } - if (isInList(decStatus, CUSTOMS_FAIL_STATUS)) { - failed = true; - } - } +// /** +// * 报关明细写入 customs_declaration_detail +// * (补 set outOrderNumber/outOrderId,原 PickingOrder 代码这两字段漏 set 了) +// */ +// private void saveCustomsDetail(StockOutOrder soo, JSONObject item) { +// try { +// CustomsDeclarationDetailDO d = new CustomsDeclarationDetailDO(); +// d.setDocumentNumber(soo.getOutOrderNumber()); +// d.setBondInvtNo(item.getString("entry_id")); +// Object erpGNo = item.get("erp_g_no"); +// if (erpGNo != null) { +// d.setInvtRow(erpGNo instanceof Number +// ? ((Number) erpGNo).intValue() +// : Integer.parseInt(erpGNo.toString())); +// } +// d.setOutOrderNumber(soo.getOutOrderNumber()); +// d.setOutOrderId(soo.getOutOrderId()); +// d.setOrganizationId(soo.getOrganizationId()); +// d.setOrganizationName(soo.getOrganizationName()); +// d.setTopOrganizationId(soo.getTopOrganizationId()); +// customsDeclarationDetailService.insert(d); +// } catch (Exception e) { +// log.error("写报关明细失败 outOrderNumber={}", soo.getOutOrderNumber(), e); +// } +// } - if (passed) { - // ✅ 放行:状态 13→9 + 扣库存 + 推 OMS - soo.setStatus(9); - stockOutOrderMapper.updateById(soo); - doStockOutDeduct(soo.getOutOrderNumber(), soo, loginUser); - pushOmsByOrderNumber(soo.getOutOrderNumber()); - pass++; - } else if (failed) { - // ❌ 退单:保持13,记告警日志(暂留人工处理) - log.warn("报关退单,请人工处理 outOrderNumber={} decStatus={}", - soo.getOutOrderNumber(), decStatus); - fail++; - } else { - pending++; // 进行中 - } - } catch (Exception e) { - log.error("海关确认出库异常 outOrderNumber={}", soo.getOutOrderNumber(), e); - fail++; - } - } - Map r = new HashMap<>(); - r.put("pass", pass); - r.put("pending", pending); - r.put("fail", fail); - return AjaxResult.success(r); - } - - /** - * sendDec 查询报关回写(参考 PickingOrderApplicationService.java:771-818 模板) - * 关键改造:① erpBillNo 传出库单号 ② 返回整个 data 数组(不只第0条) ③ 不在这里处理 dec_status - */ - private JSONArray queryCustomsDeclaration(String erpBillNo, Long organizationId, String organizationName) throws Exception { - Map param = new HashMap<>(); - param.put("beginDate", "2020-01-01"); - param.put("endDate", new SimpleDateFormat("yyyy-MM-dd").format(new Date())); - param.put("erpBillNo", erpBillNo); - param.put("pageIndex", 1); - param.put("pageSize", 100); - List> body = new ArrayList<>(); - body.add(param); - - // 多租户 URL(保证查的地址和推 save_order_e 的地址一致) - String ncUrl = pickingMaterialDetailMapper.getNcUrl("gw", organizationName, organizationId); - String url = (ncUrl != null) ? ncUrl : CUSTOMS_PUSH_API_URL; - - HttpPost post = new HttpPost(url); - post.setEntity(new StringEntity(JSONObject.toJSONString(body), "UTF-8")); - post.setHeader("Content-type", "application/json"); - post.setHeader("apiName", "sendDec"); - post.setHeader("verify", CUSTOMS_VERIFY); - log.info("sendDec 请求 erpBillNo={} url={} body={}", erpBillNo, url,body); - - try (CloseableHttpClient client = HttpClients.createDefault(); - CloseableHttpResponse resp = client.execute(post)) { - String respStr = EntityUtils.toString(resp.getEntity()); - log.info("sendDec 响应 erpBillNo={} resp={}", erpBillNo, respStr); - if (resp.getStatusLine().getStatusCode() == 200) { - JSONObject json = JSONObject.parseObject(respStr); - Integer code = json.getInteger("code"); - if (code != null && code == 200) { - return json.getJSONArray("data"); - } - } - return null; - } - } - - private boolean isInList(String v, String[] arr) { - if (v == null) return false; - for (String s : arr) { - if (s.equalsIgnoreCase(v)) return true; - } - return false; - } - - /** - * 报关明细写入 customs_declaration_detail - * (补 set outOrderNumber/outOrderId,原 PickingOrder 代码这两字段漏 set 了) - */ - private void saveCustomsDetail(StockOutOrder soo, JSONObject item) { - try { - CustomsDeclarationDetailDO d = new CustomsDeclarationDetailDO(); - d.setDocumentNumber(soo.getOutOrderNumber()); - d.setBondInvtNo(item.getString("entry_id")); - Object erpGNo = item.get("erp_g_no"); - if (erpGNo != null) { - d.setInvtRow(erpGNo instanceof Number - ? ((Number) erpGNo).intValue() - : Integer.parseInt(erpGNo.toString())); - } - d.setOutOrderNumber(soo.getOutOrderNumber()); - d.setOutOrderId(soo.getOutOrderId()); - d.setOrganizationId(soo.getOrganizationId()); - d.setOrganizationName(soo.getOrganizationName()); - d.setTopOrganizationId(soo.getTopOrganizationId()); - customsDeclarationDetailService.insert(d); - } catch (Exception e) { - log.error("写报关明细失败 outOrderNumber={}", soo.getOutOrderNumber(), e); - } - } - - /** 按 orderNumber 推 OMS(pushOms 入参是 handoverTaskOrderId,这里包一层) */ - private void pushOmsByOrderNumber(String orderNumber) { - List htoList = handoverTaskOrderService.list( - new LambdaQueryWrapper() - .eq(HandoverTaskOrder::getOrderNumber, orderNumber)); - for (HandoverTaskOrder hto : htoList) { - pushOms(hto.getHandoverTaskOrderId()); - } - } +// /** 按 orderNumber 推 OMS(pushOms 入参是 handoverTaskOrderId,这里包一层) */ +// private void pushOmsByOrderNumber(String orderNumber) { +// List htoList = handoverTaskOrderService.list( +// new LambdaQueryWrapper() +// .eq(HandoverTaskOrder::getOrderNumber, orderNumber)); +// for (HandoverTaskOrder hto : htoList) { +// pushOms(hto.getHandoverTaskOrderId()); +// } +// } private void OMSInventorySynchronization(OutMaterialDetail outMaterialDetail,BigDecimal checkQuantity) { outMaterialDetail.getLotNo(); diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockOutOrder/StockOutOrderApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockOutOrder/StockOutOrderApi.java index 17c88caa6..6e3d11735 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockOutOrder/StockOutOrderApi.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockOutOrder/StockOutOrderApi.java @@ -69,8 +69,8 @@ public class StockOutOrderApi extends BaseController { private IStockOutOrderService stockOutOrderService; @Autowired private ExcelParseService excelParseService; - @Autowired - private HandoverTaskOrderDomainService handoverTaskOrderDomainService; +// @Autowired +// private HandoverTaskOrderDomainService handoverTaskOrderDomainService; /** * 提货单大标题:未选时为「提货单」;可传副标题如「谷丰--营销部」,或与弹窗一致传整段「提货单--谷丰--营销部」(后者原样作标题,并将 -- 规范为 ——)。 @@ -109,12 +109,12 @@ public class StockOutOrderApi extends BaseController { List list = stockOutOrderApplicationService.queryList(stockOutOrderDO); return getDataTable(list); } - - @ApiOperation("海关确认出库(人工批量触发,参数为空则扫全部已交接状态)") - @PostMapping("/customsConfirmOut") - public AjaxResult customsConfirmOut(@RequestBody(required = false) List outOrderNumbers) { - return handoverTaskOrderDomainService.customsConfirmOut(outOrderNumbers); - } +// +// @ApiOperation("海关确认出库(人工批量触发,参数为空则扫全部已交接状态)") +// @PostMapping("/customsConfirmOut") +// public AjaxResult customsConfirmOut(@RequestBody(required = false) List outOrderNumbers) { +// return handoverTaskOrderDomainService.customsConfirmOut(outOrderNumbers); +// } /** * PDA出库签名列表查询 From 1cc123917bb7e6458faa10762203f3a4e430275b Mon Sep 17 00:00:00 2001 From: zhaoqing <1670883518@qq.com> Date: Fri, 14 Aug 2026 17:38:34 +0800 Subject: [PATCH 33/37] =?UTF-8?q?fix(oms):=E8=BF=90=E8=BE=93=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E5=8D=95=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/mapper/executeOrder/ExecuteOrderMapper.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mhd_oms/src/main/resources/mapper/executeOrder/ExecuteOrderMapper.xml b/mhd_oms/src/main/resources/mapper/executeOrder/ExecuteOrderMapper.xml index 82a826d88..0ac65cf58 100644 --- a/mhd_oms/src/main/resources/mapper/executeOrder/ExecuteOrderMapper.xml +++ b/mhd_oms/src/main/resources/mapper/executeOrder/ExecuteOrderMapper.xml @@ -131,7 +131,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - order by layDate desc, CREATE_TIME desc + order by lay_date desc, CREATE_TIME desc