diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/reviewOrder/ReviewOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/reviewOrder/ReviewOrderApplicationService.java index 3bb137f05..a5a7a8e7a 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/reviewOrder/ReviewOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/reviewOrder/ReviewOrderApplicationService.java @@ -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 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 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 reviewOrderPOList, LoginUser loginUser) { + if (CollectionUtils.isEmpty(reviewOrderPOList)) { + return; + } + Date now = new Date(); + String userRealName = resolveLoginDisplayName(loginUser); + List taskOrderDOList = new ArrayList<>(); + for (ReviewOrderPO reviewOrderPO : reviewOrderPOList) { + if (reviewOrderPO == null || !StringUtils.hasText(reviewOrderPO.getReviewOrderNumber())) { + continue; + } + // 防重:同复核单号只生成一张作业单 + long exists = stockOutTaskOrderService.count(new LambdaQueryWrapper() + .eq(StockOutTaskOrder::getPickingOrderNumber, reviewOrderPO.getReviewOrderNumber()) + .eq(StockOutTaskOrder::getDelFlag, 1)); + if (exists > 0) { + continue; + } + List 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 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 点击确认时一致),再参与待复核校验与出库同步。 */ diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/po/OutMaterialDetailPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/po/OutMaterialDetailPO.java index 0f9f139d6..7f3e971fb 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/po/OutMaterialDetailPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/po/OutMaterialDetailPO.java @@ -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; } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outOrderAbnormal/repository/persistence/OutOrderAbnormalImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outOrderAbnormal/repository/persistence/OutOrderAbnormalImpl.java index 618b19a15..9e307b089 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outOrderAbnormal/repository/persistence/OutOrderAbnormalImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outOrderAbnormal/repository/persistence/OutOrderAbnormalImpl.java @@ -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() + .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 outMaterialDetailList = pickingMaterialDetailMapper.selectList(new QueryWrapper().lambda() .eq(PickingMaterialDetail::getPickingOrderNumber, outOrderAbnormalBaseDO.getPickingOrderNumber())); - //拣货数量与计划数量不符,完成收货会生成拣货异常记录 + // 实际拣货与分配数量不一致时生成拣货异常记录 outOrderAbnormalList.addAll(genPickingOrderMaterialDetailList(outOrderAbnormalBaseDO, outMaterialDetailList)); }else if (2 == type) { List outMaterialDetailList = outMaterialDetailMapper.selectList(new QueryWrapper().lambda() .eq(OutMaterialDetail::getOutOrderNumber, outOrderAbnormalBaseDO.getOutOrderNumber())); - //复核数量与拣货数量不符,完成收货会生成复核异常记录 + // 复核数量与拣货数量不一致时生成复核异常记录 outOrderAbnormalList.addAll(genCheckOrderMaterialDetailList(outOrderAbnormalBaseDO, outMaterialDetailList)); }else { throw new ServiceException("异常类型错误"); @@ -181,12 +224,7 @@ public class OutOrderAbnormalImpl extends ServiceImpl + * 拣货异常:计划数量=出库明细分配数量,作业数量=实际拣货数量;二者不一致时生成记录。 */ private List genPickingOrderMaterialDetailList(OutOrderAbnormalBaseDO OutOrderAbnormalBaseDO, List pickingMaterialDetailList){ LoginUser loginUser = SecurityUtils.getLoginUser(); @@ -198,28 +236,36 @@ public class OutOrderAbnormalImpl extends ServiceImpl 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() + .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 + * 复核异常:计划数量=拣货数量,作业数量=实际复核数量;二者不一致时生成记录。 */ private List genCheckOrderMaterialDetailList(OutOrderAbnormalBaseDO OutOrderAbnormalBaseDO, List outMaterialDetailList){ LoginUser loginUser = SecurityUtils.getLoginUser(); @@ -248,26 +289,23 @@ public class OutOrderAbnormalImpl extends ServiceImpl 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()); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outOrderAbnormal/repository/po/OutOrderAbnormalPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outOrderAbnormal/repository/po/OutOrderAbnormalPO.java index 6af3b0bab..d3e8b18f3 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outOrderAbnormal/repository/po/OutOrderAbnormalPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outOrderAbnormal/repository/po/OutOrderAbnormalPO.java @@ -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-复核异常") diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingMaterialDetail/repository/po/PickingMaterialDetailPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingMaterialDetail/repository/po/PickingMaterialDetailPO.java index da817617a..ed3b1a0c2 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingMaterialDetail/repository/po/PickingMaterialDetailPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingMaterialDetail/repository/po/PickingMaterialDetailPO.java @@ -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; } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/ReviewOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/ReviewOrderDomainService.java index 5ee095f7a..5cc4fd5e0 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/ReviewOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/ReviewOrderDomainService.java @@ -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() + .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 reviewRows = reviewMaterialDetailMapper.selectList(new LambdaQueryWrapper() + .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 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) { diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/repository/po/StockOutTaskOrderPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/repository/po/StockOutTaskOrderPO.java index b4649caba..502bba4f1 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/repository/po/StockOutTaskOrderPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/repository/po/StockOutTaskOrderPO.java @@ -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; diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/repository/todo/StockOutTaskOrderDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/repository/todo/StockOutTaskOrderDO.java index b369862af..bc54d8b93 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/repository/todo/StockOutTaskOrderDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/repository/todo/StockOutTaskOrderDO.java @@ -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; diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/service/StockOutTaskOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/service/StockOutTaskOrderDomainService.java index 4f3fdaa07..58e5d743c 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/service/StockOutTaskOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/service/StockOutTaskOrderDomainService.java @@ -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 queryList(StockOutTaskOrderDO stockOutTaskOrderDO) { List 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 list) { List taskNumberList = list.stream() @@ -131,19 +141,28 @@ public class StockOutTaskOrderDomainService { if (CollectionUtils.isEmpty(detailList)) { return; } - // 按 task_number -> material_base_info_id 分组,汇总 quantity、pickingQuantity - Map>> taskToMaterialMap = detailList.stream() - .collect(Collectors.groupingBy(TaskPickingMaterialDetail::getTaskNumber, - Collectors.groupingBy(TaskPickingMaterialDetail::getMaterialBaseInfoId))); + Map> detailsByTask = detailList.stream() + .collect(Collectors.groupingBy(TaskPickingMaterialDetail::getTaskNumber)); for (StockOutTaskOrderPO po : list) { String taskNumber = po.getTaskNumber(); if (taskNumber == null) { continue; } - Map> materialMap = taskToMaterialMap.get(taskNumber); - if (materialMap == null || materialMap.isEmpty()) { + List 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> materialMap = taskDetails.stream() + .collect(Collectors.groupingBy(TaskPickingMaterialDetail::getMaterialBaseInfoId)); int totalMaterialQuantity = materialMap.size(); int completedMaterialQuantity = 0; for (List 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 taskPickingMaterialDetailPOList = taskPickingMaterialDetailService.queryList(taskPickingMaterialDetailDO); + enrichTaskDetailPlanAndWork(stockOutTaskOrderPO, taskPickingMaterialDetailPOList); Map> taskPickingMaterialDetailPOMap = taskPickingMaterialDetailPOList.stream().collect(Collectors.groupingBy(TaskPickingMaterialDetailPO::getMaterialBaseInfoId)); - int totalPickingMaterialQuantity = 0;//拣货单按库位分组 统计已拣货进度 + int totalPickingMaterialQuantity = 0;//拣货单按物料分组 统计已拣货进度 for (Map.Entry> map : taskPickingMaterialDetailPOMap.entrySet()){ List 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> outMaterialDetailSerialNumberMap = outMaterialDetailSerialNumberPOList.stream() // .collect(Collectors.groupingBy(OutMaterialDetailSerialNumberPO::getMaterialDetailUniqueId)); List taskPickingMaterialDetailPOList = taskPickingMaterialDetailService.queryList(taskPickingMaterialDetailDO); + enrichTaskDetailPlanAndWork(stockOutTaskOrderPO, taskPickingMaterialDetailPOList); Map> 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 taskPickingMaterialDetailPOList = taskPickingMaterialDetailService.queryList(taskPickingMaterialDetailDO); + enrichTaskDetailPlanAndWork(stockOutTaskOrderPO, taskPickingMaterialDetailPOList); Map> taskPickingMaterialDetailPOMap = taskPickingMaterialDetailPOList.stream().collect(Collectors.groupingBy(TaskPickingMaterialDetailPO::getMaterialBaseInfoId)); int totalPickingMaterialQuantity = 0;//拣货单按物料分组 统计已拣货进度 List 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 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() + .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 diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/taskPickingMaterialDetail/repository/po/TaskPickingMaterialDetailPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/taskPickingMaterialDetail/repository/po/TaskPickingMaterialDetailPO.java index b3c892afb..1c061e0c2 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/taskPickingMaterialDetail/repository/po/TaskPickingMaterialDetailPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/taskPickingMaterialDetail/repository/po/TaskPickingMaterialDetailPO.java @@ -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; + } diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockOutTaskOrder/StockOutTaskOrderDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockOutTaskOrder/StockOutTaskOrderDTO.java index a8489540f..b3b8d9d6c 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockOutTaskOrder/StockOutTaskOrderDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockOutTaskOrder/StockOutTaskOrderDTO.java @@ -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; diff --git a/mhd_wms/src/main/resources/mapper/stockOutTaskOrder/StockOutTaskOrderMapper.xml b/mhd_wms/src/main/resources/mapper/stockOutTaskOrder/StockOutTaskOrderMapper.xml index fee22ad63..da2493a12 100644 --- a/mhd_wms/src/main/resources/mapper/stockOutTaskOrder/StockOutTaskOrderMapper.xml +++ b/mhd_wms/src/main/resources/mapper/stockOutTaskOrder/StockOutTaskOrderMapper.xml @@ -20,6 +20,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + + + + + + +