no message
parent
3ccab344bd
commit
88176e1522
|
|
@ -51,7 +51,10 @@ public enum AsnTypeEnum {
|
|||
AsnTypeEnum.PJ.getValue(),
|
||||
AsnTypeEnum.JY.getValue(),
|
||||
AsnTypeEnum.CPC.getValue(),
|
||||
AsnTypeEnum.PJC.getValue()
|
||||
AsnTypeEnum.PJC.getValue(),
|
||||
AsnTypeEnum.SC.getValue(),
|
||||
AsnTypeEnum.WX.getValue(),
|
||||
AsnTypeEnum.QC.getValue()
|
||||
);
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,6 +20,14 @@ public enum PickTypeEnum {
|
|||
|
||||
JY(7, "检验出库"),
|
||||
|
||||
SC(1, "生产出库"),
|
||||
|
||||
BF(2, "报废出库"),
|
||||
|
||||
WX(3, "维修出库"),
|
||||
|
||||
DJ(8, "点检出库"),
|
||||
|
||||
;
|
||||
|
||||
PickTypeEnum(Integer value, String desc) {
|
||||
|
|
@ -41,7 +49,11 @@ public enum PickTypeEnum {
|
|||
PickTypeEnum.CP.getValue(),
|
||||
PickTypeEnum.PJ.getValue(),
|
||||
PickTypeEnum.FG.getValue(),
|
||||
PickTypeEnum.JY.getValue()
|
||||
PickTypeEnum.JY.getValue(),
|
||||
PickTypeEnum.SC.getValue(),
|
||||
PickTypeEnum.BF.getValue(),
|
||||
PickTypeEnum.WX.getValue(),
|
||||
PickTypeEnum.DJ.getValue()
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -230,11 +230,18 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements IT
|
|||
}
|
||||
|
||||
//目前是四个工作站
|
||||
List<Point> outPoints = pointService.queryPoints(null, null, AreaTypeEnum.CK_DOCK.getValue());
|
||||
if (CollectionUtils.isEmpty(outPoints)) {
|
||||
log.info("没有出库工作站");
|
||||
List<Point> outCpPoints = pointService.queryPoints(null, null, AreaTypeEnum.CK_DOCK.getValue());
|
||||
if (CollectionUtils.isEmpty(outCpPoints)) {
|
||||
log.info("没有成品出库工作站");
|
||||
return;
|
||||
}
|
||||
|
||||
List<Point> outMjPoints = pointService.queryPoints(null, null, AreaTypeEnum.MJCK_DOCK.getValue());
|
||||
if (CollectionUtils.isEmpty(outMjPoints)) {
|
||||
log.info("没有模具出库工作站");
|
||||
return;
|
||||
}
|
||||
|
||||
//当前所有工作站执行中的任务
|
||||
Map<String, Integer> pointTaskCountMap = queryPointTaskCount();
|
||||
|
||||
|
|
@ -253,20 +260,28 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements IT
|
|||
//获取所有出库单明细
|
||||
List<Long> pickDetailId = taskList.stream().map(Task::getPickDetailId).distinct().toList();
|
||||
Map<Long, PickDetail> pickDetailMap = pickDetailService.queryByPickDetailIdsToMap(pickDetailId);
|
||||
List<Point> outPoints;
|
||||
for (Task task : taskList) {
|
||||
//起点
|
||||
Point fromPoint = fromPointMap.get(task.getFromPointId());
|
||||
//出库单
|
||||
Pick pick = pickMap.get(task.getPickId());
|
||||
//选择最优且任务数最少的工作站
|
||||
Point bestOutPoint = selectBestAvailableOutboundPoint(fromPoint, outPoints, pointTaskCountMap);
|
||||
Point bestOutPoint;
|
||||
if(Set.of(4, 5, 6, 7).contains(pick.getOrderType())){
|
||||
outPoints=outCpPoints;
|
||||
bestOutPoint = selectBestAvailableOutboundPoint(fromPoint, outPoints, pointTaskCountMap);
|
||||
}else{
|
||||
bestOutPoint=outMjPoints.get(0);
|
||||
}
|
||||
task.setToPointId(bestOutPoint.getId());
|
||||
task.setToPointCode(bestOutPoint.getPointCode());
|
||||
|
||||
//分配日志
|
||||
Inventory inventory = inventoryMap.get(task.getInventoryId());
|
||||
Pick pick = pickMap.get(task.getPickId());
|
||||
PickDetail pickDetail = pickDetailMap.get(task.getPickDetailId());
|
||||
|
||||
if (inventory != null && pick != null && pickDetail != null) {
|
||||
if (inventory != null && pickDetail != null) {
|
||||
inventoryLogService.addAllocInventoryLog(inventory, bestOutPoint.getId(),
|
||||
task.getPlanQty(), pick.getThirdOrderNo(), pickDetail.getId(), pickDetail.getDescription());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -269,19 +269,88 @@ public class PickProcessor {
|
|||
* @param pickedQty 拣货数量
|
||||
* @param pickDetailUpdateMap 拣货明细更新集合
|
||||
*/
|
||||
private void updatePickDetail(PickData data, Task task, BigDecimal pickedQty,
|
||||
Map<Long, PickDetail> pickDetailUpdateMap) {
|
||||
//出库明细
|
||||
PickDetail pickDetail = data.getPickDetailMap().get(task.getPickDetailId());
|
||||
//获取map最新的出库明细
|
||||
PickDetail targetPickDetail = pickDetailUpdateMap.getOrDefault(pickDetail.getId(), pickDetail);
|
||||
//拣货数量
|
||||
BigDecimal newPickedQty = BigDecimalUtil.add(targetPickDetail.getPickedQty(), pickedQty, 0);
|
||||
//状态
|
||||
Integer status = newPickedQty.compareTo(targetPickDetail.getOrderQty()) >= 0 ? PickStatusEnum.PICKED.getValue() : PickStatusEnum.PICKING.getValue();
|
||||
targetPickDetail.setPickedQty(newPickedQty);
|
||||
targetPickDetail.setStatus(status);
|
||||
pickDetailUpdateMap.put(targetPickDetail.getId(), targetPickDetail);
|
||||
private void updatePickDetail(
|
||||
PickData data,
|
||||
Task task,
|
||||
BigDecimal pickedQty,
|
||||
Map<Long, PickDetail> pickDetailUpdateMap
|
||||
) {
|
||||
// 从数据中获取原始 PickDetail
|
||||
PickDetail originalPickDetail = data.getPickDetailMap().get(task.getPickDetailId());
|
||||
if (originalPickDetail == null) {
|
||||
return; // 安全保护
|
||||
}
|
||||
|
||||
// 从 Map 获取已累积的 PickDetail(可能是已经部分更新过的)
|
||||
PickDetail currentPickDetail = pickDetailUpdateMap
|
||||
.computeIfAbsent(originalPickDetail.getId(), id -> clonePickDetail(originalPickDetail));
|
||||
|
||||
// 累加拣货数量
|
||||
BigDecimal existingQty = currentPickDetail.getPickedQty() == null
|
||||
? BigDecimal.ZERO
|
||||
: currentPickDetail.getPickedQty();
|
||||
|
||||
BigDecimal newPickedQty = existingQty.add(pickedQty);
|
||||
|
||||
// 订单总数量
|
||||
BigDecimal orderQty = currentPickDetail.getOrderQty() == null
|
||||
? BigDecimal.ZERO
|
||||
: currentPickDetail.getOrderQty();
|
||||
|
||||
// 确保 newPickedQty 不超过 orderQty
|
||||
if (newPickedQty.compareTo(orderQty) > 0) {
|
||||
newPickedQty = orderQty;
|
||||
}
|
||||
|
||||
// 更新数量
|
||||
currentPickDetail.setPickedQty(newPickedQty);
|
||||
|
||||
// 计算状态:是否完全拣完
|
||||
Integer status;
|
||||
if (newPickedQty.compareTo(orderQty) >= 0) {
|
||||
status = PickStatusEnum.PICKED.getValue();
|
||||
} else if (newPickedQty.compareTo(BigDecimal.ZERO) > 0) {
|
||||
status = PickStatusEnum.PICKING.getValue();
|
||||
}else {
|
||||
status = currentPickDetail.getStatus();
|
||||
}
|
||||
|
||||
currentPickDetail.setStatus(status);
|
||||
|
||||
// 最终写回更新 Map
|
||||
pickDetailUpdateMap.put(currentPickDetail.getId(), currentPickDetail);
|
||||
}
|
||||
|
||||
private PickDetail clonePickDetail(PickDetail src) {
|
||||
PickDetail dst = PickDetail.builder()
|
||||
.id(src.getId())
|
||||
.pickId(src.getPickId())
|
||||
.itemId(src.getItemId())
|
||||
.stockId(src.getStockId())
|
||||
.lineNo(src.getLineNo())
|
||||
.unit(src.getUnit())
|
||||
.project(src.getProject())
|
||||
.taskNo(src.getTaskNo())
|
||||
.orderQty(src.getOrderQty())
|
||||
.allocatedQty(src.getAllocatedQty())
|
||||
.pickedQty(src.getPickedQty())
|
||||
.status(src.getStatus())
|
||||
.propC1(src.getPropC1())
|
||||
.propC2(src.getPropC2())
|
||||
.propC3(src.getPropC3())
|
||||
.propC4(src.getPropC4())
|
||||
.propD1(src.getPropD1())
|
||||
.description(src.getDescription())
|
||||
.sourceId(src.getSourceId())
|
||||
.sourceName(src.getSourceName())
|
||||
.tenantId(src.getTenantId())
|
||||
.sysOrgCode(src.getSysOrgCode())
|
||||
.createBy(src.getCreateBy())
|
||||
.createTime(src.getCreateTime())
|
||||
.updateBy(src.getUpdateBy())
|
||||
.updateTime(src.getUpdateTime())
|
||||
.build();
|
||||
return dst;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in New Issue