diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv/server/impl/NDCAgvServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv/server/impl/NDCAgvServiceImpl.java index 3abd79c..4e5f582 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv/server/impl/NDCAgvServiceImpl.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv/server/impl/NDCAgvServiceImpl.java @@ -382,6 +382,11 @@ public class NDCAgvServiceImpl implements NDCAgvService { if ("7".equals(carno) || "8".equals(carno)) { tempList.removeIf(r -> !"四号站点(RT)".equals(r.getLabel())); } + if (Integer.parseInt(carno) > 6) { + tempList.removeIf(r -> !"四号站点(RT)".equals(r.getLabel())); + } else if (Integer.parseInt(carno) < 7) { + tempList.removeIf(r -> "四号站点(RT)".equals(r.getLabel())); + } if (ObjectUtil.isNotEmpty(tempList)) { temp = tempList.get(0); satation = Integer.parseInt(temp.getPara1()); 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 32055e3..91a1de8 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 @@ -176,6 +176,10 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic if (StringUtils.isBlank(task.getCar_no())) { task.setCar_no(String.valueOf(carno)); } + //分配车辆时间 + if (StringUtils.isBlank(task.getPut_y())) { + task.setPut_y(DateUtil.now()); + } taskserver.update(task); logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + "反馈:" + data); //车辆状态归零 @@ -273,32 +277,48 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic LocalTime now = LocalTime.now(); // 判断当前时间是否在时间段内 boolean isInRange = !now.isBefore(startTime) && !now.isAfter(endTime); - int electric = 0; + int electricMin = 0, electricMax = 0; //早上8-22点 if (isInRange) { - electric = Integer.parseInt(paramService.findByCode(AcsConfig.ELECTRIC).getValue()); + String electricStr = paramService.findByCode(AcsConfig.ELECTRIC).getValue(); + if (electricStr.contains("-")) { + String[] range = electricStr.split("-"); + electricMin = Integer.parseInt(range[0].trim()); + electricMax = Integer.parseInt(range[1].trim()); + } else { + electricMax = Integer.parseInt(electricStr.trim()); + } } else { - electric = Integer.parseInt(paramService.findByCode(AcsConfig.ELECTRIC2).getValue()); + String electricStr = paramService.findByCode(AcsConfig.ELECTRIC2).getValue(); + if (electricStr.contains("-")) { + String[] range = electricStr.split("-"); + electricMin = Integer.parseInt(range[0].trim()); + electricMax = Integer.parseInt(range[1].trim()); + } else { + electricMax = Integer.parseInt(electricStr.trim()); + } } - if (electric_qty > 0 && electric_qty < electric) { - log.info("当前车辆{}电量为{}低于{},开始判断是否需要充电!", this.agvaddr, electric_qty, electric); + if (electric_qty > 0 && electric_qty >= electricMin && electric_qty <= electricMax) { + log.info("当前车辆{}电量为{}在充电区间{}-{}内,开始判断是否需要充电!", this.agvaddr, electric_qty, electricMin, electricMax); //判断是否已下发充电任务 Dict dict1 = dictService.getDictByName3("station", String.valueOf(this.agvaddr), null); - log.info("当前车辆{}电量为{}低于{},开始查询分配充电桩信息", this.agvaddr, electric_qty, electric); + log.info("当前车辆{}电量为{}在充电区间{}-{}内,开始查询分配充电桩信息", this.agvaddr, electric_qty, electricMin, electricMax); if (ObjectUtil.isNotEmpty(dict1)) { log.info("当前车辆{}已分配充电桩{},退出后续判断", this.agvaddr, dict1.getPara1()); } else { List dictList = dictService.getDictByName2("station"); - if (ObjectUtils.isNotEmpty(dictList) && (this.agvaddr == 7 || this.agvaddr == 8)) { + if (ObjectUtils.isNotEmpty(dictList) && (this.agvaddr > 6)) { dictList.removeIf(r -> !"四号站点(RT)".equals(r.getLabel())); + } else if (ObjectUtils.isNotEmpty(dictList) && (this.agvaddr < 7)) { + dictList.removeIf(r -> "四号站点(RT)".equals(r.getLabel())); } if (ObjectUtils.isNotEmpty(dictList)) { - log.info("当前车辆{}电量为{}低于{},充电桩数量", this.agvaddr, electric_qty, dictList.size()); + log.info("当前车辆{}电量为{}在充电区间{}-{}内,充电桩数量{}", this.agvaddr, electric_qty, electricMin, electricMax, dictList.size()); log.info("当前车辆{}成功分配充电桩:{},准备下发充电任务", this.agvaddr, dictList.get(0).getLabel()); ndcAgvService.charge(String.valueOf(this.agvaddr)); isCharge = true; } else { - log.info("当前车辆{}电量为{}低于{},但无空闲充电桩!", this.agvaddr, electric_qty, electric); + log.info("当前车辆{}电量为{}在充电区间{}-{}内,但无空闲充电桩!", this.agvaddr, electric_qty, electricMin, electricMax); } } } @@ -382,14 +402,14 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic JSONObject post = new JSONObject(); JSONObject zh_cn = new JSONObject(); // 设置标题 - zh_cn.put("title", "AMR报警"); + zh_cn.put("title", "AMR消息"); // 设置内容 JSONArray contentArray = new JSONArray(); JSONArray contentRow1 = new JSONArray(); - // 第一行:报警信息: 【AMR故障报警】 + // 第一行:报警信息: 【AMR报警】 JSONObject tagText1 = new JSONObject(); tagText1.put("tag", "text"); - tagText1.put("text", "报警信息: 【AMR故障报警】"); + tagText1.put("text", "报警信息: 【AMR报警】"); // 第二行:设备编码 JSONObject tagText2 = new JSONObject(); tagText2.put("tag", "text"); 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 d4dc973..166787e 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 @@ -1061,22 +1061,20 @@ public class InstructionServiceImpl extends CommonServiceImpl(HttpStatus.CREATED); } + @Log("修改任务优先级") + /** 修改任务优先级 */ + @PostMapping(value = "/updatePriority") + public ResponseEntity updatePriority(@RequestBody JSONObject json) { + taskService.updatePriority(json); + return new ResponseEntity<>(HttpStatus.OK); + } + @SaIgnore @Log("查询缓存所有任务") /** 查询缓存任务 */ 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 0106c0c..be01cad 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 @@ -516,5 +516,13 @@ public interface TaskService extends CommonService { + /** + * 修改任务优先级(批量) + * + * @param json 包含 taskIds 列表和 priority + */ + void updatePriority(JSONObject json); + + List queryTaskSheet(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 864429f..5d1505b 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 @@ -380,13 +380,13 @@ public class TaskServiceImpl extends CommonServiceImpl impleme } switch (timeIndex) { case "1": // 1-3分钟(包含1和3) - return duration >= 1 && duration <= 3; + return duration >= 1 && duration < 3; case "2": // 3-5分钟(大于3,小于等于5) - return duration > 3 && duration <= 5; + return duration >= 3 && duration < 5; case "3": // 5-8分钟(大于5,小于等于8) - return duration > 5 && duration <= 8; + return duration >= 5 && duration < 8; case "4": // 大于8分钟 - return duration > 8; + return duration >= 8; default: return true; } @@ -844,6 +844,59 @@ public class TaskServiceImpl extends CommonServiceImpl impleme taskMapper.updateById(task); } + @Override + @Transactional(rollbackFor = Exception.class) + public void updatePriority(JSONObject json) { + List taskIds = (List) json.get("taskIds"); + Integer priority = json.getInteger("priority"); + String startPointCode = json.getString("start_point_code"); + if (taskIds == null || taskIds.isEmpty()) { + throw new BadRequestException("请至少选择一个任务"); + } + if (priority == null || priority < 0 || priority >= 99) { + throw new BadRequestException("优先级必须为0-98之间的整数"); + } + // 如果传入了起点编码,查找同一排(相同前缀)的其他待执行任务并合并 + if (StrUtil.isNotBlank(startPointCode)) { + // 提取前缀,如 "BCPRK1-1" → "BCPRK1" + String prefix = startPointCode.split("-", 2)[0]; + // 仅对起点任务(BCPRK/CPRK)进行合并 + if (prefix.contains("BCPRK") || prefix.contains("CPRK")) { + List samePrefixTasks = new LambdaQueryChainWrapper<>(taskMapper) + .eq(Task::getTask_status, "0") + .eq(Task::getIs_delete, "0") + .likeRight(Task::getStart_device_code, prefix + "-") + .list(); + if (!samePrefixTasks.isEmpty()) { + Set mergedIds = new HashSet<>(taskIds); + for (Task t : samePrefixTasks) { + mergedIds.add(t.getTask_id()); + } + taskIds = new ArrayList<>(mergedIds); + } + } + } + String currentUsername = SecurityUtils.getCurrentUsername(); + String now = DateUtil.now(); + for (String taskId : taskIds) { + TaskDto entity = this.findById(taskId); + if (entity == null) { + throw new BadRequestException(LangProcess.msg("error_sysAuth")); + } + if (!"0".equals(entity.getTask_status())) { + throw new BadRequestException("只能修改待执行任务的优先级"); + } + TaskDto updateDto = new TaskDto(); + updateDto.setTask_id(taskId); + updateDto.setPriority(String.valueOf(priority)); + updateDto.setUpdate_time(now); + updateDto.setUpdate_by(currentUsername); + updateDto.setTemperature(currentUsername + "于" + now + "手动修改了优先级:"+priority); + Task task = ConvertUtil.convert(updateDto, Task.class); + taskMapper.updateById(task); + } + } + @Override @Transactional(rollbackFor = Exception.class) public void deleteAll(String[] ids) throws Exception { @@ -855,7 +908,7 @@ public class TaskServiceImpl extends CommonServiceImpl impleme @Override @Transactional(rollbackFor = Exception.class) public void finishByHand(String id) { - id =id+"-"; + id = id + "-"; this.finish(id); } @@ -887,16 +940,10 @@ public class TaskServiceImpl extends CommonServiceImpl impleme } Task task = ConvertUtil.convert(entity, Task.class); if (StringUtils.isNotBlank(entity.getTo_x())) { - DateTime toXTime = DateUtil.parse(entity.getTo_x()); - DateTime nowTime = DateUtil.parse(now); - long diffMs = nowTime.getTime() - toXTime.getTime(); - if (diffMs < 0) { - diffMs = 0; - } - long totalSeconds = diffMs / 1000; - long minutes = totalSeconds / 60; - long seconds = totalSeconds % 60; - task.setTo_z(String.format("%d.%02d", minutes, seconds)); + task.setTo_z(calcDuration(entity.getTo_x(), now)); + } + if (StringUtils.isNotBlank(entity.getPut_y())) { + task.setPut_z(calcDuration(entity.getPut_y(), now)); } taskMapper.updateById(task); //移除任务缓存信息 @@ -907,9 +954,29 @@ public class TaskServiceImpl extends CommonServiceImpl impleme if (!StrUtil.startWith(entity.getTask_code(), "-") && StrUtil.equals(hasWms, "1")) { this.feedWmsTaskStatus(entity); } - } + /** + * 计算从指定时间到当前时间的耗时,格式为 分.秒(如 3.05) + * @param fromTime 起始时间字符串 + * @param now 当前时间字符串 + * @return 格式化耗时,若 fromTime 为空则返回 null + */ + private String calcDuration(String fromTime, String now) { + if (StringUtils.isBlank(fromTime)) { + return null; + } + DateTime fromDateTime = DateUtil.parse(fromTime); + DateTime nowDateTime = DateUtil.parse(now); + long diffMs = nowDateTime.getTime() - fromDateTime.getTime(); + if (diffMs < 0) { + diffMs = 0; + } + long totalSeconds = diffMs / 1000; + long minutes = totalSeconds / 60; + long seconds = totalSeconds % 60; + return String.format("%d.%02d", minutes, seconds); + } @Override @Transactional(rollbackFor = Exception.class) @@ -938,7 +1005,7 @@ public class TaskServiceImpl extends CommonServiceImpl impleme entity.setUpdate_time(now); entity.setUpdate_by(currentUsername); entity.setTask_status(TaskStatusEnum.CANCEL.getIndex()); - + entity.setRemark("该任务由人工手动取消"); Task task = ConvertUtil.convert(entity, Task.class); taskMapper.updateById(task); //移除任务缓存信息 @@ -1774,10 +1841,12 @@ public class TaskServiceImpl extends CommonServiceImpl impleme // 计算实际运行总时长(to_z累加,单位:分钟) // to_z格式为 "5.19" 表示 5分钟19秒,需要正确解析 long totalRunningSeconds = carTasks.stream() - .filter(t -> StrUtil.isNotEmpty(t.getTo_z())) + .filter(t -> StrUtil.isNotEmpty(t.getPut_z()) || StrUtil.isNotEmpty(t.getTo_z())) .mapToLong(t -> { + // 优先使用 put_z,若为空则使用 to_z + String timeStr = StrUtil.isNotEmpty(t.getPut_z()) ? t.getPut_z() : t.getTo_z(); try { - String[] parts = t.getTo_z().split("\\."); + String[] parts = timeStr.split("\\."); int minutes = Integer.parseInt(parts[0]); int seconds = parts.length > 1 ? Integer.parseInt(parts[1]) : 0; return minutes * 60 + seconds; // 转换为秒 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 6e19f76..2ee6ad9 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 @@ -143,6 +143,21 @@ public class AutoCreateInst { .lt(InstructionMybatis::getInstruction_status, InstructionStatusEnum.FINISHED.getIndex()) .eq(InstructionMybatis::getIs_delete, "0") .list(); + //将执行中的任务也加入指令列表参与起点校验 + List executingTasks = taskserver.queryAllByStatus("1"); + if (CollectionUtils.isNotEmpty(executingTasks)) { + // 收集已有指令中的起始点,避免重复 + Set existingStartPoints = activeInstructions.stream() + .map(InstructionMybatis::getStart_device_code) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + List executingInstructionList = executingTasks.stream() + .filter(t -> t.getStart_device_code() != null) + .filter(t -> !existingStartPoints.contains(t.getStart_device_code())) + .map(t -> InstructionMybatis.builder().start_device_code(t.getStart_device_code()).build()) + .collect(Collectors.toList()); + activeInstructions.addAll(executingInstructionList); + } //起点重复检查 if (isStartTask && checkinsList(activeInstructions, start_point)) { blockedPoints.add(start_point); diff --git a/acs/nladmin-system/nlsso-server/src/main/resources/config/application-prod.yml b/acs/nladmin-system/nlsso-server/src/main/resources/config/application-prod.yml index 9d2b3d8..fb46fd3 100644 --- a/acs/nladmin-system/nlsso-server/src/main/resources/config/application-prod.yml +++ b/acs/nladmin-system/nlsso-server/src/main/resources/config/application-prod.yml @@ -127,7 +127,7 @@ file: avatarMaxSize: 5 logging: file: - path: D:\log\beian\acs # /Users/onepiece/myFile/acs_logs + path: D:\log\huayu\acs # /Users/onepiece/myFile/acs_logs config: classpath:logback-spring.xml lucene: index: diff --git a/acs/nladmin-system/nlsso-server/src/main/resources/config/application.yml b/acs/nladmin-system/nlsso-server/src/main/resources/config/application.yml index 6bc5a0d..b1bcc54 100644 --- a/acs/nladmin-system/nlsso-server/src/main/resources/config/application.yml +++ b/acs/nladmin-system/nlsso-server/src/main/resources/config/application.yml @@ -6,7 +6,7 @@ spring: freemarker: check-template-location: false profiles: - active: prod + active: dev # active: dev # active: prod jackson: diff --git a/acs/nladmin-system/nlsso-server/src/main/resources/logback-spring.xml b/acs/nladmin-system/nlsso-server/src/main/resources/logback-spring.xml index 5534c35..6e7c1b4 100644 --- a/acs/nladmin-system/nlsso-server/src/main/resources/logback-spring.xml +++ b/acs/nladmin-system/nlsso-server/src/main/resources/logback-spring.xml @@ -43,7 +43,7 @@ https://juejin.cn/post/6844903775631572999 ${LOG_HOME}/%d{yyyy-MM-dd}.%i.log - 30 + 180 120MB @@ -167,6 +167,7 @@ https://juejin.cn/post/6844903775631572999 + diff --git a/acs/nladmin-ui/src/api/acs/task/task.js b/acs/nladmin-ui/src/api/acs/task/task.js index 3d15975..abf1fb7 100644 --- a/acs/nladmin-ui/src/api/acs/task/task.js +++ b/acs/nladmin-ui/src/api/acs/task/task.js @@ -103,5 +103,13 @@ export function queryTaskSheet(data) { }) } -export default { add, edit, del, finish, cancel, createTaskByClick, deviceAskTask, ordinaryTaskCreate, specialTaskCreate, createInst, reload, queryTaskSheet } +export function updatePriority(data) { + return request({ + url: 'api/task/updatePriority', + method: 'post', + data + }) +} + +export default { add, edit, del, finish, cancel, createTaskByClick, deviceAskTask, ordinaryTaskCreate, specialTaskCreate, createInst, reload, queryTaskSheet, updatePriority } diff --git a/acs/nladmin-ui/src/views/acs/history/taskRecord/index.vue b/acs/nladmin-ui/src/views/acs/history/taskRecord/index.vue index 8ea2652..ca2f455 100644 --- a/acs/nladmin-ui/src/views/acs/history/taskRecord/index.vue +++ b/acs/nladmin-ui/src/views/acs/history/taskRecord/index.vue @@ -320,7 +320,7 @@ - + diff --git a/acs/nladmin-ui/src/views/acs/task/index.vue b/acs/nladmin-ui/src/views/acs/task/index.vue index c68202d..4b23970 100644 --- a/acs/nladmin-ui/src/views/acs/task/index.vue +++ b/acs/nladmin-ui/src/views/acs/task/index.vue @@ -123,6 +123,17 @@ > {{ $t('auto.common.synchronous') }} + + {{ $t('修改优先级') }} + @@ -133,22 +144,22 @@ - - - - - + + + + + + + + + + + + + + + + - - - + + + - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + +
@@ -459,30 +470,30 @@ - - - - - - -
- {{ $t('task.select.Placeholder') }} -
-
- - - + + + + + + + + + + + + + + + + + + + + + + + + @@ -543,6 +554,21 @@
+ + + + + + + + + + + + @@ -653,7 +679,7 @@