From cac00113a300f6ea5e9cdf08112d7d48e15d8408 Mon Sep 17 00:00:00 2001 From: gongbaoxiong <751575283@qq.com> Date: Thu, 30 Jul 2026 11:13:11 +0800 Subject: [PATCH] =?UTF-8?q?add:=E5=A2=9E=E5=8A=A07=E6=9C=88=E4=BB=BD?= =?UTF-8?q?=E7=9A=84=E4=B8=80=E4=BA=9B=E6=96=B0=E5=A2=9E=E9=9C=80=E6=B1=82?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/nl/acs/AcsConfig.java | 2 + .../agv/ndcone/AgvNdcOneDeviceDriver.java | 81 +++--- .../enums/InstructionStatusEnum.java | 4 +- .../service/impl/InstructionServiceImpl.java | 11 +- .../org/nl/acs/task/rest/TaskController.java | 7 + .../org/nl/acs/task/service/TaskService.java | 7 + .../task/service/impl/TaskServiceImpl.java | 69 +++++ .../service/quartz/task/AutoCreateInst.java | 2 +- .../src/i18n/langs/instruction/zh.js | 1 + .../views/acs/history/instRecord/index.vue | 14 +- .../src/views/acs/instruction/index.vue | 7 +- acs/nladmin-ui/src/views/acs/task/index.vue | 2 +- .../src/views/monitor/server/index.vue | 246 +++++++++++++----- .../impl/diy/SameBlockNumRuleHandler.java | 1 + .../nl/wms/ext_manage/enums/EXTConstant.java | 5 + .../service/impl/AcsToWmsServiceImpl.java | 7 +- .../service/util/tasks/StInTask.java | 2 +- .../service/util/tasks/StOutTask.java | 2 +- .../controller/monitor/MonitorController.java | 46 ++++ .../service/monitor/MonitorService.java | 31 +++ .../monitor/impl/MonitorServiceImpl.java | 188 +++++++++++++ .../service/impl/InBillServiceImpl.java | 43 +-- .../service/impl/OutBillServiceImpl.java | 82 +++--- .../wbwms/controller/WmsToIWmscontroller.java | 46 ++++ .../src/main/resources/config/application.yml | 2 +- 25 files changed, 731 insertions(+), 177 deletions(-) create mode 100644 nladmin-system/nlsso-server/src/main/java/org/nl/wms/system_manage/controller/monitor/MonitorController.java create mode 100644 nladmin-system/nlsso-server/src/main/java/org/nl/wms/system_manage/service/monitor/MonitorService.java create mode 100644 nladmin-system/nlsso-server/src/main/java/org/nl/wms/system_manage/service/monitor/impl/MonitorServiceImpl.java diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/AcsConfig.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/AcsConfig.java index 0ba03ed..eed1508 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/AcsConfig.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/AcsConfig.java @@ -66,6 +66,8 @@ public interface AcsConfig { String AutoCleanDays = "AutoCleanDays"; //最大任务下发时间 String MAXSENDTASKTIME = "maxSendTaskTime"; + //任务超时时间阈值(分钟),超过该时间未完成的任务视为超时异常 + String TASKTIMEOUTMINUTES = "taskTimeoutMinutes"; //指令下发立库 String INSTSENDLK = "instSendLk"; /** diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java index 9f5da8d..3114346 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java @@ -23,12 +23,14 @@ import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; import org.nl.acs.history.ErrorUtil; import org.nl.acs.instruction.domain.Instruction; +import org.nl.acs.instruction.enums.InstructionStatusEnum; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.impl.InstructionServiceImpl; import org.nl.acs.log.LokiLog; import org.nl.acs.log.LokiLogType; import org.nl.acs.log.service.DeviceExecuteLogService; import org.nl.acs.opc.DeviceAppService; +import org.nl.acs.task.enums.TaskStatusEnum; import org.nl.acs.task.service.TaskService; import org.nl.acs.task.service.dto.TaskDto; import org.nl.acs.task.service.impl.TaskServiceImpl; @@ -93,8 +95,9 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic */ @Data private static class FeiShuErrorRecord { - private int num = 0; // 收到同一报警的次数 - private long lastSendTime = 0; // 最后一次推送的时间戳(毫秒) + private int pushCount = 0; // 已推送同一报警的次数 + private long lastSendTime = 0; // 最后一次推送的时间戳(毫秒) + private long lastReceiveTime = 0; // 最后一次收到报警的时间戳(毫秒),用于缓存过期判断 } /** @@ -103,7 +106,8 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic private volatile String feiShuSendTime = "8:00-22:00"; private volatile String feiShuSendFre = "2"; private volatile long lastParamLoadTime = 0; - private static final long PARAM_CACHE_TIMEOUT = 600000; // 参数缓存超时时间:120秒 + private static final long PARAM_CACHE_TIMEOUT = 600000; // 参数缓存超时时间:600秒 + private static final long FEI_SHU_ERROR_CACHE_TIMEOUT = 5 * 60 * 1000; // 飞书报警缓存过期时间:5分钟 String transportOrder = ""; boolean isCharge = false; @@ -197,7 +201,7 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic //到达取货点 //(需要WCS反馈) } else if (phase == 0x03) { - inst.setExecute_status("1"); + inst.setExecute_status(InstructionStatusEnum.BUSY.getIndex()); instructionService.update(inst); //添加车号 if (StringUtils.isBlank(task.getCar_no())) { @@ -212,7 +216,9 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic //(需要WCS反馈) } else if (phase == 0x05) { data = ndcAgvService.sendAgvOneModeInst(phase, index, 0); - task.setTask_status("4"); + inst.setExecute_status(InstructionStatusEnum.PICKUP.getIndex()); + instructionService.update(inst); + task.setTask_status(TaskStatusEnum.FINISHEDMOVE.getIndex()); //车辆执行任务开始计时字段 if (StringUtils.isBlank(task.getTo_x())) { task.setTo_x(DateUtil.now()); @@ -384,35 +390,28 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic int endMinutes = endHour * 60 + endMinute; // 判断当前时间是否在工作时间内 if (nowMinutes < startMinutes || nowMinutes >= endMinutes) { - // log.info("当前时间{}不在工作时间范围内({}),跳过发送飞书消息", - // DateUtil.formatTime(now), feiShuSendTime); return; } } } - // 2. 计数与间隔推送逻辑:第1次收到不推送,第2次收到首次推送,之后按间隔推送 - String cacheKey = this.getDeviceCode() + errorMessage; + // 2. 全局缓存过期清理:清除超过5分钟未收到报警的记录 long currentTime = System.currentTimeMillis(); + cleanExpiredFeiShuErrorCache(currentTime); + // 3. 计数与间隔推送逻辑:首次推送至feiShuUrl1,累计推送5次后同时推送至feiShuUrl1和feiShuUrl2 + String cacheKey = this.getDeviceCode() + errorMessage; FeiShuErrorRecord record = feiShuErrorCache.get(cacheKey); if (record == null) { - // 第一次收到该报警,num=1,不推送 record = new FeiShuErrorRecord(); - record.setNum(1); feiShuErrorCache.put(cacheKey, record); - return; } - // 每次收到报警,计数+1;超过5次则清除缓存,重新开始计数 - record.setNum(record.getNum() + 1); - if (record.getNum() > 5) { - feiShuErrorCache.remove(cacheKey); - return; - } - if (record.getNum() > 2) { - // num > 2,已推送过,按间隔时间控制后续推送 + // 更新最后收到报警的时间 + record.setLastReceiveTime(currentTime); + // 频率控制:非首次推送时,检查是否在推送间隔内 + if (record.getPushCount() > 0) { int feiShuSendFreMin = Integer.parseInt(feiShuSendFre); long diffTime = currentTime - record.getLastSendTime(); if (diffTime < feiShuSendFreMin * 60000L) { - log.debug("设备{}的{}在{}分钟内已有过提醒,过滤掉本次重复提醒(距今{}ms)", + log.info("设备{}的{}在{}分钟内已有过提醒,过滤掉本次重复提醒(距今{}ms)", this.getDeviceCode(), errorMessage, feiShuSendFreMin, diffTime); return; } @@ -460,22 +459,35 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic post.put("zh_cn", zh_cn); content.put("post", post); requestBody.put("content", content); - String feiShuUrl = "https://open.feishu.cn/open-apis/bot/v2/hook/c3fcb100-72e0-48e6-bdf6-e266e67858a1"; - // 5. 发送 HTTP 请求到飞书机器人 - String response = HttpRequest.post(feiShuUrl) + String feiShuUrl1 = "https://open.feishu.cn/open-apis/bot/v2/hook/c3fcb100-72e0-48e6-bdf6-e266e67858a1"; + String feiShuUrl2 = "https://open.feishu.cn/open-apis/bot/v2/hook/c3fcb100-72e0-48e6-bdf6-e266e67858a2"; + // 5. 发送 HTTP 请求到飞书机器人(首次~第5次仅推送到feiShuUrl1,第6次起同时推送到feiShuUrl1和feiShuUrl2) + boolean pushToBoth = record.getPushCount() >= 5; + String response1 = HttpRequest.post(feiShuUrl1) .header("Content-Type", "application/json") .body(requestBody.toJSONString()) - .timeout(15000) // 5秒超时 + .timeout(15000) // 15秒超时 .execute() .body(); + if (pushToBoth) { + log.info("设备{}的{}已连续推送{}次,同时推送至feiShuUrl2", + this.getDeviceCode(), errorMessage, record.getPushCount() + 1); + HttpRequest.post(feiShuUrl2) + .header("Content-Type", "application/json") + .body(requestBody.toJSONString()) + .timeout(15000) + .execute() + .body(); + } // 6. 检查响应结果并记录日志 - JSONObject jsonResponse = JSONObject.parseObject(response); + JSONObject jsonResponse = JSONObject.parseObject(response1); if (jsonResponse != null && jsonResponse.getIntValue("code") == 0) { - //log.info("设备{}的故障消息发送成功:{}", this.getDeviceCode(), errorMessage); - // 更新记录:记录最后发送时间 + log.info("设备{}的报警消息发送成功:{}", this.getDeviceCode(), errorMessage); + // 更新记录:记录最后发送时间和推送计数 record.setLastSendTime(currentTime); + record.setPushCount(record.getPushCount() + 1); } else { - log.error("设备{}的故障消息发送失败:{}", this.getDeviceCode(), response); + log.error("设备{}的故障消息发送失败:{}", this.getDeviceCode(), response1); } } catch (Exception e) { @@ -507,5 +519,16 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic } } + /** + * 清理过期的飞书报警错误缓存:遍历所有缓存条目,清除超过5分钟未收到报警的记录 + * + * @param currentTime 当前时间戳(毫秒) + */ + private void cleanExpiredFeiShuErrorCache(long currentTime) { + long expireThreshold = currentTime - FEI_SHU_ERROR_CACHE_TIMEOUT; + feiShuErrorCache.entrySet().removeIf(entry -> + entry.getValue().getLastReceiveTime() > 0 + && entry.getValue().getLastReceiveTime() < expireThreshold); + } } diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/instruction/enums/InstructionStatusEnum.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/instruction/enums/InstructionStatusEnum.java index 259b293..3e16203 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/instruction/enums/InstructionStatusEnum.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/instruction/enums/InstructionStatusEnum.java @@ -17,10 +17,10 @@ public enum InstructionStatusEnum { */ READY("0", "READY", "就绪"), BUSY("1", "BUSY", "执行中"), + PICKUP("1.1", "FINISHED_MOVE", "取货完成"), + RELEASE("1.2", "FINISHED_PUT", "放货完成"), FINISHED("2", "FINISHED", "完成"), - CANCEL("3", "CANCEL", "取消"), - ERROR("99", "CANCEL", "异常"); /** diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java index 6bccd1d..d00909c 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java @@ -45,6 +45,7 @@ import org.nl.acs.route.service.dto.RouteLineDto; import org.nl.acs.route.service.impl.RouteLineServiceImpl; import org.nl.acs.task.TaskInstructionLock; import org.nl.acs.task.domain.Task; +import org.nl.acs.task.enums.TaskStatusEnum; import org.nl.acs.task.service.TaskService; import org.nl.acs.task.service.dto.TaskDto; import org.nl.acs.task.service.mapper.TaskMapper; @@ -188,7 +189,9 @@ public class InstructionServiceImpl extends CommonServiceImpl queryPage = PageUtil.toMybatisPage(page); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); // wrapper.eq(InstructionMybatis::getIs_delete,0); @@ -199,7 +202,7 @@ public class InstructionServiceImpl extends CommonServiceImpl instructionMybatis.like(InstructionMybatis::getStart_point_code, point_code).or().like(InstructionMybatis::getNext_point_code, point_code)); wrapper.eq(StringUtils.isNotBlank(instruction_type), InstructionMybatis::getInstruction_type, instruction_type); - wrapper.le(InstructionMybatis::getInstruction_status, 1); + wrapper.lt(InstructionMybatis::getInstruction_status, InstructionStatusEnum.FINISHED.getIndex()); if (!StrUtil.isEmpty(is_over)) { if (StrUtil.equals(is_over, CommonFinalParam.ONE)) { wrapper.ge(InstructionMybatis::getInstruction_status, InstructionStatusEnum.FINISHED.getIndex()); @@ -587,13 +590,11 @@ public class InstructionServiceImpl extends CommonServiceImpl(instructionMapper) - .lt(InstructionMybatis::getInstruction_status, InstructionStatusEnum.CANCEL.getIndex()) + .lt(InstructionMybatis::getInstruction_status, InstructionStatusEnum.FINISHED.getIndex()) .eq(InstructionMybatis::getNext_point_code, dto.getNext_point_code()) .eq(InstructionMybatis::getStart_point_code, dto.getStart_point_code()) .eq(InstructionMybatis::getTask_id, dto.getTask_id()) .one(); - - if (ins != null) { throw new Exception(dto.getTask_code() + ":该任务已存在待完成指令!"); } diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/rest/TaskController.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/rest/TaskController.java index 186b35a..8ca97d2 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/rest/TaskController.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/rest/TaskController.java @@ -185,4 +185,11 @@ public class TaskController { public ResponseEntity queryTaskSheet(@RequestBody Map whereJson) { return new ResponseEntity<>(taskService.queryTaskSheet(whereJson), HttpStatus.OK); } + + @SaIgnore + @Log("查询超时异常任务") + @PostMapping(value = "/queryTimeoutTask") + public ResponseEntity queryTimeoutTask(@RequestBody Map whereJson) { + return new ResponseEntity<>(taskService.queryTimeoutTask(whereJson), HttpStatus.OK); + } } diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/TaskService.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/TaskService.java index be01cad..758a6ee 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/TaskService.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/TaskService.java @@ -525,4 +525,11 @@ public interface TaskService extends CommonService { List queryTaskSheet(Map whereJson); + + /** + * 查询超时异常任务(create_time 到 update_time 超过60分钟) + * @param whereJson 查询条件 + * @return 超时任务列表 + */ + List queryTimeoutTask(Map whereJson); } diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java index 9385179..a0b9de4 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java @@ -1032,6 +1032,15 @@ public class TaskServiceImpl extends CommonServiceImpl impleme List unfinishedList = new LambdaQueryChainWrapper<>(instructionMapper) .lt(InstructionMybatis::getInstruction_status, InstructionStatusEnum.FINISHED.getIndex()) .eq(InstructionMybatis::getIs_delete, "0").list(); + // 检查是否存在相同task_code的指令,如果存在则报错 + String taskCode = acsTask.getTask_code(); + InstructionMybatis existByTaskcode = unfinishedList.stream() + .filter(r -> StrUtil.equals(r.getTask_code(), taskCode)) + .findFirst() + .orElse(null); + if (existByTaskcode != null) { + throw new BadRequestException("该任务号已存在指令号为:" + existByTaskcode.getInstruction_code() + "的指令,请核查取消后再创建!"); + } maxManInstNumber = paramService.findByCode(AcsConfig.MAXMANINSTNUMBER).getValue(); unfinishedManInstructionCount = unfinishedList.stream().filter(r -> "2".equals(r.getCreate_type())).count(); long maxManInst = Long.parseLong(maxManInstNumber); @@ -1732,6 +1741,49 @@ public class TaskServiceImpl extends CommonServiceImpl impleme @Override + public List queryTimeoutTask(Map whereJson) { + // 日期格式 + String create_time = (String) whereJson.get("startDate"); + String end_time = (String) whereJson.get("endDate"); + if (StrUtil.isEmpty(create_time) || StrUtil.isEmpty(end_time)) { + String today = DateUtil.today(); + create_time = today + " 00:00:00"; + end_time = today + " 23:59:59"; + } else { + if (create_time.length() == 10) { + create_time += " 00:00:00"; + } + if (end_time.length() == 10) { + end_time += " 23:59:59"; + } + } + // 查询已完成的任务(task_status = 99 表示完成) + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Task::getTask_status, TaskStatusEnum.FINISHED.getIndex()) + .between(Task::getCreate_time, create_time, end_time) + .orderByDesc(Task::getCreate_time); + List taskList = taskMapper.selectList(wrapper); + // 过滤出 create_time 到 update_time 超过超时阈值的任务 + int timeoutMinutes = getTaskTimeoutMinutes(); + List result = new ArrayList<>(); + for (Task task : taskList) { + Double durationMinutes = calculateDuration(task.getCreate_time(), task.getUpdate_time()); + if (durationMinutes != null && durationMinutes > timeoutMinutes) { + JSONObject jo = new JSONObject(); + jo.put("task_code", task.getTask_code()); + jo.put("start_point_code", task.getStart_point_code()); + jo.put("next_point_code", task.getNext_point_code()); + jo.put("create_time", task.getCreate_time()); + jo.put("update_time", task.getUpdate_time()); + jo.put("to_y", String.format("%.2f", durationMinutes)); + jo.put("vehicle_code", task.getVehicle_code()); + result.add(jo); + } + } + log.info("查询超时异常任务,时间范围:{} ~ {},结果数量:{}", create_time, end_time, result.size()); + return result; + } + public List queryTaskSheet(Map whereJson) { //日期格式"2026-05-21" String create_time = (String) whereJson.get("startDate"); @@ -1943,6 +1995,23 @@ public class TaskServiceImpl extends CommonServiceImpl impleme } } + /** + * 获取任务超时时间阈值(分钟),从系统参数表读取,默认60分钟 + * + * @return 超时阈值(分钟) + */ + private int getTaskTimeoutMinutes() { + try { + String value = paramService.findByCode(AcsConfig.TASKTIMEOUTMINUTES).getValue(); + if (StrUtil.isNotBlank(value)) { + return Integer.parseInt(value); + } + } catch (Exception e) { + log.warn("获取任务超时时间参数失败,使用默认值60分钟", e); + } + return 60; // 默认60分钟 + } + /** * 将分钟格式化为 小时h分钟m 的字符串 */ diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/AutoCreateInst.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/AutoCreateInst.java index 2ee6ad9..9678e39 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/AutoCreateInst.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/AutoCreateInst.java @@ -140,7 +140,7 @@ public class AutoCreateInst { continue; } List activeInstructions = new LambdaQueryChainWrapper<>(instructionMapper) - .lt(InstructionMybatis::getInstruction_status, InstructionStatusEnum.FINISHED.getIndex()) + .lt(InstructionMybatis::getInstruction_status, InstructionStatusEnum.PICKUP.getIndex()) .eq(InstructionMybatis::getIs_delete, "0") .list(); //将执行中的任务也加入指令列表参与起点校验 diff --git a/acs/nladmin-ui/src/i18n/langs/instruction/zh.js b/acs/nladmin-ui/src/i18n/langs/instruction/zh.js index 2d7f9fd..d138f24 100644 --- a/acs/nladmin-ui/src/i18n/langs/instruction/zh.js +++ b/acs/nladmin-ui/src/i18n/langs/instruction/zh.js @@ -25,6 +25,7 @@ export default { 'task_status': '任务状态', 'input_startCode_or_nextCode': '输入起点或终点', 'ready': '就绪', + 'finished_move': '取货完成', 'Execution': '执行中', 'Finish': '完成', 'undelivered': '未下发', diff --git a/acs/nladmin-ui/src/views/acs/history/instRecord/index.vue b/acs/nladmin-ui/src/views/acs/history/instRecord/index.vue index c150341..2d6a019 100644 --- a/acs/nladmin-ui/src/views/acs/history/instRecord/index.vue +++ b/acs/nladmin-ui/src/views/acs/history/instRecord/index.vue @@ -146,13 +146,13 @@ diff --git a/acs/nladmin-ui/src/views/acs/instruction/index.vue b/acs/nladmin-ui/src/views/acs/instruction/index.vue index 2ca0b87..fc62390 100644 --- a/acs/nladmin-ui/src/views/acs/instruction/index.vue +++ b/acs/nladmin-ui/src/views/acs/instruction/index.vue @@ -157,9 +157,10 @@ diff --git a/acs/nladmin-ui/src/views/acs/task/index.vue b/acs/nladmin-ui/src/views/acs/task/index.vue index c8fc236..7888852 100644 --- a/acs/nladmin-ui/src/views/acs/task/index.vue +++ b/acs/nladmin-ui/src/views/acs/task/index.vue @@ -578,7 +578,7 @@ - + . diff --git a/nladmin-system/nladmin-ui/src/views/monitor/server/index.vue b/nladmin-system/nladmin-ui/src/views/monitor/server/index.vue index 934d97f..18a5660 100644 --- a/nladmin-system/nladmin-ui/src/views/monitor/server/index.vue +++ b/nladmin-system/nladmin-ui/src/views/monitor/server/index.vue @@ -1,12 +1,136 @@ @@ -99,69 +223,69 @@ export default { this.monitor = window.setInterval(() => { setTimeout(() => { this.init() - }, 2) - }, 3500) + }, 7) + }, 9500) }, destroyed() { clearInterval(this.monitor) }, methods: { - // init() { - // initData(this.url, {}).then(data => { - // this.data = data - // this.show = true - // if (this.cpuInfo.xAxis.data.length >= 8) { - // this.cpuInfo.xAxis.data.shift() - // this.memoryInfo.xAxis.data.shift() - // this.cpuInfo.series[0].data.shift() - // this.memoryInfo.series[0].data.shift() - // } - // this.cpuInfo.xAxis.data.push(data.time) - // this.memoryInfo.xAxis.data.push(data.time) - // this.cpuInfo.series[0].data.push(parseFloat(data.cpu.used)) - // this.memoryInfo.series[0].data.push(parseFloat(data.memory.usageRate)) - // }) - // } + init() { + initData(this.url, {}).then(data => { + this.data = data + this.show = true + if (this.cpuInfo.xAxis.data.length >= 8) { + this.cpuInfo.xAxis.data.shift() + this.memoryInfo.xAxis.data.shift() + this.cpuInfo.series[0].data.shift() + this.memoryInfo.series[0].data.shift() + } + this.cpuInfo.xAxis.data.push(data.time) + this.memoryInfo.xAxis.data.push(data.time) + this.cpuInfo.series[0].data.push(parseFloat(data.cpu.used)) + this.memoryInfo.series[0].data.push(parseFloat(data.memory.usageRate)) + }) + } } } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/decision_manage/service/strategyConfig/decisioner/impl/diy/SameBlockNumRuleHandler.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/decision_manage/service/strategyConfig/decisioner/impl/diy/SameBlockNumRuleHandler.java index 293063d..b968f2c 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/decision_manage/service/strategyConfig/decisioner/impl/diy/SameBlockNumRuleHandler.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/decision_manage/service/strategyConfig/decisioner/impl/diy/SameBlockNumRuleHandler.java @@ -33,6 +33,7 @@ public class SameBlockNumRuleHandler extends Decisioner * @return List :仓位集合 */ @Override + public List handler(List list, JSONObject param) { // 判断仓位是否为空 if (CollectionUtils.isEmpty(list)) { diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/enums/EXTConstant.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/enums/EXTConstant.java index 7ae9132..d45cd8f 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/enums/EXTConstant.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/enums/EXTConstant.java @@ -21,4 +21,9 @@ public class EXTConstant { * ACS下发任务接口地址 */ public final static String SEND_TASK_ACS_API = "api/wms/task"; + + /** + * ACS查询超时异常任务接口地址 + */ + public final static String QUERY_TIMEOUT_TASK_ACS_API = "api/task/queryTimeoutTask"; } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/impl/AcsToWmsServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/impl/AcsToWmsServiceImpl.java index 78faafa..babf4a7 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/impl/AcsToWmsServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext_manage/service/impl/AcsToWmsServiceImpl.java @@ -79,7 +79,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { @Override - @Transactional(rollbackFor = Exception.class) + // @Transactional(rollbackFor = Exception.class) @SneakyThrows public Map receiveTaskStatusAcs(String string) { log.info("acs向lms反馈任务状态,请求参数:--------------------------------------" + string); @@ -116,7 +116,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { } else if (ResultAcsStatus.FINISHED.getCode().equals(acs_task_status)) { // 完成 status = TaskStatus.FINISHED; - iSchBaseTaskService.updateById(taskObj); + // iSchBaseTaskService.updateById(taskObj); } else if(ResultAcsStatus.MOVEFINISH.getCode().equals(acs_task_status)){ if(!taskObj.getPoint_code2().equals("CKFPW")){ log.info("任务号{}已经申请二次分配",taskObj.getTask_code()); @@ -143,7 +143,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { schBasePoint.setLock_up(true); iSchBasePointService.update(schBasePoint); taskObj.setPoint_code2(finish_code); - taskObj.setTask_status(TaskStatus.APPLY.getCode()); + taskObj.setTask_status(TaskStatus.APPLY.getCode()); iSchBaseTaskService.update(taskObj); } status = TaskStatus.APPLY; @@ -156,7 +156,6 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { // 根据配置编码执行相关配置内的方法 AbstractTask task = taskFactory.getTask(taskObj.getConfig_code()); task.updateTaskStatus(taskObj.getTask_code(),status); - } else { throw new BadRequestException("任务标识为:" + task_id + "的任务正在操作中!"); } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/StInTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/StInTask.java index daa55dd..2c76d59 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/StInTask.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/StInTask.java @@ -161,7 +161,7 @@ public class StInTask extends AbstractTask { public void backMes(String task_code) { } - @Transactional(rollbackFor = Exception.class) + // @Transactional(rollbackFor = Exception.class) public void finishTask(SchBaseTask taskObj) { // 任务完成 taskObj.setTask_status(TaskStatus.FINISHED.getCode()); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/StOutTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/StOutTask.java index 29e46b2..5a545cb 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/StOutTask.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch_manage/service/util/tasks/StOutTask.java @@ -143,7 +143,7 @@ public class StOutTask extends AbstractTask { public void backMes(String task_code) { } - @Transactional(rollbackFor = Exception.class) + // @Transactional(rollbackFor = Exception.class) public void finishTask(SchBaseTask taskObj) { // 任务完成 taskObj.setTask_status(TaskStatus.FINISHED.getCode()); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/system_manage/controller/monitor/MonitorController.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/system_manage/controller/monitor/MonitorController.java new file mode 100644 index 0000000..5a475d3 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/system_manage/controller/monitor/MonitorController.java @@ -0,0 +1,46 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.nl.wms.system_manage.controller.monitor; + + + +import lombok.RequiredArgsConstructor; +import org.nl.wms.system_manage.service.monitor.MonitorService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author Zheng Jie + * @date 2020-05-02 + */ +@RestController +@RequiredArgsConstructor + +@RequestMapping("/api/monitor") +public class MonitorController { + + private final MonitorService serverService; + + @GetMapping + //("查询服务监控") +// //SaCheckPermission("monitor:list") + public ResponseEntity query() { + return new ResponseEntity<>(serverService.getServers(),HttpStatus.OK); + } +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/system_manage/service/monitor/MonitorService.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/system_manage/service/monitor/MonitorService.java new file mode 100644 index 0000000..8f8395a --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/system_manage/service/monitor/MonitorService.java @@ -0,0 +1,31 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.nl.wms.system_manage.service.monitor; + +import java.util.Map; + +/** + * @author Zheng Jie + * @date 2020-05-02 + */ +public interface MonitorService { + + /** + * 查询数据分页 + * @return Map + */ + Map getServers(); +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/system_manage/service/monitor/impl/MonitorServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/system_manage/service/monitor/impl/MonitorServiceImpl.java new file mode 100644 index 0000000..005406a --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/system_manage/service/monitor/impl/MonitorServiceImpl.java @@ -0,0 +1,188 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.nl.wms.system_manage.service.monitor.impl; + +import cn.hutool.core.date.BetweenFormatter; +import cn.hutool.core.date.DateUtil; +import org.nl.common.utils.FileUtil; +import org.nl.common.utils.IPUtil; +import org.nl.wms.system_manage.service.monitor.MonitorService; +import org.springframework.stereotype.Service; +import oshi.SystemInfo; +import oshi.hardware.CentralProcessor; +import oshi.hardware.GlobalMemory; +import oshi.hardware.HardwareAbstractionLayer; +import oshi.hardware.VirtualMemory; +import oshi.software.os.FileSystem; +import oshi.software.os.OSFileStore; +import oshi.software.os.OperatingSystem; +import oshi.util.FormatUtil; +import oshi.util.Util; + +import java.lang.management.ManagementFactory; +import java.text.DecimalFormat; +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * @author Zheng Jie + * @date 2020-05-02 + */ +@Service +public class MonitorServiceImpl implements MonitorService { + + private final DecimalFormat df = new DecimalFormat("0.00"); + + @Override + public Map getServers(){ + Map resultMap = new LinkedHashMap<>(8); + try { + SystemInfo si = new SystemInfo(); + OperatingSystem os = si.getOperatingSystem(); + HardwareAbstractionLayer hal = si.getHardware(); + // 系统信息 + resultMap.put("sys", getSystemInfo(os)); + // cpu 信息 + resultMap.put("cpu", getCpuInfo(hal.getProcessor())); + // 内存信息 + resultMap.put("memory", getMemoryInfo(hal.getMemory())); + // 交换区信息 + resultMap.put("swap", getSwapInfo(hal.getMemory())); + // 磁盘 + resultMap.put("disk", getDiskInfo(os)); + resultMap.put("time", DateUtil.format(new Date(), "HH:mm:ss")); + } catch (Exception e) { + e.printStackTrace(); + } + return resultMap; + } + + /** + * 获取磁盘信息 + * @return / + */ + private Map getDiskInfo(OperatingSystem os) { + Map diskInfo = new LinkedHashMap<>(); + FileSystem fileSystem = os.getFileSystem(); + List fsArray = fileSystem.getFileStores(); + String osName = System.getProperty("os.name"); + long available = 0, total = 0; + for (OSFileStore fs : fsArray){ + // windows 需要将所有磁盘分区累加,linux 和 mac 直接累加会出现磁盘重复的问题,待修复 + if(osName.toLowerCase().startsWith("win")) { + available += fs.getUsableSpace(); + total += fs.getTotalSpace(); + } else { + available = fs.getUsableSpace(); + total = fs.getTotalSpace(); + break; + } + } + long used = total - available; + diskInfo.put("total", total > 0 ? FileUtil.getSize(total) : "?"); + diskInfo.put("available", FileUtil.getSize(available)); + diskInfo.put("used", FileUtil.getSize(used)); + diskInfo.put("usageRate", df.format(used/(double)total * 100)); + return diskInfo; + } + + /** + * 获取交换区信息 + * @param memory / + * @return / + */ + private Map getSwapInfo(GlobalMemory memory) { + Map swapInfo = new LinkedHashMap<>(); + VirtualMemory virtualMemory = memory.getVirtualMemory(); + long total = virtualMemory.getSwapTotal(); + long used = virtualMemory.getSwapUsed(); + swapInfo.put("total", FormatUtil.formatBytes(total)); + swapInfo.put("used", FormatUtil.formatBytes(used)); + swapInfo.put("available", FormatUtil.formatBytes(total - used)); + if(used == 0){ + swapInfo.put("usageRate", 0); + } else { + swapInfo.put("usageRate", df.format(used/(double)total * 100)); + } + return swapInfo; + } + + /** + * 获取内存信息 + * @param memory / + * @return / + */ + private Map getMemoryInfo(GlobalMemory memory) { + Map memoryInfo = new LinkedHashMap<>(); + memoryInfo.put("total", FormatUtil.formatBytes(memory.getTotal())); + memoryInfo.put("available", FormatUtil.formatBytes(memory.getAvailable())); + memoryInfo.put("used", FormatUtil.formatBytes(memory.getTotal() - memory.getAvailable())); + memoryInfo.put("usageRate", df.format((memory.getTotal() - memory.getAvailable())/(double)memory.getTotal() * 100)); + return memoryInfo; + } + + /** + * 获取Cpu相关信息 + * @param processor / + * @return / + */ + private Map getCpuInfo(CentralProcessor processor) { + Map cpuInfo = new LinkedHashMap<>(); + cpuInfo.put("name", processor.getProcessorIdentifier().getName()); + cpuInfo.put("package", processor.getPhysicalPackageCount() + "个物理CPU"); + cpuInfo.put("core", processor.getPhysicalProcessorCount() + "个物理核心"); + cpuInfo.put("coreNumber", processor.getPhysicalProcessorCount()); + cpuInfo.put("logic", processor.getLogicalProcessorCount() + "个逻辑CPU"); + // CPU信息 + long[] prevTicks = processor.getSystemCpuLoadTicks(); + // 等待1秒... + Util.sleep(1000); + long[] ticks = processor.getSystemCpuLoadTicks(); + long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()]; + long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()]; + long sys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()]; + long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()]; + long iowait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()]; + long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()]; + long softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()]; + long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()]; + long totalCpu = user + nice + sys + idle + iowait + irq + softirq + steal; + cpuInfo.put("used", df.format(100d * user / totalCpu + 100d * sys / totalCpu)); + cpuInfo.put("idle", df.format(100d * idle / totalCpu)); + return cpuInfo; + } + + /** + * 获取系统相关信息,系统、运行天数、系统IP + * @param os / + * @return / + */ + private Map getSystemInfo(OperatingSystem os){ + Map systemInfo = new LinkedHashMap<>(); + // jvm 运行时间 + long time = ManagementFactory.getRuntimeMXBean().getStartTime(); + Date date = new Date(time); + // 计算项目运行时间 5.4.3:BetweenFormater, 5.7.14改名为BetweenFormatter + String formatBetween = DateUtil.formatBetween(date, new Date(), BetweenFormatter.Level.HOUR); + // 系统信息 + systemInfo.put("os", os.toString()); + systemInfo.put("day", formatBetween); + systemInfo.put("ip", IPUtil.getLocalIp()); + return systemInfo; + } +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/InBillServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/InBillServiceImpl.java index bbdac69..6a3ffa0 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/InBillServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/InBillServiceImpl.java @@ -966,7 +966,7 @@ public class InBillServiceImpl extends ServiceImpl i } @Override - @Transactional(rollbackFor = Exception.class) + //@Transactional(rollbackFor = Exception.class) public void taskFinish(SchBaseTask task) { List groupPlateList = mdPbGroupplateMapper.selectList(new LambdaQueryWrapper() .eq(GroupPlate::getStoragevehicle_code, task.getVehicle_code()).orderByDesc(GroupPlate::getCreate_name)); @@ -993,6 +993,24 @@ public class InBillServiceImpl extends ServiceImpl i //获取出入库单标识 String iostorinv_id = item1.getIostorinv_id(); IOStorInv ioStorInv = ioStorInvMapper.selectOne(new LambdaQueryWrapper().eq(IOStorInv::getIostorinv_id, iostorinv_id)); + //回传给wms + String source_name = ioStorInv.getSource_name(); + TOWMSMSG towmsmsg = new TOWMSMSG(); + towmsmsg.setType(task.getConfig_code().contains("In") ? "0" : "1"); + towmsmsg.setBill_code(source_name); + towmsmsg.setStatus(ResultAcsStatus.EXECUTING.getCode().equals(task.getTask_status()) ? "1" : "200"); + JSONObject jo = new JSONObject(); + jo.put("storagevehicle_code", task.getVehicle_code()); + jo.put("struct_name", task.getPoint_code2()); + jo.put("struct_code", task.getPoint_code2()); + jo.put("material_name", MdMeMaterialbaseList.get(0).getMaterial_name()); + jo.put("material_code", MdMeMaterialbaseList.get(0).getMaterial_code()); + jo.put("qty", groupPlateList.get(0).getQty()); + List tableData = new ArrayList<>(); + tableData.add(jo); + towmsmsg.setTableData(tableData); + //iWmsToWmsService.FinishOutTask(towmsmsg); + notifyWmsAsync(towmsmsg); //acs完成任务状态为5,PC端完成为0 if (!"1".equals(task.getTask_status())) { //转库解锁原库位 @@ -1056,24 +1074,7 @@ public class InBillServiceImpl extends ServiceImpl i ); } } - //回传给wms - String source_name = ioStorInv.getSource_name(); - TOWMSMSG towmsmsg = new TOWMSMSG(); - towmsmsg.setType(task.getConfig_code().contains("In") ? "0" : "1"); - towmsmsg.setBill_code(source_name); - towmsmsg.setStatus(ResultAcsStatus.EXECUTING.getCode().equals(task.getTask_status()) ? "1" : "200"); - JSONObject jo = new JSONObject(); - jo.put("storagevehicle_code", task.getVehicle_code()); - jo.put("struct_name", task.getPoint_code2()); - jo.put("struct_code", task.getPoint_code2()); - jo.put("material_name", MdMeMaterialbaseList.get(0).getMaterial_name()); - jo.put("material_code", MdMeMaterialbaseList.get(0).getMaterial_code()); - jo.put("qty", groupPlateList.get(0).getQty()); - List tableData = new ArrayList<>(); - tableData.add(jo); - towmsmsg.setTableData(tableData); - //iWmsToWmsService.FinishOutTask(towmsmsg); - notifyWmsAsync(towmsmsg); + throw new BadRequestException("未找到库位信息"); } @Override @Transactional(rollbackFor = Exception.class) @@ -1177,9 +1178,9 @@ public class InBillServiceImpl extends ServiceImpl i return one; } /** - * 异步回传WMS + * 异步回传WMSp */ - @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) + //@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) public void notifyWmsAsync(TOWMSMSG task) { // 调用WMS接口 iWmsToWmsService.FinishOutTask(task); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/OutBillServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/OutBillServiceImpl.java index 524b989..1187090 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/OutBillServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/warehouse_manage/inAndOut/service/impl/OutBillServiceImpl.java @@ -1416,7 +1416,7 @@ public class OutBillServiceImpl extends ServiceImpl * 4.更新所有出库单明细及主表 */ @Override - @Transactional(rollbackFor = Exception.class) + // @Transactional(rollbackFor = Exception.class) public void taskFinish(SchBaseTask task) { List groupPlateList = mdPbGroupplateMapper.selectList(new LambdaQueryWrapper() .eq(GroupPlate::getStoragevehicle_code, task.getVehicle_code()).orderByDesc(GroupPlate::getCreate_name)); @@ -1427,6 +1427,27 @@ public class OutBillServiceImpl extends ServiceImpl if (ObjectUtils.isEmpty(MdMeMaterialbaseList)) { throw new BadRequestException("未找到该托盘的物料信息,检查一下该托盘是否已出库或在操作日志中查询该物料是否被删除!"); } + //终点修改点位状态 + SchBasePoint point_code2 = new SchBasePoint(); + point_code2 = iSchBasePointService.getByCode(task.getPoint_code2()); + point_code2.setVehicle_code(task.getVehicle_code()); + point_code2.setPoint_status(PointStatusEnum.FULL_POINT.getCode()); + point_code2.setLock_up(false); + iSchBasePointService.update(point_code2); + log.info("任务号:{}完成,解锁库位:{}", task.getTask_code(), point_code2); + //日志记录 + SysLog logDto = new SysLog(); + logDto.setRequest_ip("localhost"); + logDto.setAddress("localhost"); + logDto.setMethod("taskFinish"); + logDto.setUsername(""); + logDto.setDescription("操作成功!"); + logDto.setBrowser("browser"); + logDto.setLog_id(cn.hutool.core.util.IdUtil.getSnowflake(1, 1).nextIdStr()); + logDto.setCreate_time(DateUtil.now()); + logDto.setLog_type("INFO"); + logDto.setParams("任务完成:" + task.getTask_code() + ",解锁库位成功:-------------------" + point_code2); + logMapper.insert(logDto); String currentUserId = SecurityUtils.getCurrentUserId(); String nickName = SecurityUtils.getCurrentNickName(); String now = DateUtil.now(); @@ -1449,27 +1470,23 @@ public class OutBillServiceImpl extends ServiceImpl //获取单据编号 String bill_code = ioStorInv.getBill_code(); String source_name = ioStorInv.getSource_name(); - //终点修改点位状态 - SchBasePoint point_code2 = new SchBasePoint(); - point_code2 = iSchBasePointService.getByCode(task.getPoint_code2()); - point_code2.setVehicle_code(task.getVehicle_code()); - point_code2.setPoint_status(PointStatusEnum.FULL_POINT.getCode()); - point_code2.setLock_up(false); - iSchBasePointService.update(point_code2); - log.info("任务号:{}完成,解锁库位:{}", task.getTask_code(), point_code2); - //日志记录 - SysLog logDto = new SysLog(); - logDto.setRequest_ip("localhost"); - logDto.setAddress("localhost"); - logDto.setMethod("taskFinish"); - logDto.setUsername(""); - logDto.setDescription("操作成功!"); - logDto.setBrowser("browser"); - logDto.setLog_id(cn.hutool.core.util.IdUtil.getSnowflake(1, 1).nextIdStr()); - logDto.setCreate_time(DateUtil.now()); - logDto.setLog_type("INFO"); - logDto.setParams("任务完成:" + task.getTask_code() + ",解锁库位成功:-------------------" + point_code2); - logMapper.insert(logDto); + //回传给wms + TOWMSMSG towmsmsg = new TOWMSMSG(); + towmsmsg.setType("1"); + towmsmsg.setBill_code(source_name); + towmsmsg.setStatus("200"); + JSONObject jo = new JSONObject(); + jo.put("storagevehicle_code", task.getVehicle_code()); + jo.put("struct_name", task.getPoint_code2()); + jo.put("struct_code", task.getPoint_code2()); + jo.put("material_name", MdMeMaterialbaseList.get(0).getMaterial_name()); + jo.put("material_code", MdMeMaterialbaseList.get(0).getMaterial_code()); + jo.put("qty", groupPlateList.get(0).getQty()); + List tableData = new ArrayList<>(); + tableData.add(jo); + towmsmsg.setTableData(tableData); + // iWmsToWmsService.FinishOutTask(towmsmsg); + notifyWmsAsync(towmsmsg); //解锁库位 String cTStructCode = item.getStruct_code(); //超托需要更新多个库位 @@ -1518,23 +1535,7 @@ public class OutBillServiceImpl extends ServiceImpl ); } } - //回传给wms - TOWMSMSG towmsmsg = new TOWMSMSG(); - towmsmsg.setType("1"); - towmsmsg.setBill_code(source_name); - towmsmsg.setStatus("200"); - JSONObject jo = new JSONObject(); - jo.put("storagevehicle_code", task.getVehicle_code()); - jo.put("struct_name", task.getPoint_code2()); - jo.put("struct_code", task.getPoint_code2()); - jo.put("material_name", MdMeMaterialbaseList.get(0).getMaterial_name()); - jo.put("material_code", MdMeMaterialbaseList.get(0).getMaterial_code()); - jo.put("qty", groupPlateList.get(0).getQty()); - List tableData = new ArrayList<>(); - tableData.add(jo); - towmsmsg.setTableData(tableData); - // iWmsToWmsService.FinishOutTask(towmsmsg); - notifyWmsAsync(towmsmsg); + } @Override @@ -1582,12 +1583,13 @@ public class OutBillServiceImpl extends ServiceImpl towmsmsg.setTableData(tableData); // iWmsToWmsService.FinishOutTask(towmsmsg); notifyWmsAsync(towmsmsg); + throw new BadRequestException("未找到该托盘的物料信息,检查一下该托盘是否已出库或在操作日志中查询该物料是否被删除!"); } /** * 异步回传WMS */ - @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) + // @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) public void notifyWmsAsync(TOWMSMSG task) { // 调用WMS接口 iWmsToWmsService.FinishOutTask(task); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/wbwms/controller/WmsToIWmscontroller.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/wbwms/controller/WmsToIWmscontroller.java index c0274d7..4dcdc4a 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/wbwms/controller/WmsToIWmscontroller.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/wbwms/controller/WmsToIWmscontroller.java @@ -2,6 +2,9 @@ package org.nl.wms.wbwms.controller; import cn.dev33.satoken.annotation.SaIgnore; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Lists; @@ -11,8 +14,14 @@ import org.apache.commons.lang3.ObjectUtils; import org.nl.common.exception.BadRequestException; import org.nl.common.logging.annotation.Log; import org.nl.common.utils.IdUtil; +import org.nl.config.SpringContextHolder; import org.nl.wms.basedata_manage.service.IStructattrService; import org.nl.wms.basedata_manage.service.dao.Structattr; +import org.nl.wms.ext_manage.enums.EXTConstant; +import org.nl.wms.ext_manage.service.util.AcsResponse; +import org.nl.wms.system_manage.enums.SysParamConstant; +import org.nl.wms.system_manage.service.param.dao.Param; +import org.nl.wms.system_manage.service.param.impl.SysParamServiceImpl; import org.nl.wms.wbwms.service.WmsToIWmsService; import org.nl.wms.wbwms.service.dto.WmstoIWmsResponse; import org.springframework.beans.factory.annotation.Autowired; @@ -159,4 +168,41 @@ public class WmsToIWmscontroller { return new ResponseEntity<>(HttpStatus.OK); } + + @PostMapping("/queryTimeoutTask") + @Log("查询ACS超时异常任务") + @SaIgnore + public ResponseEntity queryTimeoutTask(@RequestBody JSONObject param) { + // 系统参数类 + SysParamServiceImpl sysParamService = SpringContextHolder.getBean(SysParamServiceImpl.class); + // ACS地址 + Param acsUrlParam = sysParamService.findByCode(SysParamConstant.ACS_URL); + if (ObjectUtil.isEmpty(acsUrlParam)) { + return new ResponseEntity<>(AcsResponse.requestError("系统参数表中:" + SysParamConstant.ACS_URL + "不存在"), HttpStatus.OK); + } + String url = acsUrlParam.getValue() + EXTConstant.QUERY_TIMEOUT_TASK_ACS_API; + log.info("调用ACS超时异常任务查询接口:{}", url); + try { + String resultMsg = HttpRequest.post(url) + .body(JSON.toJSONString(param)) + .execute().body(); + log.info("ACS超时异常任务查询结果:{}", resultMsg); + // 格式转换:兼容 ACS 返回 JSONObject 或 JSONArray 两种情况 + AcsResponse acsResponse; + String trimmedMsg = resultMsg.trim(); + if (trimmedMsg.startsWith("[")) { + // 返回的是数组,直接赋值到 data 字段 + JSONArray jsonArray = JSONArray.parseArray(resultMsg); + acsResponse = AcsResponse.requestOk(); + acsResponse.setData(jsonArray); + } else { + // 返回的是对象 + acsResponse = JSON.parseObject(resultMsg, AcsResponse.class); + } + return new ResponseEntity<>(acsResponse, HttpStatus.OK); + } catch (Exception e) { + log.error("调用ACS超时异常任务查询接口失败:{}", e.getMessage()); + return new ResponseEntity<>(AcsResponse.requestError("返回结果异常,原因:" + e.getMessage()), HttpStatus.OK); + } + } } diff --git a/nladmin-system/nlsso-server/src/main/resources/config/application.yml b/nladmin-system/nlsso-server/src/main/resources/config/application.yml index 32d6a53..a94f6dc 100644 --- a/nladmin-system/nlsso-server/src/main/resources/config/application.yml +++ b/nladmin-system/nlsso-server/src/main/resources/config/application.yml @@ -11,7 +11,7 @@ spring: freemarker: check-template-location: false profiles: - active: prod + active: dev # active: dev # active: prod jackson: