diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index cdd3c78ab..e7e292e25 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -76,6 +76,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { */ @Override @Transactional(rollbackFor = Exception.class) + @SneakyThrows public Map receiveTaskStatusAcs(String string) { log.info("receiveTaskStatusAcs请求参数:--------------------------------------" + string); JSONArray array = JSONArray.parseArray(string); @@ -84,41 +85,53 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { for (int i = 0; i < array.size(); i++) { JSONObject row = array.getJSONObject(i); String task_id = row.getString("task_id"); - JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); - // 任务处理类 - String processing_class = taskObj.getString("handle_class"); - //1:执行中,2:完成 ,3:acs取消 - String acs_task_status = row.getString("task_status"); - String car_no = row.getString("car_no"); - if (StrUtil.isNotEmpty(car_no)) { - taskObj.put("car_no", car_no); - WQLObject.getWQLObject("SCH_BASE_Task").update(taskObj); - } - String message = ""; - String status = ""; - if ("1".equals(acs_task_status)) { - status = TaskStatusEnum.EXECUTING.getCode(); - } - if ("2".equals(acs_task_status)) { - status = TaskStatusEnum.FINISHED.getCode(); - } - if ("3".equals(acs_task_status)) { - status = "0"; - } - // 任务处理类 + RLock lock = redissonClient.getLock(task_id); + boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); try { - Class clz = Class.forName(processing_class); - Object obj = clz.newInstance(); - // 调用每个任务类的forceFinishInst()强制结束方法 - Method m = obj.getClass().getDeclaredMethod("updateTaskStatus", JSONObject.class, String.class); - m.invoke(obj, row, status); - } catch (Exception e) { - e.printStackTrace(); - message = e.getMessage(); - throw new BadRequestException(message); + if (tryLock){ + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + // 任务处理类 + String processing_class = taskObj.getString("handle_class"); + //1:执行中,2:完成 ,3:acs取消 + String acs_task_status = row.getString("task_status"); + String car_no = row.getString("car_no"); + if (StrUtil.isNotEmpty(car_no)) { + taskObj.put("car_no", car_no); + WQLObject.getWQLObject("SCH_BASE_Task").update(taskObj); + } + String message = ""; + String status = ""; + if ("1".equals(acs_task_status)) { + status = TaskStatusEnum.EXECUTING.getCode(); + } + if ("2".equals(acs_task_status)) { + status = TaskStatusEnum.FINISHED.getCode(); + } + if ("3".equals(acs_task_status)) { + status = "0"; + } + // 任务处理类 + try { + Class clz = Class.forName(processing_class); + Object obj = clz.newInstance(); + // 调用每个任务类的forceFinishInst()强制结束方法 + Method m = obj.getClass().getDeclaredMethod("updateTaskStatus", JSONObject.class, String.class); + m.invoke(obj, row, status); + } catch (Exception e) { + e.printStackTrace(); + message = e.getMessage(); + throw new BadRequestException(message); + } + }else { + throw new BadRequestException("任务标识为:"+task_id+"的任务正在操作中!"); + } + } finally { + if (tryLock) { + lock.unlock(); + } } - } + } JSONObject result = new JSONObject(); result.put("status", HttpStatus.OK.value()); result.put("message", "任务状态反馈成功!"); @@ -947,7 +960,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { @Override public JSONObject sendGetGoalStruct(JSONObject whereJson) { log.info("sendGetGoalStruct请求参数为--------------------------:" + whereJson.toString()); - //type:2、反馈尺寸;3、申请取货;4、申请放货;6、套轴申请;7、套轴完成;8、拔轴完成 + //type:2、反馈尺寸;3、申请放货;4、申请取货;6、套轴申请;7、套轴完成;8、拔轴完成 String type = whereJson.getString("type"); JSONObject result = new JSONObject(); @@ -978,24 +991,37 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { String zg_generation = zg_jo.getString("qzz_generation"); if (StrUtil.isEmpty(zg_generation) || StrUtil.isEmpty(zg_size)) { - //如果纸管工位的代数和尺寸为空,则把气胀轴搬运到气胀轴缓存位 - JSONObject jo = new JSONObject(); - jo.put("task_type", "010603"); - jo.put("point_code1", cbz_jo.getString("point_code")); - JSONObject fhd_jo = WQLObject.getWQLObject("st_ivt_shaftivt").query("point_type = '7' AND product_area = '" + product_area + "'").uniqueResult(0); - jo.put("point_code2", fhd_jo.getString("point_code")); - jo.put("product_area", product_area); - jo.put("vehicle_code", "qzz"); - jo.put("truss_type", "8"); - JSONObject request_param = new JSONObject(); - request_param.put("have_size", cbz_size); - request_param.put("have_generation", cbz_generation); - jo.put("request_param", request_param.toString()); - paperTrussTask.createTask(jo); - result.put("status", HttpStatus.OK.value()); - result.put("is_bushing", "0"); - result.put("message", "反馈成功!"); - return result; + /*如果纸管工位的代数和尺寸为空,判断是否存在正在纸管出库且符合条件的任务 + 1、存在,则反馈ACS等待 + 2、不存在,则把气胀轴搬运到气胀轴缓存位*/ + JSONObject paper_jo = WQLObject.getWQLObject("sch_base_task").query("task_type = '010601' AND task_status < '07' AND is_delete = '0' AND product_area = '" + product_area + "' order by create_time").uniqueResult(0); + if (ObjectUtil.isNotEmpty(paper_jo)) { + JSONObject resq_jo = paper_jo.getJSONObject("request_param"); + + JSONObject plan_jo = WQLObject.getWQLObject("pdm_bi_slittingproductionplan").query("container_name = '" + resq_jo.getString("container_name1") + "'").uniqueResult(0); + String paper_tube_or_FRP = plan_jo.getString("paper_tube_or_frp"); + String paper_name; + if ("1".equals(paper_tube_or_FRP)) { + paper_name = plan_jo.getString("paper_tube_description"); + } else { + paper_name = plan_jo.getString("frp_description"); + } + String need_size = String.valueOf(paper_name.split("\\|")[2].charAt(0)); + JSONObject cut_jo = WQLObject.getWQLObject("st_ivt_cutpointivt").query("ext_code = '" + plan_jo.getString("resource_name") + "'").uniqueResult(0); + //获取分切机维护的气涨轴代数 + String need_generation = cut_jo.getString("qzz_generation"); + if (cbz_size.equals(need_size) && zg_generation.equals(need_generation)) { + //todo:反馈ACS让气胀轴等待 + result.put("status", HttpStatus.OK.value()); + result.put("is_bushing", "2"); + result.put("message", "反馈成功!"); + return result; + } else { + return createTask(result, product_area, cbz_jo, cbz_size, cbz_generation); + } + } else { + return createTask(result, product_area, cbz_jo, cbz_size, cbz_generation); + } } else { if (cbz_size.equals(zg_size) && zg_generation.equals(cbz_generation)) { //todo:反馈ACS可以进行穿轴 @@ -1168,11 +1194,34 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { result.put("status", HttpStatus.OK.value()); result.put("device_code", struct_jo.getString("point_code")); result.put("message", "反馈成功!"); + log.info("sendGetGoalStruct输出参数为--------------------------:" + result.toString()); + return result; + } + + //创建气胀轴放货任务 + private JSONObject createTask(JSONObject result, String product_area, JSONObject cbz_jo, String cbz_size, String cbz_generation) { + JSONObject jo = new JSONObject(); + jo.put("task_type", "010603"); + jo.put("point_code1", cbz_jo.getString("point_code")); + JSONObject fhd_jo = WQLObject.getWQLObject("st_ivt_shaftivt").query("point_type = '7' AND product_area = '" + product_area + "'").uniqueResult(0); + jo.put("point_code2", fhd_jo.getString("point_code")); + jo.put("product_area", product_area); + jo.put("vehicle_code", "qzz"); + jo.put("truss_type", "8"); + JSONObject request_param = new JSONObject(); + request_param.put("have_size", cbz_size); + request_param.put("have_generation", cbz_generation); + jo.put("request_param", request_param.toString()); + paperTrussTask.createTask(jo); + result.put("status", HttpStatus.OK.value()); + result.put("is_bushing", "0"); + result.put("message", "反馈成功!"); return result; } @Override public JSONObject actionFinishRequest(JSONObject whereJson) { + log.info("actionFinishRequest请求参数为--------------------------:" + whereJson.toString()); String type = whereJson.getString("action"); String task_code = whereJson.getString("task_code1"); WQLObject ivt_shaftivt = WQLObject.getWQLObject("st_ivt_shaftivt"); @@ -1227,7 +1276,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { JSONObject jo = new JSONObject(); jo.put("task_type", "010606"); jo.put("truss_type", "1"); - jo.put("task_status", TaskStatusEnum.SURE_START.getCode()); + jo.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); jo.put("point_code1", plan_jo.getString("start_code")); jo.put("point_code2", in_jo.getString("point_code")); JSONObject hchj_jo = WQLObject.getWQLObject("st_ivt_shaftivt").query("point_code = '" + plan_jo.getString("start_code") + "'").uniqueResult(0); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/OutServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/OutServiceImpl.java index 4d2503c4a..2f122ac1c 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/OutServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/OutServiceImpl.java @@ -238,12 +238,6 @@ public class OutServiceImpl implements OutService { throw new BadRequestException("点位:" + empty_vehicle.getString("point_code") + "载具号为空!"); } jo.put("vehicle_code", point_code + "废箔"); - if (jo.getString("vehicle_code").contains("废箔")) { - System.out.println("YES-------"); - } - if (!jo.getString("vehicle_code").contains("废箔")) { - System.out.println("NO-------"); - } jo.put("product_area", cut_ivt.getString("product_area")); //分切>输送线 子卷出站 jo.put("task_type", "010404"); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/TaskServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/TaskServiceImpl.java index 34dca3e67..307e224e1 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/TaskServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/TaskServiceImpl.java @@ -9,6 +9,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.nl.common.utils.SecurityUtils; import org.nl.modules.common.exception.BadRequestException; @@ -20,6 +21,8 @@ import org.nl.wms.basedata.master.service.dto.ClassstandardDto; import org.nl.wms.basedata.st.service.impl.UserAreaServiceImpl; import org.nl.wms.sch.manage.TaskStatusEnum; import org.nl.wms.sch.service.TaskService; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -28,6 +31,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.TimeUnit; /** * @author ldjun @@ -41,6 +45,8 @@ public class TaskServiceImpl implements TaskService { private final ClassstandardService classstandardService; + private final RedissonClient redissonClient; + @Override public Map queryAll(Map form, Pageable page) { @@ -110,61 +116,75 @@ public class TaskServiceImpl implements TaskService { @Override @Transactional(rollbackFor = Exception.class) + @SneakyThrows public void operation(Map map) { String task_id = MapUtil.getStr(map, "task_id"); - String method_name = MapUtil.getStr(map, "method_name"); - JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); - if ("finish".equals(method_name)) { - //强制执行,只把任务变更成完成状态 - // 更改任务状态为完成 - taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); - taskObj.put("update_optid", SecurityUtils.getCurrentUserId()); - taskObj.put("update_optname", SecurityUtils.getCurrentUsername()); - taskObj.put("update_time", DateUtil.now()); - taskObj.put("remark", "任务被强制完成,不执行任何逻辑!"); - WQLObject.getWQLObject("SCH_BASE_Task").update(taskObj); - } else { - // 任务处理类 - String processing_class = taskObj.getString("handle_class"); - String message = ""; - try { - Class clz = Class.forName(processing_class); - Object obj = clz.newInstance(); - // 调用每个任务类的method_name()强制结束方法 - Method m = obj.getClass().getMethod(method_name, String.class); - JSONObject result = (JSONObject) m.invoke(obj, task_id); - if (ObjectUtil.isEmpty(result)) { - return; - } - JSONArray arr = result.getJSONArray("errArr"); - WQLObject wo = WQLObject.getWQLObject("sch_base_task"); - if (ObjectUtil.isNotEmpty(arr)) { - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - JSONObject param = new JSONObject(); - param.put("task_id", json.getString("task_id")); - param.put("remark", json.getString("message")); - wo.update(param); + RLock lock = redissonClient.getLock(task_id); + boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); + try { + if (tryLock){ + String method_name = MapUtil.getStr(map, "method_name"); + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + if ("finish".equals(method_name)) { + //强制执行,只把任务变更成完成状态 + // 更改任务状态为完成 + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("update_optid", SecurityUtils.getCurrentUserId()); + taskObj.put("update_optname", SecurityUtils.getCurrentUsername()); + taskObj.put("update_time", DateUtil.now()); + taskObj.put("remark", "任务被强制完成,不执行任何逻辑!"); + WQLObject.getWQLObject("SCH_BASE_Task").update(taskObj); + } else { + // 任务处理类 + String processing_class = taskObj.getString("handle_class"); + String message = ""; + try { + Class clz = Class.forName(processing_class); + Object obj = clz.newInstance(); + // 调用每个任务类的method_name()强制结束方法 + Method m = obj.getClass().getMethod(method_name, String.class); + JSONObject result = (JSONObject) m.invoke(obj, task_id); + if (ObjectUtil.isEmpty(result)) { + return; + } + JSONArray arr = result.getJSONArray("errArr"); + WQLObject wo = WQLObject.getWQLObject("sch_base_task"); + if (ObjectUtil.isNotEmpty(arr)) { + for (int i = 0; i < arr.size(); i++) { + JSONObject json = arr.getJSONObject(i); + JSONObject param = new JSONObject(); + param.put("task_id", json.getString("task_id")); + param.put("remark", json.getString("message")); + wo.update(param); + } + throw new BadRequestException("任务操作失败!"); + } else { + JSONObject param = new JSONObject(); + param.put("task_id", task_id); + param.put("remark", "操作成功"); + wo.update(param); + } + } catch (InvocationTargetException e) { + if (ObjectUtil.isNull(e.getTargetException().getMessage())) { + message = e.getTargetException().toString(); + } else { + message = e.getTargetException().getMessage(); + } + throw new BadRequestException(message); + } catch (Exception e) { + e.printStackTrace(); + throw new BadRequestException(e.getMessage()); } - throw new BadRequestException("任务操作失败!"); - } else { - JSONObject param = new JSONObject(); - param.put("task_id", task_id); - param.put("remark", "操作成功"); - wo.update(param); } - } catch (InvocationTargetException e) { - if (ObjectUtil.isNull(e.getTargetException().getMessage())) { - message = e.getTargetException().toString(); - } else { - message = e.getTargetException().getMessage(); - } - throw new BadRequestException(message); - } catch (Exception e) { - e.printStackTrace(); - throw new BadRequestException(e.getMessage()); + }else { + throw new BadRequestException("任务标识为:"+task_id+"的任务正在操作中!"); + } + }finally { + if (tryLock) { + lock.unlock(); } } + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PaperTrussTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PaperTrussTask.java index 91b165fd1..611ff8be2 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PaperTrussTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PaperTrussTask.java @@ -63,7 +63,7 @@ public class PaperTrussTask extends AbstractAcsTask { if ("010605".equals(json.getString("task_type")) || "010603".equals(json.getString("task_type")) || "010604".equals(json.getString("task_type"))) { dto.setVersion(json.getJSONObject("request_param").getString("have_generation")); } - if ("010606".equals(json.getString("task_type"))) { + if ("010606".equals(json.getString("task_type")) || "010602".equals(json.getString("task_type"))) { dto.setVersion(json.getJSONObject("request_param").getString("need_generation")); } resultList.add(dto); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PaperTubeTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PaperTubeTask.java index e08f1173d..a81d3f0d0 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PaperTubeTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PaperTubeTask.java @@ -2,6 +2,7 @@ package org.nl.wms.sch.tasks; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; @@ -11,6 +12,7 @@ import org.nl.common.utils.SecurityUtils; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.ext.acs.service.WmsToAcsService; import org.nl.wms.sch.AcsTaskDto; import org.nl.wms.sch.manage.AbstractAcsTask; import org.nl.wms.sch.manage.TaskStatusEnum; @@ -93,7 +95,7 @@ public class PaperTubeTask extends AbstractAcsTask { out_jo.put("container_name2", req_param.getString("container_name2")); //查询对应的分切计划 - JSONObject plan_jo = WQLObject.getWQLObject("pdm_bi_slittingproductionplan").query("container_name = '" + req_param.getString("container_name1") + "'").uniqueResult(0); + JSONObject plan_jo = WQLObject.getWQLObject("pdm_bi_slittingproductionplan").query("container_name = '" + req_param.getString("container_name1") + "' AND is_delete = '0'").uniqueResult(0); String paper_tube_or_FRP = plan_jo.getString("paper_tube_or_frp"); String paper_name; if ("1".equals(paper_tube_or_FRP)) { @@ -141,6 +143,25 @@ public class PaperTubeTask extends AbstractAcsTask { request_param.put("need_generation", need_generation); jo.put("request_param", request_param.toString()); paperTrussTask.createTask(jo); + } else { + //如果穿拔轴上存在一根气胀轴且没有任务,则下发ACS允许套轴 + if ("1".equals(have_qzz)) { + String device_code = cbz_jo.getString("point_code"); + //判断是否存在任务 + JSONObject paper_jo = WQLObject.getWQLObject("sch_base_task").query("point_code1 = '" + device_code + "' AND task_status < '07' AND is_delete = '0'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(paper_jo)) { + //给穿拔轴机下发套轴 + WmsToAcsService wmsToAcsService = SpringContextHolder.getBean(WmsToAcsService.class); + JSONArray action_rows = new JSONArray(); + JSONObject action_jo = new JSONObject(); + action_jo.put("device_code", device_code); + action_jo.put("code", "to_command"); + action_jo.put("product_area", product_area); + action_jo.put("value", "4"); + action_rows.add(action_jo); + wmsToAcsService.action(action_rows); + } + } } //更新出库口的库存信息 diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/task/HandMoveStorAcsTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/task/HandMoveStorAcsTask.java index 94efbf5d9..2377b0015 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/task/HandMoveStorAcsTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/task/HandMoveStorAcsTask.java @@ -91,8 +91,8 @@ public class HandMoveStorAcsTask extends AbstractAcsTask { throw new BadRequestException("查询不到操作的任务记录!"); } if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { - map.put("work_status", "02"); - wo_dtl.update(map, "task_id='" + task_id + "'"); + /*map.put("work_status", "02"); + wo_dtl.update(map, "task_id='" + task_id + "'");*/ map.put("task_status", TaskStatusEnum.EXECUTING.getCode()); map.put("update_optid", currentUserId + ""); map.put("update_optname", nickName);