opt: 事务范围缩小
This commit is contained in:
@@ -95,7 +95,6 @@ public class AutoCallAirShaftTask {
|
||||
* 套拔轴缓存位满了、没有分切计划,则触发自动创建套拔轴任务
|
||||
* update: 24/04/28 内包间只是区分气胀轴大小(即代数),不需要区分锂电/标箔
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void run() {
|
||||
log.info("自动呼叫套轴开始执行...");
|
||||
// 判断配置参数是否只做拔轴
|
||||
@@ -105,163 +104,166 @@ public class AutoCallAirShaftTask {
|
||||
// 1、获取空的插拔轴位(无任务)
|
||||
List<BstIvtShafttubeivt> emptyPoints = bstIvtShafttubeivtService.getAllShaftPointsByConditions("2",
|
||||
"0", "0");
|
||||
emptyPoints.forEach(empty -> {
|
||||
// 标箔:1,锂电:2 改:大小:4代5代
|
||||
String specification = empty.getQzz_generation();
|
||||
String location = empty.getPoint_location();
|
||||
if (ObjectUtil.isNotEmpty(isOnlyPulling) && SlitterConstant.SLITTER_YES.equals(isOnlyPulling.getValue())) {
|
||||
// 只做拔轴
|
||||
makePullShaft(empty, specification);
|
||||
return;
|
||||
}
|
||||
Integer integer = Integer.valueOf(ObjectUtil.isEmpty(tzDay.getValue()) ? "0" : tzDay.getValue());
|
||||
// 2、获取分切计划数据 校验代数 todo: 顺序可能需要考虑
|
||||
List<SlitterPlanDistinctDto> planAll = slittingproductionplanService.getAllCutPlan(integer);
|
||||
String value = paramObj.getValue();
|
||||
List<String> prefixList = Arrays.asList(value.split("[,,]"));
|
||||
List<SlitterPlanDistinctDto> plans = planAll.stream()
|
||||
.filter(p -> prefixList.stream()
|
||||
.anyMatch(prefix -> p.getResource_name().startsWith(prefix)) &&
|
||||
checkComputationPoint(p, empty) && checkHasTask(p))
|
||||
emptyPoints.forEach(empty -> doCallShaft(empty, isOnlyPulling, tzDay, paramObj));
|
||||
}
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void doCallShaft(BstIvtShafttubeivt empty, Param isOnlyPulling, Param tzDay, Param paramObj) {
|
||||
// 标箔:1,锂电:2 改:大小:4代5代
|
||||
String specification = empty.getQzz_generation();
|
||||
String location = empty.getPoint_location();
|
||||
if (ObjectUtil.isNotEmpty(isOnlyPulling) && SlitterConstant.SLITTER_YES.equals(isOnlyPulling.getValue())) {
|
||||
// 只做拔轴
|
||||
makePullShaft(empty, specification);
|
||||
return;
|
||||
}
|
||||
Integer integer = Integer.valueOf(ObjectUtil.isEmpty(tzDay.getValue()) ? "0" : tzDay.getValue());
|
||||
// 2、获取分切计划数据 校验代数 todo: 顺序可能需要考虑
|
||||
List<SlitterPlanDistinctDto> planAll = slittingproductionplanService.getAllCutPlan(integer);
|
||||
String value = paramObj.getValue();
|
||||
List<String> prefixList = Arrays.asList(value.split("[,,]"));
|
||||
List<SlitterPlanDistinctDto> plans = planAll.stream()
|
||||
.filter(p -> prefixList.stream()
|
||||
.anyMatch(prefix -> p.getResource_name().startsWith(prefix)) &&
|
||||
checkComputationPoint(p, empty) && checkHasTask(p))
|
||||
.collect(Collectors.toList());
|
||||
if (plans.size() == 0) {
|
||||
// 如果不需要套轴,就只做拔轴
|
||||
makePullShaft(empty, specification);
|
||||
return;
|
||||
}
|
||||
log.info("获取过滤后的分切计划数据:{}", JSON.toJSONString(plans));
|
||||
// 查看套轴对接位是否满了
|
||||
// todo: 这里需要注意不要去校验071的任务,不然提前释放货位没意义。
|
||||
List<BstIvtCutpointivt> emptyShaftPoint = bcutpointivtService.getAreaNotTaskPointByStatus("1",
|
||||
"1", location, "0");
|
||||
// 如果满了就只做拔轴 预留一个货位?,防止套轴直接站满
|
||||
if (emptyShaftPoint.size() == 0) {
|
||||
log.info("暂存位没有空位!正在检测是否存在半个点位!");
|
||||
// 校验是否存在半个位置,且有分切计划
|
||||
// 获取只有一个位置的点位
|
||||
List<BstIvtCutpointivt> halfPlacePoint = bcutpointivtService.getAllHalfPlacePoints("1",
|
||||
"1", location);
|
||||
List<String> qzzs = halfPlacePoint.stream()
|
||||
.map(p -> ObjectUtil.isNotEmpty(p.getQzz_no1()) ? p.getQzz_no1() : p.getQzz_no2())
|
||||
.collect(Collectors.toList());
|
||||
if (plans.size() == 0) {
|
||||
if (qzzs.size() == 0) {
|
||||
log.info("没有半个点位,或者对应的另一半分切计划没有找到!");
|
||||
// 如果不需要套轴,就只做拔轴
|
||||
makePullShaft(empty, specification);
|
||||
return;
|
||||
}
|
||||
log.info("获取过滤后的分切计划数据:{}", JSON.toJSONString(plans));
|
||||
// 查看套轴对接位是否满了
|
||||
// todo: 这里需要注意不要去校验071的任务,不然提前释放货位没意义。
|
||||
List<BstIvtCutpointivt> emptyShaftPoint = bcutpointivtService.getAreaNotTaskPointByStatus("1",
|
||||
"1", location, "0");
|
||||
// 如果满了就只做拔轴 预留一个货位?,防止套轴直接站满
|
||||
if (emptyShaftPoint.size() == 0) {
|
||||
log.info("暂存位没有空位!正在检测是否存在半个点位!");
|
||||
// 校验是否存在半个位置,且有分切计划
|
||||
// 获取只有一个位置的点位
|
||||
List<BstIvtCutpointivt> halfPlacePoint = bcutpointivtService.getAllHalfPlacePoints("1",
|
||||
"1", location);
|
||||
List<String> qzzs = halfPlacePoint.stream()
|
||||
.map(p -> ObjectUtil.isNotEmpty(p.getQzz_no1()) ? p.getQzz_no1() : p.getQzz_no2())
|
||||
.collect(Collectors.toList());
|
||||
if (qzzs.size() == 0) {
|
||||
log.info("没有半个点位,或者对应的另一半分切计划没有找到!");
|
||||
// 如果不需要套轴,就只做拔轴
|
||||
makePullShaft(empty, specification);
|
||||
return;
|
||||
}
|
||||
// 从寻查找分切计划,并放在plans, 没有考虑区域问题, 里面会考虑代数
|
||||
plans = slittingproductionplanService.getAllHalfPlan(qzzs);
|
||||
if (plans.size() == 0) {
|
||||
log.info("没有找到对应的另一半分切计划没有找到");
|
||||
// 如果不需要套轴,就只做拔轴
|
||||
makePullShaft(empty, specification);
|
||||
return;
|
||||
}
|
||||
log.info("找到对应的另一半的计划 - {}", plans);
|
||||
}
|
||||
// 获取一个分切计划的Dto。如果是6寸,可以直接使用、如果是3寸,需要判断当前位置是否满足
|
||||
// todo: 需要校验分切设备是在对应的区域中
|
||||
SlitterPlanDistinctDto planDto = plans.stream()
|
||||
.filter(planD -> "6".equals(planD.getQzz_size()) ||
|
||||
("3".equals(planD.getQzz_size()) && specification.equals(planD.getQzz_generation())))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
if (planDto == null) {
|
||||
log.warn("过滤3/6寸和代数输出结果为空,跳过此次套轴。此时点位对应代数:{}", specification);
|
||||
// 从寻查找分切计划,并放在plans, 没有考虑区域问题, 里面会考虑代数
|
||||
plans = slittingproductionplanService.getAllHalfPlan(qzzs);
|
||||
if (plans.size() == 0) {
|
||||
log.info("没有找到对应的另一半分切计划没有找到");
|
||||
// 如果不需要套轴,就只做拔轴
|
||||
makePullShaft(empty, specification);
|
||||
return;
|
||||
}
|
||||
log.info("此时获取的分切计划dto: {}", planDto);
|
||||
// 获取分切计划dto中对应的需要套轴的分切计划 最多两个计划
|
||||
List<PdmBiSlittingproductionplan> needPlans = slittingproductionplanService.list(new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
|
||||
log.info("找到对应的另一半的计划 - {}", plans);
|
||||
}
|
||||
// 获取一个分切计划的Dto。如果是6寸,可以直接使用、如果是3寸,需要判断当前位置是否满足
|
||||
// todo: 需要校验分切设备是在对应的区域中
|
||||
SlitterPlanDistinctDto planDto = plans.stream()
|
||||
.filter(planD -> "6".equals(planD.getQzz_size()) ||
|
||||
("3".equals(planD.getQzz_size()) && specification.equals(planD.getQzz_generation())))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
if (planDto == null) {
|
||||
log.warn("过滤3/6寸和代数输出结果为空,跳过此次套轴。此时点位对应代数:{}", specification);
|
||||
return;
|
||||
}
|
||||
log.info("此时获取的分切计划dto: {}", planDto);
|
||||
// 获取分切计划dto中对应的需要套轴的分切计划 最多两个计划
|
||||
List<PdmBiSlittingproductionplan> needPlans = slittingproductionplanService.list(new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
|
||||
.eq(PdmBiSlittingproductionplan::getResource_name, planDto.getResource_name())
|
||||
.eq(PdmBiSlittingproductionplan::getParent_container_name, planDto.getParent_container_name())
|
||||
.eq(PdmBiSlittingproductionplan::getUp_or_down, planDto.getUp_or_down())
|
||||
.eq(PdmBiSlittingproductionplan::getSplit_group, planDto.getSplit_group())
|
||||
.eq(PdmBiSlittingproductionplan::getIs_delete, SlitterConstant.SLITTER_NO)
|
||||
.eq(PdmBiSlittingproductionplan::getIs_paper_ok, SlitterConstant.SLITTER_YES));
|
||||
if (needPlans.size() == 0) {
|
||||
// 可能是改切,所以换成restruct_container_name来使用
|
||||
needPlans = slittingproductionplanService.list(new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
|
||||
.eq(PdmBiSlittingproductionplan::getResource_name, planDto.getResource_name())
|
||||
.eq(PdmBiSlittingproductionplan::getParent_container_name, planDto.getParent_container_name())
|
||||
.eq(PdmBiSlittingproductionplan::getRestruct_container_name, planDto.getParent_container_name())
|
||||
.eq(PdmBiSlittingproductionplan::getUp_or_down, planDto.getUp_or_down())
|
||||
.eq(PdmBiSlittingproductionplan::getSplit_group, planDto.getSplit_group())
|
||||
.eq(PdmBiSlittingproductionplan::getIs_delete, SlitterConstant.SLITTER_NO)
|
||||
.eq(PdmBiSlittingproductionplan::getIs_paper_ok, SlitterConstant.SLITTER_YES));
|
||||
if (needPlans.size() == 0) {
|
||||
// 可能是改切,所以换成restruct_container_name来使用
|
||||
needPlans = slittingproductionplanService.list(new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
|
||||
.eq(PdmBiSlittingproductionplan::getResource_name, planDto.getResource_name())
|
||||
.eq(PdmBiSlittingproductionplan::getRestruct_container_name, planDto.getParent_container_name())
|
||||
.eq(PdmBiSlittingproductionplan::getUp_or_down, planDto.getUp_or_down())
|
||||
.eq(PdmBiSlittingproductionplan::getSplit_group, planDto.getSplit_group())
|
||||
.eq(PdmBiSlittingproductionplan::getIs_delete, SlitterConstant.SLITTER_NO)
|
||||
.eq(PdmBiSlittingproductionplan::getIs_paper_ok, SlitterConstant.SLITTER_YES));
|
||||
}
|
||||
log.info("通过dto获取的分切计划:{}", needPlans);
|
||||
// 获取其中一条
|
||||
PdmBiSlittingproductionplan needPlan = needPlans.get(0);
|
||||
String qzzSize = needPlan.getQzz_size();
|
||||
// 从套轴对接位获取相同气涨轴大小
|
||||
// update: 不需要(同标箔或者锂电分开)
|
||||
// todo: 需要校验区域0/1
|
||||
List<BstIvtCutpointivt> qzzPoint = bcutpointivtService.getPointByTypeAndShaftSize("1", qzzSize, specification);
|
||||
if (qzzPoint.size() == 0) {
|
||||
// 保存所需要的分切计划数据到点位上(套轴对接位)更新分切计划
|
||||
saveCutPlanMessage(empty, needPlans, qzzSize);
|
||||
// 调用ACS滚条气涨轴下来
|
||||
toAcsOutShaft(qzzSize, location, empty);
|
||||
toCallAgvMovePaperTube(needPlans, location, empty);
|
||||
return;
|
||||
}
|
||||
// 查找一条没任务的点位
|
||||
BstIvtCutpointivt startPoint = qzzPoint.get(0);
|
||||
if (ObjectUtil.isEmpty(startPoint)) {
|
||||
// 保存所需要的分切计划数据到点位上(套轴对接位)更新分切计划
|
||||
saveCutPlanMessage(empty, needPlans, qzzSize);
|
||||
// 如果不存在,则发起信号滚气涨轴
|
||||
// 调用ACS滚条气涨轴下来
|
||||
toAcsOutShaft(qzzSize, location, empty);
|
||||
toCallAgvMovePaperTube(needPlans, location, empty);
|
||||
return;
|
||||
}
|
||||
// 创建任务
|
||||
JSONObject param = new JSONObject();
|
||||
param.put("point_code1", ObjectUtil.isNotEmpty(startPoint.getQzz_no1())
|
||||
? startPoint.getTruss_point_code1() : startPoint.getTruss_point_code2());
|
||||
param.put("point_code2", empty.getPoint_code());
|
||||
param.put("vehicle_code", ObjectUtil.isNotEmpty(startPoint.getQzz_no1())
|
||||
? startPoint.getQzz_no1() : startPoint.getQzz_no2());
|
||||
// 气胀轴号
|
||||
param.put("qzz_no", ObjectUtil.isNotEmpty(startPoint.getQzz_no1())
|
||||
? startPoint.getQzz_no1() : startPoint.getQzz_no2());
|
||||
param.put("needPlan", planDto);
|
||||
// 是否拔轴
|
||||
param.put("is_pulling", SlitterConstant.SLITTER_YES);
|
||||
param.put("task_type", SlitterEnum.TASK_TYPE.code("穿拔轴缓存<>穿拔轴位"));
|
||||
param.put("product_area", SlitterConstant.SLITTER_TASK_AREA);
|
||||
param.put("qzz_size", needPlan.getQzz_size());
|
||||
// 所需的纸管规格
|
||||
SlitterTaskUtil.putNeedPaperSpec(param, needPlans);
|
||||
// 当前纸管的规格信息
|
||||
String oldQzzNo = ObjectUtil.isNotEmpty(startPoint.getQzz_no1())
|
||||
? startPoint.getQzz_no1() : startPoint.getQzz_no2();
|
||||
if (oldQzzNo == null) {
|
||||
throw new BadRequestException("当前气胀轴的编码为空!");
|
||||
}
|
||||
}
|
||||
log.info("通过dto获取的分切计划:{}", needPlans);
|
||||
// 获取其中一条
|
||||
PdmBiSlittingproductionplan needPlan = needPlans.get(0);
|
||||
String qzzSize = needPlan.getQzz_size();
|
||||
// 从套轴对接位获取相同气涨轴大小
|
||||
// update: 不需要(同标箔或者锂电分开)
|
||||
// todo: 需要校验区域0/1
|
||||
List<BstIvtCutpointivt> qzzPoint = bcutpointivtService.getPointByTypeAndShaftSize("1", qzzSize, specification);
|
||||
if (qzzPoint.size() == 0) {
|
||||
// 保存所需要的分切计划数据到点位上(套轴对接位)更新分切计划
|
||||
saveCutPlanMessage(empty, needPlans, qzzSize);
|
||||
// 设置是否套轴:1:正常套轴,2:待定(到后面还会申请套轴)
|
||||
setIsSleeveShaft(param);
|
||||
// 最多两条
|
||||
List<PdmBiSlittingproductionplan> oldPlans = slittingproductionplanService.getByQzzNo(oldQzzNo);
|
||||
SlitterTaskUtil.putCurrentPaperSpec(param, oldPlans);
|
||||
// 套管数量
|
||||
param.put("casingCount", needPlans.size());
|
||||
// 拔管数量
|
||||
param.put("pullCount", oldPlans.size());
|
||||
param.put("containers", oldPlans.stream().map(PdmBiSlittingproductionplan::getContainer_name).collect(Collectors.toList()));
|
||||
trussCallAirShaftTask.createTask(param);
|
||||
// 调用ACS滚条气涨轴下来
|
||||
toAcsOutShaft(qzzSize, location, empty);
|
||||
toCallAgvMovePaperTube(needPlans, location, empty);
|
||||
// 将分切计划is_paper_ok 1(纸管已经准备好) -> 2(已经套轴)
|
||||
needPlans.forEach(p -> {
|
||||
p.setIs_paper_ok("2");
|
||||
TaskUtils.updateOptMessageBySlitterPlan(p);
|
||||
});
|
||||
slittingproductionplanService.updateBatchById(needPlans);
|
||||
return;
|
||||
}
|
||||
// 查找一条没任务的点位
|
||||
BstIvtCutpointivt startPoint = qzzPoint.get(0);
|
||||
if (ObjectUtil.isEmpty(startPoint)) {
|
||||
// 保存所需要的分切计划数据到点位上(套轴对接位)更新分切计划
|
||||
saveCutPlanMessage(empty, needPlans, qzzSize);
|
||||
// 如果不存在,则发起信号滚气涨轴
|
||||
// 调用ACS滚条气涨轴下来
|
||||
toAcsOutShaft(qzzSize, location, empty);
|
||||
toCallAgvMovePaperTube(needPlans, location, empty);
|
||||
return;
|
||||
}
|
||||
// 创建任务
|
||||
JSONObject param = new JSONObject();
|
||||
param.put("point_code1", ObjectUtil.isNotEmpty(startPoint.getQzz_no1())
|
||||
? startPoint.getTruss_point_code1() : startPoint.getTruss_point_code2());
|
||||
param.put("point_code2", empty.getPoint_code());
|
||||
param.put("vehicle_code", ObjectUtil.isNotEmpty(startPoint.getQzz_no1())
|
||||
? startPoint.getQzz_no1() : startPoint.getQzz_no2());
|
||||
// 气胀轴号
|
||||
param.put("qzz_no", ObjectUtil.isNotEmpty(startPoint.getQzz_no1())
|
||||
? startPoint.getQzz_no1() : startPoint.getQzz_no2());
|
||||
param.put("needPlan", planDto);
|
||||
// 是否拔轴
|
||||
param.put("is_pulling", SlitterConstant.SLITTER_YES);
|
||||
param.put("task_type", SlitterEnum.TASK_TYPE.code("穿拔轴缓存<>穿拔轴位"));
|
||||
param.put("product_area", SlitterConstant.SLITTER_TASK_AREA);
|
||||
param.put("qzz_size", needPlan.getQzz_size());
|
||||
// 所需的纸管规格
|
||||
SlitterTaskUtil.putNeedPaperSpec(param, needPlans);
|
||||
// 当前纸管的规格信息
|
||||
String oldQzzNo = ObjectUtil.isNotEmpty(startPoint.getQzz_no1())
|
||||
? startPoint.getQzz_no1() : startPoint.getQzz_no2();
|
||||
if (oldQzzNo == null) {
|
||||
throw new BadRequestException("当前气胀轴的编码为空!");
|
||||
}
|
||||
// 保存所需要的分切计划数据到点位上(套轴对接位)更新分切计划
|
||||
saveCutPlanMessage(empty, needPlans, qzzSize);
|
||||
// 设置是否套轴:1:正常套轴,2:待定(到后面还会申请套轴)
|
||||
setIsSleeveShaft(param);
|
||||
// 最多两条
|
||||
List<PdmBiSlittingproductionplan> oldPlans = slittingproductionplanService.getByQzzNo(oldQzzNo);
|
||||
SlitterTaskUtil.putCurrentPaperSpec(param, oldPlans);
|
||||
// 套管数量
|
||||
param.put("casingCount", needPlans.size());
|
||||
// 拔管数量
|
||||
param.put("pullCount", oldPlans.size());
|
||||
param.put("containers", oldPlans.stream().map(PdmBiSlittingproductionplan::getContainer_name).collect(Collectors.toList()));
|
||||
trussCallAirShaftTask.createTask(param);
|
||||
toCallAgvMovePaperTube(needPlans, location, empty);
|
||||
// 将分切计划is_paper_ok 1(纸管已经准备好) -> 2(已经套轴)
|
||||
needPlans.forEach(p -> {
|
||||
p.setIs_paper_ok("2");
|
||||
TaskUtils.updateOptMessageBySlitterPlan(p);
|
||||
});
|
||||
slittingproductionplanService.updateBatchById(needPlans);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -409,8 +409,6 @@ public class SlitterServiceImpl implements SlitterService {
|
||||
if (shafttubeivts.size() == 0) {
|
||||
throw new BadRequestException("未找到可存放气涨轴规格「" + qzzSize + "」的空暂存位");
|
||||
}
|
||||
// todo: 过滤空位后面是否有轴的位置
|
||||
|
||||
BstIvtShafttubeivt shafttubeivt = shafttubeivts.get(0);
|
||||
RLock lockPoint = redissonClient.getLock(shafttubeivt.getPoint_code());
|
||||
boolean tryLockPoint = lockPoint.tryLock(0, TimeUnit.SECONDS);
|
||||
@@ -1975,6 +1973,7 @@ public class SlitterServiceImpl implements SlitterService {
|
||||
plan.setIs_parent_ok("0");
|
||||
plan.setIs_child_tz_ok("0");
|
||||
plan.setIs_child_ps_ok("0");
|
||||
plan.setPaper_weight("0");
|
||||
plan.setQzzno("");
|
||||
plan.setIs_delete("0");
|
||||
plan.setSale_order_name("-");
|
||||
|
||||
Reference in New Issue
Block a user