opt:优化定时器调度

This commit is contained in:
zds
2025-06-23 16:23:09 +08:00
parent a09cc8332e
commit 80037a059c
10 changed files with 113 additions and 345 deletions

View File

@@ -61,4 +61,10 @@ public interface IMdPbPapervehicleService extends IService<MdPbPapervehicle> {
* @return
*/
List<MdPbPapervehicle> getAllTubesByPoint(String location);
/**
* 获取任务中的管芯信息
* @return
*/
List<MdPbPapervehicle> getInfoByTask();
}

View File

@@ -21,4 +21,6 @@ public interface MdPbPapervehicleMapper extends BaseMapper<MdPbPapervehicle> {
Integer checkHaveTaskByPoints(List<String> pointCodes);
List<MdPbPapervehicle> getAllTubesByPoint(String location);
List<MdPbPapervehicle> getInfoByTask();
}

View File

@@ -70,4 +70,14 @@
AND bs.is_used = '1'
AND p.qty > 0
</select>
<select id="getInfoByTask" resultType="org.nl.b_lms.bst.ivt.papervehicle.service.dao.MdPbPapervehicle">
SELECT p.* FROM sch_base_task t1
LEFT JOIN md_pb_papervehicle p ON p.vehicle_code = t1.vehicle_code2 AND p.qty > 0
WHERE t1.task_type = '010807' AND t1.task_status <![CDATA[ < ]]> '07' AND t1.is_delete = '0'
UNION
SELECT p.* FROM sch_base_task t2
LEFT JOIN md_pb_papervehicle p ON p.vehicle_code = t2.vehicle_code AND p.qty > 0
WHERE t2.task_type = '010808' AND t2.task_status <![CDATA[ < ]]> '07' AND t2.is_delete = '0'
</select>
</mapper>

View File

@@ -108,5 +108,8 @@ public class MdPbPapervehicleServiceImpl extends ServiceImpl<MdPbPapervehicleMap
public List<MdPbPapervehicle> getAllTubesByPoint(String location) {
return mdPbPapervehicleMapper.getAllTubesByPoint(location);
}
@Override
public List<MdPbPapervehicle> getInfoByTask() {
return mdPbPapervehicleMapper.getInfoByTask();
}
}

View File

@@ -103,4 +103,6 @@ public interface IBstIvtStockingivtService extends IService<BstIvtStockingivt> {
List<MdPbPapervehicle> showDetail2(Map param);
PdmBiOrderbominfo showBom2(Map param);
List<BstIvtStockingivt> getMoveTaskPoints();
}

View File

@@ -44,4 +44,6 @@ public interface BstIvtStockingivtMapper extends BaseMapper<BstIvtStockingivt> {
List<BhTubeMovePointDto> getCanMovePointList(String location, String pointType);
List<ShowStockView> showPapervehicleView(String product_area, String material_code);
List<BstIvtStockingivt> getMoveTaskPoints();
}

View File

@@ -117,4 +117,15 @@
p.vehicle_code,
p.material_code
</select>
<select id="getMoveTaskPoints" resultType="org.nl.b_lms.bst.ivt.stockingivt.service.dao.BstIvtStockingivt">
SELECT
s.*
FROM
sch_base_task t
LEFT JOIN bst_ivt_stockingivt s ON s.point_code = t.point_code1 AND s.point_type = '2' AND s.is_used = '1'
WHERE t.task_type = '010816'
AND t.task_status <![CDATA[ <> ]]> '07'
AND t.is_delete = '0'
</select>
</mapper>

View File

@@ -197,4 +197,9 @@ public class BstIvtStockingivtServiceImpl extends ServiceImpl<BstIvtStockingivtM
PdmBiOrderbominfo order = pdmBiOrderbominfoService.getOne(lam);
return order;
}
@Override
public List<BstIvtStockingivt> getMoveTaskPoints() {
return bstIvtStockingivtMapper.getMoveTaskPoints();
}
}

View File

