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