|
@@ -12,11 +12,16 @@ import com.ruoyi.ams.task.mapper.WcsTaskMapper;
|
|
|
import com.ruoyi.ams.task.service.IWcsTaskService;
|
|
|
import com.ruoyi.base.constant.Constant;
|
|
|
import com.ruoyi.base.domain.BaseLocationInfo;
|
|
|
+import com.ruoyi.base.domain.BaseLocationZone;
|
|
|
+import com.ruoyi.base.mapper.BaseLocationZoneMapper;
|
|
|
import com.ruoyi.base.service.IBaseLocationInfoService;
|
|
|
+import com.ruoyi.base.service.IBaseLocationZoneService;
|
|
|
import com.ruoyi.common.core.redis.RedisCache;
|
|
|
import com.ruoyi.common.exception.base.BaseException;
|
|
|
import com.ruoyi.common.utils.DateUtils;
|
|
|
import com.ruoyi.common.utils.StringUtils;
|
|
|
+import com.ruoyi.system.service.ISysConfigService;
|
|
|
+import com.ruoyi.system.service.impl.SysConfigServiceImpl;
|
|
|
import com.ruoyi.tianao.domian.TianaoTask;
|
|
|
import com.ruoyi.tianao.service.TianaoService;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
@@ -61,111 +66,166 @@ public class TianaoServiceImpl implements TianaoService {
|
|
|
@Autowired
|
|
|
private IAmsTaskService amsTaskService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private BaseLocationZoneMapper baseLocationZoneMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ISysConfigService iSysConfigService;
|
|
|
+
|
|
|
@Value("${tianao.taskBackUrl}")
|
|
|
- private String taskBackUrl;
|
|
|
+ private String taskBackUrl;
|
|
|
@Value("${tianao.AGVStatusBackUrl}")
|
|
|
- private String AGVStatusBackUrl ;
|
|
|
+ private String AGVStatusBackUrl;
|
|
|
|
|
|
- private final List<Long> statusLsit = Arrays.asList(11L,12L,5L,6L,7L);
|
|
|
+ private final List<Long> statusLsit = Arrays.asList(2L, 5L, 6L, 7L);
|
|
|
+
|
|
|
+ private final List<Long> zoneList = Arrays.asList(10003L, 10005L);
|
|
|
|
|
|
@Autowired
|
|
|
private RedisCache redisCache;
|
|
|
|
|
|
|
|
|
@Override
|
|
|
+ @Transactional
|
|
|
public JSONObject addTask(TianaoTask tianaoTask) {
|
|
|
- if (redisCache.checkIsLock(tianaoTask.getLcs_task_id())){
|
|
|
- return returnJson("e0001","任务Id已重复","fail");
|
|
|
- }
|
|
|
- if (tianaoTask.getFrom_location().equals(tianaoTask.getTo_location())) {
|
|
|
- return returnJson("e0001","起始库位与目标库位不能相同","fail");
|
|
|
- }
|
|
|
- BaseLocationInfo formAddress = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(tianaoTask.getFrom_location(), Constant.WAREHOUSE_ID);
|
|
|
- if(ObjectUtil.isNull(formAddress)){
|
|
|
- return returnJson("e0001","起始位置不存在","fail");
|
|
|
- }
|
|
|
- BaseLocationInfo toAddress = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(tianaoTask.getTo_location(), Constant.WAREHOUSE_ID);
|
|
|
- if(ObjectUtil.isNull(toAddress)){
|
|
|
- return returnJson("e0001","目标位置不存在","fail");
|
|
|
- }
|
|
|
- if("N".equals(toAddress.getIsEmpty())){
|
|
|
- return returnJson("e0001","目标位置库存不为空","fail");
|
|
|
- }
|
|
|
- WcsTask wcsTask = new WcsTask();
|
|
|
- wcsTask.setTaskNo(System.currentTimeMillis() + "");
|
|
|
- wcsTask.setState(9L);
|
|
|
- wcsTask.setTaskType(Constant.TASK_TYPE.FORWARD.getValue());
|
|
|
- wcsTask.setBusinessType(tianaoTask.getTask_type());
|
|
|
- wcsTask.setAreaFrom(formAddress.getZoneId().toString());
|
|
|
- wcsTask.setLocationFrom(formAddress.getId().toString());
|
|
|
- wcsTask.setAreaTo(toAddress.getZoneId().toString());
|
|
|
- wcsTask.setLocationTo(toAddress.getId().toString());
|
|
|
- wcsTask.setCreateTime(tianaoTask.getTime());
|
|
|
- wcsTask.setCreateBy("上层调用");
|
|
|
- wcsTask.setShopId(Constant.WAREHOUSE_ID.toString());
|
|
|
- wcsTask.setPriority(10L);
|
|
|
- wcsTask.setExt7(tianaoTask.getLcs_task_id());
|
|
|
- wcsTask.setExt5(tianaoTask.getContainer_no());
|
|
|
- if (wcsTaskService.insertWcsTask(wcsTask) ==1){
|
|
|
- redisCache.setCacheObject(tianaoTask.getLcs_task_id(),tianaoTask.getLcs_task_id(),30,TimeUnit.SECONDS);
|
|
|
- return returnJson("00000","任务发起成功","ok");
|
|
|
+ try {
|
|
|
+ if (redisCache.checkIsLock(tianaoTask.getLcs_task_id())) {
|
|
|
+ List<WcsTask> wcsTaskList = wcsTaskMapper.selectWcsTaskByLcsTaskId(tianaoTask.getLcs_task_id());
|
|
|
+ if (ObjectUtil.isNotNull(wcsTaskList) || wcsTaskList.size() > 0) {
|
|
|
+ return returnJson("e0001", "任务Id已重复", "fail");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (tianaoTask.getFrom_location().equals(tianaoTask.getTo_location())) {
|
|
|
+ return returnJson("e0001", "起始库位与目标库位不能相同", "fail");
|
|
|
+ }
|
|
|
+ BaseLocationInfo formAddress = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(tianaoTask.getFrom_location(), Constant.WAREHOUSE_ID);
|
|
|
+ if (ObjectUtil.isNull(formAddress)) {
|
|
|
+ return returnJson("e0001", "起始位置不存在", "fail");
|
|
|
+ }
|
|
|
+ BaseLocationInfo toAddress = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(tianaoTask.getTo_location(), Constant.WAREHOUSE_ID);
|
|
|
+ if (ObjectUtil.isNull(toAddress)) {
|
|
|
+ return returnJson("e0001", "目标位置不存在", "fail");
|
|
|
+ }
|
|
|
+ if ("N".equals(toAddress.getIsEmpty())) {
|
|
|
+ return returnJson("e0001", "目标位置库存不为空", "fail");
|
|
|
+ }
|
|
|
+ //判断是否需要拆分任务
|
|
|
+ if (zoneList.contains(formAddress.getZoneId()) || zoneList.contains(toAddress.getZoneId())) {
|
|
|
+ WcsTask wcsTask = createWcsTask(tianaoTask, formAddress, toAddress, "0");
|
|
|
+ formAddress.setIsEmpty("N");
|
|
|
+ iBaseLocationInfoService.updateBaseLocationInfo(formAddress);
|
|
|
+ wcsTaskService.insertWcsTask(wcsTask);
|
|
|
+ } else {
|
|
|
+ //拆分任务,获取任务执行的中转区
|
|
|
+ Long zoneId = null;
|
|
|
+ if (formAddress.getZoneId().equals(10009L) || toAddress.getZoneId().equals(10009L)) {
|
|
|
+ zoneId = Long.parseLong(iSysConfigService.selectConfigByKey("sys.area.B2"));
|
|
|
+ } else {
|
|
|
+ zoneId = Long.parseLong(iSysConfigService.selectConfigByKey("sys.area.C"));
|
|
|
+ }
|
|
|
+ //选择中转区空库位
|
|
|
+ BaseLocationInfo baseLocationInfo = new BaseLocationInfo();
|
|
|
+ baseLocationInfo.setZoneId(zoneId);
|
|
|
+ baseLocationInfo.setIsEmpty("Y");
|
|
|
+ List<BaseLocationInfo> baseLocationInfos = iBaseLocationInfoService.selectSortedLocatinListByZoneIdNoTask(baseLocationInfo);
|
|
|
+ if (ObjectUtil.isNull(baseLocationInfos) && baseLocationInfos.size() == 0) {
|
|
|
+ return returnJson("e0001", "没有合适的中转库位", "fail");
|
|
|
+ }
|
|
|
+ System.out.println(baseLocationInfos.get(0));
|
|
|
+ WcsTask wcsTask1 = createWcsTask(tianaoTask, formAddress, baseLocationInfos.get(0), "1");
|
|
|
+ WcsTask wcsTask2 = createWcsTask(tianaoTask, baseLocationInfos.get(0), toAddress, "0");
|
|
|
+ wcsTask2.setParentTask(wcsTask1.getTaskNo());
|
|
|
+ formAddress.setIsEmpty("N");
|
|
|
+ iBaseLocationInfoService.updateBaseLocationInfo(formAddress);
|
|
|
+ //生成任务
|
|
|
+ wcsTaskService.insertWcsTask(wcsTask1);
|
|
|
+ wcsTaskService.insertWcsTask(wcsTask2);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ log.info("任务:{},生成出错,mag:{}", tianaoTask, e.getMessage());
|
|
|
+ return returnJson("e0001", "任务发起出错", "fail");
|
|
|
}
|
|
|
- return returnJson("e0001","任务发起出错","fail");
|
|
|
+ redisCache.setCacheObject(tianaoTask.getLcs_task_id(), tianaoTask.getLcs_task_id(), 30, TimeUnit.SECONDS);
|
|
|
+ return returnJson("00000", "任务发起成功", "ok");
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public JSONObject cancelTask(TianaoTask tianaoTask) {
|
|
|
- WcsTask wcsTask = wcsTaskMapper.selectWcsTaskByLcsTaskId(tianaoTask.getLcs_task_id());
|
|
|
- log.info(wcsTask.toString());
|
|
|
- if (ObjectUtil.isNull(wcsTask)) {
|
|
|
- return returnJson("e0001","任务查询不存在","fail");
|
|
|
- }
|
|
|
- if (wcsTaskService.cancelTask(wcsTask).isSuccess()){
|
|
|
- return returnJson("00000","任务取消成功","ok");
|
|
|
+ try {
|
|
|
+ List<WcsTask> wcsTaskList = wcsTaskMapper.selectWcsTaskByLcsTaskId(tianaoTask.getLcs_task_id());
|
|
|
+ log.info("取消任务详情:{}", wcsTaskList);
|
|
|
+ if (ObjectUtil.isNull(wcsTaskList) || wcsTaskList.size() == 0) {
|
|
|
+ return returnJson("e0001", "任务查询不存在", "fail");
|
|
|
+ }
|
|
|
+ for (WcsTask wcsTask : wcsTaskList) {
|
|
|
+ if (wcsTask.getState().equals(6L) || wcsTask.getState().equals(2L)) {
|
|
|
+ return returnJson("e0001", "总任务或者前置任务已完成无法取消", "fail");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (WcsTask wcsTask : wcsTaskList) {
|
|
|
+ wcsTaskService.cancelTask(wcsTask);
|
|
|
+ }
|
|
|
+ return returnJson("00000", "任务取消成功", "ok");
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("取消任务失败,msg:{}", e.getMessage());
|
|
|
+ return returnJson("e0001", "任务取消出错", "fail");
|
|
|
}
|
|
|
- return returnJson("e0001","任务取消出错","fail");
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
@Transactional
|
|
|
public JSONObject updateTask(TianaoTask tianaoTask) {
|
|
|
- WcsTask wcsTask = wcsTaskMapper.selectWcsTaskByLcsTaskId(tianaoTask.getLcs_task_id());
|
|
|
- if (ObjectUtil.isNull(wcsTask)) {
|
|
|
- return returnJson("e0001","任务查询不存在","fail");
|
|
|
+ List<WcsTask> wcsTaskList = wcsTaskMapper.selectWcsTaskByLcsTaskId(tianaoTask.getLcs_task_id());
|
|
|
+ if (ObjectUtil.isNull(wcsTaskList) || wcsTaskList.size() == 0) {
|
|
|
+ return returnJson("e0001", "任务查询不存在", "fail");
|
|
|
}
|
|
|
- if (statusLsit.contains(wcsTask.getState())){
|
|
|
- return returnJson("e0001","当前任务无法修改卸货点","fail");
|
|
|
+ WcsTask wcsTask = new WcsTask();
|
|
|
+ if (wcsTaskList.size() == 1) {
|
|
|
+ wcsTask = wcsTaskList.get(0);
|
|
|
+ } else {
|
|
|
+ for (WcsTask task : wcsTaskList) {
|
|
|
+ if (StringUtils.isNotEmpty(task.getParentTask())) {
|
|
|
+ wcsTask = task;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (statusLsit.contains(wcsTask.getState())) {
|
|
|
+ return returnJson("e0001", "当前任务无法修改卸货点", "fail");
|
|
|
+ }
|
|
|
+ BaseLocationInfo baseLocationInfo = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(tianaoTask.getTo_location(), Constant.WAREHOUSE_ID);
|
|
|
+ if (ObjectUtil.isNull(baseLocationInfo)) {
|
|
|
+ return returnJson("e0001", "目标卸货点不存在", "fail");
|
|
|
}
|
|
|
- if("N".equals( iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(tianaoTask.getTo_location(), Constant.WAREHOUSE_ID).getIsEmpty())){
|
|
|
- return returnJson("e0001","目标卸货点不为空","fail");
|
|
|
+ if ("N".equals(baseLocationInfo.getIsEmpty())) {
|
|
|
+ return returnJson("e0001", "目标卸货点不为空", "fail");
|
|
|
}
|
|
|
- if (wcsTask.getState()!=9) {
|
|
|
+ if (wcsTask.getState() != 9L) {
|
|
|
try {
|
|
|
AmsTask amsTask = new AmsTask();
|
|
|
amsTask.setTaskNo(wcsTask.getTaskNo());
|
|
|
amsTask = amsTaskService.selectAmsTaskByModel(amsTask);
|
|
|
Integer carNo = Integer.getInteger(wcsTask.getAgvNo());
|
|
|
- if (ObjectUtil.isNotNull(carNo)){
|
|
|
+ if (ObjectUtil.isNotNull(carNo)) {
|
|
|
//修改AGV任务目标地址
|
|
|
- statusUpdateService.confirmAnalysis(wcsTask.getTaskNo(), amsTask.getAciIndex(),carNo
|
|
|
- , "02", tianaoTask.getTo_location());
|
|
|
+ statusUpdateService.confirmAnalysis(wcsTask.getTaskNo(), amsTask.getAciIndex(), carNo
|
|
|
+ , "02", baseLocationInfo.getId().toString());
|
|
|
Thread.sleep(1000);
|
|
|
- statusUpdateService.confirmAnalysis(wcsTask.getTaskNo(), amsTask.getAciIndex(), carNo
|
|
|
+ statusUpdateService.confirmAnalysis(wcsTask.getTaskNo(), amsTask.getAciIndex(), carNo
|
|
|
, "10", "1");
|
|
|
Thread.sleep(1000);
|
|
|
}
|
|
|
- }catch (Exception e){
|
|
|
+ } catch (Exception e) {
|
|
|
log.info(e.getMessage());
|
|
|
- return returnJson("e0001","任务修改卸货点失败","fail");
|
|
|
+ return returnJson("e0001", "任务修改卸货点失败", "fail");
|
|
|
}
|
|
|
}
|
|
|
- BaseLocationInfo toAddress = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(tianaoTask.getTo_location(), Constant.WAREHOUSE_ID);
|
|
|
- wcsTask.setAreaTo(toAddress.getZoneId().toString());
|
|
|
- wcsTask.setLocationTo(tianaoTask.getTo_location());
|
|
|
- if(wcsTaskService.updateWcsTask(wcsTask)==1){
|
|
|
- return returnJson("00000","卸货点修改成功","ok");
|
|
|
+ wcsTask.setAreaTo(baseLocationInfo.getZoneId().toString());
|
|
|
+ wcsTask.setLocationTo(baseLocationInfo.getId().toString());
|
|
|
+ if (wcsTaskService.updateWcsTask(wcsTask) == 1) {
|
|
|
+ return returnJson("00000", "卸货点修改成功", "ok");
|
|
|
}
|
|
|
- return returnJson("e0001","任务修改卸货点失败","fail");
|
|
|
+ return returnJson("e0001", "任务修改卸货点失败", "fail");
|
|
|
}
|
|
|
|
|
|
@EventListener
|
|
@@ -173,48 +233,52 @@ public class TianaoServiceImpl implements TianaoService {
|
|
|
public String getAGVCoordinate(CarStatus car) {
|
|
|
JSONObject jsonObject = new JSONObject();
|
|
|
JSONObject jsonObject1 = new JSONObject();
|
|
|
- jsonObject1.put("carNo",car.getCarNo());
|
|
|
- jsonObject1.put("y",car.getY());
|
|
|
- jsonObject1.put("x",car.getX());
|
|
|
- jsonObject1.put("time",DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,new Date()));
|
|
|
- jsonObject.put("HEADER",jsonObject1);
|
|
|
- log.info("反馈AGV坐标请求参数:{}",jsonObject);
|
|
|
- String body = HttpRequest.post(AGVStatusBackUrl)
|
|
|
- .body(jsonObject.toString())
|
|
|
- .contentType("application/json").execute().body();
|
|
|
- log.info("反馈AGV坐标回调结果:{}",body);
|
|
|
- return body;
|
|
|
+ jsonObject1.put("carNo", car.getCarNo());
|
|
|
+ jsonObject1.put("y", car.getY());
|
|
|
+ jsonObject1.put("x", car.getX());
|
|
|
+ jsonObject1.put("time", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, new Date()));
|
|
|
+ jsonObject.put("HEADER", jsonObject1);
|
|
|
+ log.info("反馈AGV坐标请求参数:{}", jsonObject);
|
|
|
+// String body = HttpRequest.post(AGVStatusBackUrl)
|
|
|
+// .body(jsonObject.toString())
|
|
|
+// .contentType("application/json").execute().body();
|
|
|
+// log.info("反馈AGV坐标回调结果:{}", body);
|
|
|
+// return body;
|
|
|
+ return null;
|
|
|
}
|
|
|
|
|
|
@EventListener
|
|
|
@Async
|
|
|
- public String tianaoCallBack(WcsTask wcsTask){
|
|
|
- if (StringUtils.isNotEmpty(wcsTask.getExt7())){
|
|
|
+ public String tianaoCallBack(WcsTask wcsTask) {
|
|
|
+ if (StringUtils.isNotEmpty(wcsTask.getExt7())) {
|
|
|
+ if (wcsTask.getState().equals(2L) && "1".equals(wcsTask.getExt5())){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
JSONObject jsonObject = new JSONObject();
|
|
|
JSONObject jsonObject1 = new JSONObject();
|
|
|
jsonObject1.put("lcs_task_id", wcsTask.getExt7());
|
|
|
- jsonObject1.put("container_no", wcsTask.getExt5());
|
|
|
+ jsonObject1.put("container_no", wcsTask.getBatchNo());
|
|
|
jsonObject1.put("task_type", wcsTask.getBusinessType());
|
|
|
jsonObject1.put("task_status", wcsTask.getState());
|
|
|
jsonObject1.put("agv_no", wcsTask.getAgvNo());
|
|
|
- jsonObject1.put("time", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,new Date()));
|
|
|
- jsonObject.put("HEADER",jsonObject1);
|
|
|
- log.info("反馈任务状态请求参数:{}",jsonObject);
|
|
|
- String body = HttpRequest.post(taskBackUrl)
|
|
|
- .body(jsonObject.toString())
|
|
|
- .contentType("application/json").execute().body();
|
|
|
- log.info("反馈任务状态回调结果:{}", body);
|
|
|
- return body;
|
|
|
+ jsonObject1.put("time", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, new Date()));
|
|
|
+ jsonObject.put("HEADER", jsonObject1);
|
|
|
+ log.info("反馈任务状态请求参数:{}", jsonObject);
|
|
|
+// String body = HttpRequest.post(taskBackUrl)
|
|
|
+// .body(jsonObject.toString())
|
|
|
+// .contentType("application/json").execute().body();
|
|
|
+// log.info("反馈任务状态回调结果:{}", body);
|
|
|
+// return body;
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public JSONObject returnJson(String code,String msg,String state){
|
|
|
+ public JSONObject returnJson(String code, String msg, String state) {
|
|
|
JSONObject jsonObject = new JSONObject();
|
|
|
- jsonObject.put("code",code);
|
|
|
- jsonObject.put("msg",msg);
|
|
|
- jsonObject.put("state",state);
|
|
|
+ jsonObject.put("code", code);
|
|
|
+ jsonObject.put("msg", msg);
|
|
|
+ jsonObject.put("state", state);
|
|
|
return jsonObject;
|
|
|
}
|
|
|
|
|
@@ -227,4 +291,24 @@ public class TianaoServiceImpl implements TianaoService {
|
|
|
public String testAgvAddress(CarStatus car) {
|
|
|
return getAGVCoordinate(car);
|
|
|
}
|
|
|
+
|
|
|
+ private WcsTask createWcsTask(TianaoTask tianaoTask, BaseLocationInfo formAddress, BaseLocationInfo toAddress, String frontLoadingOrNot) {
|
|
|
+ WcsTask wcsTask = new WcsTask();
|
|
|
+ wcsTask.setTaskNo(System.currentTimeMillis() + "");
|
|
|
+ wcsTask.setState(9L);
|
|
|
+ wcsTask.setTaskType(Constant.TASK_TYPE.Handling.getValue());
|
|
|
+ wcsTask.setBusinessType("01");
|
|
|
+ wcsTask.setAreaFrom(formAddress.getZoneId().toString());
|
|
|
+ wcsTask.setLocationFrom(formAddress.getId().toString());
|
|
|
+ wcsTask.setAreaTo(toAddress.getZoneId().toString());
|
|
|
+ wcsTask.setLocationTo(toAddress.getId().toString());
|
|
|
+ wcsTask.setCreateTime(tianaoTask.getTime());
|
|
|
+ wcsTask.setCreateBy("上层调用");
|
|
|
+ wcsTask.setShopId(Constant.WAREHOUSE_ID.toString());
|
|
|
+ wcsTask.setPriority(10L);
|
|
|
+ wcsTask.setExt7(tianaoTask.getLcs_task_id());
|
|
|
+ wcsTask.setBatchNo(tianaoTask.getContainer_no());
|
|
|
+ wcsTask.setExt5(frontLoadingOrNot);
|
|
|
+ return wcsTask;
|
|
|
+ }
|
|
|
}
|