PDA拣货复核修改
This commit is contained in:
+21
@@ -151,6 +151,27 @@ public class HandoverTaskOrderApplicationService {
|
|||||||
return handoverTaskOrderDomainService.getInfo(outTaskOrderId);
|
return handoverTaskOrderDomainService.getInfo(outTaskOrderId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 按作业单号获取交接作业单详细信息(PDA 端)
|
||||||
|
* 用于下发任务(taskType=7)中 trackingNumber 对应交接作业单的 taskNumber
|
||||||
|
*
|
||||||
|
* @param taskNumber 作业单号
|
||||||
|
* @return 交接作业单详情,含物料明细(与 getInfo 逻辑一致)
|
||||||
|
*/
|
||||||
|
public HandoverTaskOrderPO getInfoByTaskNumber(String taskNumber) {
|
||||||
|
if (taskNumber == null || taskNumber.trim().isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
HandoverTaskOrder handoverTaskOrder = handoverTaskOrderService.getOne(
|
||||||
|
new LambdaQueryWrapper<HandoverTaskOrder>()
|
||||||
|
.eq(HandoverTaskOrder::getTaskNumber, taskNumber.trim())
|
||||||
|
.eq(HandoverTaskOrder::getDelFlag, 1));
|
||||||
|
if (handoverTaskOrder == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return handoverTaskOrderDomainService.getInfo(handoverTaskOrder.getHandoverTaskOrderId());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分配月台
|
* 分配月台
|
||||||
*/
|
*/
|
||||||
|
|||||||
+17
-1
@@ -741,7 +741,22 @@ public class ShiftManageApplicationService {
|
|||||||
if (CollectionUtils.isEmpty(shiftMoveMaterialQuantityList)){
|
if (CollectionUtils.isEmpty(shiftMoveMaterialQuantityList)){
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// 兼容:容器移位通常只有一个目标库位,若部分子项未传 newStorageLocationId,从同组第一个有值的子项复制
|
// 兼容:容器移位通常只有一个目标库位
|
||||||
|
// 1) 若子项未传 newStorageLocationId,优先从父级复制(PDA 可能把目标放在父级)
|
||||||
|
Long parentTargetId = containerShiftDO.getNewStorageLocationId();
|
||||||
|
if (parentTargetId != null && parentTargetId > 0) {
|
||||||
|
shiftMoveMaterialQuantityList.forEach(c -> {
|
||||||
|
if (c.getNewStorageLocationId() == null || c.getNewStorageLocationId() <= 0) {
|
||||||
|
c.setNewStorageLocationId(parentTargetId);
|
||||||
|
c.setNewStorageSectionId(containerShiftDO.getNewStorageSectionId());
|
||||||
|
c.setNewStorageCode(containerShiftDO.getNewStorageCode());
|
||||||
|
c.setNewStorageName(containerShiftDO.getNewStorageName());
|
||||||
|
c.setNewStorageLocationCode(containerShiftDO.getNewStorageLocationCode());
|
||||||
|
c.setNewStorageLocationName(containerShiftDO.getNewStorageLocationName());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// 2) 若部分子项仍未传,从同组第一个有值的子项复制
|
||||||
ShiftMoveMaterialQuantityPO firstWithTarget = shiftMoveMaterialQuantityList.stream()
|
ShiftMoveMaterialQuantityPO firstWithTarget = shiftMoveMaterialQuantityList.stream()
|
||||||
.filter(c -> c.getNewStorageLocationId() != null && c.getNewStorageLocationId() > 0)
|
.filter(c -> c.getNewStorageLocationId() != null && c.getNewStorageLocationId() > 0)
|
||||||
.findFirst().orElse(null);
|
.findFirst().orElse(null);
|
||||||
@@ -760,6 +775,7 @@ public class ShiftManageApplicationService {
|
|||||||
shiftMoveMaterialQuantityList.forEach(shiftMoveMaterialQuantityPO -> {
|
shiftMoveMaterialQuantityList.forEach(shiftMoveMaterialQuantityPO -> {
|
||||||
Long newStorageLocationId = shiftMoveMaterialQuantityPO.getNewStorageLocationId();
|
Long newStorageLocationId = shiftMoveMaterialQuantityPO.getNewStorageLocationId();
|
||||||
if (newStorageLocationId == null || newStorageLocationId <= 0) {
|
if (newStorageLocationId == null || newStorageLocationId <= 0) {
|
||||||
|
log.warn("容器移位缺少目标库位。父级newStorageLocationId={}, 请求体={}", containerShiftDO.getNewStorageLocationId(), JSON.toJSONString(containerShiftDOList));
|
||||||
throw new ServiceException("目标库位不能为空,请选择目标库位");
|
throw new ServiceException("目标库位不能为空,请选择目标库位");
|
||||||
}
|
}
|
||||||
AjaxResult storageLocationResult = systemServiceFeign.getStorageLocationInfoByStorageLocationId(newStorageLocationId);
|
AjaxResult storageLocationResult = systemServiceFeign.getStorageLocationInfoByStorageLocationId(newStorageLocationId);
|
||||||
|
|||||||
+5
@@ -232,6 +232,11 @@ public class StockOutTaskOrderApplicationService {
|
|||||||
TaskPickingMaterialDetailDO returnTaskPickingMaterialDetailDO = new TaskPickingMaterialDetailDO();
|
TaskPickingMaterialDetailDO returnTaskPickingMaterialDetailDO = new TaskPickingMaterialDetailDO();
|
||||||
BeanUtils.copyProperties(taskPickingMaterialDetailPO, returnTaskPickingMaterialDetailDO);
|
BeanUtils.copyProperties(taskPickingMaterialDetailPO, returnTaskPickingMaterialDetailDO);
|
||||||
returnTaskPickingMaterialDetailDO.setActualQuantity(taskPickingMaterialDetailDO.getActualQuantity());
|
returnTaskPickingMaterialDetailDO.setActualQuantity(taskPickingMaterialDetailDO.getActualQuantity());
|
||||||
|
// PDA 提交的净重、毛重、体积、面积需传递到拣货更新逻辑,否则会丢失
|
||||||
|
returnTaskPickingMaterialDetailDO.setTotalNetWeight(taskPickingMaterialDetailDO.getTotalNetWeight());
|
||||||
|
returnTaskPickingMaterialDetailDO.setTotalGrossWeight(taskPickingMaterialDetailDO.getTotalGrossWeight());
|
||||||
|
returnTaskPickingMaterialDetailDO.setTotalVolume(taskPickingMaterialDetailDO.getTotalVolume());
|
||||||
|
returnTaskPickingMaterialDetailDO.setTotalArea(taskPickingMaterialDetailDO.getTotalArea());
|
||||||
//是否开启了序列号管理
|
//是否开启了序列号管理
|
||||||
if (taskPickingMaterialDetailPO.getSerialNumberManage() == 1){
|
if (taskPickingMaterialDetailPO.getSerialNumberManage() == 1){
|
||||||
if (CollectionUtils.isEmpty(taskPickingMaterialDetailDO.getMaterialDetailSerialNumberList())){
|
if (CollectionUtils.isEmpty(taskPickingMaterialDetailDO.getMaterialDetailSerialNumberList())){
|
||||||
|
|||||||
+54
-13
@@ -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.materialInventory.repository.mapper.MaterialInventoryMapper;
|
||||||
import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail;
|
import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail;
|
||||||
import com.mhd.wms.domain.outMaterialDetail.repository.mapper.OutMaterialDetailMapper;
|
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.taskHandoverMaterialDetail.repository.po.TaskHandoverMaterialDetailPO;
|
||||||
import com.mhd.wms.domain.shiftManage.repository.po.ShiftManagePO;
|
import com.mhd.wms.domain.shiftManage.repository.po.ShiftManagePO;
|
||||||
import com.mhd.wms.domain.shiftManage.repository.todo.ShiftManageDO;
|
import com.mhd.wms.domain.shiftManage.repository.todo.ShiftManageDO;
|
||||||
@@ -61,6 +62,8 @@ public class HandoverTaskOrderDomainService {
|
|||||||
private StockOutOrderMapper stockOutOrderMapper;
|
private StockOutOrderMapper stockOutOrderMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private IDeliveTaskService deliveTaskService;
|
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)
|
public HandoverTaskOrderPO getInfo(Long outTaskOrderId)
|
||||||
{
|
{
|
||||||
@@ -103,15 +107,45 @@ public class HandoverTaskOrderDomainService {
|
|||||||
if (handoverTaskOrderPO == null) {
|
if (handoverTaskOrderPO == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
// 根据复核单数据生成物料明细:按出库单号查询 out_material_detail,使用复核数量
|
|
||||||
String orderNumber = handoverTaskOrderPO.getOrderNumber();
|
String orderNumber = handoverTaskOrderPO.getOrderNumber();
|
||||||
if (orderNumber != null && !orderNumber.trim().isEmpty()) {
|
if (orderNumber != null && !orderNumber.trim().isEmpty()) {
|
||||||
List<OutMaterialDetail> outMaterialDetailList = outMaterialDetailMapper.selectList(
|
StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper<StockOutOrder>().lambda()
|
||||||
new QueryWrapper<OutMaterialDetail>().lambda()
|
.eq(StockOutOrder::getOutOrderNumber, orderNumber)
|
||||||
.eq(OutMaterialDetail::getOutOrderNumber, orderNumber)
|
.eq(StockOutOrder::getDelFlag, 1));
|
||||||
.eq(OutMaterialDetail::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<>();
|
List<TaskHandoverMaterialDetailPO> materialDetailList = new ArrayList<>();
|
||||||
for (OutMaterialDetail omd : outMaterialDetailList) {
|
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();
|
TaskHandoverMaterialDetailPO detail = new TaskHandoverMaterialDetailPO();
|
||||||
detail.setMaterialDetailId(omd.getMaterialDetailId());
|
detail.setMaterialDetailId(omd.getMaterialDetailId());
|
||||||
detail.setUniqueId(omd.getUniqueId());
|
detail.setUniqueId(omd.getUniqueId());
|
||||||
@@ -127,11 +161,6 @@ public class HandoverTaskOrderDomainService {
|
|||||||
detail.setVolumeLimit(omd.getVolumeLimit());
|
detail.setVolumeLimit(omd.getVolumeLimit());
|
||||||
detail.setQuantity(omd.getQuantity());
|
detail.setQuantity(omd.getQuantity());
|
||||||
detail.setPickingQuantity(omd.getPickingQuantity());
|
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.setCheckQuantity(handoverQuantity);
|
||||||
detail.setPackId(omd.getPackId());
|
detail.setPackId(omd.getPackId());
|
||||||
detail.setPackCode(omd.getPackCode());
|
detail.setPackCode(omd.getPackCode());
|
||||||
@@ -257,14 +286,26 @@ public class HandoverTaskOrderDomainService {
|
|||||||
String orderNumber = handoverTaskOrder.getOrderNumber();
|
String orderNumber = handoverTaskOrder.getOrderNumber();
|
||||||
StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper<StockOutOrder>().lambda()
|
StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper<StockOutOrder>().lambda()
|
||||||
.eq(StockOutOrder::getOutOrderNumber, orderNumber));
|
.eq(StockOutOrder::getOutOrderNumber, orderNumber));
|
||||||
|
if (stockOutOrder == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
//完成交接状态改为已出库
|
//完成交接状态改为已出库
|
||||||
stockOutOrder.setStatus(9);
|
stockOutOrder.setStatus(9);
|
||||||
stockOutOrderMapper.updateById(stockOutOrder);
|
stockOutOrderMapper.updateById(stockOutOrder);
|
||||||
List<OutMaterialDetail> outMaterialDetailList = outMaterialDetailMapper.selectList(new QueryWrapper<OutMaterialDetail>().lambda()
|
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) {
|
for (OutMaterialDetail outMaterialDetail : outMaterialDetailList) {
|
||||||
Long materialInventoryId = outMaterialDetail.getMaterialInventoryId();
|
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 checkArea = outMaterialDetail.getCheckArea();
|
||||||
BigDecimal checkVolume = outMaterialDetail.getCheckVolume();
|
BigDecimal checkVolume = outMaterialDetail.getCheckVolume();
|
||||||
BigDecimal checkGrossWeight = outMaterialDetail.getCheckGrossWeight();
|
BigDecimal checkGrossWeight = outMaterialDetail.getCheckGrossWeight();
|
||||||
|
|||||||
+15
@@ -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.entity.OutMaterialDetailSerialNumber;
|
||||||
import com.mhd.wms.domain.outMaterialDetailSerialNumber.repository.facade.IOutMaterialDetailSerialNumberService;
|
import com.mhd.wms.domain.outMaterialDetailSerialNumber.repository.facade.IOutMaterialDetailSerialNumberService;
|
||||||
import com.mhd.wms.domain.overStock.repository.todo.QueryOrderOverStockDO;
|
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.pickingMaterialDetail.entity.PickingMaterialDetail;
|
||||||
import com.mhd.wms.domain.stockOutOrder.entity.StockOutOrder;
|
import com.mhd.wms.domain.stockOutOrder.entity.StockOutOrder;
|
||||||
import com.mhd.wms.domain.stockOutOrder.repository.mapper.StockOutOrderMapper;
|
import com.mhd.wms.domain.stockOutOrder.repository.mapper.StockOutOrderMapper;
|
||||||
@@ -72,6 +73,8 @@ public class OutMaterialDetailImpl extends ServiceImpl<OutMaterialDetailMapper,
|
|||||||
private MaterialBaseInfoMapper materialBaseInfoMapper;
|
private MaterialBaseInfoMapper materialBaseInfoMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private StockOutOrderMapper stockOutOrderMapper;
|
private StockOutOrderMapper stockOutOrderMapper;
|
||||||
|
@Autowired
|
||||||
|
private IPickingMaterialDetailService pickingMaterialDetailService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询物料明细列表
|
* 查询物料明细列表
|
||||||
@@ -1030,6 +1033,18 @@ public class OutMaterialDetailImpl extends ServiceImpl<OutMaterialDetailMapper,
|
|||||||
outMaterialDetail.setCheckGrossWeight(outMaterialDetailDO.getCheckGrossWeight());
|
outMaterialDetail.setCheckGrossWeight(outMaterialDetailDO.getCheckGrossWeight());
|
||||||
outMaterialDetail.setCheckNetWeight(outMaterialDetailDO.getCheckNetWeight());
|
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);
|
outMaterialDetailList.add(outMaterialDetail);
|
||||||
BigDecimal actualQuantity = outMaterialDetailDO.getActualQuantity() != null ? outMaterialDetailDO.getActualQuantity() : BigDecimal.ZERO;
|
BigDecimal actualQuantity = outMaterialDetailDO.getActualQuantity() != null ? outMaterialDetailDO.getActualQuantity() : BigDecimal.ZERO;
|
||||||
checkQuantity = checkQuantity.add(actualQuantity);
|
checkQuantity = checkQuantity.add(actualQuantity);
|
||||||
|
|||||||
+6
@@ -86,4 +86,10 @@ public interface IPickingMaterialDetailService extends IService<PickingMaterialD
|
|||||||
* @return Boolean
|
* @return Boolean
|
||||||
*/
|
*/
|
||||||
public Boolean addQuantity(PickingMaterialDetailDOByUpdate pickingMaterialDetailDOByUpdate);
|
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);
|
||||||
}
|
}
|
||||||
+22
@@ -35,6 +35,11 @@ public interface PickingMaterialDetailMapper extends BaseMapper<PickingMaterialD
|
|||||||
*/
|
*/
|
||||||
Integer countMaterialTypesByOutOrderNumber(@Param("outOrderNumber") String outOrderNumber);
|
Integer countMaterialTypesByOutOrderNumber(@Param("outOrderNumber") String outOrderNumber);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 按出库单号查询有拣货数量的 out_unique_id 列表(= out_material_detail.unique_id,即复核单上的明细)
|
||||||
|
*/
|
||||||
|
List<Long> selectOutUniqueIdsWithPickingByOutOrderNumber(@Param("outOrderNumber") String outOrderNumber);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description 根据拣货单增加拣货数量
|
* @description 根据拣货单增加拣货数量
|
||||||
* @author ZhouGY
|
* @author ZhouGY
|
||||||
@@ -44,4 +49,21 @@ public interface PickingMaterialDetailMapper extends BaseMapper<PickingMaterialD
|
|||||||
*/
|
*/
|
||||||
public int addQuantity(PickingMaterialDetailDOByUpdate pickingMaterialDetailDOByUpdate);
|
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);
|
||||||
|
|
||||||
}
|
}
|
||||||
+11
@@ -301,6 +301,17 @@ public class PickingMaterialDetailImpl extends ServiceImpl<PickingMaterialDetail
|
|||||||
return true;
|
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 设置分配数量
|
* @description 设置分配数量
|
||||||
* @author ZhouGY
|
* @author ZhouGY
|
||||||
|
|||||||
+13
@@ -63,6 +63,19 @@ public class ContainerShiftDO implements Serializable {
|
|||||||
@Excel(name = "库位名称")
|
@Excel(name = "库位名称")
|
||||||
private String storageLocationName;
|
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("批次号")
|
@ApiModelProperty("批次号")
|
||||||
@Excel(name = "批次号")
|
@Excel(name = "批次号")
|
||||||
private String batchNumber;
|
private String batchNumber;
|
||||||
|
|||||||
+32
-15
@@ -790,12 +790,21 @@ public class StockOutOrderDomainService {
|
|||||||
outMaterialDetailPO.setCheckVolume(pickingMaterialDetailPO.getTotalVolume());
|
outMaterialDetailPO.setCheckVolume(pickingMaterialDetailPO.getTotalVolume());
|
||||||
outMaterialDetailPO.setCheckNetWeight(pickingMaterialDetailPO.getTotalNetWeight());
|
outMaterialDetailPO.setCheckNetWeight(pickingMaterialDetailPO.getTotalNetWeight());
|
||||||
outMaterialDetailPO.setCheckGrossWeight(pickingMaterialDetailPO.getTotalGrossWeight());
|
outMaterialDetailPO.setCheckGrossWeight(pickingMaterialDetailPO.getTotalGrossWeight());
|
||||||
// 复核明细按已拣货完成数量:优先使用 picking_material_detail 汇总的拣货数量(真实拣货数据)
|
// 拣货数量:优先 picking_material_detail,否则 out_material_detail
|
||||||
if (pickingMaterialDetailPO.getPickingQuantity() != null && pickingMaterialDetailPO.getPickingQuantity().compareTo(BigDecimal.ZERO) > 0) {
|
BigDecimal pickQty = (pickingMaterialDetailPO.getPickingQuantity() != null && pickingMaterialDetailPO.getPickingQuantity().compareTo(BigDecimal.ZERO) > 0)
|
||||||
outMaterialDetailPO.setWaitCheckQuantity(pickingMaterialDetailPO.getPickingQuantity());
|
? pickingMaterialDetailPO.getPickingQuantity() : outMaterialDetailPO.getPickingQuantity();
|
||||||
} else {
|
BigDecimal checkQty = outMaterialDetailPO.getCheckQuantity() != null ? outMaterialDetailPO.getCheckQuantity() : BigDecimal.ZERO;
|
||||||
outMaterialDetailPO.setWaitCheckQuantity(outMaterialDetailPO.getPickingQuantity());
|
// 待复核数量 = 拣货数量 - 已复核数量(复核提交后应减少)
|
||||||
|
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();
|
List<OutMaterialDetailPO> children = outMaterialDetailPO.getChildren();
|
||||||
if (!CollectionUtils.isEmpty(children)) {
|
if (!CollectionUtils.isEmpty(children)) {
|
||||||
@@ -813,12 +822,21 @@ public class StockOutOrderDomainService {
|
|||||||
outMaterialDetailPOChild.setCheckVolume(pickingMaterialDetailPO1.getTotalVolume());
|
outMaterialDetailPOChild.setCheckVolume(pickingMaterialDetailPO1.getTotalVolume());
|
||||||
outMaterialDetailPOChild.setCheckNetWeight(pickingMaterialDetailPO1.getTotalNetWeight());
|
outMaterialDetailPOChild.setCheckNetWeight(pickingMaterialDetailPO1.getTotalNetWeight());
|
||||||
outMaterialDetailPOChild.setCheckGrossWeight(pickingMaterialDetailPO1.getTotalGrossWeight());
|
outMaterialDetailPOChild.setCheckGrossWeight(pickingMaterialDetailPO1.getTotalGrossWeight());
|
||||||
// 复核明细按已拣货完成数量:优先使用 picking_material_detail 汇总的拣货数量(真实拣货数据)
|
// 拣货数量:优先 picking_material_detail,否则 out_material_detail
|
||||||
if (pickingMaterialDetailPO1.getPickingQuantity() != null && pickingMaterialDetailPO1.getPickingQuantity().compareTo(BigDecimal.ZERO) > 0) {
|
BigDecimal pickQtyChild = (pickingMaterialDetailPO1.getPickingQuantity() != null && pickingMaterialDetailPO1.getPickingQuantity().compareTo(BigDecimal.ZERO) > 0)
|
||||||
outMaterialDetailPOChild.setWaitCheckQuantity(pickingMaterialDetailPO1.getPickingQuantity());
|
? pickingMaterialDetailPO1.getPickingQuantity() : outMaterialDetailPOChild.getPickingQuantity();
|
||||||
} else {
|
BigDecimal checkQtyChild = outMaterialDetailPOChild.getCheckQuantity() != null ? outMaterialDetailPOChild.getCheckQuantity() : BigDecimal.ZERO;
|
||||||
outMaterialDetailPOChild.setWaitCheckQuantity(outMaterialDetailPOChild.getPickingQuantity());
|
// 待复核数量 = 拣货数量 - 已复核数量(复核提交后应减少)
|
||||||
|
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){
|
for (OutMaterialDetailPO outMaterialDetailPO : outMaterialDetailPOList){
|
||||||
weightLimit = weightLimit.add(outMaterialDetailPO.getWeightLimit());
|
weightLimit = weightLimit.add(outMaterialDetailPO.getWeightLimit());
|
||||||
volumeLimit = volumeLimit.add(outMaterialDetailPO.getVolumeLimit());
|
volumeLimit = volumeLimit.add(outMaterialDetailPO.getVolumeLimit());
|
||||||
// 待复核数量按已拣货完成数量:优先 waitCheckQuantity(来自 picking_material_detail),否则用 pickingQuantity
|
// wantNumber=拣货数量总和,alreadyNumber=已复核总和,notHaveNumber=剩余待复核
|
||||||
BigDecimal qty = (outMaterialDetailPO.getWaitCheckQuantity() != null && outMaterialDetailPO.getWaitCheckQuantity().compareTo(BigDecimal.ZERO) > 0)
|
BigDecimal pickQty = (outMaterialDetailPO.getQuantity() != null ? outMaterialDetailPO.getQuantity() : outMaterialDetailPO.getPickingQuantity());
|
||||||
? outMaterialDetailPO.getWaitCheckQuantity() : outMaterialDetailPO.getPickingQuantity();
|
wantNumber = wantNumber.add(pickQty != null ? pickQty : BigDecimal.ZERO);
|
||||||
wantNumber = wantNumber.add(qty != null ? qty : BigDecimal.ZERO);
|
alreadyNumber = alreadyNumber.add(outMaterialDetailPO.getCheckQuantity() != null ? outMaterialDetailPO.getCheckQuantity() : BigDecimal.ZERO);
|
||||||
alreadyNumber = alreadyNumber.add(outMaterialDetailPO.getCheckQuantity());
|
|
||||||
}
|
}
|
||||||
OutMaterialCheckPO outMaterialCheckPO = new OutMaterialCheckPO();
|
OutMaterialCheckPO outMaterialCheckPO = new OutMaterialCheckPO();
|
||||||
outMaterialCheckPO.setCount(outMaterialDetailPOList.size());
|
outMaterialCheckPO.setCount(outMaterialDetailPOList.size());
|
||||||
|
|||||||
+5
-4
@@ -167,17 +167,18 @@ public class TaskPickingMaterialDetailImpl extends ServiceImpl<TaskPickingMateri
|
|||||||
.filter(p -> pickingUniqueId.equals(p.getUniqueId())).findFirst().orElse(null);
|
.filter(p -> pickingUniqueId.equals(p.getUniqueId())).findFirst().orElse(null);
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
existing.setPickingQuantity((existing.getPickingQuantity() != null ? existing.getPickingQuantity() : BigDecimal.ZERO).add(qty));
|
existing.setPickingQuantity((existing.getPickingQuantity() != null ? existing.getPickingQuantity() : BigDecimal.ZERO).add(qty));
|
||||||
|
// 净重、毛重、体积、面积:拣货填写值直接覆盖,不累加
|
||||||
if (taskPickingMaterialDetailDO.getTotalNetWeight() != null) {
|
if (taskPickingMaterialDetailDO.getTotalNetWeight() != null) {
|
||||||
existing.setTotalNetWeight((existing.getTotalNetWeight() != null ? existing.getTotalNetWeight() : BigDecimal.ZERO).add(taskPickingMaterialDetailDO.getTotalNetWeight()));
|
existing.setTotalNetWeight(taskPickingMaterialDetailDO.getTotalNetWeight());
|
||||||
}
|
}
|
||||||
if (taskPickingMaterialDetailDO.getTotalGrossWeight() != null) {
|
if (taskPickingMaterialDetailDO.getTotalGrossWeight() != null) {
|
||||||
existing.setTotalGrossWeight((existing.getTotalGrossWeight() != null ? existing.getTotalGrossWeight() : BigDecimal.ZERO).add(taskPickingMaterialDetailDO.getTotalGrossWeight()));
|
existing.setTotalGrossWeight(taskPickingMaterialDetailDO.getTotalGrossWeight());
|
||||||
}
|
}
|
||||||
if (taskPickingMaterialDetailDO.getTotalVolume() != null) {
|
if (taskPickingMaterialDetailDO.getTotalVolume() != null) {
|
||||||
existing.setTotalVolume((existing.getTotalVolume() != null ? existing.getTotalVolume() : BigDecimal.ZERO).add(taskPickingMaterialDetailDO.getTotalVolume()));
|
existing.setTotalVolume(taskPickingMaterialDetailDO.getTotalVolume());
|
||||||
}
|
}
|
||||||
if (taskPickingMaterialDetailDO.getTotalArea() != null) {
|
if (taskPickingMaterialDetailDO.getTotalArea() != null) {
|
||||||
existing.setTotalArea((existing.getTotalArea() != null ? existing.getTotalArea() : BigDecimal.ZERO).add(taskPickingMaterialDetailDO.getTotalArea()));
|
existing.setTotalArea(taskPickingMaterialDetailDO.getTotalArea());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
PickingMaterialDetailDO pickingMaterialDetailDO = new PickingMaterialDetailDO();
|
PickingMaterialDetailDO pickingMaterialDetailDO = new PickingMaterialDetailDO();
|
||||||
|
|||||||
+28
-4
@@ -220,6 +220,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
AND IFNULL(pmd.PICKING_QUANTITY, 0) > 0
|
AND IFNULL(pmd.PICKING_QUANTITY, 0) > 0
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<select id="selectOutUniqueIdsWithPickingByOutOrderNumber" resultType="java.lang.Long">
|
||||||
|
SELECT DISTINCT pmd.OUT_UNIQUE_ID
|
||||||
|
FROM picking_material_detail pmd
|
||||||
|
INNER JOIN out_material_detail omd ON pmd.OUT_UNIQUE_ID = omd.UNIQUE_ID AND omd.DEL_FLAG = 1
|
||||||
|
WHERE omd.OUT_ORDER_NUMBER = #{outOrderNumber}
|
||||||
|
AND pmd.DEL_FLAG = 1
|
||||||
|
AND IFNULL(pmd.PICKING_QUANTITY, 0) > 0
|
||||||
|
</select>
|
||||||
|
|
||||||
<update id="addQuantity" parameterType="com.mhd.wms.domain.pickingMaterialDetail.repository.todo.PickingMaterialDetailDOByUpdate">
|
<update id="addQuantity" parameterType="com.mhd.wms.domain.pickingMaterialDetail.repository.todo.PickingMaterialDetailDOByUpdate">
|
||||||
UPDATE picking_material_detail
|
UPDATE picking_material_detail
|
||||||
<set>
|
<set>
|
||||||
@@ -228,24 +237,25 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
WHEN #{item.uniqueId} THEN LEAST(picking_quantity + #{item.pickingQuantity}, quantity)
|
WHEN #{item.uniqueId} THEN LEAST(picking_quantity + #{item.pickingQuantity}, quantity)
|
||||||
</foreach>
|
</foreach>
|
||||||
</trim>
|
</trim>
|
||||||
|
<!-- 净重、毛重、体积、面积:拣货填写值直接覆盖,不累加 -->
|
||||||
<trim prefix="total_net_weight = CASE unique_id" suffix="END,">
|
<trim prefix="total_net_weight = CASE unique_id" suffix="END,">
|
||||||
<foreach collection="pickingMaterialDetailList" item="item" index="index">
|
<foreach collection="pickingMaterialDetailList" item="item" index="index">
|
||||||
WHEN #{item.uniqueId} THEN IFNULL(total_net_weight, 0) + IFNULL(#{item.totalNetWeight}, 0)
|
WHEN #{item.uniqueId} THEN IFNULL(#{item.totalNetWeight}, total_net_weight)
|
||||||
</foreach>
|
</foreach>
|
||||||
</trim>
|
</trim>
|
||||||
<trim prefix="total_gross_weight = CASE unique_id" suffix="END,">
|
<trim prefix="total_gross_weight = CASE unique_id" suffix="END,">
|
||||||
<foreach collection="pickingMaterialDetailList" item="item" index="index">
|
<foreach collection="pickingMaterialDetailList" item="item" index="index">
|
||||||
WHEN #{item.uniqueId} THEN IFNULL(total_gross_weight, 0) + IFNULL(#{item.totalGrossWeight}, 0)
|
WHEN #{item.uniqueId} THEN IFNULL(#{item.totalGrossWeight}, total_gross_weight)
|
||||||
</foreach>
|
</foreach>
|
||||||
</trim>
|
</trim>
|
||||||
<trim prefix="total_volume = CASE unique_id" suffix="END,">
|
<trim prefix="total_volume = CASE unique_id" suffix="END,">
|
||||||
<foreach collection="pickingMaterialDetailList" item="item" index="index">
|
<foreach collection="pickingMaterialDetailList" item="item" index="index">
|
||||||
WHEN #{item.uniqueId} THEN IFNULL(total_volume, 0) + IFNULL(#{item.totalVolume}, 0)
|
WHEN #{item.uniqueId} THEN IFNULL(#{item.totalVolume}, total_volume)
|
||||||
</foreach>
|
</foreach>
|
||||||
</trim>
|
</trim>
|
||||||
<trim prefix="total_area = CASE unique_id" suffix="END,">
|
<trim prefix="total_area = CASE unique_id" suffix="END,">
|
||||||
<foreach collection="pickingMaterialDetailList" item="item" index="index">
|
<foreach collection="pickingMaterialDetailList" item="item" index="index">
|
||||||
WHEN #{item.uniqueId} THEN IFNULL(total_area, 0) + IFNULL(#{item.totalArea}, 0)
|
WHEN #{item.uniqueId} THEN IFNULL(#{item.totalArea}, total_area)
|
||||||
</foreach>
|
</foreach>
|
||||||
</trim>
|
</trim>
|
||||||
update_by = #{updateBy},
|
update_by = #{updateBy},
|
||||||
@@ -258,4 +268,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
#{item.uniqueId}
|
#{item.uniqueId}
|
||||||
</foreach>
|
</foreach>
|
||||||
</update>
|
</update>
|
||||||
|
|
||||||
|
<!-- 复核提交时:先将该 out_unique_id 下所有行置0 -->
|
||||||
|
<update id="resetWeightVolumeByOutUniqueId">
|
||||||
|
UPDATE picking_material_detail SET total_net_weight = 0, total_gross_weight = 0, total_volume = 0, total_area = 0
|
||||||
|
WHERE out_unique_id = #{outUniqueId} AND del_flag = 1
|
||||||
|
</update>
|
||||||
|
<!-- 复核提交时:将第一行设为复核值,保证 queryTotalsByOutNumberAndBaseId 汇总正确(first 为达梦保留字,改用 first_row) -->
|
||||||
|
<update id="updateFirstRowWeightVolumeByOutUniqueId">
|
||||||
|
UPDATE picking_material_detail pmd
|
||||||
|
INNER JOIN (SELECT unique_id FROM picking_material_detail WHERE out_unique_id = #{outUniqueId} AND del_flag = 1 ORDER BY unique_id LIMIT 1) first_row ON pmd.unique_id = first_row.unique_id
|
||||||
|
SET pmd.total_net_weight = #{totalNetWeight}, pmd.total_gross_weight = #{totalGrossWeight}, pmd.total_volume = #{totalVolume}, pmd.total_area = #{totalArea},
|
||||||
|
pmd.update_by = #{updateBy}, pmd.update_by_name = #{updateByName}, pmd.update_time = #{updateTime}
|
||||||
|
WHERE pmd.out_unique_id = #{outUniqueId} AND pmd.del_flag = 1
|
||||||
|
</update>
|
||||||
</mapper>
|
</mapper>
|
||||||
Reference in New Issue
Block a user