fix: 锁细粒度扩大

This commit is contained in:
2025-08-07 19:58:32 +08:00
parent 746833151f
commit 661595c790

View File

@@ -285,56 +285,55 @@ public class SlitterServiceImpl implements SlitterService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public JSONObject acsFinishLoadShaft(JSONObject param) { public JSONObject acsFinishLoadShaft(JSONObject param) {
log.info("ACS申请套管完成参数: {}", param);
String msg = ""; String msg = "";
JSONObject res = new JSONObject(); JSONObject res = new JSONObject();
// 穿拔轴位 // 穿拔轴位
String deviceCode = param.getString("device_code"); String deviceCode = param.getString("device_code");
List<String> stepTipLogs = getRedisListValue("ERROR" + deviceCode); List<String> stepTipLogs = getRedisListValue("ERROR" + deviceCode);
// 纸管 // 枷锁
String weight1 = param.getString("weight1"); RLock lock = redissonClient.getLock("doAcsFinishLoadShaft");
String material1 = param.getString("material1"); boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS);
String weight2 = param.getString("weight2"); try {
String material2 = param.getString("material2"); if (tryLock) {
// 判断是否有未完成的任务 log.info("ACS申请套管完成参数: {}", param);
List<SchBaseTask> list = taskService.list(new LambdaQueryWrapper<SchBaseTask>() // 纸管
.eq(SchBaseTask::getPoint_code1, deviceCode) String weight1 = param.getString("weight1");
.lt(SchBaseTask::getTask_status, "07")); String material1 = param.getString("material1");
if (list.size() > 0) { String weight2 = param.getString("weight2");
log.error("点位[{}]存在未完成得任务!", deviceCode); String material2 = param.getString("material2");
stepTipLogs.add("套轴完成->点位[" + deviceCode + "]存在未完成任务"); // 判断是否有未完成任务
redisUtils.set("ERROR" + deviceCode, stepTipLogs); List<SchBaseTask> list = taskService.list(new LambdaQueryWrapper<SchBaseTask>()
throw new BadRequestException("点位[" + deviceCode + "]存在未完成得任务!"); .eq(SchBaseTask::getPoint_code1, deviceCode)
} .lt(SchBaseTask::getTask_status, "07"));
BstIvtShafttubeivt startPoint = shafttubeivtService.getOne(new LambdaQueryWrapper<BstIvtShafttubeivt>() if (list.size() > 0) {
.eq(BstIvtShafttubeivt::getPoint_code, deviceCode)); log.error("点位[{}]存在未完成得任务!", deviceCode);
// 获取分切计划 stepTipLogs.add("套轴完成->点位[" + deviceCode + "]存在未完成得任务!");
List<String> collect = Stream.of(startPoint.getContainer_name1(), startPoint.getContainer_name2()) redisUtils.set("ERROR" + deviceCode, stepTipLogs);
.filter(value -> value != null && !value.isEmpty()).collect(Collectors.toList()); throw new BadRequestException("点位[" + deviceCode + "]存在未完成得任务!");
if (collect.size() == 0) { }
log.error("找不到[{}]对应的分切计划!", deviceCode); BstIvtShafttubeivt startPoint = shafttubeivtService.getOne(new LambdaQueryWrapper<BstIvtShafttubeivt>()
stepTipLogs.add("套轴完成->找不到[" + deviceCode + "]点位记录的分切计划!分切计划可能被删除或者拼接!"); .eq(BstIvtShafttubeivt::getPoint_code, deviceCode));
redisUtils.set("ERROR" + deviceCode, stepTipLogs); // 获取分切计划
throw new BadRequestException("找不到[" + deviceCode + "]对应的分切计划!"); List<String> collect = Stream.of(startPoint.getContainer_name1(), startPoint.getContainer_name2())
} .filter(value -> value != null && !value.isEmpty()).collect(Collectors.toList());
List<PdmBiSlittingproductionplan> plans = slittingproductionplanService.list( if (collect.size() == 0) {
new LambdaQueryWrapper<PdmBiSlittingproductionplan>() log.error("找不到[{}]对应的分切计划!", deviceCode);
.in(PdmBiSlittingproductionplan::getContainer_name, collect) stepTipLogs.add("套轴完成->找不到[" + deviceCode + "]点位记录的分切计划!分切计划可能被删除或者拼接!");
.eq(PdmBiSlittingproductionplan::getStatus, "01") redisUtils.set("ERROR" + deviceCode, stepTipLogs);
.eq(PdmBiSlittingproductionplan::getIs_delete, "0")); throw new BadRequestException("找不到[" + deviceCode + "]对应的分切计划!");
// 去异常位 }
if (plans.size() == 0) { List<PdmBiSlittingproductionplan> plans = slittingproductionplanService.list(
log.error("找不到[{}]对应的分切计划,分切计划可能被删除或者拼接!", collect); new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
// 移动到异常处理位随机一个点位在送到B2对面的位置 .in(PdmBiSlittingproductionplan::getContainer_name, collect)
List<BstIvtCutpointivt> exceptionPoints = bcutpointivtService.getAreaNotTaskPointByStatus("1", "1", "0", "0"); .eq(PdmBiSlittingproductionplan::getStatus, "01")
if (exceptionPoints.size() > 0) { .eq(PdmBiSlittingproductionplan::getIs_delete, "0"));
BstIvtCutpointivt exceptionPoint = exceptionPoints.get(0); // 去异常位
// 枷锁 if (plans.size() == 0) {
RLock lockPointR = redissonClient.getLock(exceptionPoint.getPoint_code()); log.error("找不到[{}]对应的分切计划,分切计划可能被删除或者拼接!", collect);
boolean tryLockPointR = lockPointR.tryLock(0, TimeUnit.SECONDS); // 移动到异常处理位随机一个点位在送到B2对面的位置
try { List<BstIvtCutpointivt> exceptionPoints = bcutpointivtService.getAreaNotTaskPointByStatus("1", "1", "0", "0");
if (tryLockPointR) { if (exceptionPoints.size() > 0) {
// 需要枷锁 BstIvtCutpointivt exceptionPoint = exceptionPoints.get(0);
JSONObject exParam = new JSONObject(); JSONObject exParam = new JSONObject();
exParam.put("point_code1", startPoint.getPoint_code()); exParam.put("point_code1", startPoint.getPoint_code());
exParam.put("point_code2", ObjectUtil.isEmpty(exceptionPoint.getQzz_no1()) exParam.put("point_code2", ObjectUtil.isEmpty(exceptionPoint.getQzz_no1())
@@ -352,101 +351,87 @@ public class SlitterServiceImpl implements SlitterService {
res.put("message", "创建送至异常处理位!"); res.put("message", "创建送至异常处理位!");
return res; return res;
} else { } else {
throw new BadRequestException("系统繁忙,稍后在试!"); stepTipLogs.add("套轴完成->[" + collect + "]对应的分切计划状态已更改,无暂存位置,创建任务失败!");
} redisUtils.set("ERROR" + deviceCode, stepTipLogs);
} finally { JSONObject exParam = new JSONObject();
if (tryLockPointR) { exParam.put("point_code1", startPoint.getPoint_code());
lockPointR.unlock(); exParam.put("point_code2", "-");
exParam.put("vehicle_code1", collect);
exParam.put("task_type", SlitterEnum.TASK_TYPE.code("套轴异常处理桁架任务"));
exParam.put("product_area", SlitterConstant.SLITTER_TASK_AREA);
exParam.put("task_status", TaskStatusEnum.SURE_START.getCode());
exParam.put("acs_task_type", "6");
sendNBJExceptionPointTask.createTask(exParam);
res.put("status", HttpStatus.HTTP_OK);
res.put("message", "请求成功");
res.put("msg", msg);
return res;
} }
} }
} else { // 分切计划设置纸卷重量
stepTipLogs.add("套轴完成->[" + collect + "]对应的分切计划状态已更改,无暂存位置,创建任务失败!"); for (PdmBiSlittingproductionplan plan : plans) {
redisUtils.set("ERROR" + deviceCode, stepTipLogs); if (SlitterConstant.SLITTER_SUB_VOLUME_LEFT.equals(plan.getLeft_or_right())) {
JSONObject exParam = new JSONObject(); plan.setPaper_weight(weight1);
exParam.put("point_code1", startPoint.getPoint_code()); msg = msg + "子卷号:" + plan.getContainer_name() + "的纸管重量: " + weight1 + " | ";
exParam.put("point_code2", "-"); } else {
exParam.put("vehicle_code1", collect); plan.setPaper_weight(weight2);
exParam.put("task_type", SlitterEnum.TASK_TYPE.code("套轴异常处理桁架任务")); msg = msg + "子卷号:" + plan.getContainer_name() + "的纸管重量: " + weight2 + " | ";
exParam.put("product_area", SlitterConstant.SLITTER_TASK_AREA); }
exParam.put("task_status", TaskStatusEnum.SURE_START.getCode()); TaskUtils.updateOptMessageBySlitterPlan(plan);
exParam.put("acs_task_type", "6"); }
sendNBJExceptionPointTask.createTask(exParam); slittingproductionplanService.updateBatchById(plans);
res.put("status", HttpStatus.HTTP_OK);
res.put("message", "请求成功");
res.put("msg", msg);
return res;
// throw new BadRequestException("[" + collect + "]对应的分切计划状态已更改,无暂存位置!");
}
}
// 分切计划设置纸卷重量
for (PdmBiSlittingproductionplan plan : plans) {
if (SlitterConstant.SLITTER_SUB_VOLUME_LEFT.equals(plan.getLeft_or_right())) {
plan.setPaper_weight(weight1);
msg = msg + "子卷号:" + plan.getContainer_name() + "的纸管重量: " + weight1 + " | ";
} else {
plan.setPaper_weight(weight2);
msg = msg + "子卷号:" + plan.getContainer_name() + "的纸管重量: " + weight2 + " | ";
}
TaskUtils.updateOptMessageBySlitterPlan(plan);
}
slittingproductionplanService.updateBatchById(plans);
// 当前套轴的分切计划 // 当前套轴的分切计划
PdmBiSlittingproductionplan demoPlan = plans.get(0); PdmBiSlittingproductionplan demoPlan = plans.get(0);
// 分切计划设置套轴完成 // 分切计划设置套轴完成
String resourceName = demoPlan.getResource_name(); String resourceName = demoPlan.getResource_name();
String qzzNo = resourceName.substring(0, 2) String qzzNo = resourceName.substring(0, 2)
+ resourceName.substring(resourceName.length() - 2) + resourceName.substring(resourceName.length() - 2)
+ demoPlan.getSplit_group() + demoPlan.getSplit_group()
+ TaskUtils.getDateTime("yyMMddHHmmss") + "-" + TaskUtils.getDateTime("yyMMddHHmmss") + "-"
+ demoPlan.getUp_or_down(); + demoPlan.getUp_or_down();
plans.forEach(plan -> { plans.forEach(plan -> {
plan.setIs_child_tz_ok(SlitterConstant.SLITTER_YES); plan.setIs_child_tz_ok(SlitterConstant.SLITTER_YES);
plan.setQzzno(qzzNo); plan.setQzzno(qzzNo);
TaskUtils.updateOptMessageBySlitterPlan(plan); TaskUtils.updateOptMessageBySlitterPlan(plan);
}); });
slittingproductionplanService.updateBatchById(plans); slittingproductionplanService.updateBatchById(plans);
// 查找是否有同组的气胀轴位置 // 查找是否有同组的气胀轴位置
BstIvtCutpointivt cutPoint = slitterMapper.getSameGroupPoint(demoPlan); BstIvtCutpointivt cutPoint = slitterMapper.getSameGroupPoint(demoPlan);
if (ObjectUtil.isEmpty(cutPoint)) { if (ObjectUtil.isEmpty(cutPoint)) {
// 也有可能在路上, 获取任务的终点 // 也有可能在路上, 获取任务的终点
String endPoint = slitterMapper.getSameGroupTaskPoint(demoPlan); String endPoint = slitterMapper.getSameGroupTaskPoint(demoPlan);
if (ObjectUtil.isNotEmpty(endPoint)) { if (ObjectUtil.isNotEmpty(endPoint)) {
cutPoint = bcutpointivtService.getOne(new LambdaQueryWrapper<BstIvtCutpointivt>() cutPoint = bcutpointivtService.getOne(new LambdaQueryWrapper<BstIvtCutpointivt>()
.eq(BstIvtCutpointivt::getTruss_point_code1, endPoint).or() .eq(BstIvtCutpointivt::getTruss_point_code1, endPoint).or()
.eq(BstIvtCutpointivt::getTruss_point_code2, endPoint)); .eq(BstIvtCutpointivt::getTruss_point_code2, endPoint));
} }
} }
if (ObjectUtil.isEmpty(cutPoint)) { if (ObjectUtil.isEmpty(cutPoint)) {
// 获取一个空位 (上下区域) // 获取一个空位 (上下区域)
List<BstIvtCutpointivt> emptyNotTaskPoint = bcutpointivtService.getNBJAreaNotTaskPointByStatus( List<BstIvtCutpointivt> emptyNotTaskPoint = bcutpointivtService.getNBJAreaNotTaskPointByStatus(
"1", "1", startPoint.getPoint_location(), "1"); "1", "1", startPoint.getPoint_location(), "1");
if (emptyNotTaskPoint.size() > 0) { if (emptyNotTaskPoint.size() > 0) {
cutPoint = emptyNotTaskPoint.get(0); cutPoint = emptyNotTaskPoint.get(0);
} else { } else {
stepTipLogs.add("提示:套轴完成->找不到可用套轴对接位创建半条任务等待AGV取货完成触发!"); stepTipLogs.add("提示:套轴完成->找不到可用套轴对接位创建半条任务等待AGV取货完成触发!");
redisUtils.set("ERROR" + deviceCode, stepTipLogs); redisUtils.set("ERROR" + deviceCode, stepTipLogs);
// 创建任务 // 创建任务
JSONObject taskParam = new JSONObject(); JSONObject taskParam = new JSONObject();
taskParam.put("point_code1", startPoint.getPoint_code()); taskParam.put("point_code1", startPoint.getPoint_code());
taskParam.put("point_code2", "-"); taskParam.put("point_code2", "-");
taskParam.put("needPosition", SlitterConstant.SLITTER_SHAFT_UP.equals(demoPlan.getUp_or_down()) taskParam.put("needPosition", SlitterConstant.SLITTER_SHAFT_UP.equals(demoPlan.getUp_or_down())
? "A" : "B"); ? "A" : "B");
taskParam.put("vehicle_code1", SlitterConstant.SLITTER_SHAFT_UP.equals(demoPlan.getUp_or_down()) ? qzzNo : ""); taskParam.put("vehicle_code1", SlitterConstant.SLITTER_SHAFT_UP.equals(demoPlan.getUp_or_down()) ? qzzNo : "");
taskParam.put("vehicle_code2", SlitterConstant.SLITTER_SHAFT_DOWN.equals(demoPlan.getUp_or_down()) ? qzzNo : ""); taskParam.put("vehicle_code2", SlitterConstant.SLITTER_SHAFT_DOWN.equals(demoPlan.getUp_or_down()) ? qzzNo : "");
taskParam.put("task_type", "010814"); taskParam.put("task_type", "010814");
taskParam.put("task_status", TaskStatusEnum.SURE_START.getCode()); taskParam.put("task_status", TaskStatusEnum.SURE_START.getCode());
taskParam.put("product_area", SlitterConstant.SLITTER_TASK_AREA); taskParam.put("product_area", SlitterConstant.SLITTER_TASK_AREA);
taskParam.put("immediateNotifyAcs", "0"); taskParam.put("immediateNotifyAcs", "0");
trussSendAirShaftTask.createTask(taskParam); trussSendAirShaftTask.createTask(taskParam);
} }
} }
if (ObjectUtil.isNotEmpty(cutPoint)) { if (ObjectUtil.isNotEmpty(cutPoint)) {
// 枷锁
RLock lockPoint = redissonClient.getLock(cutPoint.getPoint_code());
boolean tryLockPoint = lockPoint.tryLock(0, TimeUnit.SECONDS);
try {
if (tryLockPoint) {
// 创建任务 // 创建任务
JSONObject taskParam = new JSONObject(); JSONObject taskParam = new JSONObject();
taskParam.put("point_code1", startPoint.getPoint_code()); taskParam.put("point_code1", startPoint.getPoint_code());
@@ -458,18 +443,17 @@ public class SlitterServiceImpl implements SlitterService {
taskParam.put("product_area", SlitterConstant.SLITTER_TASK_AREA); taskParam.put("product_area", SlitterConstant.SLITTER_TASK_AREA);
taskParam.put("immediateNotifyAcs", "1"); taskParam.put("immediateNotifyAcs", "1");
trussSendAirShaftTask.createTask(taskParam); trussSendAirShaftTask.createTask(taskParam);
} else {
stepTipLogs.add("套轴完成->系统繁忙,稍后在试!");
redisUtils.set("ERROR" + deviceCode, stepTipLogs);
throw new BadRequestException("系统繁忙,稍后在试!");
}
} finally {
if (tryLockPoint) {
lockPoint.unlock();
} }
} else {
stepTipLogs.add("套轴完成->系统繁忙,稍后在试!");
redisUtils.set("ERROR" + deviceCode, stepTipLogs);
throw new BadRequestException("系统繁忙,稍后在试!");
}
} finally {
if (tryLock) {
lock.unlock();
} }
} }
res.put("status", HttpStatus.HTTP_OK); res.put("status", HttpStatus.HTTP_OK);
res.put("message", "请求成功"); res.put("message", "请求成功");
res.put("msg", msg); res.put("msg", msg);