作业单页面调整修改BUG
This commit is contained in:
+119
@@ -8,6 +8,7 @@ import com.mhd.common.core.exception.ServiceException;
|
||||
import com.mhd.common.core.utils.DateUtils;
|
||||
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.common.core.web.domain.AjaxResult;
|
||||
import com.mhd.system.api.SystemServiceFeign;
|
||||
@@ -23,6 +24,8 @@ import com.mhd.wms.domain.handoverTaskOrder.repository.facade.IHandoverTaskOrder
|
||||
import com.mhd.wms.domain.handoverTaskOrder.repository.todo.HandoverTaskOrderDO;
|
||||
import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail;
|
||||
import com.mhd.wms.domain.outMaterialDetail.repository.mapper.OutMaterialDetailMapper;
|
||||
import com.mhd.wms.domain.outOrderAbnormal.repository.facade.IOutOrderAbnormalService;
|
||||
import com.mhd.wms.domain.outOrderAbnormal.repository.todo.OutOrderAbnormalBaseDO;
|
||||
import com.mhd.wms.domain.reviewOrder.entity.ReviewMaterialDetail;
|
||||
import com.mhd.wms.domain.reviewOrder.entity.ReviewOrder;
|
||||
import com.mhd.wms.domain.reviewOrder.repository.mapper.ReviewMaterialDetailMapper;
|
||||
@@ -30,9 +33,13 @@ import com.mhd.wms.domain.reviewOrder.repository.mapper.ReviewOrderMapper;
|
||||
import com.mhd.wms.domain.reviewOrder.repository.po.ReviewMaterialDetailPO;
|
||||
import com.mhd.wms.domain.reviewOrder.repository.po.ReviewOrderPO;
|
||||
import com.mhd.wms.domain.reviewOrder.repository.todo.ReviewOrderDO;
|
||||
import com.mhd.wms.domain.stockOutTaskOrder.entity.StockOutTaskOrder;
|
||||
import com.mhd.wms.domain.stockOutTaskOrder.repository.facade.IStockOutTaskOrderService;
|
||||
import com.mhd.wms.domain.stockOutTaskOrder.repository.todo.StockOutTaskOrderDO;
|
||||
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.taskPickingMaterialDetail.repository.todo.TaskPickingMaterialDetailDO;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
@@ -81,6 +88,11 @@ public class ReviewOrderApplicationService {
|
||||
|
||||
@Autowired
|
||||
private OutMaterialDetailMapper outMaterialDetailMapper;
|
||||
@Autowired
|
||||
private IStockOutTaskOrderService stockOutTaskOrderService;
|
||||
|
||||
@Autowired
|
||||
private IOutOrderAbnormalService outOrderAbnormalService;
|
||||
|
||||
public List<ReviewOrderPO> queryList(ReviewOrderDO query) {
|
||||
if (query == null) {
|
||||
@@ -317,6 +329,8 @@ public class ReviewOrderApplicationService {
|
||||
}
|
||||
// 复核确认时将复核结果同步到出库明细/出库单,供出库交接读取数量
|
||||
syncOutOrderCheckQtyByReviewConfirm(reviewOrderId, loginUser);
|
||||
// 与出库单「复核确认」一致:复核数量与拣货数量不一致时生成复核异常单(FHYC)
|
||||
genOutOrderAbnormalAfterReviewConfirm(reviewOrderId);
|
||||
ReviewOrder order = reviewOrderMapper.selectById(reviewOrderId);
|
||||
if (order == null) {
|
||||
continue;
|
||||
@@ -330,6 +344,27 @@ public class ReviewOrderApplicationService {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 复核单完成确认后生成出库复核异常记录(与 {@link com.mhd.wms.domain.stockOutOrder.service.StockOutOrderDomainService#checkConfirm} 中 type=2 逻辑一致)。
|
||||
*/
|
||||
private void genOutOrderAbnormalAfterReviewConfirm(Long reviewOrderId) {
|
||||
if (reviewOrderId == null) {
|
||||
return;
|
||||
}
|
||||
ReviewOrderPO header = reviewOrderMapper.selectHeaderByReviewOrderId(reviewOrderId);
|
||||
if (header == null || header.getOutOrderId() == null) {
|
||||
return;
|
||||
}
|
||||
StockOutOrderPO stockOutOrderPO = stockOutOrderService.getInfo(header.getOutOrderId());
|
||||
if (stockOutOrderPO == null || StringUtils.isBlank(stockOutOrderPO.getOutOrderNumber())) {
|
||||
return;
|
||||
}
|
||||
OutOrderAbnormalBaseDO base = new OutOrderAbnormalBaseDO();
|
||||
BeanUtils.copyProperties(stockOutOrderPO, base);
|
||||
base.setOutOrderNumber(stockOutOrderPO.getOutOrderNumber());
|
||||
outOrderAbnormalService.genOutOrderAbnormal(base, 2);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将复核单已复核数量同步到出库明细 checkQuantity,并汇总回写出库单 checkQuantity。
|
||||
*/
|
||||
@@ -463,6 +498,8 @@ public class ReviewOrderApplicationService {
|
||||
if (CollectionUtils.isEmpty(reviewOrderPOList)) {
|
||||
throw new ServiceException("复核单不存在或已下发,请重新选择");
|
||||
}
|
||||
// 复核下发时同步生成作业单(与拣货同表结构),避免下发后无作业单可做
|
||||
genStockOutTaskOrderForReviewDistribution(reviewOrderPOList, loginUser);
|
||||
genDeliveTaskForReview(reviewOrderPOList, cmd, loginUser);
|
||||
List<Long> toUpdateIds = reviewOrderPOList.stream()
|
||||
.map(ReviewOrderPO::getReviewOrderId)
|
||||
@@ -519,6 +556,88 @@ public class ReviewOrderApplicationService {
|
||||
deliveTaskService.batchInsert(deliveTaskDOList);
|
||||
}
|
||||
|
||||
/**
|
||||
* 复核下发时生成作业单(stock_out_task_order + task_picking_material_detail)
|
||||
*/
|
||||
private void genStockOutTaskOrderForReviewDistribution(List<ReviewOrderPO> reviewOrderPOList, LoginUser loginUser) {
|
||||
if (CollectionUtils.isEmpty(reviewOrderPOList)) {
|
||||
return;
|
||||
}
|
||||
Date now = new Date();
|
||||
String userRealName = resolveLoginDisplayName(loginUser);
|
||||
List<StockOutTaskOrderDO> taskOrderDOList = new ArrayList<>();
|
||||
for (ReviewOrderPO reviewOrderPO : reviewOrderPOList) {
|
||||
if (reviewOrderPO == null || !StringUtils.hasText(reviewOrderPO.getReviewOrderNumber())) {
|
||||
continue;
|
||||
}
|
||||
// 防重:同复核单号只生成一张作业单
|
||||
long exists = stockOutTaskOrderService.count(new LambdaQueryWrapper<StockOutTaskOrder>()
|
||||
.eq(StockOutTaskOrder::getPickingOrderNumber, reviewOrderPO.getReviewOrderNumber())
|
||||
.eq(StockOutTaskOrder::getDelFlag, 1));
|
||||
if (exists > 0) {
|
||||
continue;
|
||||
}
|
||||
List<ReviewMaterialDetailPO> detailRows = reviewOrderMapper.queryDetailByReviewOrderId(reviewOrderPO.getReviewOrderId());
|
||||
if (CollectionUtils.isEmpty(detailRows)) {
|
||||
continue;
|
||||
}
|
||||
StockOutTaskOrderDO taskOrderDO = new StockOutTaskOrderDO();
|
||||
taskOrderDO.setOrganizationId(reviewOrderPO.getOrganizationId());
|
||||
taskOrderDO.setOrganizationName(reviewOrderPO.getOrganizationName());
|
||||
taskOrderDO.setTopOrganizationId(reviewOrderPO.getTopOrganizationId());
|
||||
taskOrderDO.setWarehouseId(reviewOrderPO.getWarehouseId());
|
||||
taskOrderDO.setWarehouseCode(reviewOrderPO.getWarehouseCode());
|
||||
taskOrderDO.setWarehouseName(reviewOrderPO.getWarehouseName());
|
||||
// 货主与复核单客户一致(出库单货主可能与复核客户口径不同)
|
||||
taskOrderDO.setShipperId(reviewOrderPO.getCustomerId());
|
||||
taskOrderDO.setShipperName(reviewOrderPO.getCustomerName());
|
||||
taskOrderDO.setOrderNumber(reviewOrderPO.getOutOrderNumber());
|
||||
taskOrderDO.setPickingOrderNumber(reviewOrderPO.getReviewOrderNumber());
|
||||
taskOrderDO.setSerialNumber(OrderSequence.getOrderCode("FHZYLS"));
|
||||
taskOrderDO.setTaskNumber(OrderSequence.getOrderCode("FHZY"));
|
||||
taskOrderDO.setStatus(1);
|
||||
taskOrderDO.setType(1);
|
||||
taskOrderDO.setOperatorsBy(loginUser != null ? loginUser.getUserid() : null);
|
||||
taskOrderDO.setOperatorsName(userRealName);
|
||||
taskOrderDO.setCreateBy(loginUser != null ? loginUser.getUserid() : null);
|
||||
taskOrderDO.setCreateByName(userRealName);
|
||||
taskOrderDO.setCreateTime(now);
|
||||
taskOrderDO.setUpdateBy(loginUser != null ? loginUser.getUserid() : null);
|
||||
taskOrderDO.setUpdateByName(userRealName);
|
||||
taskOrderDO.setUpdateTime(now);
|
||||
List<TaskPickingMaterialDetailDO> taskDetailDOList = detailRows.stream().map(r -> {
|
||||
TaskPickingMaterialDetailDO d = new TaskPickingMaterialDetailDO();
|
||||
d.setMaterialDetailId(r.getMaterialDetailId());
|
||||
d.setOrganizationId(reviewOrderPO.getOrganizationId());
|
||||
d.setOrganizationName(reviewOrderPO.getOrganizationName());
|
||||
d.setTopOrganizationId(reviewOrderPO.getTopOrganizationId());
|
||||
d.setMaterialBaseInfoId(r.getMaterialBaseInfoId());
|
||||
d.setMaterialCode(r.getMaterialCode());
|
||||
d.setMaterialName(r.getMaterialName());
|
||||
d.setBarCode(r.getBarCode());
|
||||
d.setQuantity(nz(r.getPendingReviewQty()));
|
||||
d.setActualQuantity(nz(r.getPendingReviewQty()));
|
||||
d.setPickingQuantity(BigDecimal.ZERO);
|
||||
d.setPickingStatus(1);
|
||||
d.setUnitCode(r.getUnitCode());
|
||||
d.setUnitName(r.getUnitName());
|
||||
d.setBatchNumber(r.getBatchNumber());
|
||||
d.setRemark(r.getRemark());
|
||||
d.setTotalNetWeight(r.getNetWeightKg());
|
||||
d.setTotalGrossWeight(r.getGrossWeightKg());
|
||||
d.setTotalVolume(r.getVolumeCbm());
|
||||
d.setTotalArea(r.getAreaSqm());
|
||||
d.setPickingUniqueId(r.getOutUniqueId());
|
||||
return d;
|
||||
}).collect(Collectors.toList());
|
||||
taskOrderDO.setTaskPickingMaterialDetailList(taskDetailDOList);
|
||||
taskOrderDOList.add(taskOrderDO);
|
||||
}
|
||||
if (!CollectionUtils.isEmpty(taskOrderDOList)) {
|
||||
stockOutTaskOrderService.genStockPickingTaskOrder(taskOrderDOList);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 完成复核时,请求体中的明细快照先写入 review_material_detail(与 PDA 点击确认时一致),再参与待复核校验与出库同步。
|
||||
*/
|
||||
|
||||
+8
@@ -517,4 +517,12 @@ public class OutMaterialDetailPO extends StockOutOrderBaseDO {
|
||||
@ApiModelProperty("库存数量")
|
||||
@Excel(name = "库存数量")
|
||||
private BigDecimal stockQuantity;
|
||||
|
||||
@ApiModelProperty("出库异常明细:计划数量(复核异常场景=拣货数量)")
|
||||
@TableField(exist = false)
|
||||
private BigDecimal abnormalPlanQuantity;
|
||||
|
||||
@ApiModelProperty("出库异常明细:作业数量(复核异常场景=实际复核数量)")
|
||||
@TableField(exist = false)
|
||||
private BigDecimal abnormalWorkQuantity;
|
||||
}
|
||||
+79
-41
@@ -1,5 +1,6 @@
|
||||
package com.mhd.wms.domain.outOrderAbnormal.repository.persistence;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.mhd.common.core.exception.ServiceException;
|
||||
@@ -10,6 +11,7 @@ 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.outMaterialDetail.repository.mapper.OutMaterialDetailMapper;
|
||||
import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailPO;
|
||||
import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailDO;
|
||||
import com.mhd.wms.domain.outOrderAbnormal.entity.OutOrderAbnormal;
|
||||
import com.mhd.wms.domain.outOrderAbnormal.repository.facade.IOutOrderAbnormalService;
|
||||
@@ -20,6 +22,7 @@ import com.mhd.wms.domain.outOrderAbnormal.repository.todo.OutOrderAbnormalDO;
|
||||
import com.mhd.wms.domain.pickingMaterialDetail.entity.PickingMaterialDetail;
|
||||
import com.mhd.wms.domain.pickingMaterialDetail.repository.facade.IPickingMaterialDetailService;
|
||||
import com.mhd.wms.domain.pickingMaterialDetail.repository.mapper.PickingMaterialDetailMapper;
|
||||
import com.mhd.wms.domain.pickingMaterialDetail.repository.po.PickingMaterialDetailPO;
|
||||
import com.mhd.wms.domain.pickingMaterialDetail.repository.todo.PickingMaterialDetailDO;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@@ -109,6 +112,7 @@ public class OutOrderAbnormalImpl extends ServiceImpl<OutOrderAbnormalMapper, Ou
|
||||
}
|
||||
OutOrderAbnormalPO outOrderAbnormalPO = list.get(0);
|
||||
fillMaterialDetails(outOrderAbnormalPO);
|
||||
enrichAbnormalDetailQuantities(outOrderAbnormalPO);
|
||||
return outOrderAbnormalPO;
|
||||
}
|
||||
|
||||
@@ -149,6 +153,45 @@ public class OutOrderAbnormalImpl extends ServiceImpl<OutOrderAbnormalMapper, Ou
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 出库异常详情:为明细补充「计划数量 / 作业数量」展示字段(与头字段 quantity、actualQuantity 语义一致)
|
||||
*/
|
||||
private void enrichAbnormalDetailQuantities(OutOrderAbnormalPO po) {
|
||||
if (po == null || CollectionUtils.isEmpty(po.getMaterialDetailList())) {
|
||||
return;
|
||||
}
|
||||
Integer type = po.getType();
|
||||
if (Integer.valueOf(1).equals(type)) {
|
||||
for (Object o : po.getMaterialDetailList()) {
|
||||
if (!(o instanceof PickingMaterialDetailPO)) {
|
||||
continue;
|
||||
}
|
||||
PickingMaterialDetailPO p = (PickingMaterialDetailPO) o;
|
||||
BigDecimal alloc = null;
|
||||
if (p.getOutUniqueId() != null && StringUtils.hasText(po.getOutOrderNumber())) {
|
||||
OutMaterialDetail omd = outMaterialDetailMapper.selectOne(new LambdaQueryWrapper<OutMaterialDetail>()
|
||||
.eq(OutMaterialDetail::getUniqueId, p.getOutUniqueId())
|
||||
.eq(OutMaterialDetail::getOutOrderNumber, po.getOutOrderNumber())
|
||||
.eq(OutMaterialDetail::getDelFlag, 1));
|
||||
if (omd != null) {
|
||||
alloc = omd.getAllocationQuantity();
|
||||
}
|
||||
}
|
||||
p.setAbnormalPlanQuantity(alloc != null ? alloc : p.getQuantity());
|
||||
p.setAbnormalWorkQuantity(p.getPickingQuantity());
|
||||
}
|
||||
} else if (Integer.valueOf(2).equals(type)) {
|
||||
for (Object o : po.getMaterialDetailList()) {
|
||||
if (!(o instanceof OutMaterialDetailPO)) {
|
||||
continue;
|
||||
}
|
||||
OutMaterialDetailPO m = (OutMaterialDetailPO) o;
|
||||
m.setAbnormalPlanQuantity(m.getPickingQuantity());
|
||||
m.setAbnormalWorkQuantity(m.getCheckQuantity());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 生成异常记录
|
||||
* @author ZhouGY
|
||||
@@ -164,12 +207,12 @@ public class OutOrderAbnormalImpl extends ServiceImpl<OutOrderAbnormalMapper, Ou
|
||||
if (1 == type){
|
||||
List<PickingMaterialDetail> outMaterialDetailList = pickingMaterialDetailMapper.selectList(new QueryWrapper<PickingMaterialDetail>().lambda()
|
||||
.eq(PickingMaterialDetail::getPickingOrderNumber, outOrderAbnormalBaseDO.getPickingOrderNumber()));
|
||||
//拣货数量与计划数量不符,完成收货会生成拣货异常记录
|
||||
// 实际拣货与分配数量不一致时生成拣货异常记录
|
||||
outOrderAbnormalList.addAll(genPickingOrderMaterialDetailList(outOrderAbnormalBaseDO, outMaterialDetailList));
|
||||
}else if (2 == type) {
|
||||
List<OutMaterialDetail> outMaterialDetailList = outMaterialDetailMapper.selectList(new QueryWrapper<OutMaterialDetail>().lambda()
|
||||
.eq(OutMaterialDetail::getOutOrderNumber, outOrderAbnormalBaseDO.getOutOrderNumber()));
|
||||
//复核数量与拣货数量不符,完成收货会生成复核异常记录
|
||||
// 复核数量与拣货数量不一致时生成复核异常记录
|
||||
outOrderAbnormalList.addAll(genCheckOrderMaterialDetailList(outOrderAbnormalBaseDO, outMaterialDetailList));
|
||||
}else {
|
||||
throw new ServiceException("异常类型错误");
|
||||
@@ -181,12 +224,7 @@ public class OutOrderAbnormalImpl extends ServiceImpl<OutOrderAbnormalMapper, Ou
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 拣货数量与分配数量不符,完成收货会生成拣货异常记录
|
||||
* @author ZhouGY
|
||||
* @date 2024/5/24 11:45
|
||||
* @param OutOrderAbnormalBaseDO
|
||||
* @param pickingMaterialDetailList
|
||||
* @return List<InOrderAbnormal>
|
||||
* 拣货异常:计划数量=出库明细分配数量,作业数量=实际拣货数量;二者不一致时生成记录。
|
||||
*/
|
||||
private List<OutOrderAbnormal> genPickingOrderMaterialDetailList(OutOrderAbnormalBaseDO OutOrderAbnormalBaseDO, List<PickingMaterialDetail> pickingMaterialDetailList){
|
||||
LoginUser loginUser = SecurityUtils.getLoginUser();
|
||||
@@ -198,28 +236,36 @@ public class OutOrderAbnormalImpl extends ServiceImpl<OutOrderAbnormalMapper, Ou
|
||||
? loginUser.getRealname()
|
||||
: loginUser.getUsername();
|
||||
List<OutOrderAbnormal> outOrderAbnormalList = new ArrayList<>();
|
||||
//BigDecimal actualQuantity = BigDecimal.ZERO;
|
||||
for (PickingMaterialDetail pickingMaterialDetail : pickingMaterialDetailList){
|
||||
//actualQuantity = actualQuantity.add(pickingMaterialDetail.getPickingQuantity());
|
||||
//拣货
|
||||
if (pickingMaterialDetail.getPickingQuantity().compareTo(pickingMaterialDetail.getQuantity()) != 0){
|
||||
//判断是否存在异常 根据设置的是否允许超收 取值动态赋值 先默认写死 收货异常
|
||||
BigDecimal pick = pickingMaterialDetail.getPickingQuantity() != null ? pickingMaterialDetail.getPickingQuantity() : BigDecimal.ZERO;
|
||||
BigDecimal alloc = null;
|
||||
if (pickingMaterialDetail.getOutUniqueId() != null && StringUtils.hasText(OutOrderAbnormalBaseDO.getOutOrderNumber())) {
|
||||
OutMaterialDetail omd = outMaterialDetailMapper.selectOne(new LambdaQueryWrapper<OutMaterialDetail>()
|
||||
.eq(OutMaterialDetail::getUniqueId, pickingMaterialDetail.getOutUniqueId())
|
||||
.eq(OutMaterialDetail::getOutOrderNumber, OutOrderAbnormalBaseDO.getOutOrderNumber())
|
||||
.eq(OutMaterialDetail::getDelFlag, 1));
|
||||
if (omd != null && omd.getAllocationQuantity() != null) {
|
||||
alloc = omd.getAllocationQuantity();
|
||||
}
|
||||
}
|
||||
if (alloc == null) {
|
||||
alloc = pickingMaterialDetail.getQuantity() != null ? pickingMaterialDetail.getQuantity() : BigDecimal.ZERO;
|
||||
}
|
||||
// 计划数量=分配数量,作业数量=实际拣货数量
|
||||
if (pick.compareTo(alloc) != 0) {
|
||||
OutOrderAbnormal outOrderAbnormal = new OutOrderAbnormal();
|
||||
//赋值基础数据
|
||||
BeanUtils.copyProperties(OutOrderAbnormalBaseDO, outOrderAbnormal);
|
||||
//赋值物料信息
|
||||
BeanUtils.copyProperties(pickingMaterialDetail, outOrderAbnormal, IgnoreNullUtil.getNullPropertyNames(pickingMaterialDetail));
|
||||
outOrderAbnormal.setAbnormalNumber(OrderSequence.getOrderCode("JHYC"));
|
||||
outOrderAbnormal.setAbnormalType(1);
|
||||
outOrderAbnormal.setActualQuantity(pickingMaterialDetail.getPickingQuantity());
|
||||
if (pickingMaterialDetail.getPickingQuantity().compareTo(pickingMaterialDetail.getQuantity()) > 0){
|
||||
//拣货数量大于分配数量
|
||||
outOrderAbnormal.setAbnormalReason("拣货数量大于分配数量");
|
||||
}else if (pickingMaterialDetail.getPickingQuantity().compareTo(pickingMaterialDetail.getQuantity()) < 0){
|
||||
//拣货数量小于分配数量
|
||||
outOrderAbnormal.setAbnormalReason("拣货数量小于分配数量");
|
||||
outOrderAbnormal.setQuantity(alloc);
|
||||
outOrderAbnormal.setActualQuantity(pick);
|
||||
outOrderAbnormal.setAbnormalActualQuantity(pick.subtract(alloc));
|
||||
if (pick.compareTo(alloc) > 0) {
|
||||
outOrderAbnormal.setAbnormalReason("实际拣货数量大于分配数量");
|
||||
} else {
|
||||
outOrderAbnormal.setAbnormalReason("实际拣货数量小于分配数量");
|
||||
}
|
||||
outOrderAbnormal.setAbnormalActualQuantity(pickingMaterialDetail.getPickingQuantity().subtract(pickingMaterialDetail.getQuantity()));
|
||||
outOrderAbnormal.setCreateBy(loginUser.getUserid());
|
||||
outOrderAbnormal.setCreateByName(userRealName);
|
||||
outOrderAbnormal.setCreateTime(new Date());
|
||||
@@ -230,12 +276,7 @@ public class OutOrderAbnormalImpl extends ServiceImpl<OutOrderAbnormalMapper, Ou
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 复核数量与拣货数量不符,完成收货会生成复核异常记录
|
||||
* @author ZhouGY
|
||||
* @date 2024/5/24 11:45
|
||||
* @param OutOrderAbnormalBaseDO
|
||||
* @param outMaterialDetailList
|
||||
* @return List<InOrderAbnormal>
|
||||
* 复核异常:计划数量=拣货数量,作业数量=实际复核数量;二者不一致时生成记录。
|
||||
*/
|
||||
private List<OutOrderAbnormal> genCheckOrderMaterialDetailList(OutOrderAbnormalBaseDO OutOrderAbnormalBaseDO, List<OutMaterialDetail> outMaterialDetailList){
|
||||
LoginUser loginUser = SecurityUtils.getLoginUser();
|
||||
@@ -248,26 +289,23 @@ public class OutOrderAbnormalImpl extends ServiceImpl<OutOrderAbnormalMapper, Ou
|
||||
: loginUser.getUsername();
|
||||
List<OutOrderAbnormal> outOrderAbnormalList = new ArrayList<>();
|
||||
for (OutMaterialDetail outMaterialDetail : outMaterialDetailList){
|
||||
//复核
|
||||
if (outMaterialDetail.getCheckQuantity().compareTo(outMaterialDetail.getAllocationQuantity()) != 0){
|
||||
//判断是否存在异常 根据设置的是否允许超收 取值动态赋值 先默认写死 收货异常
|
||||
BigDecimal pick = outMaterialDetail.getPickingQuantity() != null ? outMaterialDetail.getPickingQuantity() : BigDecimal.ZERO;
|
||||
BigDecimal check = outMaterialDetail.getCheckQuantity() != null ? outMaterialDetail.getCheckQuantity() : BigDecimal.ZERO;
|
||||
// 计划数量=拣货数量,作业数量=实际复核数量(复核数量)
|
||||
if (check.compareTo(pick) != 0) {
|
||||
OutOrderAbnormal outOrderAbnormal = new OutOrderAbnormal();
|
||||
//赋值基础数据
|
||||
BeanUtils.copyProperties(OutOrderAbnormalBaseDO, outOrderAbnormal);
|
||||
//赋值物料信息
|
||||
BeanUtils.copyProperties(outMaterialDetail, outOrderAbnormal, IgnoreNullUtil.getNullPropertyNames(outMaterialDetail));
|
||||
outOrderAbnormal.setAbnormalNumber(OrderSequence.getOrderCode("FHYC"));
|
||||
outOrderAbnormal.setAbnormalType(2);//复核异常
|
||||
outOrderAbnormal.setActualQuantity(outMaterialDetail.getCheckQuantity());
|
||||
outOrderAbnormal.setQuantity(outMaterialDetail.getAllocationQuantity());
|
||||
if (outMaterialDetail.getCheckQuantity().compareTo(outMaterialDetail.getPickingQuantity()) > 0){
|
||||
//复核数量大于拣货数量
|
||||
outOrderAbnormal.setQuantity(pick);
|
||||
outOrderAbnormal.setActualQuantity(check);
|
||||
outOrderAbnormal.setAbnormalActualQuantity(check.subtract(pick));
|
||||
if (check.compareTo(pick) > 0) {
|
||||
outOrderAbnormal.setAbnormalReason("复核数量大于拣货数量");
|
||||
}else if (outMaterialDetail.getCheckQuantity().compareTo(outMaterialDetail.getPickingQuantity()) < 0){
|
||||
//复核数量小于拣货数量
|
||||
} else {
|
||||
outOrderAbnormal.setAbnormalReason("复核数量小于拣货数量");
|
||||
}
|
||||
outOrderAbnormal.setAbnormalActualQuantity(outMaterialDetail.getCheckQuantity().subtract(outMaterialDetail.getPickingQuantity()));
|
||||
outOrderAbnormal.setCreateBy(loginUser.getUserid());
|
||||
outOrderAbnormal.setCreateByName(userRealName);
|
||||
outOrderAbnormal.setCreateTime(new Date());
|
||||
|
||||
+4
-4
@@ -57,16 +57,16 @@ public class OutOrderAbnormalPO extends BaseVOEntity {
|
||||
@Excel(name = "类型:1-拣货 2-复核")
|
||||
private Integer type;
|
||||
|
||||
@ApiModelProperty("计划数量")
|
||||
@ApiModelProperty("计划数量:拣货异常=分配数量;复核异常=拣货数量")
|
||||
@Excel(name = "计划数量")
|
||||
private BigDecimal quantity;
|
||||
|
||||
@ApiModelProperty("作业数量")
|
||||
@ApiModelProperty("作业数量:拣货异常=实际拣货数量;复核异常=实际复核数量")
|
||||
@Excel(name = "作业数量")
|
||||
private BigDecimal actualQuantity;
|
||||
|
||||
@ApiModelProperty("异常数量 = 作业数量 - 计划数量")
|
||||
@Excel(name = "异常数量 = 作业数量 - 计划数量")
|
||||
@ApiModelProperty("异常数量 = 作业数量 - 计划数量(符号与业务比较一致)")
|
||||
@Excel(name = "异常数量 = 作业数量 - 计划数量")
|
||||
private BigDecimal abnormalActualQuantity;
|
||||
|
||||
@ApiModelProperty("异常类型: 1-拣货异常 2-复核异常")
|
||||
|
||||
+8
@@ -296,4 +296,12 @@ public class PickingMaterialDetailPO extends BaseVOEntity {
|
||||
@ApiModelProperty("贴标费")
|
||||
@Excel(name = "贴标费")
|
||||
private BigDecimal stickerFee;
|
||||
|
||||
@ApiModelProperty("出库异常明细:计划数量(拣货异常场景=出库明细分配数量)")
|
||||
@TableField(exist = false)
|
||||
private BigDecimal abnormalPlanQuantity;
|
||||
|
||||
@ApiModelProperty("出库异常明细:作业数量(拣货异常场景=实际拣货数量)")
|
||||
@TableField(exist = false)
|
||||
private BigDecimal abnormalWorkQuantity;
|
||||
}
|
||||
+83
@@ -16,8 +16,11 @@ import com.mhd.wms.domain.reviewOrder.entity.ReviewMaterialDetail;
|
||||
import com.mhd.wms.domain.reviewOrder.entity.ReviewOrder;
|
||||
import com.mhd.wms.domain.reviewOrder.repository.mapper.ReviewMaterialDetailMapper;
|
||||
import com.mhd.wms.domain.reviewOrder.repository.mapper.ReviewOrderMapper;
|
||||
import com.mhd.wms.domain.stockOutTaskOrder.repository.facade.IStockOutTaskOrderService;
|
||||
import com.mhd.wms.domain.stockOutTaskOrder.repository.todo.StockOutTaskOrderDO;
|
||||
import com.mhd.wms.domain.stockOutOrder.entity.StockOutOrder;
|
||||
import com.mhd.wms.domain.stockOutOrder.repository.facade.IStockOutOrderService;
|
||||
import com.mhd.wms.domain.taskPickingMaterialDetail.repository.todo.TaskPickingMaterialDetailDO;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
@@ -51,6 +54,8 @@ public class ReviewOrderDomainService {
|
||||
|
||||
@Autowired
|
||||
private IStockOutOrderService stockOutOrderService;
|
||||
@Autowired
|
||||
private IStockOutTaskOrderService stockOutTaskOrderService;
|
||||
|
||||
/**
|
||||
* 拣货全部完成后,若出库单需要复核,则生成复核单头+明细,并将出库单状态置为「复核中」(8)。
|
||||
@@ -150,6 +155,8 @@ public class ReviewOrderDomainService {
|
||||
reviewMaterialDetailMapper.insert(row);
|
||||
}
|
||||
}
|
||||
// 复核也生成作业单(同拣货作业单表结构),用于作业任务跟踪
|
||||
genStockOutTaskOrderForReview(header, loginUser, now);
|
||||
|
||||
StockOutOrder statusUpdate = new StockOutOrder();
|
||||
statusUpdate.setStatus(8);
|
||||
@@ -254,6 +261,82 @@ public class ReviewOrderDomainService {
|
||||
return d;
|
||||
}
|
||||
|
||||
/**
|
||||
* 复核单生成后,同步生成一张作业单到 stock_out_task_order(结构与拣货作业单一致)。
|
||||
*/
|
||||
private void genStockOutTaskOrderForReview(ReviewOrder header, LoginUser loginUser, Date now) {
|
||||
if (header == null || header.getReviewOrderNumber() == null) {
|
||||
return;
|
||||
}
|
||||
// 防重复:同一个复核单号只生成一张作业单
|
||||
long exists = stockOutTaskOrderService.count(new LambdaQueryWrapper<com.mhd.wms.domain.stockOutTaskOrder.entity.StockOutTaskOrder>()
|
||||
.eq(com.mhd.wms.domain.stockOutTaskOrder.entity.StockOutTaskOrder::getPickingOrderNumber, header.getReviewOrderNumber())
|
||||
.eq(com.mhd.wms.domain.stockOutTaskOrder.entity.StockOutTaskOrder::getDelFlag, 1));
|
||||
if (exists > 0) {
|
||||
return;
|
||||
}
|
||||
List<ReviewMaterialDetail> reviewRows = reviewMaterialDetailMapper.selectList(new LambdaQueryWrapper<ReviewMaterialDetail>()
|
||||
.eq(ReviewMaterialDetail::getReviewOrderId, header.getReviewOrderId())
|
||||
.eq(ReviewMaterialDetail::getDelFlag, 1));
|
||||
if (reviewRows == null || reviewRows.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
StockOutTaskOrderDO taskDO = new StockOutTaskOrderDO();
|
||||
taskDO.setOrganizationId(header.getOrganizationId());
|
||||
taskDO.setOrganizationName(header.getOrganizationName());
|
||||
taskDO.setTopOrganizationId(header.getTopOrganizationId());
|
||||
taskDO.setWarehouseId(header.getWarehouseId());
|
||||
taskDO.setWarehouseCode(header.getWarehouseCode());
|
||||
taskDO.setWarehouseName(header.getWarehouseName());
|
||||
taskDO.setShipperId(header.getCustomerId());
|
||||
taskDO.setShipperName(header.getCustomerName());
|
||||
taskDO.setOrderNumber(header.getOutOrderNumber());
|
||||
taskDO.setPickingOrderNumber(header.getReviewOrderNumber());
|
||||
taskDO.setSerialNumber(OrderSequence.getOrderCode("FHZYLS"));
|
||||
taskDO.setTaskNumber(OrderSequence.getOrderCode("FHZY"));
|
||||
taskDO.setStatus(1);
|
||||
// 复用字段:type=1 代表按单作业(与拣货任务一致口径)
|
||||
taskDO.setType(1);
|
||||
taskDO.setOperatorsBy(loginUser != null ? loginUser.getUserid() : null);
|
||||
taskDO.setOperatorsName(resolveLoginDisplayName(loginUser));
|
||||
taskDO.setCreateBy(loginUser != null ? loginUser.getUserid() : null);
|
||||
taskDO.setCreateByName(resolveLoginDisplayName(loginUser));
|
||||
taskDO.setCreateTime(now);
|
||||
taskDO.setUpdateBy(loginUser != null ? loginUser.getUserid() : null);
|
||||
taskDO.setUpdateByName(resolveLoginDisplayName(loginUser));
|
||||
taskDO.setUpdateTime(now);
|
||||
|
||||
List<TaskPickingMaterialDetailDO> detailDOList = reviewRows.stream().map(r -> {
|
||||
TaskPickingMaterialDetailDO d = new TaskPickingMaterialDetailDO();
|
||||
d.setMaterialDetailId(r.getMaterialDetailId());
|
||||
d.setOrganizationId(header.getOrganizationId());
|
||||
d.setOrganizationName(header.getOrganizationName());
|
||||
d.setTopOrganizationId(header.getTopOrganizationId());
|
||||
d.setMaterialBaseInfoId(r.getMaterialBaseInfoId());
|
||||
d.setMaterialCode(r.getMaterialCode());
|
||||
d.setMaterialName(r.getMaterialName());
|
||||
d.setBarCode(r.getBarCode());
|
||||
d.setQuantity(r.getPendingReviewQty());
|
||||
d.setActualQuantity(r.getPendingReviewQty());
|
||||
d.setPickingQuantity(BigDecimal.ZERO);
|
||||
d.setPickingStatus(1);
|
||||
d.setUnitCode(r.getUnitCode());
|
||||
d.setUnitName(r.getUnitName());
|
||||
d.setBatchNumber(r.getBatchNumber());
|
||||
d.setRemark(r.getRemark());
|
||||
d.setTotalNetWeight(r.getNetWeightKg());
|
||||
d.setTotalGrossWeight(r.getGrossWeightKg());
|
||||
d.setTotalVolume(r.getVolumeCbm());
|
||||
d.setTotalArea(r.getAreaSqm());
|
||||
d.setPickingUniqueId(r.getOutUniqueId());
|
||||
return d;
|
||||
}).collect(java.util.stream.Collectors.toList());
|
||||
taskDO.setTaskPickingMaterialDetailList(detailDOList);
|
||||
|
||||
stockOutTaskOrderService.genStockPickingTaskOrder(java.util.Collections.singletonList(taskDO));
|
||||
}
|
||||
|
||||
/** 与拣货领域一致:优先 userPo.userName(姓名),其次 LoginUser.realname,最后 username(账号兜底) */
|
||||
private static String resolveLoginDisplayName(LoginUser loginUser) {
|
||||
if (loginUser == null) {
|
||||
|
||||
+12
-6
@@ -56,6 +56,12 @@ public class StockOutTaskOrderPO extends BaseVOEntity {
|
||||
@Excel(name = "拣货类型:1-按单拣货 2-按品拣货")
|
||||
private Integer type;
|
||||
|
||||
@ApiModelProperty("作业任务类型:3-拣货 4-复核")
|
||||
private Integer taskType;
|
||||
|
||||
@ApiModelProperty("状态名称(按任务类型区分)")
|
||||
private String statusName;
|
||||
|
||||
@ApiModelProperty("仓库id")
|
||||
@Excel(name = "仓库id")
|
||||
private Long warehouseId;
|
||||
@@ -84,19 +90,19 @@ public class StockOutTaskOrderPO extends BaseVOEntity {
|
||||
@Excel(name = "拣货单号")
|
||||
private String pickingOrderNumber;
|
||||
|
||||
@ApiModelProperty("物料总数量")
|
||||
@Excel(name = "物料总数量")
|
||||
@ApiModelProperty("计划数量(明细计划数量汇总,与作业明细 quantity 一致)")
|
||||
@Excel(name = "计划数量")
|
||||
private BigDecimal quantity;
|
||||
|
||||
@ApiModelProperty("物料种类数")
|
||||
@ApiModelProperty("物料种类数(列表中为按品汇总后的种类数,用于进度展示)")
|
||||
@Excel(name = "物料种类数")
|
||||
private Integer materialQuantity;
|
||||
|
||||
@ApiModelProperty("拣货数量")
|
||||
@Excel(name = "拣货数量")
|
||||
@ApiModelProperty("作业数量(已拣货/已复核等明细作业量汇总,与作业明细 pickingQuantity 一致)")
|
||||
@Excel(name = "作业数量")
|
||||
private BigDecimal pickingQuantity;
|
||||
|
||||
@ApiModelProperty("拣货物料种数")
|
||||
@ApiModelProperty("已完成作业的种类数(列表进度用)")
|
||||
@Excel(name = "拣货物料种数")
|
||||
private Integer pickingMaterialQuantity;
|
||||
|
||||
|
||||
+3
@@ -54,6 +54,9 @@ public class StockOutTaskOrderDO extends BaseVOEntity {
|
||||
@Excel(name = "拣货类型:1-按单拣货 2-按品拣货")
|
||||
private Integer type;
|
||||
|
||||
@ApiModelProperty("作业任务类型:3-拣货 4-复核")
|
||||
private Integer taskType;
|
||||
|
||||
@ApiModelProperty("仓库id")
|
||||
@Excel(name = "仓库id")
|
||||
private Long warehouseId;
|
||||
|
||||
+156
-19
@@ -53,6 +53,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
@@ -102,19 +103,28 @@ public class StockOutTaskOrderDomainService {
|
||||
|
||||
/**
|
||||
* 分页查询拣货作业单列表
|
||||
* 列表返回前补充拣货进度:materialQuantity=拣货明细种类数,pickingMaterialQuantity=已完成种类数,用于显示 已完成数/总数
|
||||
* 列表返回前:从作业明细汇总计划数量 quantity、作业数量 pickingQuantity;并补充种类进度 materialQuantity / pickingMaterialQuantity
|
||||
*/
|
||||
public List<StockOutTaskOrderPO> queryList(StockOutTaskOrderDO stockOutTaskOrderDO) {
|
||||
List<StockOutTaskOrderPO> list = stockOutTaskOrderService.queryList(stockOutTaskOrderDO);
|
||||
if (CollectionUtil.isEmpty(list)) {
|
||||
return list;
|
||||
}
|
||||
list.forEach(this::fillTaskTypeAndStatusName);
|
||||
if (stockOutTaskOrderDO != null && stockOutTaskOrderDO.getTaskType() != null) {
|
||||
list = list.stream()
|
||||
.filter(p -> stockOutTaskOrderDO.getTaskType().equals(p.getTaskType()))
|
||||
.collect(Collectors.toList());
|
||||
if (CollectionUtil.isEmpty(list)) {
|
||||
return list;
|
||||
}
|
||||
}
|
||||
enrichListWithPickingProgress(list);
|
||||
return list;
|
||||
}
|
||||
|
||||
/**
|
||||
* 为拣货作业单列表补充拣货进度(materialQuantity、pickingMaterialQuantity)
|
||||
* 为拣货作业单列表补充:计划数量/作业数量(明细汇总)及按品种类进度
|
||||
*/
|
||||
private void enrichListWithPickingProgress(List<StockOutTaskOrderPO> list) {
|
||||
List<String> taskNumberList = list.stream()
|
||||
@@ -131,19 +141,28 @@ public class StockOutTaskOrderDomainService {
|
||||
if (CollectionUtils.isEmpty(detailList)) {
|
||||
return;
|
||||
}
|
||||
// 按 task_number -> material_base_info_id 分组,汇总 quantity、pickingQuantity
|
||||
Map<String, Map<Long, List<TaskPickingMaterialDetail>>> taskToMaterialMap = detailList.stream()
|
||||
.collect(Collectors.groupingBy(TaskPickingMaterialDetail::getTaskNumber,
|
||||
Collectors.groupingBy(TaskPickingMaterialDetail::getMaterialBaseInfoId)));
|
||||
Map<String, List<TaskPickingMaterialDetail>> detailsByTask = detailList.stream()
|
||||
.collect(Collectors.groupingBy(TaskPickingMaterialDetail::getTaskNumber));
|
||||
for (StockOutTaskOrderPO po : list) {
|
||||
String taskNumber = po.getTaskNumber();
|
||||
if (taskNumber == null) {
|
||||
continue;
|
||||
}
|
||||
Map<Long, List<TaskPickingMaterialDetail>> materialMap = taskToMaterialMap.get(taskNumber);
|
||||
if (materialMap == null || materialMap.isEmpty()) {
|
||||
List<TaskPickingMaterialDetail> taskDetails = detailsByTask.get(taskNumber);
|
||||
if (taskDetails == null || taskDetails.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
BigDecimal planSum = BigDecimal.ZERO;
|
||||
BigDecimal workSum = BigDecimal.ZERO;
|
||||
for (TaskPickingMaterialDetail d : taskDetails) {
|
||||
planSum = planSum.add(d.getQuantity() != null ? d.getQuantity() : BigDecimal.ZERO);
|
||||
workSum = workSum.add(d.getPickingQuantity() != null ? d.getPickingQuantity() : BigDecimal.ZERO);
|
||||
}
|
||||
po.setQuantity(planSum);
|
||||
po.setPickingQuantity(workSum);
|
||||
|
||||
Map<Long, List<TaskPickingMaterialDetail>> materialMap = taskDetails.stream()
|
||||
.collect(Collectors.groupingBy(TaskPickingMaterialDetail::getMaterialBaseInfoId));
|
||||
int totalMaterialQuantity = materialMap.size();
|
||||
int completedMaterialQuantity = 0;
|
||||
for (List<TaskPickingMaterialDetail> materialDetails : materialMap.values()) {
|
||||
@@ -191,11 +210,13 @@ public class StockOutTaskOrderDomainService {
|
||||
public StockOutTaskOrderPO getInfo(Long outTaskOrderId)
|
||||
{
|
||||
StockOutTaskOrderPO stockOutTaskOrderPO = stockOutTaskOrderService.getInfo(outTaskOrderId);
|
||||
fillTaskTypeAndStatusName(stockOutTaskOrderPO);
|
||||
TaskPickingMaterialDetailDO taskPickingMaterialDetailDO = new TaskPickingMaterialDetailDO();
|
||||
taskPickingMaterialDetailDO.setTaskNumber(stockOutTaskOrderPO.getTaskNumber());
|
||||
List<TaskPickingMaterialDetailPO> taskPickingMaterialDetailPOList = taskPickingMaterialDetailService.queryList(taskPickingMaterialDetailDO);
|
||||
enrichTaskDetailPlanAndWork(stockOutTaskOrderPO, taskPickingMaterialDetailPOList);
|
||||
Map<Long, List<TaskPickingMaterialDetailPO>> taskPickingMaterialDetailPOMap = taskPickingMaterialDetailPOList.stream().collect(Collectors.groupingBy(TaskPickingMaterialDetailPO::getMaterialBaseInfoId));
|
||||
int totalPickingMaterialQuantity = 0;//拣货单按库位分组 统计已拣货进度
|
||||
int totalPickingMaterialQuantity = 0;//拣货单按物料分组 统计已拣货进度
|
||||
for (Map.Entry<Long, List<TaskPickingMaterialDetailPO>> map : taskPickingMaterialDetailPOMap.entrySet()){
|
||||
List<TaskPickingMaterialDetailPO> taskPickingMaterialDetailPOListByMaterial = map.getValue();
|
||||
if (CollectionUtil.isEmpty(taskPickingMaterialDetailPOListByMaterial)){
|
||||
@@ -207,9 +228,10 @@ public class StockOutTaskOrderDomainService {
|
||||
BigDecimal pickingQuantity = BigDecimal.ZERO;
|
||||
BigDecimal waitPickingQuantity = BigDecimal.ZERO;
|
||||
for (TaskPickingMaterialDetailPO taskPickingMaterialDetailPO : taskPickingMaterialDetailPOListByMaterial) {
|
||||
quantity = quantity.add(taskPickingMaterialDetailPO.getQuantity());
|
||||
pickingQuantity = pickingQuantity.add(taskPickingMaterialDetailPO.getPickingQuantity());
|
||||
waitPickingQuantity = waitPickingQuantity.add(taskPickingMaterialDetailPO.getWaitPickingQuantity());
|
||||
quantity = quantity.add(detailPlanForDisplay(taskPickingMaterialDetailPO));
|
||||
pickingQuantity = pickingQuantity.add(detailWorkForDisplay(taskPickingMaterialDetailPO));
|
||||
waitPickingQuantity = waitPickingQuantity.add(taskPickingMaterialDetailPO.getWaitPickingQuantity() != null
|
||||
? taskPickingMaterialDetailPO.getWaitPickingQuantity() : BigDecimal.ZERO);
|
||||
}
|
||||
taskMaterialPO.setQuantity(quantity);
|
||||
taskMaterialPO.setPickingQuantity(pickingQuantity);
|
||||
@@ -234,6 +256,7 @@ public class StockOutTaskOrderDomainService {
|
||||
*/
|
||||
public StockOutTaskOrderPO getInfoByStorageLocation(Long outTaskOrderId) {
|
||||
StockOutTaskOrderPO stockOutTaskOrderPO = stockOutTaskOrderService.getInfo(outTaskOrderId);
|
||||
fillTaskTypeAndStatusName(stockOutTaskOrderPO);
|
||||
TaskPickingMaterialDetailDO taskPickingMaterialDetailDO = new TaskPickingMaterialDetailDO();
|
||||
taskPickingMaterialDetailDO.setTaskNumber(stockOutTaskOrderPO.getTaskNumber());
|
||||
// OutMaterialDetailSerialNumberDO outMaterialDetailSerialNumberDO = new OutMaterialDetailSerialNumberDO();
|
||||
@@ -242,6 +265,7 @@ public class StockOutTaskOrderDomainService {
|
||||
// Map<Long, List<OutMaterialDetailSerialNumberPO>> outMaterialDetailSerialNumberMap = outMaterialDetailSerialNumberPOList.stream()
|
||||
// .collect(Collectors.groupingBy(OutMaterialDetailSerialNumberPO::getMaterialDetailUniqueId));
|
||||
List<TaskPickingMaterialDetailPO> taskPickingMaterialDetailPOList = taskPickingMaterialDetailService.queryList(taskPickingMaterialDetailDO);
|
||||
enrichTaskDetailPlanAndWork(stockOutTaskOrderPO, taskPickingMaterialDetailPOList);
|
||||
Map<Long, List<TaskPickingMaterialDetailPO>> taskPickingMaterialDetailPOMap = taskPickingMaterialDetailPOList.stream().collect(Collectors.groupingBy(TaskPickingMaterialDetailPO::getStorageLocationId));
|
||||
int totalPickingMaterialQuantity = 0;//拣货单按库位分组 统计已拣货进度(含已完成的库位)
|
||||
int totalStorageCount = taskPickingMaterialDetailPOMap.size();
|
||||
@@ -254,8 +278,8 @@ public class StockOutTaskOrderDomainService {
|
||||
BigDecimal quantityAll = BigDecimal.ZERO;
|
||||
BigDecimal pickingQuantityAll = BigDecimal.ZERO;
|
||||
for (TaskPickingMaterialDetailPO d : taskPickingMaterialDetailPOListByStorage) {
|
||||
quantityAll = quantityAll.add(d.getQuantity() != null ? d.getQuantity() : BigDecimal.ZERO);
|
||||
pickingQuantityAll = pickingQuantityAll.add(d.getPickingQuantity() != null ? d.getPickingQuantity() : BigDecimal.ZERO);
|
||||
quantityAll = quantityAll.add(detailPlanForDisplay(d));
|
||||
pickingQuantityAll = pickingQuantityAll.add(detailWorkForDisplay(d));
|
||||
}
|
||||
if (quantityAll.compareTo(BigDecimal.ZERO) > 0 && pickingQuantityAll.compareTo(quantityAll) >= 0){
|
||||
totalPickingMaterialQuantity += 1;
|
||||
@@ -266,8 +290,8 @@ public class StockOutTaskOrderDomainService {
|
||||
BigDecimal pickingQuantity = BigDecimal.ZERO;
|
||||
BigDecimal waitPickingQuantity = BigDecimal.ZERO;
|
||||
for (TaskPickingMaterialDetailPO taskPickingMaterialDetailPO : taskPickingMaterialDetailPOListByStorage) {
|
||||
quantity = quantity.add(taskPickingMaterialDetailPO.getQuantity());
|
||||
pickingQuantity = pickingQuantity.add(taskPickingMaterialDetailPO.getPickingQuantity() != null ? taskPickingMaterialDetailPO.getPickingQuantity() : BigDecimal.ZERO);
|
||||
quantity = quantity.add(detailPlanForDisplay(taskPickingMaterialDetailPO));
|
||||
pickingQuantity = pickingQuantity.add(detailWorkForDisplay(taskPickingMaterialDetailPO));
|
||||
waitPickingQuantity = waitPickingQuantity.add(taskPickingMaterialDetailPO.getWaitPickingQuantity() != null ? taskPickingMaterialDetailPO.getWaitPickingQuantity() : BigDecimal.ZERO);
|
||||
}
|
||||
taskStoragePO.setQuantity(quantity);
|
||||
@@ -297,9 +321,11 @@ public class StockOutTaskOrderDomainService {
|
||||
*/
|
||||
public StockOutTaskOrderPO getInfoByMaterial(Long outTaskOrderId) {
|
||||
StockOutTaskOrderPO stockOutTaskOrderPO = stockOutTaskOrderService.getInfo(outTaskOrderId);;
|
||||
fillTaskTypeAndStatusName(stockOutTaskOrderPO);
|
||||
TaskPickingMaterialDetailDO taskPickingMaterialDetailDO = new TaskPickingMaterialDetailDO();
|
||||
taskPickingMaterialDetailDO.setTaskNumber(stockOutTaskOrderPO.getTaskNumber());
|
||||
List<TaskPickingMaterialDetailPO> taskPickingMaterialDetailPOList = taskPickingMaterialDetailService.queryList(taskPickingMaterialDetailDO);
|
||||
enrichTaskDetailPlanAndWork(stockOutTaskOrderPO, taskPickingMaterialDetailPOList);
|
||||
Map<Long, List<TaskPickingMaterialDetailPO>> taskPickingMaterialDetailPOMap = taskPickingMaterialDetailPOList.stream().collect(Collectors.groupingBy(TaskPickingMaterialDetailPO::getMaterialBaseInfoId));
|
||||
int totalPickingMaterialQuantity = 0;//拣货单按物料分组 统计已拣货进度
|
||||
List<TaskMaterialPO> taskMaterialPOList = new ArrayList<>();
|
||||
@@ -314,9 +340,10 @@ public class StockOutTaskOrderDomainService {
|
||||
BigDecimal pickingQuantity = BigDecimal.ZERO;
|
||||
BigDecimal waitPickingQuantity = BigDecimal.ZERO;
|
||||
for (TaskPickingMaterialDetailPO taskPickingMaterialDetailPO : taskPickingMaterialDetailPOListByMaterial) {
|
||||
quantity = quantity.add(taskPickingMaterialDetailPO.getQuantity());
|
||||
pickingQuantity = pickingQuantity.add(taskPickingMaterialDetailPO.getPickingQuantity());
|
||||
waitPickingQuantity = waitPickingQuantity.add(taskPickingMaterialDetailPO.getWaitPickingQuantity());
|
||||
quantity = quantity.add(detailPlanForDisplay(taskPickingMaterialDetailPO));
|
||||
pickingQuantity = pickingQuantity.add(detailWorkForDisplay(taskPickingMaterialDetailPO));
|
||||
waitPickingQuantity = waitPickingQuantity.add(taskPickingMaterialDetailPO.getWaitPickingQuantity() != null
|
||||
? taskPickingMaterialDetailPO.getWaitPickingQuantity() : BigDecimal.ZERO);
|
||||
}
|
||||
taskMaterialPO.setQuantity(quantity);
|
||||
taskMaterialPO.setPickingQuantity(pickingQuantity);
|
||||
@@ -343,6 +370,116 @@ public class StockOutTaskOrderDomainService {
|
||||
return stockOutTaskOrderPO;
|
||||
}
|
||||
|
||||
/**
|
||||
* 统一出库作业任务类型:3-拣货 4-复核(按作业单号前缀识别)
|
||||
*/
|
||||
private void fillTaskTypeAndStatusName(StockOutTaskOrderPO po) {
|
||||
if (po == null) {
|
||||
return;
|
||||
}
|
||||
String taskNumber = po.getTaskNumber();
|
||||
if (taskNumber == null) {
|
||||
return;
|
||||
}
|
||||
if (taskNumber.startsWith("FHZY")) {
|
||||
po.setTaskType(4);
|
||||
po.setStatusName(mapReviewStatusName(po.getStatus()));
|
||||
} else {
|
||||
po.setTaskType(3);
|
||||
po.setStatusName(mapPickingStatusName(po.getStatus()));
|
||||
}
|
||||
}
|
||||
|
||||
private String mapPickingStatusName(Integer status) {
|
||||
if (status == null) {
|
||||
return null;
|
||||
}
|
||||
switch (status) {
|
||||
case 1:
|
||||
return "待拣货";
|
||||
case 2:
|
||||
return "拣货中";
|
||||
case 3:
|
||||
return "已拣货";
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private String mapReviewStatusName(Integer status) {
|
||||
if (status == null) {
|
||||
return null;
|
||||
}
|
||||
switch (status) {
|
||||
case 1:
|
||||
return "待复核";
|
||||
case 2:
|
||||
return "复核中";
|
||||
case 3:
|
||||
return "已复核";
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 作业单详情:按任务类型写入明细上的计划/作业展示数量(关联出库明细)
|
||||
*/
|
||||
private void enrichTaskDetailPlanAndWork(StockOutTaskOrderPO header, List<TaskPickingMaterialDetailPO> lines) {
|
||||
if (header == null || CollectionUtil.isEmpty(lines)) {
|
||||
return;
|
||||
}
|
||||
fillTaskTypeAndStatusName(header);
|
||||
Integer taskType = header.getTaskType();
|
||||
String outOrderNumber = header.getOrderNumber();
|
||||
if (taskType == null || !StringUtils.hasText(outOrderNumber)) {
|
||||
return;
|
||||
}
|
||||
for (TaskPickingMaterialDetailPO line : lines) {
|
||||
if (line.getPickingUniqueId() == null) {
|
||||
continue;
|
||||
}
|
||||
OutMaterialDetail omd = outMaterialDetailMapper.selectOne(new LambdaQueryWrapper<OutMaterialDetail>()
|
||||
.eq(OutMaterialDetail::getOutOrderNumber, outOrderNumber)
|
||||
.eq(OutMaterialDetail::getUniqueId, line.getPickingUniqueId())
|
||||
.eq(OutMaterialDetail::getDelFlag, 1));
|
||||
if (omd == null) {
|
||||
continue;
|
||||
}
|
||||
if (Integer.valueOf(4).equals(taskType)) {
|
||||
line.setPlanQuantity(omd.getPickingQuantity());
|
||||
line.setWorkQuantity(omd.getCheckQuantity());
|
||||
} else {
|
||||
BigDecimal alloc = omd.getAllocationQuantity();
|
||||
if (alloc == null) {
|
||||
alloc = omd.getQuantity();
|
||||
}
|
||||
line.setPlanQuantity(alloc);
|
||||
line.setWorkQuantity(line.getPickingQuantity());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static BigDecimal detailPlanForDisplay(TaskPickingMaterialDetailPO d) {
|
||||
if (d == null) {
|
||||
return BigDecimal.ZERO;
|
||||
}
|
||||
if (d.getPlanQuantity() != null) {
|
||||
return d.getPlanQuantity();
|
||||
}
|
||||
return d.getQuantity() != null ? d.getQuantity() : BigDecimal.ZERO;
|
||||
}
|
||||
|
||||
private static BigDecimal detailWorkForDisplay(TaskPickingMaterialDetailPO d) {
|
||||
if (d == null) {
|
||||
return BigDecimal.ZERO;
|
||||
}
|
||||
if (d.getWorkQuantity() != null) {
|
||||
return d.getWorkQuantity();
|
||||
}
|
||||
return d.getPickingQuantity() != null ? d.getPickingQuantity() : BigDecimal.ZERO;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 按物料拣货
|
||||
* @author ZhouGY
|
||||
|
||||
+9
@@ -1,5 +1,6 @@
|
||||
package com.mhd.wms.domain.taskPickingMaterialDetail.repository.po;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import com.mhd.common.core.annotation.Excel;
|
||||
@@ -226,4 +227,12 @@ public class TaskPickingMaterialDetailPO extends BaseVOEntity {
|
||||
@ApiModelProperty("尺寸")
|
||||
private String size;
|
||||
|
||||
@ApiModelProperty("作业单详情-计划数量:拣货作业=出库分配数量;复核作业=出库拣货数量(与 quantity 并存,优先本字段展示)")
|
||||
@TableField(exist = false)
|
||||
private BigDecimal planQuantity;
|
||||
|
||||
@ApiModelProperty("作业单详情-作业数量:拣货作业=实际拣货数量;复核作业=实际复核数量(与 pickingQuantity 并存,优先本字段展示)")
|
||||
@TableField(exist = false)
|
||||
private BigDecimal workQuantity;
|
||||
|
||||
}
|
||||
|
||||
+9
-6
@@ -52,6 +52,9 @@ public class StockOutTaskOrderDTO extends BaseVOEntity {
|
||||
@Excel(name = "拣货类型:1-按单拣货 2-按品拣货")
|
||||
private Integer type;
|
||||
|
||||
@ApiModelProperty("作业任务类型:3-拣货 4-复核")
|
||||
private Integer taskType;
|
||||
|
||||
@ApiModelProperty("仓库id")
|
||||
@Excel(name = "仓库id")
|
||||
private Long warehouseId;
|
||||
@@ -80,19 +83,19 @@ public class StockOutTaskOrderDTO extends BaseVOEntity {
|
||||
@Excel(name = "拣货单号")
|
||||
private String pickingOrderNumber;
|
||||
|
||||
@ApiModelProperty("物料总数量")
|
||||
@Excel(name = "物料总数量")
|
||||
@ApiModelProperty("计划数量(明细计划数量汇总)")
|
||||
@Excel(name = "计划数量")
|
||||
private BigDecimal quantity;
|
||||
|
||||
@ApiModelProperty("物料种类数")
|
||||
@ApiModelProperty("物料种类数(列表进度用)")
|
||||
@Excel(name = "物料种类数")
|
||||
private Integer materialQuantity;
|
||||
|
||||
@ApiModelProperty("拣货数量")
|
||||
@Excel(name = "拣货数量")
|
||||
@ApiModelProperty("作业数量(已作业量汇总)")
|
||||
@Excel(name = "作业数量")
|
||||
private BigDecimal pickingQuantity;
|
||||
|
||||
@ApiModelProperty("拣货物料种数")
|
||||
@ApiModelProperty("已完成作业的种类数(列表进度用)")
|
||||
@Excel(name = "拣货物料种数")
|
||||
private Integer pickingMaterialQuantity;
|
||||
|
||||
|
||||
@@ -20,6 +20,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<result property="shipperName" column="shipper_name" />
|
||||
<result property="orderNumber" column="order_number" />
|
||||
<result property="pickingOrderNumber" column="picking_order_number" />
|
||||
<result property="quantity" column="quantity" />
|
||||
<result property="materialQuantity" column="material_quantity" />
|
||||
<result property="pickingQuantity" column="picking_quantity" />
|
||||
<result property="pickingMaterialQuantity" column="picking_material_quantity" />
|
||||
<result property="storageSectionId" column="storage_section_id" />
|
||||
<result property="storageCode" column="storage_code" />
|
||||
<result property="storageName" column="storage_name" />
|
||||
<result property="storageLocationId" column="storage_location_id" />
|
||||
<result property="storageLocationCode" column="storage_location_code" />
|
||||
<result property="storageLocationName" column="storage_location_name" />
|
||||
<result property="abnormal" column="abnormal" />
|
||||
<result property="operatorsBy" column="operators_by" />
|
||||
<result property="operatorsName" column="operators_name" />
|
||||
|
||||
Reference in New Issue
Block a user