feat: 添加锁

This commit is contained in:
2024-08-29 15:12:04 +08:00
parent 0d60b7bd01
commit 4e341e1196
13 changed files with 165 additions and 173 deletions

View File

@@ -58,7 +58,7 @@ public class SysCodeRuleServiceImpl extends ServiceImpl<SysCodeRuleMapper, SysCo
}
@Override
@Transactional(rollbackFor = Exception.class)
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public String codeDemo(Map form) {
String code = (String) form.get("code");
String id = codeRuleMapper.selectOne(new LambdaQueryWrapper<SysCodeRule>().eq(SysCodeRule::getCode, code)).getId();

View File

@@ -227,7 +227,7 @@ public class RawFoilPdaServiceImpl implements RawFoilPdaService {
MDC.put(GeneralDefinition.MDC_KEY, TagNameEnum.RAW_READY.getTag());
log.info("手持生箔准备就绪, {}", param);
// param: point_code
String pointCode = param.getString("point_code");
String pointCode = param.getString("point_code") + "_M";
// 将工单设置确认下卷如果是空轴任务就不用再写信号给ACS
// 1、获取对应的任务
SchBaseTask task = taskService.getTaskByPointCodeX(null, pointCode, null, null);

View File

@@ -1,7 +1,6 @@
package org.nl.wms.pda.st.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
@@ -9,7 +8,6 @@ import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.SecurityUtils;
import org.nl.config.lucene.TagNameEnum;
import org.nl.wms.pda.st.service.NbjPdaService;
import org.nl.wms.pdm.bi.dao.PdmBiSlittingproductionplan;
@@ -25,9 +23,7 @@ import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task_manage.core.constant.GeneralDefinition;
import org.nl.wms.sch.task_manage.core.enums.TaskFinishedTypeEnum;
import org.nl.wms.sch.task_manage.tasks.nbj.PdaSendShaftAGVTask;
import org.nl.wms.sch.task_manage.tasks.nbj.SendShaftAGVTask;
import org.nl.wms.sch.task_manage.tasks.nbj.SubRollDownAGVTask;
import org.nl.wms.sch.task_manage.tasks.other.PointToPointAGVTask;
import org.nl.wms.util.PointUtils;
import org.nl.wms.util.TaskUtils;
import org.slf4j.MDC;
@@ -68,8 +64,6 @@ public class NbjPdaServiceImpl implements NbjPdaService {
@Autowired
private IBstIvtCutpointivtService bcutpointivtService;
@Autowired
private PointToPointAGVTask pointToPointAGVTask;
@Autowired
private PdaSendShaftAGVTask pdaSendShaftAGVTask;
@Override
public JSONObject changeLiftStatus(JSONObject param) {
@@ -122,7 +116,7 @@ public class NbjPdaServiceImpl implements NbjPdaService {
@Transactional(rollbackFor = Exception.class)
public JSONObject doSubVolumeDown(JSONObject param) {
MDC.put(GeneralDefinition.MDC_KEY, TagNameEnum.SUB_ROLL_DOWN.getTag());
log.info("手持子卷下线,送到货梯 - {}", param);
log.info("手持子卷下线,送到一楼 - {}", param);
// point_code, vehicle_code, container_name
String pointCode = param.getString("point_code");
String containerName = param.getString("container_name");

View File

@@ -322,4 +322,12 @@ public abstract class AbstractTask {
bean.create();
}
}
/**
* AGV取货完成上报
* @param task 任务
*/
public void agvPickUpCompleted(SchBaseTask task) {
}
}

View File

@@ -9,19 +9,7 @@ package org.nl.wms.sch.task_manage;
* @since 2023-11-16
*/
public enum TaskStatus {
// APPLY("1", "申请", "申请"),
// // 创建完成
// CREATED("2", "创建完成", "创建完成"),
// // 下发
// ISSUED("3", "下发", "下发"),
// // 执行中
// EXECUTING("4", "执行中", "执行中"),
// // 完成
// FINISHED("5", "完成", "完成"),
// // 已取消
// CANCELED("6", "已取消", "已取消"),
// // 未完成
// UNFINISHED("7", "未完成", "未完成");
// 任务状态
APPLY("00", "申请", "申请"),
CREATED("01", "生成", "生成"),
@@ -31,6 +19,7 @@ public enum TaskStatus {
ISSUE("05", "下发", "下发"),
EXECUTING("06", "执行中", "执行中"),
FINISHED("07", "完成", "完成"),
PICK_UP_COMPLETED("071", "取货完成,执行中", "acs请求取货完成后修改的任务状态"),
CANCELED("08", "已取消", "已取消"),
// 未完成
UNFINISHED("09", "未完成", "未完成");

View File

@@ -10,6 +10,7 @@ import org.nl.wms.pdm.bi.dao.PdmBiRawfoilworkorder;
import org.nl.wms.pdm.bi.service.IpdmBiRawfoilworkorderService;
import org.nl.wms.sch.task.service.ISchBaseTaskService;
import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task_manage.TaskStatus;
import org.nl.wms.sch.task_manage.core.constant.GeneralDefinition;
import org.nl.wms.sch.task_manage.service.BakingOperationService;
import org.nl.wms.sch.task_manage.tasks.hot.InHotTrussTask;
@@ -17,6 +18,7 @@ import org.nl.wms.sch.task_manage.tasks.hot.OutHotTrussTask;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@@ -37,6 +39,7 @@ public class BakingOperationServiceImpl implements BakingOperationService {
@Autowired
private InHotTrussTask inHotTrussTask;
@Override
@Transactional(rollbackFor = Exception.class)
public JSONObject acsRequestOutHotTask(JSONObject param) {
log.info("acs请求出烘箱{}", param);
// device_code
@@ -63,6 +66,9 @@ public class BakingOperationServiceImpl implements BakingOperationService {
String taskCode = param.getString("task_code");
Assert.notBlank(taskCode, "任务编码不能为空!");
SchBaseTask taskObj = taskService.getByCode(taskCode);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("任务不存在");
}
JSONObject taskParam = new JSONObject();
String requestParam = taskObj.getRequest_param();
JSONObject requestObj = JSONObject.parseObject(requestParam);

View File

@@ -3,8 +3,8 @@ package org.nl.wms.sch.task_manage.tasks.hot;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.wms.pdm.ivt.hot.service.dao.StIvtHotpointivt;
import org.nl.wms.pdm.ivt.hot.service.IstIvtHotpointivtService;
import org.nl.wms.pdm.ivt.hot.service.dao.StIvtHotpointivt;
import org.nl.wms.sch.point.service.ISchBasePointService;
import org.nl.wms.sch.point.service.dao.SchBasePoint;
import org.nl.wms.sch.task.service.ISchBaseTaskService;
@@ -13,6 +13,7 @@ import org.nl.wms.sch.task_manage.AbstractTask;
import org.nl.wms.sch.task_manage.TaskStatus;
import org.nl.wms.sch.task_manage.core.constant.GeneralDefinition;
import org.nl.wms.sch.task_manage.core.enums.TaskFinishedTypeEnum;
import org.nl.wms.util.TaskUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@@ -47,26 +48,28 @@ public class OutHotTrussTask extends AbstractTask {
@Override
public void createCompletion(SchBaseTask task) {
// 从烘箱暂存位找一个空位
List<SchBasePoint> hotDjwList = pointService.getHotNotTaskPoint("A1", "A1-HXZC",
"4", "1");
if (hotDjwList.size() == 0) {
throw new BadRequestException("烘箱烘烤完毕的暂存位不够!");
}
String requestParam = task.getRequest_param();
JSONObject requestObj = JSONObject.parseObject(requestParam);
String startPoint = task.getPoint_code1();
StIvtHotpointivt hotPoint = hotpointivtService.getPointByCode(startPoint, false);
requestObj.put("workorder_id", hotPoint.getWorkorder_id());
SchBasePoint point = hotDjwList.get(0);
task.setVehicle_code(hotPoint.getFull_vehicle_code());
task.setPoint_code2(point.getPoint_code());
task.setRequest_param(JSONObject.toJSONString(requestObj));
// 保存任务参数
task.setHandle_class(THIS_CLASS);
task.setTask_status(TaskStatus.START_AND_POINT.getCode());
setUpdateByPC(task);
taskService.save(task);
TaskUtils.taskLock("A1-HXZC", () -> {
// 从烘箱暂存位找一个空位
List<SchBasePoint> hotDjwList = pointService.getHotNotTaskPoint("A1", "A1-HXZC",
"4", "1");
if (hotDjwList.size() == 0) {
throw new BadRequestException("烘箱烘烤完毕的暂存位不够!");
}
String requestParam = task.getRequest_param();
JSONObject requestObj = JSONObject.parseObject(requestParam);
String startPoint = task.getPoint_code1();
StIvtHotpointivt hotPoint = hotpointivtService.getPointByCode(startPoint, false);
requestObj.put("workorder_id", hotPoint.getWorkorder_id());
SchBasePoint point = hotDjwList.get(0);
task.setVehicle_code(hotPoint.getFull_vehicle_code());
task.setPoint_code2(point.getPoint_code());
task.setRequest_param(JSONObject.toJSONString(requestObj));
// 保存任务参数
task.setHandle_class(THIS_CLASS);
task.setTask_status(TaskStatus.START_AND_POINT.getCode());
setUpdateByPC(task);
taskService.save(task);
});
}
@Override

View File

@@ -46,7 +46,7 @@ public class SubRollDownAGVTask extends AbstractTask {
@Override
public void createCompletion(SchBaseTask task) {
// update: 查找空位没任务的货梯 -> 查找一楼暂存位空位
TaskUtils.createTask("A1-ZXZC", () -> {
TaskUtils.taskLock("A1-ZXZC", () -> {
List<SchBasePoint> zxPoints = pointService.getAllBusinessNotTaskPoint("A1", "A1-ZXZC",
"1", "1", null, null);
if (zxPoints.size() == 0) {
@@ -78,6 +78,7 @@ public class SubRollDownAGVTask extends AbstractTask {
endPoint.setVehicle_code(taskObj.getVehicle_code());
setUpdateByType(endPoint, taskFinishedType);
pointService.updateById(endPoint);
// todo: 创建搬运空架子的任务
// 任务完成
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskObj.setFinished_type(taskFinishedType.getCode());

View File

@@ -2,7 +2,6 @@ package org.nl.wms.sch.task_manage.tasks.raw;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
@@ -16,18 +15,14 @@ import org.nl.wms.sch.task_manage.AbstractTask;
import org.nl.wms.sch.task_manage.TaskStatus;
import org.nl.wms.sch.task_manage.core.constant.GeneralDefinition;
import org.nl.wms.sch.task_manage.core.enums.TaskFinishedTypeEnum;
import org.nl.wms.sch.task_manage.tasks.hot.InHotTrussTask;
import org.nl.wms.util.TaskUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.List;
import java.util.concurrent.TimeUnit;
import static org.nl.wms.util.TaskUtils.checkTaskOptionStatus;
import static org.nl.wms.util.TaskUtils.setUpdateByPC;
@@ -57,50 +52,40 @@ public class RawDownAGVTask extends AbstractTask {
@SneakyThrows
@Override
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public void createCompletion(SchBaseTask task) {
String requestParam = task.getRequest_param();
JSONObject requestObj = JSONObject.parseObject(requestParam);
String flag = requestObj.getString("is_flag");
// 生箔位置
String deviceCode = requestObj.getString("device_code");
// 收卷辊库出口
String startPointCode = requestObj.getString("start_point_code");
RLock lock = redissonClient.getLock(HX_REGION);
boolean tryLock = lock.tryLock(5, TimeUnit.SECONDS);
try {
if (tryLock) {
// 查找烘箱对接位可用的位置(没货、没任务、没禁用)
List<SchBasePoint> hxPoints = pointService.getHotNotTaskPoint("A1", HX_REGION,
"1", "1");
if (hxPoints.size() == 0) {
throw new BadRequestException("烘箱没有可以用的对接位!");
}
SchBasePoint hxPoint = hxPoints.get(0);
if ("1".equals(flag)) {
// 创建四点任务:先去收卷辊出口在到生箔位,在从生箔到烘箱对接位
task.setPoint_code1(startPointCode);
task.setPoint_code2(deviceCode + "_K");
task.setPoint_code3(deviceCode + "_M");
task.setPoint_code4(hxPoint.getPoint_code());
} else {
// 创建两点任务: 搬运到烘箱位置
task.setPoint_code1(deviceCode + "_M");
task.setPoint_code2(hxPoint.getPoint_code());
}
// 保存任务参数
task.setHandle_class(THIS_CLASS);
task.setTask_status(TaskStatus.START_AND_POINT.getCode());
setUpdateByPC(task);
taskService.save(task);
TaskUtils.taskLock(HX_REGION, () -> {
String requestParam = task.getRequest_param();
JSONObject requestObj = JSONObject.parseObject(requestParam);
String flag = requestObj.getString("is_flag");
// 生箔位置
String deviceCode = requestObj.getString("device_code");
// 收卷辊库出口
String startPointCode = requestObj.getString("start_point_code");
// 查找烘箱对接位可用的位置(没货、没任务、没禁用)
List<SchBasePoint> hxPoints = pointService.getHotNotTaskPoint("A1", HX_REGION,
"1", "1");
if (hxPoints.size() == 0) {
throw new BadRequestException("烘箱没有可以用的对接位!");
}
SchBasePoint hxPoint = hxPoints.get(0);
if ("1".equals(flag)) {
// 创建四点任务:先去收卷辊出口在到生箔位,在从生箔到烘箱对接位
task.setPoint_code1(startPointCode);
task.setPoint_code2(deviceCode + "_K");
task.setPoint_code3(deviceCode + "_M");
task.setPoint_code4(hxPoint.getPoint_code());
} else {
throw new BadRequestException("系统繁忙,稍后再试!");
// 创建两点任务: 搬运到烘箱位置
task.setPoint_code1(deviceCode + "_M");
task.setPoint_code2(hxPoint.getPoint_code());
}
} finally {
if (tryLock) {
lock.unlock();
}
}
// 保存任务参数
task.setHandle_class(THIS_CLASS);
task.setTask_status(TaskStatus.START_AND_POINT.getCode());
setUpdateByPC(task);
taskService.save(task);
});
}
@Override

View File

@@ -17,9 +17,8 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import static org.nl.wms.util.TaskUtils.checkTaskOptionStatus;
import static org.nl.wms.util.TaskUtils.setUpdateByPC;
import static org.nl.wms.util.PointUtils.setUpdateByType;
import static org.nl.wms.util.TaskUtils.*;
/**
* @Author: lyd
@@ -30,6 +29,7 @@ import static org.nl.wms.util.PointUtils.setUpdateByType;
@Component(value = "SlitterSendRollTrussTask")
public class SlitterSendRollTrussTask extends AbstractTask {
private final String THIS_CLASS = SlitterSendRollTrussTask.class.getName();
private final String SJG_REGION = "A1-SJGK";
@Autowired
private ISchBasePointService pointService;
@Autowired
@@ -43,19 +43,21 @@ public class SlitterSendRollTrussTask extends AbstractTask {
public void createCompletion(SchBaseTask task) {
// 起点一样不记录,直接创建入库任务
// 查找空位终点即可
List<SchBasePoint> allSjgkPoints = pointService.getAllBusinessNotTaskPoint("A1",
"A1-SJGK", "3", "1", null, null);
if (allSjgkPoints.size() == 0) {
throw new BadRequestException("收卷辊不存在空位!");
}
SchBasePoint endPoint = allSjgkPoints.get(0);
task.setPoint_code2(endPoint.getPoint_code());
// 创建任务
task.setHandle_class(THIS_CLASS);
task.setTask_status(TaskStatus.START_AND_POINT.getCode());
setUpdateByPC(task);
taskService.save(task);
log.info("任务创建成功:{}", task);
taskLock(SJG_REGION, () -> {
List<SchBasePoint> allSjgkPoints = pointService.getAllBusinessNotTaskPoint("A1",
SJG_REGION, "3", "1", null, null);
if (allSjgkPoints.size() == 0) {
throw new BadRequestException("收卷辊不存在空位!");
}
SchBasePoint endPoint = allSjgkPoints.get(0);
task.setPoint_code2(endPoint.getPoint_code());
// 创建任务
task.setHandle_class(THIS_CLASS);
task.setTask_status(TaskStatus.START_AND_POINT.getCode());
setUpdateByPC(task);
taskService.save(task);
log.info("任务创建成功:{}", task);
});
}
@Override

View File

@@ -3,8 +3,10 @@ package org.nl.wms.sch.task_manage.tasks.slitter;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.SecurityUtils;
import org.nl.wms.pdm.bi.dao.PdmBiRawfoilworkorder;
import org.nl.wms.pdm.bi.service.IpdmBiRawfoilworkorderService;
import org.nl.wms.pdm.ivt.cut.service.dao.StIvtCutpointivt;
@@ -52,40 +54,39 @@ public class SlitterUpAGVTask extends AbstractTask {
@Override
public void createCompletion(SchBaseTask task) {
TaskUtils.createTask("A1-SJGK", () -> {
String requestParam = task.getRequest_param();
JSONObject requestObj = JSONObject.parseObject(requestParam);
String isFlag = requestObj.getString("is_flag");
// 分切上料满料对接位
String cutPointCode = requestObj.getString("cut_point");
// 烘箱暂存对接位
String deviceCode = requestObj.getString("device_code");
StIvtCutpointivt cutPoint = cutpointivtService.getByFullCode(cutPointCode, false);
if ("0".equals(isFlag)) {
// 两点任务
task.setPoint_code1(deviceCode);
task.setPoint_code2(cutPoint.getFull_point_code());
} else {
// 收卷辊的入库不做校验
List<SchBasePoint> sjgPoints = pointService.getPointByConditions("A1", "A1-SJGK",
"1", null, null, false);
if (sjgPoints.size() == 0) {
throw new BadRequestException("收卷辊库找不到入口!");
}
SchBasePoint sjgPoint = sjgPoints.get(0);
// 四点任务
task.setPoint_code1(deviceCode);
task.setPoint_code2(cutPoint.getFull_point_code());
task.setPoint_code3(cutPoint.getEmpty_point_code());
task.setPoint_code4(sjgPoint.getPoint_code());
// 收卷辊不需要校验点位,因此无需加锁
String requestParam = task.getRequest_param();
JSONObject requestObj = JSONObject.parseObject(requestParam);
String isFlag = requestObj.getString("is_flag");
// 分切上料满料对接位
String cutPointCode = requestObj.getString("cut_point");
// 烘箱暂存对接位
String deviceCode = requestObj.getString("device_code");
StIvtCutpointivt cutPoint = cutpointivtService.getByFullCode(cutPointCode, false);
if ("0".equals(isFlag)) {
// 两点任务
task.setPoint_code1(deviceCode);
task.setPoint_code2(cutPoint.getFull_point_code());
} else {
// 收卷辊的入库不做校验
List<SchBasePoint> sjgPoints = pointService.getPointByConditions("A1", "A1-SJGK",
"1", null, null, false);
if (sjgPoints.size() == 0) {
throw new BadRequestException("收卷辊库找不到入口!");
}
// 创建任务
task.setHandle_class(THIS_CLASS);
task.setTask_status(TaskStatus.START_AND_POINT.getCode());
setUpdateByPC(task);
taskService.save(task);
log.info("任务创建成功:{}", task);
});
SchBasePoint sjgPoint = sjgPoints.get(0);
// 四点任务
task.setPoint_code1(deviceCode);
task.setPoint_code2(cutPoint.getFull_point_code());
task.setPoint_code3(cutPoint.getEmpty_point_code());
task.setPoint_code4(sjgPoint.getPoint_code());
}
// 创建任务
task.setHandle_class(THIS_CLASS);
task.setTask_status(TaskStatus.START_AND_POINT.getCode());
setUpdateByPC(task);
taskService.save(task);
log.info("任务创建成功:{}", task);
}
@@ -141,4 +142,16 @@ public class SlitterUpAGVTask extends AbstractTask {
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj);
}
@Override
public void agvPickUpCompleted(SchBaseTask task) {
LambdaUpdateWrapper<SchBaseTask> lam = new LambdaUpdateWrapper<>();
lam.set(SchBaseTask::getTask_status, TaskStatus.PICK_UP_COMPLETED.getCode())
.set(SchBaseTask::getUpdate_id, SecurityUtils.getCurrentUserId())
.set(SchBaseTask::getUpdate_name, SecurityUtils.getCurrentNickName())
.set(SchBaseTask::getUpdate_time, DateUtil.now())
.eq(SchBaseTask::getTask_code, task.getTask_code());
boolean update = taskService.update(lam);
log.info("任务[{}]取货完成执行{}", task.getTask_code(), update);
}
}

View File

@@ -15,15 +15,12 @@ import org.nl.wms.sch.task_manage.TaskStatus;
import org.nl.wms.sch.task_manage.core.constant.GeneralDefinition;
import org.nl.wms.sch.task_manage.core.enums.TaskFinishedTypeEnum;
import org.nl.wms.util.TaskUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.concurrent.TimeUnit;
import static org.nl.wms.util.PointUtils.clearPoint;
import static org.nl.wms.util.TaskUtils.*;
@@ -37,6 +34,7 @@ import static org.nl.wms.util.TaskUtils.*;
@Component(value = "SlitterUpTrussTask")
public class SlitterUpTrussTask extends AbstractTask {
private final String THIS_CLASS = SlitterUpTrussTask.class.getName();
private final static String HX_REGION = "A1-HXZC";
@Autowired
private ISchBasePointService pointService;
@Autowired
@@ -54,38 +52,28 @@ public class SlitterUpTrussTask extends AbstractTask {
@SneakyThrows
@Override
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public void createCompletion(SchBaseTask task) {
// 桁架任务,到对接位
String requestParam = task.getRequest_param();
JSONObject requestObj = JSONObject.parseObject(requestParam);
String pointCode = requestObj.getString("zc_point");
RLock lock = redissonClient.getLock("A1-HXZC");
boolean tryLock = lock.tryLock(5, TimeUnit.SECONDS);
try {
if (tryLock) {
// 终点为出口
List<SchBasePoint> endPoints = pointService.getHotNotTaskPoint("A1", "A1-HXZC",
"1", "1");
if (endPoints.size() == 0) {
throw new BadRequestException("烘箱没有可以用的对接位!");
}
SchBasePoint point = endPoints.get(0);
task.setPoint_code1(pointCode);
task.setPoint_code2(point.getPoint_code());
// 创建任务
task.setHandle_class(THIS_CLASS);
task.setTask_status(TaskStatus.START_AND_POINT.getCode());
setUpdateByPC(task);
taskService.save(task);
log.info("任务创建成功:{}", task);
TaskUtils.taskLock(HX_REGION, () -> {
// 桁架任务,到对接位
String requestParam = task.getRequest_param();
JSONObject requestObj = JSONObject.parseObject(requestParam);
String pointCode = requestObj.getString("zc_point");
// 终点为出口
List<SchBasePoint> endPoints = pointService.getHotNotTaskPoint("A1", HX_REGION,
"1", "1");
if (endPoints.size() == 0) {
throw new BadRequestException("烘箱没有可以用的对接位!");
}
} finally {
if (lock.isHeldByCurrentThread() && lock.isLocked()) {
lock.unlock();
}
}
SchBasePoint point = endPoints.get(0);
task.setPoint_code1(pointCode);
task.setPoint_code2(point.getPoint_code());
// 创建任务
task.setHandle_class(THIS_CLASS);
task.setTask_status(TaskStatus.START_AND_POINT.getCode());
setUpdateByPC(task);
taskService.save(task);
log.info("任务创建成功:{}", task);
});
}
@Override
@@ -95,6 +83,7 @@ public class SlitterUpTrussTask extends AbstractTask {
// 任务完成起点清除创建AGV任务到达参数中的point_code的点位上
String requestParam = taskObj.getRequest_param();
JSONObject requestObj = JSONObject.parseObject(requestParam);
// 分切机满料位
String isFlag = requestObj.getString("is_flag");
String workorderId = requestObj.getString("workorder_id");
@@ -102,6 +91,7 @@ public class SlitterUpTrussTask extends AbstractTask {
String endPointCode = taskObj.getPoint_code2();
SchBasePoint startPoint = pointService.getById(startPointCode);
clearPoint(startPoint, taskFinishedType);
// 创建AGV任务
log.info("点位{}更新完毕创建AGV任务给分切机上料", startPointCode);
PdmBiRawfoilworkorder order = rawfoilworkorderService.getById(workorderId);
@@ -119,6 +109,7 @@ public class SlitterUpTrussTask extends AbstractTask {
taskParam.put("up_task_code", taskObj.getTask_code());
taskParam.put("create_mode", GeneralDefinition.TASK_CREATION);
slitterUpAGVTask.apply(taskParam);
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskObj.setFinished_type(taskFinishedType.getCode());
setUpdateByType(taskObj, taskFinishedType);

View File

@@ -44,7 +44,7 @@ public class TaskUtils {
* @param function
*/
@SneakyThrows
public static void createTask(String region, Runnable function){
public static void taskLock(String region, Runnable function){
RedissonClient redissonClient = SpringContextHolder.getBean(RedissonClient.class);
RLock lock = redissonClient.getLock(region);
boolean tryLock = lock.tryLock(5, TimeUnit.SECONDS);
@@ -52,7 +52,7 @@ public class TaskUtils {
if (tryLock) {
PlatformTransactionManager txManager = SpringContextHolder.getBean(PlatformTransactionManager.class);
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
TransactionStatus status = txManager.getTransaction(def);
//执行目标方法