路线波次生成客户管理页面查询路线信息

This commit is contained in:
zhou-hongcheng
2026-04-27 17:36:24 +08:00
parent 1aeb57c91b
commit 484741e12b
5 changed files with 252 additions and 0 deletions
@@ -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;
}
@@ -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;
}
@@ -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<LoginUser> 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;
}
@@ -417,4 +417,16 @@ public class StockOutOrderPO extends BaseVOEntity {
private String salesmanName;
@ApiModelProperty("费用")
List<ReceiptOrderAccount> receiptOrderAccountList;
@ApiModelProperty("路线id")
private String lineManagementId;
@ApiModelProperty("路线编码")
private String routeCode;
@ApiModelProperty("路线名称")
private String routeName;
@ApiModelProperty("配送顺序")
private String deliveryOrder;
}
@@ -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<StockOutOrderPO> stockOutOrderPOList = stockOutOrderService.queryList(stockOutOrderDO);
if (stockOutOrderDO.getWaveOrderTypeCode().equals("routeGeneration")){
routeGeneration(stockOutOrderPOList,stockOutOrderDO);//按照线路生成波次单
}else{
getABoolean(stockOutOrderPOList,stockOutOrderDO);
}
return true;
}
private void routeGeneration(List<StockOutOrderPO> stockOutOrderPOList,StockOutOrderDO stockOutOrderDO) {
//查询这些客户的路线 吧同一个路线的归入一个波次单 没有路线 创建一个波次单
List<LoginUser> userList = new ArrayList<>();//获取客户信息
for (StockOutOrderPO stockOutOrderPO : stockOutOrderPOList) {
R<LoginUser> 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<String, List<StockOutOrderPO>> groupByLineManagementId = stockOutOrderPOList.stream()
.collect(Collectors.groupingBy(p -> p.getLineManagementId() == null ? "UNKNOWN" : p.getLineManagementId()));
for (String lineManagementId : groupByLineManagementId.keySet()){
List<StockOutOrderPO> orderList = groupByLineManagementId.get(lineManagementId);
getABoolean(orderList, stockOutOrderDO);
}
}
private void getABoolean(List<StockOutOrderPO> 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<String> outOrderNumberList = stockOutOrderPOList.stream().map(StockOutOrderPO::getOutOrderNumber).collect(Collectors.toList());
List<OutMaterialDetail> outMaterialDetailList = outMaterialDetailService.list(new QueryWrapper<OutMaterialDetail>().lambda()
.in(OutMaterialDetail::getOutOrderNumber, outOrderNumberList));
Map<String, List<OutMaterialDetail>> 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<WaveOutOrder> 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<WaveMaterialDetailDO> waveMaterialDetailDOList = new ArrayList<>();
for (Map.Entry<String, List<OutMaterialDetail>> 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<StockOutOrder>().lambda().in(StockOutOrder::getOutOrderNumber, outOrderNumberList));
//插入波次单出库单关联表
waveOutOrderService.saveBatch(waveOutOrderList);
//插入波次单播种分货明细
sowingDistributionDetailsService.batchInsert(waveOrderDO.getWaveOrderNumber(), outMaterialDetailList);
//插入波次单物料明细
waveMaterialDetailService.batchInsert(waveOrderDO.getWaveOrderNumber(), waveMaterialDetailDOList);
}
}