newMethod #1

Merged
liangzhou merged 7 commits from newMethod into main 2025-09-02 13:50:10 +08:00
Showing only changes of commit c0f4471b8f - Show all commits

View File

@ -381,9 +381,10 @@ public class WorkServiceImplements implements IWorkService {
* @param model 机型
*/
private void findWorks(String workStation, List<WorkFlow> workFlows, String model, LocalDate currentWorkDate) {
String modelStr = Objects.equals(model, "MWL") ? "装载机" : "平地机";
//开始时间
LocalDateTime startTime = LocalDateTime.now();
System.out.println("开始时间:" + startTime);
System.out.println("分析当日" + modelStr + "工作流,开始时间:" + startTime);
// 查到当前站台所有的小工位
LambdaQueryWrapper<WorkStationConfig> stationConfigQueryWrapper = new LambdaQueryWrapper<WorkStationConfig>()
.eq(StringUtils.isNotEmpty(workStation), WorkStationConfig::getWorkStation, workStation);
@ -496,9 +497,10 @@ public class WorkServiceImplements implements IWorkService {
}
//结束时间
LocalDateTime endTime = LocalDateTime.now();
System.out.println("分析当日" + modelStr + "工作流,结束时间:" + endTime);
// 用时
long duration = Duration.between(startTime, endTime).toMillis();
logger.info("生成当天工作流耗时:{}ms", duration);
logger.info("分析当日{}工作流耗时:{}ms", modelStr, duration);
}
@ -538,6 +540,7 @@ public class WorkServiceImplements implements IWorkService {
public void createTempWorkFlows() {
LocalDate currentWorkDate = getCurrentWorkDate();
if (!localWorkDateList.contains(currentWorkDate)) {
logger.info("非工作日,不创建工作流。");
return;
}
// 查找所有未锁定的拣选站台
@ -547,6 +550,7 @@ public class WorkServiceImplements implements IWorkService {
for (Stand stand : usableStands) {
if (stand.getStandStatus() == 0) {
// 存在站台处于可用状态不创建工作流
logger.info("存在站台处于可用状态,不创建工作流。");
return;
}
}
@ -617,10 +621,10 @@ public class WorkServiceImplements implements IWorkService {
.in(KateDBS::getWorkOrder, workOrderList)
.eq(KateDBS::getDbsStatus, 0));
}
logger.info("createTempWorkFlows 成功");
logger.info("创建工作流成功,此次创建{}条。", finalWorkFlows.size());
}
} else {
logger.info("createTempWorkFlows 为空");
logger.info("未创建新的工作流。");
}
}
@ -738,6 +742,7 @@ public class WorkServiceImplements implements IWorkService {
List<ELocationConfig> finalELocationConfigsOfFirst = new ArrayList<>();// 标签库位分配
// 下面开始分配首选工作
if (!needDistributeWorksOfFirst.isEmpty() && !firstWorkStandIds.isEmpty()) {
logger.info("开始分配首选机型。");
// 获取大盒子-订单的map
Map<String, List<WorkFlow>> workFlowsByBigBoxMapOfFirst = new HashMap<>();
for (WorkFlow workFlow : needDistributeWorksOfFirst) {
@ -755,7 +760,7 @@ public class WorkServiceImplements implements IWorkService {
bigBoxToGoodsTypeQtyMap.put(bigBox, goodsTypeQty);
}
// 根据物料种类数量对大盒子进行排序
List<String> sortedBoxedByGoodsTypeQty = bigBoxToGoodsTypeQtyMap.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())).map(Map.Entry::getKey).toList();
List<String> sortedBoxesByGoodsTypeQty = bigBoxToGoodsTypeQtyMap.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())).map(Map.Entry::getKey).toList();
// 每个站台包含的物料种类数量
Map<String, List<String>> stationToGoodsTypeQtyMap = new HashMap<>();
// 每个站台分配的电子标签
@ -782,14 +787,14 @@ public class WorkServiceImplements implements IWorkService {
// 物料种类总数---这里存在一个分歧大盒子之间的共通物料种类是否需要重复计算---CONFUSION
int totalGoodsTypeQty = needDistributeWorksOfFirst.stream().map(WorkFlow::getGoodsId).distinct().toList().size();
// 物料种类数量平均值
int goodsTypeQtyAverage = (int) Math.ceil(totalGoodsTypeQty / (double) standIds.size());
int goodsTypeQtyAverage = (int) Math.ceil(totalGoodsTypeQty / (double) firstWorkStandIds.size());
// 查询出需要分配的工单的dbs
List<KateDBS> kateDBSS = kateDBSService.list(new LambdaQueryWrapper<KateDBS>()
.in(KateDBS::getWorkOrder, needDistributeWorksOfFirst.stream().map(WorkFlow::getWorkOrder).distinct().toList()));
// 将这个工单的顺序号进行一个map
Map<String, Integer> workOrderToSequenceMap = kateDBSS.stream().collect(Collectors.toMap(KateDBS::getWorkOrder, KateDBS::getWorkSequence));
for (String bigBox : sortedBoxedByGoodsTypeQty) {
// 找出这个站台下的工作流
for (String bigBox : sortedBoxesByGoodsTypeQty) {
// 找出这个大盒子下的工作流
List<WorkFlow> thisBoxWorkFlows = workFlowsByBigBoxMapOfFirst.get(bigBox);
if (thisBoxWorkFlows.isEmpty()) {
// 当前大盒子没有工作流跳过
@ -897,12 +902,15 @@ public class WorkServiceImplements implements IWorkService {
for (String standId : stationToELocationConfigsMap.keySet()) {
finalELocationConfigsOfFirst.addAll(stationToELocationConfigsMap.get(standId));
}
} else {
logger.info("无法分配首选机型,可能是没有工作流或可用站台。");
}
// 次选工作存储的信息
List<GoodsToStation> finalGoodsToStationsOfNext = new ArrayList<>();// 物料分配
List<ELocationConfig> finalELocationConfigsOfNext = new ArrayList<>();// 标签库位分配
// 处理次选工作 TODO 需要考虑一下优先分配和首选工作存在相同物料种类的大盒子
if (!needDistributeWorksOfNext.isEmpty() && !nextWorkStandIds.isEmpty()) {
logger.info("开始分配次选机型。");
// 获取大盒子-订单的map
Map<String, List<WorkFlow>> workFlowsByBigBoxMapOfNext = new HashMap<>();
for (WorkFlow workFlow : needDistributeWorksOfNext) {
@ -920,7 +928,7 @@ public class WorkServiceImplements implements IWorkService {
bigBoxToGoodsTypeQtyMap.put(bigBox, goodsTypeQty);
}
// 根据物料种类数量对大盒子进行排序
List<String> sortedBoxedByGoodsTypeQty = bigBoxToGoodsTypeQtyMap.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())).map(Map.Entry::getKey).toList();
List<String> sortedBoxesByGoodsTypeQty = bigBoxToGoodsTypeQtyMap.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())).map(Map.Entry::getKey).toList();
// 每个站台包含的物料种类数量
Map<String, List<String>> stationToGoodsTypeQtyMap = new HashMap<>();
// 每个站台分配的电子标签
@ -947,14 +955,14 @@ public class WorkServiceImplements implements IWorkService {
// 物料种类总数---这里存在一个分歧大盒子之间的共通物料种类是否需要重复计算---CONFUSION
int totalGoodsTypeQty = needDistributeWorksOfNext.stream().map(WorkFlow::getGoodsId).distinct().toList().size();
// 物料种类数量平均值
int goodsTypeQtyAverage = (int) Math.ceil(totalGoodsTypeQty / (double) standIds.size());
int goodsTypeQtyAverage = (int) Math.ceil(totalGoodsTypeQty / (double) nextWorkStandIds.size());
// 查询出需要分配的工单的dbs
List<KateDBS> kateDBSS = kateDBSService.list(new LambdaQueryWrapper<KateDBS>()
.in(KateDBS::getWorkOrder, needDistributeWorksOfNext.stream().map(WorkFlow::getWorkOrder).distinct().toList()));
// 将这个工单的顺序号进行一个map
Map<String, Integer> workOrderToSequenceMap = kateDBSS.stream().collect(Collectors.toMap(KateDBS::getWorkOrder, KateDBS::getWorkSequence));
for (String bigBox : sortedBoxedByGoodsTypeQty) {
// 找出这个站台下的工作流
for (String bigBox : sortedBoxesByGoodsTypeQty) {
// 找出这个大盒子下的工作流
List<WorkFlow> thisBoxWorkFlows = workFlowsByBigBoxMapOfNext.get(bigBox);
if (thisBoxWorkFlows.isEmpty()) {
// 当前大盒子没有工作流跳过
@ -1053,15 +1061,17 @@ public class WorkServiceImplements implements IWorkService {
}
// 替换
stationToGoodsToStationsMap.put(thisStandId, oldGoodsStationsMap.values().stream().toList());
// 以下更新物料需求
for (String standId : stationToGoodsToStationsMap.keySet()) {
finalGoodsToStationsOfNext.addAll(stationToGoodsToStationsMap.get(standId));
}
// 以下更新电子标签配置
for (String standId : stationToELocationConfigsMap.keySet()) {
finalELocationConfigsOfNext.addAll(stationToELocationConfigsMap.get(standId));
}
}
// 以下更新物料需求
for (String standId : stationToGoodsToStationsMap.keySet()) {
finalGoodsToStationsOfNext.addAll(stationToGoodsToStationsMap.get(standId));
}
// 以下更新电子标签配置
for (String standId : stationToELocationConfigsMap.keySet()) {
finalELocationConfigsOfNext.addAll(stationToELocationConfigsMap.get(standId));
}
} else {
logger.info("无法分配次选机型,可能是没有工作流或可用站台。");
}
// 最终存储数据
@ -1077,6 +1087,9 @@ public class WorkServiceImplements implements IWorkService {
// 更新物料需求数据库
if (!finalGoodsToStations.isEmpty()) {
goodsToStationService.saveOrUpdateBatch(finalGoodsToStations);
logger.info("添加新的站台物料需求成功。");
} else {
logger.info("没有新的站台物料需求。");
}
// 电子标签配置
if (!finalELocationConfigsOfFirst.isEmpty()) {
@ -1088,12 +1101,17 @@ public class WorkServiceImplements implements IWorkService {
// 添加标签配置数据库
if (!finalELocationConfigs.isEmpty()) {
eLocationConfigService.saveBatch(finalELocationConfigs);
logger.info("添加新的灯光配置成功。");
} else {
logger.info("没有新的灯光配置。");
}
// 更新工作流数据
if (!thisTimeDistributeWorkFlows.isEmpty()) {
workFlowService.updateBatchById(thisTimeDistributeWorkFlows);
logger.info("分配工作完成,此次分配{}条。", thisTimeDistributeWorkFlows.size());
} else {
logger.info("此次未执行分配。");
}
logger.info("分配工作完成");
} catch (Exception e) {
logger.error("分配工作发生异常:{}", JSON.toJSONString(e));
// 回滚事务