no message
parent
3ccab344bd
commit
88176e1522
|
|
@ -51,7 +51,10 @@ public enum AsnTypeEnum {
|
||||||
AsnTypeEnum.PJ.getValue(),
|
AsnTypeEnum.PJ.getValue(),
|
||||||
AsnTypeEnum.JY.getValue(),
|
AsnTypeEnum.JY.getValue(),
|
||||||
AsnTypeEnum.CPC.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, "检验出库"),
|
JY(7, "检验出库"),
|
||||||
|
|
||||||
|
SC(1, "生产出库"),
|
||||||
|
|
||||||
|
BF(2, "报废出库"),
|
||||||
|
|
||||||
|
WX(3, "维修出库"),
|
||||||
|
|
||||||
|
DJ(8, "点检出库"),
|
||||||
|
|
||||||
;
|
;
|
||||||
|
|
||||||
PickTypeEnum(Integer value, String desc) {
|
PickTypeEnum(Integer value, String desc) {
|
||||||
|
|
@ -41,7 +49,11 @@ public enum PickTypeEnum {
|
||||||
PickTypeEnum.CP.getValue(),
|
PickTypeEnum.CP.getValue(),
|
||||||
PickTypeEnum.PJ.getValue(),
|
PickTypeEnum.PJ.getValue(),
|
||||||
PickTypeEnum.FG.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());
|
List<Point> outCpPoints = pointService.queryPoints(null, null, AreaTypeEnum.CK_DOCK.getValue());
|
||||||
if (CollectionUtils.isEmpty(outPoints)) {
|
if (CollectionUtils.isEmpty(outCpPoints)) {
|
||||||
log.info("没有出库工作站");
|
log.info("没有成品出库工作站");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<Point> outMjPoints = pointService.queryPoints(null, null, AreaTypeEnum.MJCK_DOCK.getValue());
|
||||||
|
if (CollectionUtils.isEmpty(outMjPoints)) {
|
||||||
|
log.info("没有模具出库工作站");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//当前所有工作站执行中的任务
|
//当前所有工作站执行中的任务
|
||||||
Map<String, Integer> pointTaskCountMap = queryPointTaskCount();
|
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();
|
List<Long> pickDetailId = taskList.stream().map(Task::getPickDetailId).distinct().toList();
|
||||||
Map<Long, PickDetail> pickDetailMap = pickDetailService.queryByPickDetailIdsToMap(pickDetailId);
|
Map<Long, PickDetail> pickDetailMap = pickDetailService.queryByPickDetailIdsToMap(pickDetailId);
|
||||||
|
List<Point> outPoints;
|
||||||
for (Task task : taskList) {
|
for (Task task : taskList) {
|
||||||
//起点
|
//起点
|
||||||
Point fromPoint = fromPointMap.get(task.getFromPointId());
|
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.setToPointId(bestOutPoint.getId());
|
||||||
task.setToPointCode(bestOutPoint.getPointCode());
|
task.setToPointCode(bestOutPoint.getPointCode());
|
||||||
|
|
||||||
//分配日志
|
//分配日志
|
||||||
Inventory inventory = inventoryMap.get(task.getInventoryId());
|
Inventory inventory = inventoryMap.get(task.getInventoryId());
|
||||||
Pick pick = pickMap.get(task.getPickId());
|
|
||||||
PickDetail pickDetail = pickDetailMap.get(task.getPickDetailId());
|
PickDetail pickDetail = pickDetailMap.get(task.getPickDetailId());
|
||||||
|
|
||||||
if (inventory != null && pick != null && pickDetail != null) {
|
if (inventory != null && pickDetail != null) {
|
||||||
inventoryLogService.addAllocInventoryLog(inventory, bestOutPoint.getId(),
|
inventoryLogService.addAllocInventoryLog(inventory, bestOutPoint.getId(),
|
||||||
task.getPlanQty(), pick.getThirdOrderNo(), pickDetail.getId(), pickDetail.getDescription());
|
task.getPlanQty(), pick.getThirdOrderNo(), pickDetail.getId(), pickDetail.getDescription());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -269,19 +269,88 @@ public class PickProcessor {
|
||||||
* @param pickedQty 拣货数量
|
* @param pickedQty 拣货数量
|
||||||
* @param pickDetailUpdateMap 拣货明细更新集合
|
* @param pickDetailUpdateMap 拣货明细更新集合
|
||||||
*/
|
*/
|
||||||
private void updatePickDetail(PickData data, Task task, BigDecimal pickedQty,
|
private void updatePickDetail(
|
||||||
Map<Long, PickDetail> pickDetailUpdateMap) {
|
PickData data,
|
||||||
//出库明细
|
Task task,
|
||||||
PickDetail pickDetail = data.getPickDetailMap().get(task.getPickDetailId());
|
BigDecimal pickedQty,
|
||||||
//获取map最新的出库明细
|
Map<Long, PickDetail> pickDetailUpdateMap
|
||||||
PickDetail targetPickDetail = pickDetailUpdateMap.getOrDefault(pickDetail.getId(), pickDetail);
|
) {
|
||||||
//拣货数量
|
// 从数据中获取原始 PickDetail
|
||||||
BigDecimal newPickedQty = BigDecimalUtil.add(targetPickDetail.getPickedQty(), pickedQty, 0);
|
PickDetail originalPickDetail = data.getPickDetailMap().get(task.getPickDetailId());
|
||||||
//状态
|
if (originalPickDetail == null) {
|
||||||
Integer status = newPickedQty.compareTo(targetPickDetail.getOrderQty()) >= 0 ? PickStatusEnum.PICKED.getValue() : PickStatusEnum.PICKING.getValue();
|
return; // 安全保护
|
||||||
targetPickDetail.setPickedQty(newPickedQty);
|
}
|
||||||
targetPickDetail.setStatus(status);
|
|
||||||
pickDetailUpdateMap.put(targetPickDetail.getId(), targetPickDetail);
|
// 从 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