PDA复核内容修改

This commit is contained in:
秦鸿展
2026-04-10 14:46:28 +08:00
parent bfb3c92678
commit 69543777da
6 changed files with 181 additions and 18 deletions
@@ -194,14 +194,11 @@ public class ReviewOrderApplicationService {
throw new ServiceException("复核明细不能为空");
}
for (ReviewMaterialDetailPO i : inputDetails) {
if (i == null || i.getReviewMaterialDetailId() == null) {
if (i == null) {
continue;
}
ReviewMaterialDetail db = reviewMaterialDetailMapper.selectById(i.getReviewMaterialDetailId());
if (db == null || db.getDelFlag() == null || db.getDelFlag() != 1) {
continue;
}
if (!cmd.getReviewOrderId().equals(db.getReviewOrderId())) {
ReviewMaterialDetail db = findReviewMaterialDetailForBatch(i, cmd.getReviewOrderId());
if (db == null) {
continue;
}
@@ -248,14 +245,11 @@ public class ReviewOrderApplicationService {
throw new ServiceException("复核明细不能为空");
}
for (ReviewMaterialDetailPO i : inputDetails) {
if (i == null || i.getReviewMaterialDetailId() == null) {
if (i == null) {
continue;
}
ReviewMaterialDetail db = reviewMaterialDetailMapper.selectById(i.getReviewMaterialDetailId());
if (db == null || db.getDelFlag() == null || db.getDelFlag() != 1) {
continue;
}
if (!cmd.getReviewOrderId().equals(db.getReviewOrderId())) {
ReviewMaterialDetail db = findReviewMaterialDetailForBatch(i, cmd.getReviewOrderId());
if (db == null) {
continue;
}
@@ -314,6 +308,8 @@ public class ReviewOrderApplicationService {
if (reviewOrderId == null) {
continue;
}
// 若完成复核请求携带明细,先按本次提交快照落库(数量与计量),再校验与同步出库/交接
applyReviewSnapshotForConfirm(reviewOrderId, cmd.getDetails(), loginUser);
List<ReviewMaterialDetailPO> rows = reviewOrderMapper.queryDetailByReviewOrderId(reviewOrderId);
boolean hasPending = rows.stream().anyMatch(r -> nz(r.getPendingReviewQty()).compareTo(BigDecimal.ZERO) > 0);
if (hasPending) {
@@ -363,6 +359,18 @@ public class ReviewOrderApplicationService {
}
BigDecimal checkQty = nz(detail.getReviewedQty());
outDb.setCheckQuantity(checkQty);
if (detail.getNetWeightKg() != null) {
outDb.setCheckNetWeight(detail.getNetWeightKg());
}
if (detail.getGrossWeightKg() != null) {
outDb.setCheckGrossWeight(detail.getGrossWeightKg());
}
if (detail.getVolumeCbm() != null) {
outDb.setCheckVolume(detail.getVolumeCbm());
}
if (detail.getAreaSqm() != null) {
outDb.setCheckArea(detail.getAreaSqm());
}
if (loginUser != null) {
outDb.setUpdateBy(loginUser.getUserid());
}
@@ -511,6 +519,107 @@ public class ReviewOrderApplicationService {
deliveTaskService.batchInsert(deliveTaskDOList);
}
/**
* 完成复核时,请求体中的明细快照先写入 review_material_detail(与 PDA 点击确认时一致),再参与待复核校验与出库同步。
*/
private void applyReviewSnapshotForConfirm(Long reviewOrderId, List<ReviewMaterialDetailPO> inputDetails, LoginUser loginUser) {
if (reviewOrderId == null || CollectionUtils.isEmpty(inputDetails)) {
return;
}
for (ReviewMaterialDetailPO i : inputDetails) {
if (i == null) {
continue;
}
ReviewMaterialDetail db = findReviewMaterialDetailForBatch(i, reviewOrderId);
if (db == null) {
continue;
}
BigDecimal total = nz(db.getReviewedQty()).add(nz(db.getPendingReviewQty()));
boolean qtyTouched = false;
if (i.getReviewedQty() != null && i.getPendingReviewQty() != null) {
db.setReviewedQty(i.getReviewedQty());
db.setPendingReviewQty(i.getPendingReviewQty());
qtyTouched = true;
} else if (i.getReviewedQty() != null) {
BigDecimal newR = i.getReviewedQty();
if (newR.compareTo(total) > 0) {
newR = total;
}
db.setReviewedQty(newR);
db.setPendingReviewQty(total.subtract(newR).max(BigDecimal.ZERO));
qtyTouched = true;
} else if (i.getPendingReviewQty() != null) {
BigDecimal newP = i.getPendingReviewQty();
if (newP.compareTo(total) > 0) {
newP = total;
}
db.setPendingReviewQty(newP);
db.setReviewedQty(total.subtract(newP).max(BigDecimal.ZERO));
qtyTouched = true;
} else if (i.getReviewQtyEa() != null) {
BigDecimal pending = nz(db.getPendingReviewQty());
BigDecimal reviewed = nz(db.getReviewedQty());
BigDecimal qty = i.getReviewQtyEa();
if (qty.compareTo(BigDecimal.ZERO) > 0) {
if (qty.compareTo(pending) > 0) {
qty = pending;
}
db.setPendingReviewQty(pending.subtract(qty));
db.setReviewedQty(reviewed.add(qty));
qtyTouched = true;
}
}
if (i.getNetWeightKg() != null) {
db.setNetWeightKg(i.getNetWeightKg());
}
if (i.getGrossWeightKg() != null) {
db.setGrossWeightKg(i.getGrossWeightKg());
}
if (i.getVolumeCbm() != null) {
db.setVolumeCbm(i.getVolumeCbm());
}
if (i.getAreaSqm() != null) {
db.setAreaSqm(i.getAreaSqm());
}
if (qtyTouched || i.getNetWeightKg() != null || i.getGrossWeightKg() != null
|| i.getVolumeCbm() != null || i.getAreaSqm() != null) {
fillOperator(db);
reviewMaterialDetailMapper.updateById(db);
}
}
}
/**
* 批量复核/取消复核入参行定位:优先 reviewMaterialDetailIdPDA 常只传出库明细 materialDetailId,需按复核单+出库明细主键解析。
*/
private ReviewMaterialDetail findReviewMaterialDetailForBatch(ReviewMaterialDetailPO input, Long reviewOrderId) {
if (input == null || reviewOrderId == null) {
return null;
}
if (input.getReviewMaterialDetailId() != null) {
ReviewMaterialDetail db = reviewMaterialDetailMapper.selectById(input.getReviewMaterialDetailId());
if (db == null || db.getDelFlag() == null || db.getDelFlag() != 1) {
return null;
}
if (!reviewOrderId.equals(db.getReviewOrderId())) {
return null;
}
return db;
}
if (input.getMaterialDetailId() == null) {
return null;
}
List<ReviewMaterialDetail> list = reviewMaterialDetailMapper.selectList(
new LambdaQueryWrapper<ReviewMaterialDetail>()
.eq(ReviewMaterialDetail::getReviewOrderId, reviewOrderId)
.eq(ReviewMaterialDetail::getMaterialDetailId, input.getMaterialDetailId())
.eq(ReviewMaterialDetail::getDelFlag, 1));
if (CollectionUtils.isEmpty(list)) {
return null;
}
return list.get(0);
}
private void refreshReviewOrderStatus(Long reviewOrderId) {
List<ReviewMaterialDetailPO> rows = reviewOrderMapper.queryDetailByReviewOrderId(reviewOrderId);
// 业务口径:只有全部明细待复核=0 时,状态才置为 2;部分复核仍保持 1。
@@ -171,8 +171,14 @@ public class HandoverTaskOrderDomainService {
detail.setMaterialCode(omd.getMaterialCode() != null ? omd.getMaterialCode() : omd.getMaterialNo());
detail.setMaterialName(omd.getMaterialName() != null ? omd.getMaterialName() : omd.getCommodityName());
detail.setBarCode(omd.getBarCode());
detail.setWeightLimit(omd.getWeightLimit());
detail.setVolumeLimit(omd.getVolumeLimit());
// 需要复核时:交接展示以出库明细上的复核计量为准(完成复核时由复核单同步写入 check_*)
if (Integer.valueOf(1).equals(review)) {
detail.setWeightLimit(omd.getCheckNetWeight() != null ? omd.getCheckNetWeight() : omd.getWeightLimit());
detail.setVolumeLimit(omd.getCheckVolume() != null ? omd.getCheckVolume() : omd.getVolumeLimit());
} else {
detail.setWeightLimit(omd.getWeightLimit());
detail.setVolumeLimit(omd.getVolumeLimit());
}
detail.setQuantity(omd.getQuantity());
detail.setPickingQuantity(pickQty);
detail.setCheckQuantity(handoverQuantity);
@@ -14,14 +14,19 @@ import com.mhd.wms.domain.inOrderAbnormal.repository.po.InOrderAbnormalPO;
import com.mhd.wms.domain.inOrderAbnormal.repository.todo.InOrderAbnormalBaseDO;
import com.mhd.wms.domain.inOrderAbnormal.repository.todo.InOrderAbnormalDO;
import com.mhd.wms.domain.receiptMaterialDetail.entity.ReceiptMaterialDetail;
import com.mhd.wms.domain.receiptMaterialDetail.repository.facade.IReceiptMaterialDetailService;
import com.mhd.wms.domain.receiptMaterialDetail.repository.mapper.ReceiptMaterialDetailMapper;
import com.mhd.wms.domain.receiptMaterialDetail.repository.todo.ReceiptMaterialDetailDO;
import com.mhd.wms.domain.shelfMaterialDetail.entity.ShelfMaterialDetail;
import com.mhd.wms.domain.shelfMaterialDetail.repository.facade.IShelfMaterialDetailService;
import com.mhd.wms.domain.shelfMaterialDetail.repository.mapper.ShelfMaterialDetailMapper;
import com.mhd.wms.domain.shelfMaterialDetail.repository.todo.ShelfMaterialDetailDO;
import org.springframework.beans.BeanUtils;
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 java.math.BigDecimal;
import java.util.ArrayList;
@@ -42,6 +47,10 @@ public class InOrderAbnormalImpl extends ServiceImpl<InOrderAbnormalMapper, InOr
private ReceiptMaterialDetailMapper receiptMaterialDetailMapper;
@Autowired
private ShelfMaterialDetailMapper shelfMaterialDetailMapper;
@Autowired
private IReceiptMaterialDetailService receiptMaterialDetailService;
@Autowired
private IShelfMaterialDetailService shelfMaterialDetailService;
/**
* 查询入库异常单列表
@@ -98,7 +107,42 @@ public class InOrderAbnormalImpl extends ServiceImpl<InOrderAbnormalMapper, InOr
if (CollectionUtils.isEmpty(inOrderAbnormalPOList)){
throw new ServiceException("入库异常单不存在");
}
return inOrderAbnormalPOList.get(0);
InOrderAbnormalPO inOrderAbnormalPO = inOrderAbnormalPOList.get(0);
fillMaterialDetails(inOrderAbnormalPO);
return inOrderAbnormalPO;
}
/**
* 按异常类型加载关联收货/上架明细(整单行)
*/
private void fillMaterialDetails(InOrderAbnormalPO po) {
if (po == null) {
return;
}
Integer type = po.getType();
if (Integer.valueOf(1).equals(type)) {
if (StringUtils.hasText(po.getReceiptOrderNumber())) {
ReceiptMaterialDetailDO detailDO = new ReceiptMaterialDetailDO();
detailDO.setReceiptOrderNumber(po.getReceiptOrderNumber());
po.setReceiptMaterialDetailList(receiptMaterialDetailService.queryList(detailDO));
}
} else if (Integer.valueOf(2).equals(type)) {
if (StringUtils.hasText(po.getShelfOrderNumber())) {
ShelfMaterialDetailDO detailDO = new ShelfMaterialDetailDO();
detailDO.setShelfOrderNumber(po.getShelfOrderNumber());
po.setShelfMaterialDetailList(shelfMaterialDetailService.queryList(detailDO));
}
} else {
if (StringUtils.hasText(po.getReceiptOrderNumber())) {
ReceiptMaterialDetailDO detailDO = new ReceiptMaterialDetailDO();
detailDO.setReceiptOrderNumber(po.getReceiptOrderNumber());
po.setReceiptMaterialDetailList(receiptMaterialDetailService.queryList(detailDO));
} else if (StringUtils.hasText(po.getShelfOrderNumber())) {
ShelfMaterialDetailDO detailDO = new ShelfMaterialDetailDO();
detailDO.setShelfOrderNumber(po.getShelfOrderNumber());
po.setShelfMaterialDetailList(shelfMaterialDetailService.queryList(detailDO));
}
}
}
@@ -1,5 +1,6 @@
package com.mhd.wms.domain.reviewOrder.repository.todo;
import com.fasterxml.jackson.annotation.JsonAlias;
import com.mhd.common.core.web.domain.BaseVOEntity;
import com.mhd.wms.domain.reviewOrder.repository.po.ReviewMaterialDetailPO;
import io.swagger.annotations.ApiModelProperty;
@@ -62,6 +63,7 @@ public class ReviewOrderDO extends BaseVOEntity {
private String checkOperatorsName;
@ApiModelProperty("复核明细列表(用于批量复核/取消复核)")
@JsonAlias({"materialDetailList"})
private List<ReviewMaterialDetailPO> details;
@ApiModelProperty("PDA 列表 Tab:2=历史(已复核),其它=待办(待复核/复核中)")
@@ -1,6 +1,5 @@
package com.mhd.wms.interfaces.facadeApp.reviewOrder;
import cn.hutool.json.JSONUtil;
import com.mhd.common.core.domain.po.UserPo;
import com.mhd.common.core.web.controller.BaseController;
import com.mhd.common.core.web.domain.AjaxResult;
@@ -90,7 +89,7 @@ public class ReviewOrderAppApi extends BaseController {
@ApiOperation("PDA 提交复核")
@PostMapping("/check")
public AjaxResult check(@RequestBody ReviewOrderDTO reviewOrderDTO) {
ReviewOrderDO cmd = JSONUtil.toBean(JSONUtil.toJsonStr(reviewOrderDTO), ReviewOrderDO.class);
ReviewOrderDO cmd = reviewOrderAssembler.toDO(reviewOrderDTO);
return toAjax(reviewOrderApplicationService.batchCheck(cmd));
}
@@ -110,7 +109,7 @@ public class ReviewOrderAppApi extends BaseController {
@ApiOperation("PDA 完成复核")
@PostMapping("/completeCheck")
public AjaxResult completeCheck(@RequestBody ReviewOrderDTO reviewOrderDTO) {
ReviewOrderDO cmd = JSONUtil.toBean(JSONUtil.toJsonStr(reviewOrderDTO), ReviewOrderDO.class);
ReviewOrderDO cmd = reviewOrderAssembler.toDO(reviewOrderDTO);
return toAjax(reviewOrderApplicationService.checkConfirm(cmd));
}
}
@@ -13,8 +13,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="inOrderNumber" column="in_order_number" />
<result property="receiptOrderNumber" column="receipt_order_number" />
<result property="shelfOrderNumber" column="shelf_order_number" />
<result property="type" column="type" />
<result property="quantity" column="quantity" />
<result property="actualQuantity" column="actual_quantity" />
<result property="allowActualQuantity" column="allow_actual_quantity" />
<result property="abnormalActualQuantity" column="abnormal_actual_quantity" />
<result property="abnormalType" column="abnormal_type" />
<result property="abnormalReason" column="abnormal_reason" />
<result property="remark" column="remark" />