路线波次生成客户管理页面查询路线信息
This commit is contained in:
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
+12
@@ -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;
|
||||
}
|
||||
|
||||
+12
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+12
@@ -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;
|
||||
}
|
||||
+204
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user