@@ -42,8 +42,11 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -73,8 +76,6 @@ public class AutoCallAirShaftTask extends Prun {
@Autowired
private IBstIvtStockingivtService stockingivtService;
@Autowired
private ISysNoticeService noticeService;
@Autowired
private StockAreaSendVehicleTask stockAreaSendVehicleTask;
@Autowired
private StockAreaCallTubeTask stockAreaCallTubeTask;
@@ -599,20 +600,19 @@ public class AutoCallAirShaftTask extends Prun {
log.info("同位置的另一台穿拔轴机构:{}", one);
// 另一台所需要的数量
int otherDeviceTubeSize = 0;
if (ObjectUtil.isNotEmpty(one)) {
if (one.getTube_code1().equals(tubes.get(0))) {
otherDeviceTubeSize = (int) Stream.of(one.getTube_code1(), one.getTube_code2()).filter(ObjectUtil::isNotEmpty).count();
}
}
// 缺省的数量
int needQuantity = 0;
// 判断当前区域location对应的备货区是否含有相同的纸管 校验了不在搬运中
// todo: 要考虑防止所需要的托盘被搬走!
// type=1桁架底下的托盘, 关联对象material_code=纸管, qty > 0
List<BstIvtStockingivt> useList = stockingivtService.getPaperTubePoint("1", tubes.get(0), location, 0);
// type=2桁架底下的托盘, 关联对象material_code=纸管, qty > 0
List<BstIvtStockingivt> useList = stockingivtService.getPaperTubePoint("2", tubes.get(0), location, 0);
if (useList.size() > 0) {
// 求和,三个托盘中需要的管芯的数量。
int sum = useList.stream().mapToInt(BstIvtStockingivt::getQty).sum();
if (ObjectUtil.isNotEmpty(one)) {
if (one.getTube_code1().equals(tubes.get(0))) {
otherDeviceTubeSize = (int) Stream.of(one.getTube_code1(), one.getTube_code2()).filter(ObjectUtil::isNotEmpty).count();
}
}
// 说明三个位置中有包含此纸管的数据。
if (sum >= tubes.size() + otherDeviceTubeSize) {
return true;
@@ -622,7 +622,30 @@ public class AutoCallAirShaftTask extends Prun {
// 兜底
needQuantity = needTemp > 0 ? needTemp : 1;
}
// todo: 要考虑type=3的正在搬运往套轴区三个点的托盘是否有该库存如有直接返回true
// 2.2 查询是否存在任务正在搬运过来。(路上的是另一台机构的轴)
List<MdPbPapervehicle> havePapers = papervehicleService.getInfoByTask();
if (CollectionUtil.isNotEmpty(havePapers)) {
Map<String, Integer> sumByMaterialCode = havePapers.stream()
.collect(Collectors.groupingBy(
MdPbPapervehicle::getMaterial_code,
Collectors.mapping(
MdPbPapervehicle::getQty,
Collectors.reducing(
0,
Integer::sum
)
)
));
int sumQty = sumByMaterialCode.get(tubes.get(0)).intValue();
if (sumQty >= needQuantity ) {
log.info("AGV正在搬运管芯...");
return true;
}
// 如果不够,就计算还缺多少个
int needTemp = needQuantity - sumQty;
// 兜底
needQuantity = needTemp > 0 ? needTemp : tubes.size();
}
// 查找type=3的位置(待命的托盘)中是否存在(需要判断的是单独一个托盘) 校验了不在搬运中
List<BhTubePointDto> stockingivtList = stockingivtService.getNeedPaperTubePoint("3", tubes.get(0), location);
// 找一个点位: 目的需要的点位
@@ -635,15 +658,28 @@ public class AutoCallAirShaftTask extends Prun {
}
}
if (needPoint == null) {
// 不存在则站内通知
noticeService.createNotice("备货区找不到[" + tubes.get(0) + "]的纸管信息",
"点位[" + empty.getPoint_name() + "]无法从备货区找到纸管信息",
NoticeTypeEnum.EXCEPTION.getCode());
log.info("备货区找不到[" + tubes.get(0) + "]的纸管信息");
return false;
}
// 找到就创建AGV搬运任务
// 筛选3个位置中数量最少的搬走, 如果是空位,直接搬运过来
List<BhTubeMovePointDto> needMovePointList = stockingivtService.getCanMovePointList(location, "1");
List<BhTubeMovePointDto> needMovePointListAll = stockingivtService.getCanMovePointList(location, "2");
// 过滤掉另一台穿拔轴需要的轴的数据
List<BhTubeMovePointDto> needMovePointList = new ArrayList<>();
if (ObjectUtil.isEmpty(one)) {
needMovePointList = needMovePointListAll;
} else {
List<String> otherTubes = Stream.of(one.getTube_code1(), one.getTube_code2()).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
needMovePointList = needMovePointListAll.stream().filter(bh -> {
String vehicleCode = bh.getVehicle_code();
if (otherTubes.size() == 0 || "0".equals(bh.getIvt_status()) || ObjectUtil.isEmpty(vehicleCode)) {
return true;
}
List<MdPbPapervehicle> list = papervehicleService.list(new LambdaQueryWrapper<MdPbPapervehicle>()
.eq(MdPbPapervehicle::getVehicle_code, vehicleCode).eq(MdPbPapervehicle::getMaterial_code, otherTubes.get(0)));
return list.size() == 0;
}).collect(Collectors.toList());
}
// 空位就直接创建搬过来的任务
BhTubeMovePointDto needMovePoint = needMovePointList.size() > 0 ? needMovePointList.get(0) : null;
if (ObjectUtil.isEmpty(needMovePoint) || "0".equals(needMovePoint.getIvt_status())) {
@@ -661,12 +697,28 @@ public class AutoCallAirShaftTask extends Prun {
stockAreaCallTubeTask.createTask(param);
return true;
}
// 3.2 判断是否有单独拉出去的任务,有的话直接拉过来。
List<BstIvtStockingivt> stockingivts = stockingivtService.getMoveTaskPoints();
if (CollectionUtil.isNotEmpty(stockingivts)) {
BstIvtStockingivt bstIvtStockingivt = stockingivts.get(0);
// 直接搬过来即可
JSONObject param = new JSONObject();
param.put("point_code1", needPoint.getPoint_code());
param.put("point_code2", bstIvtStockingivt.getPoint_code());
param.put("vehicle_code", needPoint.getVehicle_code());
param.put("product_area", SlitterConstant.SLITTER_TASK_AREA);
param.put("task_type", SlitterEnum.TASK_TYPE.code("备货区送纸管"));
// 存储纸管信息
List<MdPbPapervehicle> paperList = mdPbPapervehicleService.list(new LambdaQueryWrapper<MdPbPapervehicle>()
.eq(MdPbPapervehicle::getVehicle_code, needPoint.getVehicle_code()));
doSavePaperInfos(paperList, param);
stockAreaCallTubeTask.createTask(param);
return true;
}
// 查找一个没有任务的空位
List<BstIvtStockingivt> list = stockingivtService.getEmptyPointNotTask("3");
if (list.size() == 0) {
noticeService.createNotice("备货区找不到空位置搬运",
"点位[" + empty.getPoint_name() + "]无法从备货区找到空位",
NoticeTypeEnum.EXCEPTION.getCode());
log.info("备货区找不到空位置搬运");
return false;
}
BstIvtStockingivt endPoint = list.get(0);