路线波次生成客户管理页面查询路线信息
This commit is contained in:
@@ -162,4 +162,16 @@ public class LoginUser implements Serializable
|
|||||||
@ApiModelProperty("仓库信息")
|
@ApiModelProperty("仓库信息")
|
||||||
private WarehousePO warehousePO;
|
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.setUserShipperPo(userShipperPo1);
|
||||||
sysUser.setVehiclePo(vehiclePo);
|
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;
|
return sysUser;
|
||||||
}
|
}
|
||||||
|
|||||||
+12
@@ -6,7 +6,9 @@ import com.alibaba.fastjson.JSON;
|
|||||||
import com.alibaba.fastjson2.JSONObject;
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
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.constant.SnowFlakeConstants;
|
||||||
|
import com.mhd.common.core.domain.entity.R;
|
||||||
import com.mhd.common.core.domain.po.UserPo;
|
import com.mhd.common.core.domain.po.UserPo;
|
||||||
import com.mhd.common.core.enums.DictCode;
|
import com.mhd.common.core.enums.DictCode;
|
||||||
import com.mhd.common.core.exception.ServiceException;
|
import com.mhd.common.core.exception.ServiceException;
|
||||||
@@ -245,6 +247,16 @@ public class StockOutOrderApplicationService {
|
|||||||
stockOutOrderPO.setReceiptOrderAccountList(
|
stockOutOrderPO.setReceiptOrderAccountList(
|
||||||
accountByOrderId.getOrDefault(stockOutOrderPO.getOutOrderId(), Collections.emptyList()));
|
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;
|
return stockOutOrderPOS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+12
@@ -417,4 +417,16 @@ public class StockOutOrderPO extends BaseVOEntity {
|
|||||||
private String salesmanName;
|
private String salesmanName;
|
||||||
@ApiModelProperty("费用")
|
@ApiModelProperty("费用")
|
||||||
List<ReceiptOrderAccount> receiptOrderAccountList;
|
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