PDA拣货复核修改

This commit is contained in:
秦鸿展
2026-03-15 11:51:58 +08:00
parent 665c02b18a
commit 93b24f02d8
12 changed files with 229 additions and 37 deletions
@@ -21,6 +21,7 @@ import com.mhd.wms.domain.materialInventory.entity.MaterialInventory;
import com.mhd.wms.domain.materialInventory.repository.mapper.MaterialInventoryMapper;
import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail;
import com.mhd.wms.domain.outMaterialDetail.repository.mapper.OutMaterialDetailMapper;
import com.mhd.wms.domain.pickingMaterialDetail.repository.mapper.PickingMaterialDetailMapper;
import com.mhd.wms.domain.taskHandoverMaterialDetail.repository.po.TaskHandoverMaterialDetailPO;
import com.mhd.wms.domain.shiftManage.repository.po.ShiftManagePO;
import com.mhd.wms.domain.shiftManage.repository.todo.ShiftManageDO;
@@ -61,6 +62,8 @@ public class HandoverTaskOrderDomainService {
private StockOutOrderMapper stockOutOrderMapper;
@Autowired
private IDeliveTaskService deliveTaskService;
@Autowired
private PickingMaterialDetailMapper pickingMaterialDetailMapper;
/**
@@ -95,7 +98,8 @@ public class HandoverTaskOrderDomainService {
/**
* 获取交接作业单详细信息
* 物料明细根据复核单(out_material_detail)数据生成,数量使用复核数量(check_quantity),不需要复核时使用拣货数量(picking_quantity
* 需要复核时:仅从复核单取明细(picking_material_detail 有拣货的 out_unique_id + check_quantity>0),复核几条生成几条
* 不需要复核时:从出库单取 picking_quantity>0 的明细
*/
public HandoverTaskOrderPO getInfo(Long outTaskOrderId)
{
@@ -103,15 +107,45 @@ public class HandoverTaskOrderDomainService {
if (handoverTaskOrderPO == null) {
return null;
}
// 根据复核单数据生成物料明细:按出库单号查询 out_material_detail,使用复核数量
String orderNumber = handoverTaskOrderPO.getOrderNumber();
if (orderNumber != null && !orderNumber.trim().isEmpty()) {
List<OutMaterialDetail> outMaterialDetailList = outMaterialDetailMapper.selectList(
new QueryWrapper<OutMaterialDetail>().lambda()
.eq(OutMaterialDetail::getOutOrderNumber, orderNumber)
.eq(OutMaterialDetail::getDelFlag, 1));
StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper<StockOutOrder>().lambda()
.eq(StockOutOrder::getOutOrderNumber, orderNumber)
.eq(StockOutOrder::getDelFlag, 1));
Integer review = stockOutOrder != null ? stockOutOrder.getReview() : null;
// 需要复核时:仅限复核单上的明细(picking_material_detail 有拣货的 unique_id
java.util.Set<Long> outUniqueIdsWithPicking = null;
if (Integer.valueOf(1).equals(review)) {
List<Long> ids = pickingMaterialDetailMapper.selectOutUniqueIdsWithPickingByOutOrderNumber(orderNumber);
outUniqueIdsWithPicking = ids != null ? new java.util.HashSet<>(ids) : java.util.Collections.emptySet();
}
// 需要复核时:与复核单一致,仅取 level=1 父级(复核单只展示父级,子级挂在父级下)
LambdaQueryWrapper<OutMaterialDetail> omdQuery = new QueryWrapper<OutMaterialDetail>().lambda()
.eq(OutMaterialDetail::getOutOrderNumber, orderNumber)
.eq(OutMaterialDetail::getDelFlag, 1);
if (Integer.valueOf(1).equals(review)) {
omdQuery.eq(OutMaterialDetail::getLevel, 1);
}
List<OutMaterialDetail> outMaterialDetailList = outMaterialDetailMapper.selectList(omdQuery);
List<TaskHandoverMaterialDetailPO> materialDetailList = new ArrayList<>();
for (OutMaterialDetail omd : outMaterialDetailList) {
BigDecimal handoverQuantity;
if (Integer.valueOf(1).equals(review)) {
// 仅包含复核单上的明细(有拣货)且已复核的
if (outUniqueIdsWithPicking != null && !outUniqueIdsWithPicking.contains(omd.getUniqueId())) {
continue;
}
if (omd.getCheckQuantity() == null || omd.getCheckQuantity().compareTo(BigDecimal.ZERO) <= 0) {
continue;
}
handoverQuantity = omd.getCheckQuantity();
} else {
BigDecimal qty = omd.getPickingQuantity() != null ? omd.getPickingQuantity() : omd.getQuantity();
if (qty == null || qty.compareTo(BigDecimal.ZERO) <= 0) {
continue;
}
handoverQuantity = qty;
}
TaskHandoverMaterialDetailPO detail = new TaskHandoverMaterialDetailPO();
detail.setMaterialDetailId(omd.getMaterialDetailId());
detail.setUniqueId(omd.getUniqueId());
@@ -127,11 +161,6 @@ public class HandoverTaskOrderDomainService {
detail.setVolumeLimit(omd.getVolumeLimit());
detail.setQuantity(omd.getQuantity());
detail.setPickingQuantity(omd.getPickingQuantity());
// 物料明细数量:优先使用复核数量(复核单数据),不需要复核时使用拣货数量
BigDecimal handoverQuantity = omd.getCheckQuantity();
if (handoverQuantity == null || handoverQuantity.compareTo(BigDecimal.ZERO) <= 0) {
handoverQuantity = omd.getPickingQuantity() != null ? omd.getPickingQuantity() : omd.getQuantity();
}
detail.setCheckQuantity(handoverQuantity);
detail.setPackId(omd.getPackId());
detail.setPackCode(omd.getPackCode());
@@ -257,14 +286,26 @@ public class HandoverTaskOrderDomainService {
String orderNumber = handoverTaskOrder.getOrderNumber();
StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper<StockOutOrder>().lambda()
.eq(StockOutOrder::getOutOrderNumber, orderNumber));
if (stockOutOrder == null) {
continue;
}
//完成交接状态改为已出库
stockOutOrder.setStatus(9);
stockOutOrderMapper.updateById(stockOutOrder);
List<OutMaterialDetail> outMaterialDetailList = outMaterialDetailMapper.selectList(new QueryWrapper<OutMaterialDetail>().lambda()
.eq(OutMaterialDetail::getOutOrderNumber, orderNumber));
.eq(OutMaterialDetail::getOutOrderNumber, orderNumber)
.eq(OutMaterialDetail::getDelFlag, 1));
Integer review = stockOutOrder != null ? stockOutOrder.getReview() : null;
for (OutMaterialDetail outMaterialDetail : outMaterialDetailList) {
Long materialInventoryId = outMaterialDetail.getMaterialInventoryId();
BigDecimal checkQuantity = outMaterialDetail.getCheckQuantity();
// 复核什么扣减什么:需要复核用check_quantity,不需要复核用picking_quantity
BigDecimal effectiveQuantity = Integer.valueOf(1).equals(review)
? outMaterialDetail.getCheckQuantity()
: (outMaterialDetail.getPickingQuantity() != null ? outMaterialDetail.getPickingQuantity() : outMaterialDetail.getQuantity());
if (materialInventoryId == null || effectiveQuantity == null || effectiveQuantity.compareTo(BigDecimal.ZERO) <= 0) {
continue;
}
BigDecimal checkQuantity = effectiveQuantity;
BigDecimal checkArea = outMaterialDetail.getCheckArea();
BigDecimal checkVolume = outMaterialDetail.getCheckVolume();
BigDecimal checkGrossWeight = outMaterialDetail.getCheckGrossWeight();
@@ -31,6 +31,7 @@ import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailDO;
import com.mhd.wms.domain.outMaterialDetailSerialNumber.entity.OutMaterialDetailSerialNumber;
import com.mhd.wms.domain.outMaterialDetailSerialNumber.repository.facade.IOutMaterialDetailSerialNumberService;
import com.mhd.wms.domain.overStock.repository.todo.QueryOrderOverStockDO;
import com.mhd.wms.domain.pickingMaterialDetail.repository.facade.IPickingMaterialDetailService;
import com.mhd.wms.domain.pickingMaterialDetail.entity.PickingMaterialDetail;
import com.mhd.wms.domain.stockOutOrder.entity.StockOutOrder;
import com.mhd.wms.domain.stockOutOrder.repository.mapper.StockOutOrderMapper;
@@ -72,6 +73,8 @@ public class OutMaterialDetailImpl extends ServiceImpl<OutMaterialDetailMapper,
private MaterialBaseInfoMapper materialBaseInfoMapper;
@Autowired
private StockOutOrderMapper stockOutOrderMapper;
@Autowired
private IPickingMaterialDetailService pickingMaterialDetailService;
/**
* 查询物料明细列表
@@ -1030,6 +1033,18 @@ public class OutMaterialDetailImpl extends ServiceImpl<OutMaterialDetailMapper,
outMaterialDetail.setCheckGrossWeight(outMaterialDetailDO.getCheckGrossWeight());
outMaterialDetail.setCheckNetWeight(outMaterialDetailDO.getCheckNetWeight());
// 复核时同步净重、毛重、体积、面积到 picking_material_detail,供 getCheckInfo 查询展示(优先 check*,否则 total*
if (1 == type && outMaterialDetailDb.getUniqueId() != null) {
BigDecimal netW = outMaterialDetailDO.getCheckNetWeight() != null ? outMaterialDetailDO.getCheckNetWeight() : outMaterialDetailDO.getTotalNetWeight();
BigDecimal grossW = outMaterialDetailDO.getCheckGrossWeight() != null ? outMaterialDetailDO.getCheckGrossWeight() : outMaterialDetailDO.getTotalGrossWeight();
BigDecimal vol = outMaterialDetailDO.getCheckVolume() != null ? outMaterialDetailDO.getCheckVolume() : outMaterialDetailDO.getTotalVolume();
BigDecimal area = outMaterialDetailDO.getCheckArea() != null ? outMaterialDetailDO.getCheckArea() : outMaterialDetailDO.getTotalArea();
if (netW != null || grossW != null || vol != null || area != null) {
pickingMaterialDetailService.updateWeightVolumeByOutUniqueId(outMaterialDetailDb.getUniqueId(),
netW, grossW, vol, area, loginUser.getUserid(), loginUser.getUsername(), new Date());
}
}
outMaterialDetailList.add(outMaterialDetail);
BigDecimal actualQuantity = outMaterialDetailDO.getActualQuantity() != null ? outMaterialDetailDO.getActualQuantity() : BigDecimal.ZERO;
checkQuantity = checkQuantity.add(actualQuantity);
@@ -86,4 +86,10 @@ public interface IPickingMaterialDetailService extends IService<PickingMaterialD
* @return Boolean
*/
public Boolean addQuantity(PickingMaterialDetailDOByUpdate pickingMaterialDetailDOByUpdate);
/**
* 复核提交时同步净重、毛重、体积、面积到 picking_material_detail(供 getCheckInfo 查询展示)
*/
void updateWeightVolumeByOutUniqueId(Long outUniqueId, BigDecimal totalNetWeight, BigDecimal totalGrossWeight,
BigDecimal totalVolume, BigDecimal totalArea, Long updateBy, String updateByName, java.util.Date updateTime);
}
@@ -35,6 +35,11 @@ public interface PickingMaterialDetailMapper extends BaseMapper<PickingMaterialD
*/
Integer countMaterialTypesByOutOrderNumber(@Param("outOrderNumber") String outOrderNumber);
/**
* 按出库单号查询有拣货数量的 out_unique_id 列表(= out_material_detail.unique_id,即复核单上的明细)
*/
List<Long> selectOutUniqueIdsWithPickingByOutOrderNumber(@Param("outOrderNumber") String outOrderNumber);
/**
* @description 根据拣货单增加拣货数量
* @author ZhouGY
@@ -44,4 +49,21 @@ public interface PickingMaterialDetailMapper extends BaseMapper<PickingMaterialD
*/
public int addQuantity(PickingMaterialDetailDOByUpdate pickingMaterialDetailDOByUpdate);
/**
* 复核提交时:先将该 out_unique_id 下所有行置0
*/
int resetWeightVolumeByOutUniqueId(@Param("outUniqueId") Long outUniqueId);
/**
* 复核提交时:将第一行设为复核值
*/
int updateFirstRowWeightVolumeByOutUniqueId(@Param("outUniqueId") Long outUniqueId,
@Param("totalNetWeight") BigDecimal totalNetWeight,
@Param("totalGrossWeight") BigDecimal totalGrossWeight,
@Param("totalVolume") BigDecimal totalVolume,
@Param("totalArea") BigDecimal totalArea,
@Param("updateBy") Long updateBy,
@Param("updateByName") String updateByName,
@Param("updateTime") java.util.Date updateTime);
}
@@ -301,6 +301,17 @@ public class PickingMaterialDetailImpl extends ServiceImpl<PickingMaterialDetail
return true;
}
@Override
public void updateWeightVolumeByOutUniqueId(Long outUniqueId, BigDecimal totalNetWeight, BigDecimal totalGrossWeight,
BigDecimal totalVolume, BigDecimal totalArea, Long updateBy, String updateByName, Date updateTime) {
if (outUniqueId == null) {
return;
}
pickingMaterialDetailMapper.resetWeightVolumeByOutUniqueId(outUniqueId);
pickingMaterialDetailMapper.updateFirstRowWeightVolumeByOutUniqueId(outUniqueId, totalNetWeight, totalGrossWeight,
totalVolume, totalArea, updateBy, updateByName, updateTime);
}
/**
* @description 设置分配数量
* @author ZhouGY
@@ -63,6 +63,19 @@ public class ContainerShiftDO implements Serializable {
@Excel(name = "库位名称")
private String storageLocationName;
@ApiModelProperty("目标库区id(容器移位时 PDA 可能放在父级)")
private Long newStorageSectionId;
@ApiModelProperty("目标库区编码")
private String newStorageCode;
@ApiModelProperty("目标库区名称")
private String newStorageName;
@ApiModelProperty("目标库位id(容器移位时 PDA 可能放在父级)")
private Long newStorageLocationId;
@ApiModelProperty("目标库位编码")
private String newStorageLocationCode;
@ApiModelProperty("目标库位名称")
private String newStorageLocationName;
@ApiModelProperty("批次号")
@Excel(name = "批次号")
private String batchNumber;
@@ -790,12 +790,21 @@ public class StockOutOrderDomainService {
outMaterialDetailPO.setCheckVolume(pickingMaterialDetailPO.getTotalVolume());
outMaterialDetailPO.setCheckNetWeight(pickingMaterialDetailPO.getTotalNetWeight());
outMaterialDetailPO.setCheckGrossWeight(pickingMaterialDetailPO.getTotalGrossWeight());
// 复核明细按已拣货完成数量:优先使用 picking_material_detail 汇总的拣货数量(真实拣货数据)
if (pickingMaterialDetailPO.getPickingQuantity() != null && pickingMaterialDetailPO.getPickingQuantity().compareTo(BigDecimal.ZERO) > 0) {
outMaterialDetailPO.setWaitCheckQuantity(pickingMaterialDetailPO.getPickingQuantity());
} else {
outMaterialDetailPO.setWaitCheckQuantity(outMaterialDetailPO.getPickingQuantity());
// 拣货数量:优先 picking_material_detail,否则 out_material_detail
BigDecimal pickQty = (pickingMaterialDetailPO.getPickingQuantity() != null && pickingMaterialDetailPO.getPickingQuantity().compareTo(BigDecimal.ZERO) > 0)
? pickingMaterialDetailPO.getPickingQuantity() : outMaterialDetailPO.getPickingQuantity();
BigDecimal checkQty = outMaterialDetailPO.getCheckQuantity() != null ? outMaterialDetailPO.getCheckQuantity() : BigDecimal.ZERO;
// 待复核数量 = 拣货数量 - 已复核数量(复核提交后应减少)
BigDecimal waitQty = (pickQty != null ? pickQty : BigDecimal.ZERO).subtract(checkQty);
if (waitQty.compareTo(BigDecimal.ZERO) < 0) {
waitQty = BigDecimal.ZERO;
}
outMaterialDetailPO.setWaitCheckQuantity(waitQty);
// quantity=PC下发时的拣货数量,actualQuantity默认=待复核数量
if (pickQty != null) {
outMaterialDetailPO.setQuantity(pickQty);
}
outMaterialDetailPO.setActualQuantity(waitQty);
}
List<OutMaterialDetailPO> children = outMaterialDetailPO.getChildren();
if (!CollectionUtils.isEmpty(children)) {
@@ -813,12 +822,21 @@ public class StockOutOrderDomainService {
outMaterialDetailPOChild.setCheckVolume(pickingMaterialDetailPO1.getTotalVolume());
outMaterialDetailPOChild.setCheckNetWeight(pickingMaterialDetailPO1.getTotalNetWeight());
outMaterialDetailPOChild.setCheckGrossWeight(pickingMaterialDetailPO1.getTotalGrossWeight());
// 复核明细按已拣货完成数量:优先使用 picking_material_detail 汇总的拣货数量(真实拣货数据)
if (pickingMaterialDetailPO1.getPickingQuantity() != null && pickingMaterialDetailPO1.getPickingQuantity().compareTo(BigDecimal.ZERO) > 0) {
outMaterialDetailPOChild.setWaitCheckQuantity(pickingMaterialDetailPO1.getPickingQuantity());
} else {
outMaterialDetailPOChild.setWaitCheckQuantity(outMaterialDetailPOChild.getPickingQuantity());
// 拣货数量:优先 picking_material_detail,否则 out_material_detail
BigDecimal pickQtyChild = (pickingMaterialDetailPO1.getPickingQuantity() != null && pickingMaterialDetailPO1.getPickingQuantity().compareTo(BigDecimal.ZERO) > 0)
? pickingMaterialDetailPO1.getPickingQuantity() : outMaterialDetailPOChild.getPickingQuantity();
BigDecimal checkQtyChild = outMaterialDetailPOChild.getCheckQuantity() != null ? outMaterialDetailPOChild.getCheckQuantity() : BigDecimal.ZERO;
// 待复核数量 = 拣货数量 - 已复核数量(复核提交后应减少)
BigDecimal waitQtyChild = (pickQtyChild != null ? pickQtyChild : BigDecimal.ZERO).subtract(checkQtyChild);
if (waitQtyChild.compareTo(BigDecimal.ZERO) < 0) {
waitQtyChild = BigDecimal.ZERO;
}
outMaterialDetailPOChild.setWaitCheckQuantity(waitQtyChild);
// quantity=PC下发时的拣货数量,actualQuantity默认=待复核数量
if (pickQtyChild != null) {
outMaterialDetailPOChild.setQuantity(pickQtyChild);
}
outMaterialDetailPOChild.setActualQuantity(waitQtyChild);
}
}
}
@@ -831,11 +849,10 @@ public class StockOutOrderDomainService {
for (OutMaterialDetailPO outMaterialDetailPO : outMaterialDetailPOList){
weightLimit = weightLimit.add(outMaterialDetailPO.getWeightLimit());
volumeLimit = volumeLimit.add(outMaterialDetailPO.getVolumeLimit());
// 待复核数量按已拣货完成数量:优先 waitCheckQuantity(来自 picking_material_detail),否则用 pickingQuantity
BigDecimal qty = (outMaterialDetailPO.getWaitCheckQuantity() != null && outMaterialDetailPO.getWaitCheckQuantity().compareTo(BigDecimal.ZERO) > 0)
? outMaterialDetailPO.getWaitCheckQuantity() : outMaterialDetailPO.getPickingQuantity();
wantNumber = wantNumber.add(qty != null ? qty : BigDecimal.ZERO);
alreadyNumber = alreadyNumber.add(outMaterialDetailPO.getCheckQuantity());
// wantNumber=拣货数量总和,alreadyNumber=已复核总和,notHaveNumber=剩余待复核
BigDecimal pickQty = (outMaterialDetailPO.getQuantity() != null ? outMaterialDetailPO.getQuantity() : outMaterialDetailPO.getPickingQuantity());
wantNumber = wantNumber.add(pickQty != null ? pickQty : BigDecimal.ZERO);
alreadyNumber = alreadyNumber.add(outMaterialDetailPO.getCheckQuantity() != null ? outMaterialDetailPO.getCheckQuantity() : BigDecimal.ZERO);
}
OutMaterialCheckPO outMaterialCheckPO = new OutMaterialCheckPO();
outMaterialCheckPO.setCount(outMaterialDetailPOList.size());
@@ -167,17 +167,18 @@ public class TaskPickingMaterialDetailImpl extends ServiceImpl<TaskPickingMateri
.filter(p -> pickingUniqueId.equals(p.getUniqueId())).findFirst().orElse(null);
if (existing != null) {
existing.setPickingQuantity((existing.getPickingQuantity() != null ? existing.getPickingQuantity() : BigDecimal.ZERO).add(qty));
// 净重、毛重、体积、面积:拣货填写值直接覆盖,不累加
if (taskPickingMaterialDetailDO.getTotalNetWeight() != null) {
existing.setTotalNetWeight((existing.getTotalNetWeight() != null ? existing.getTotalNetWeight() : BigDecimal.ZERO).add(taskPickingMaterialDetailDO.getTotalNetWeight()));
existing.setTotalNetWeight(taskPickingMaterialDetailDO.getTotalNetWeight());
}
if (taskPickingMaterialDetailDO.getTotalGrossWeight() != null) {
existing.setTotalGrossWeight((existing.getTotalGrossWeight() != null ? existing.getTotalGrossWeight() : BigDecimal.ZERO).add(taskPickingMaterialDetailDO.getTotalGrossWeight()));
existing.setTotalGrossWeight(taskPickingMaterialDetailDO.getTotalGrossWeight());
}
if (taskPickingMaterialDetailDO.getTotalVolume() != null) {
existing.setTotalVolume((existing.getTotalVolume() != null ? existing.getTotalVolume() : BigDecimal.ZERO).add(taskPickingMaterialDetailDO.getTotalVolume()));
existing.setTotalVolume(taskPickingMaterialDetailDO.getTotalVolume());
}
if (taskPickingMaterialDetailDO.getTotalArea() != null) {
existing.setTotalArea((existing.getTotalArea() != null ? existing.getTotalArea() : BigDecimal.ZERO).add(taskPickingMaterialDetailDO.getTotalArea()));
existing.setTotalArea(taskPickingMaterialDetailDO.getTotalArea());
}
} else {
PickingMaterialDetailDO pickingMaterialDetailDO = new PickingMaterialDetailDO();