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