From 484741e12b234186d2721ddf73965c8562ce5991 Mon Sep 17 00:00:00 2001 From: zhou-hongcheng <1064771933@qq.com> Date: Mon, 27 Apr 2026 17:36:24 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B7=AF=E7=BA=BF=E6=B3=A2=E6=AC=A1=E7=94=9F?= =?UTF-8?q?=E6=88=90=E5=AE=A2=E6=88=B7=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E8=B7=AF=E7=BA=BF=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mhd/system/api/model/LoginUser.java | 12 ++ .../service/UserApplicationService.java | 12 ++ .../StockOutOrderApplicationService.java | 12 ++ .../repository/po/StockOutOrderPO.java | 12 ++ .../service/RouteGenerationService.java | 204 ++++++++++++++++++ 5 files changed, 252 insertions(+) create mode 100644 mhd_wms/src/main/java/com/mhd/wms/domain/waveOrder/service/RouteGenerationService.java diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/model/LoginUser.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/model/LoginUser.java index 3afe4170e..e71b362aa 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/model/LoginUser.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/model/LoginUser.java @@ -162,4 +162,16 @@ public class LoginUser implements Serializable @ApiModelProperty("仓库信息") private WarehousePO warehousePO; + @ApiModelProperty("路线id") + private String lineManagementId; + + @ApiModelProperty("路线编码") + private String routeCode; + + @ApiModelProperty("路线名称") + private String routeName; + + @ApiModelProperty("配送顺序") + private String deliveryOrder; + } diff --git a/mhd-user-center/src/main/java/com/mhd/user/application/service/UserApplicationService.java b/mhd-user-center/src/main/java/com/mhd/user/application/service/UserApplicationService.java index 7d1a3f921..7ed665e3d 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/application/service/UserApplicationService.java +++ b/mhd-user-center/src/main/java/com/mhd/user/application/service/UserApplicationService.java @@ -2783,6 +2783,18 @@ public class UserApplicationService { } sysUser.setUserShipperPo(userShipperPo1); sysUser.setVehiclePo(vehiclePo); + if (userPo.getLineManagementId() != null && !userPo.getLineManagementId().isEmpty()) { + sysUser.setLineManagementId(userPo.getLineManagementId()); + } + if (userPo.getRouteCode() != null && !userPo.getRouteCode().isEmpty()) { + sysUser.setRouteCode(userPo.getRouteCode()); + } + if (userPo.getRouteName() != null && !userPo.getRouteName().isEmpty()) { + sysUser.setRouteName(userPo.getRouteName()); + } + if (userPo.getDeliveryOrder() != null && !userPo.getDeliveryOrder().isEmpty()) { + sysUser.setDeliveryOrder(userPo.getDeliveryOrder()); + } } return sysUser; } 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 f1a4a255f..08533094a 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 @@ -6,7 +6,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.mhd.common.core.constant.SecurityConstants; import com.mhd.common.core.constant.SnowFlakeConstants; +import com.mhd.common.core.domain.entity.R; import com.mhd.common.core.domain.po.UserPo; import com.mhd.common.core.enums.DictCode; import com.mhd.common.core.exception.ServiceException; @@ -245,6 +247,16 @@ public class StockOutOrderApplicationService { stockOutOrderPO.setReceiptOrderAccountList( accountByOrderId.getOrDefault(stockOutOrderPO.getOutOrderId(), Collections.emptyList())); } + for (StockOutOrderPO stockOutOrderPO : stockOutOrderPOS) { + R userByUser = userServiceFeign.getUserByUserId(stockOutOrderPO.getCustomerId(), SecurityConstants.INNER); + LoginUser user = userByUser.getData(); + if (StringUtils.isNotEmpty(user.getLineManagementId())){ + stockOutOrderPO.setLineManagementId(user.getLineManagementId()); + stockOutOrderPO.setRouteCode(user.getRouteCode()); + stockOutOrderPO.setRouteName(user.getRouteName()); + stockOutOrderPO.setDeliveryOrder(user.getDeliveryOrder()); + } + } return stockOutOrderPOS; } 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 4754da21f..63482075c 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 @@ -417,4 +417,16 @@ public class StockOutOrderPO extends BaseVOEntity { private String salesmanName; @ApiModelProperty("费用") List receiptOrderAccountList; + + @ApiModelProperty("路线id") + private String lineManagementId; + + @ApiModelProperty("路线编码") + private String routeCode; + + @ApiModelProperty("路线名称") + private String routeName; + + @ApiModelProperty("配送顺序") + private String deliveryOrder; } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/waveOrder/service/RouteGenerationService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/waveOrder/service/RouteGenerationService.java new file mode 100644 index 000000000..613826163 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/waveOrder/service/RouteGenerationService.java @@ -0,0 +1,204 @@ +package com.mhd.wms.domain.waveOrder.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.mhd.common.core.constant.SecurityConstants; +import com.mhd.common.core.domain.entity.R; +import com.mhd.common.core.exception.ServiceException; +import com.mhd.common.core.utils.OrderSequence; +import com.mhd.common.core.utils.StringUtils; +import com.mhd.common.core.utils.bean.BeanUtils; +import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.system.api.UserServiceFeign; +import com.mhd.system.api.model.LoginUser; +import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail; +import com.mhd.wms.domain.outMaterialDetail.repository.facade.IOutMaterialDetailService; +import com.mhd.wms.domain.sowingDistributionDetails.repository.facade.ISowingDistributionDetailsService; +import com.mhd.wms.domain.stockOutOrder.entity.StockOutOrder; +import com.mhd.wms.domain.stockOutOrder.repository.facade.IStockOutOrderService; +import com.mhd.wms.domain.stockOutOrder.repository.po.StockOutOrderPO; +import com.mhd.wms.domain.stockOutOrder.repository.todo.StockOutOrderDO; +import com.mhd.wms.domain.waveMaterialDetail.repository.facade.IWaveMaterialDetailService; +import com.mhd.wms.domain.waveMaterialDetail.repository.todo.WaveMaterialDetailDO; +import com.mhd.wms.domain.waveOrder.abstracts.AbstractWaveOrderService; +import com.mhd.wms.domain.waveOrder.repository.facade.IWaveOrderService; +import com.mhd.wms.domain.waveOrder.repository.todo.WaveOrderDO; +import com.mhd.wms.domain.waveOutOrder.entity.WaveOutOrder; +import com.mhd.wms.domain.waveOutOrder.repository.facade.IWaveOutOrderService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author ZhouGY + * @title DirectGenerationImpl + * @description: TODO + * @date 2024/6/4 11:09 + **/ +@Service +public class RouteGenerationService extends AbstractWaveOrderService { + + @Autowired + private IWaveOrderService waveOrderService; + @Autowired + private IStockOutOrderService stockOutOrderService; + @Autowired + private IOutMaterialDetailService outMaterialDetailService; + @Autowired + private IWaveMaterialDetailService waveMaterialDetailService; + @Autowired + private ISowingDistributionDetailsService sowingDistributionDetailsService; + @Autowired + private IWaveOutOrderService waveOutOrderService; + @Autowired + private UserServiceFeign userServiceFeign; + + /** + * @description 核心业务逻辑 直接生成 + * @author ZhouGY + * @date 2024/6/4 11:10 + * @param stockOutOrderDO + * @return Boolean + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean handleWaveOrderDO(StockOutOrderDO stockOutOrderDO) { + //出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 + stockOutOrderDO.setStatus(2); + List stockOutOrderPOList = stockOutOrderService.queryList(stockOutOrderDO); + if (stockOutOrderDO.getWaveOrderTypeCode().equals("routeGeneration")){ + routeGeneration(stockOutOrderPOList,stockOutOrderDO);//按照线路生成波次单 + }else{ + getABoolean(stockOutOrderPOList,stockOutOrderDO); + } + return true; + } + + private void routeGeneration(List stockOutOrderPOList,StockOutOrderDO stockOutOrderDO) { + //查询这些客户的路线 吧同一个路线的归入一个波次单 没有路线 创建一个波次单 + List userList = new ArrayList<>();//获取客户信息 + for (StockOutOrderPO stockOutOrderPO : stockOutOrderPOList) { + R userByUser = userServiceFeign.getUserByUserId(stockOutOrderPO.getCustomerId(), SecurityConstants.INNER); + LoginUser user = userByUser.getData(); + if (StringUtils.isNotEmpty(user.getLineManagementId())){ + stockOutOrderPO.setLineManagementId(user.getLineManagementId()); + } + userList.add(userByUser.getData()); + } + // null 值统一放到 "UNKNOWN" 分组 + Map> groupByLineManagementId = stockOutOrderPOList.stream() + .collect(Collectors.groupingBy(p -> p.getLineManagementId() == null ? "UNKNOWN" : p.getLineManagementId())); + for (String lineManagementId : groupByLineManagementId.keySet()){ + List orderList = groupByLineManagementId.get(lineManagementId); + getABoolean(orderList, stockOutOrderDO); + } + } + + private void getABoolean(List stockOutOrderPOList,StockOutOrderDO stockOutOrderDO) { + if (CollectionUtils.isEmpty(stockOutOrderPOList)){ + throw new ServiceException("直接生成波次单,请选择已审核的出库单"); + } + //判断是不是同一货主、同一仓库下的订单 + boolean flag = stockOutOrderPOList.stream().map(p -> p.getWarehouseId() + "_" + p.getShipperId()).distinct().count() == 1; + if (!flag){ + throw new ServiceException("非同一个货主、同一仓库下的订单不能合并"); + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + List outOrderNumberList = stockOutOrderPOList.stream().map(StockOutOrderPO::getOutOrderNumber).collect(Collectors.toList()); + List outMaterialDetailList = outMaterialDetailService.list(new QueryWrapper().lambda() + .in(OutMaterialDetail::getOutOrderNumber, outOrderNumberList)); + Map> outMaterialDetailListMap = outMaterialDetailList.stream().collect(Collectors.groupingBy(OutMaterialDetail::getMaterialCode)); + int outOrderQuantity = stockOutOrderPOList.size(); + int materialCategoryQuantity = outMaterialDetailListMap.size(); + //统计总数量 + BigDecimal materialTotalQuantity = BigDecimal.ZERO; + //统计总重量 + BigDecimal weightTotalLimit = BigDecimal.ZERO; + //统计总体积 + BigDecimal volumeTotalLimit = BigDecimal.ZERO; + if (!CollectionUtils.isEmpty(outMaterialDetailList)){ + materialTotalQuantity = outMaterialDetailList.stream().map(OutMaterialDetail::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add); + weightTotalLimit = outMaterialDetailList.stream().map(OutMaterialDetail::getWeightLimit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + volumeTotalLimit = outMaterialDetailList.stream().map(OutMaterialDetail::getVolumeLimit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + } + StockOutOrderPO stockOutOrderPO = stockOutOrderPOList.get(0); + WaveOrderDO waveOrderDO = new WaveOrderDO(); + waveOrderDO.setOrganizationId(stockOutOrderPO.getOrganizationId()); + waveOrderDO.setOrganizationName(stockOutOrderPO.getOrganizationName()); + waveOrderDO.setTopOrganizationId(stockOutOrderPO.getTopOrganizationId()); + waveOrderDO.setStatus(1); + if (stockOutOrderDO.getWaveOrderTypeCode().equals("routeGeneration")){ + waveOrderDO.setWaveOrderTypeCode("routeGeneration"); + waveOrderDO.setWaveOrderTypeName("按线路生成"); + }else { + waveOrderDO.setWaveOrderTypeCode("directGeneration"); + waveOrderDO.setWaveOrderTypeName("直接生成"); + } + waveOrderDO.setOutOrderQuantity(outOrderQuantity); + waveOrderDO.setMaterialCategoryQuantity(materialCategoryQuantity); + waveOrderDO.setQuantity(materialTotalQuantity); + waveOrderDO.setWeightLimit(weightTotalLimit); + waveOrderDO.setVolumeLimit(volumeTotalLimit); + waveOrderDO.setOrderTypeCode(stockOutOrderPO.getOrderTypeCode()); + waveOrderDO.setOrderTypeName(stockOutOrderPO.getOrderTypeName()); + waveOrderDO.setWaveOrderNumber(OrderSequence.getOrderCode("BC")); + waveOrderDO.setWarehouseId(stockOutOrderPO.getWarehouseId()); + waveOrderDO.setWarehouseCode(stockOutOrderPO.getWarehouseCode()); + waveOrderDO.setWarehouseName(stockOutOrderPO.getWarehouseName()); + waveOrderDO.setShipperId(stockOutOrderPO.getShipperId()); + waveOrderDO.setShipperCode(stockOutOrderPO.getShipperCode()); + waveOrderDO.setShipperName(stockOutOrderPO.getShipperName()); + waveOrderDO.setAllocationQuantity(stockOutOrderPO.getAllocationQuantity()); + waveOrderDO.setCreateBy(loginUser.getUserid()); + waveOrderDO.setCreateByName(loginUser.getUsername()); + waveOrderDO.setCreateTime(new Date()); + waveOrderService.insert(waveOrderDO); + List waveOutOrderList = new ArrayList<>(); + for (StockOutOrderPO stockOutOrderPODb : stockOutOrderPOList){ + WaveOutOrder waveOutOrder = new WaveOutOrder(); + waveOutOrder.setWaveOrderNumber(waveOrderDO.getWaveOrderNumber()); + waveOutOrder.setOutOrderNumber(stockOutOrderPODb.getOutOrderNumber()); + waveOutOrder.setOrganizationId(loginUser.getUserPo().getOrganizationId()); + waveOutOrder.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + waveOutOrder.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + waveOutOrder.setCreateBy(loginUser.getUserid()); + waveOutOrder.setCreateByName(loginUser.getUsername()); + waveOutOrder.setCreateTime(new Date()); + waveOutOrderList.add(waveOutOrder); + } + // 批量插入明细 + List waveMaterialDetailDOList = new ArrayList<>(); + for (Map.Entry> entry : outMaterialDetailListMap.entrySet()){ + WaveMaterialDetailDO waveMaterialDetailDO = new WaveMaterialDetailDO(); + OutMaterialDetail outMaterialDetail = entry.getValue().get(entry.getValue().size() - 1); + BeanUtils.copyProperties(outMaterialDetail, waveMaterialDetailDO, + "materialDetailId", "uniqueId", "noticeNumber", "outOrderNumber", "quantity", + "createBy", "createByName", "createTime", + "updateBy", "updateByName", "updateTime"); + BigDecimal weightLimit = entry.getValue().stream().map(OutMaterialDetail::getWeightLimit).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal volumeLimit = entry.getValue().stream().map(OutMaterialDetail::getVolumeLimit).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal quantity = entry.getValue().stream().map(OutMaterialDetail::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add); + waveMaterialDetailDO.setQuantity(quantity); + waveMaterialDetailDO.setWeightLimit(weightLimit); + waveMaterialDetailDO.setVolumeLimit(volumeLimit); + waveMaterialDetailDOList.add(waveMaterialDetailDO); + } + //修改出库单状态为波次中 + StockOutOrder stockOutOrder = new StockOutOrder(); + stockOutOrder.setStatus(5);//波次中 + stockOutOrder.setUpdateBy(loginUser.getUserid()); + stockOutOrder.setUpdateByName(loginUser.getUsername()); + stockOutOrder.setUpdateTime(new Date()); + stockOutOrderService.update(stockOutOrder, new QueryWrapper().lambda().in(StockOutOrder::getOutOrderNumber, outOrderNumberList)); + //插入波次单、出库单关联表 + waveOutOrderService.saveBatch(waveOutOrderList); + //插入波次单播种分货明细 + sowingDistributionDetailsService.batchInsert(waveOrderDO.getWaveOrderNumber(), outMaterialDetailList); + //插入波次单物料明细 + waveMaterialDetailService.batchInsert(waveOrderDO.getWaveOrderNumber(), waveMaterialDetailDOList); + } +}