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 9f0445c..79dce40 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 @@ -10,6 +10,8 @@ public interface AcsConfig { String ONEPOINTMAXTASK = "onePointMaxTask"; //同一任务创建最大指令数 String MAXINSTNUMBER = "maxInstNumber"; + //同一任务创建最大RT车指令数 + String MAXRTINSTNUMBER = "maxRtInstNumber"; //创建任务检查 String CREATETASKCHECK = "createTaskCheck"; //撤销任务检查 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 e3a0594..57ae399 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 @@ -1,25 +1,19 @@ package org.nl.acs.device_driver.basedriver.agv.ndcone; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import cn.hutool.http.HttpResponse; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import jodd.util.StringUtil; import lombok.Data; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.nl.acs.AcsConfig; import org.nl.acs.agv.server.NDCAgvService; import org.nl.acs.auto.run.OneNDCSocketConnectionAutoRun; import org.nl.acs.device.domain.Device; import org.nl.acs.device.service.DeviceService; import org.nl.acs.device_driver.DeviceDriver; -import org.nl.acs.device_driver.RequestMethodEnum; -import org.nl.acs.device_driver.basedriver.agv.utils.AgvActionEnum; -import org.nl.acs.device_driver.basedriver.standard_ordinary_site.StandardOrdinarySiteDeviceDriver; import org.nl.acs.device_driver.driver.AbstractDeviceDriver; -import org.nl.acs.device_driver.storage.standard_storage.StandardStorageDeviceDriver; import org.nl.acs.ext.wms.data.one.feedBackTaskStatus.FeedBackTaskStatusRequest; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; @@ -37,13 +31,11 @@ import org.nl.common.exception.BadRequestException; import org.nl.config.SpringContextHolder; import org.nl.config.thread.ThreadPoolExecutorUtil; import org.nl.system.service.lucene.LuceneExecuteLogService; -import org.nl.system.service.lucene.dto.LuceneLogDto; import org.nl.system.service.param.ISysParamService; import org.nl.system.service.param.impl.SysParamServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import java.util.List; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.ThreadPoolExecutor; /** @@ -149,6 +141,14 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic transportOrder = inst.getTask_code(); //车辆分配任务时 状态为1 执行中 task.setTask_status("1"); + //车辆执行任务开始计时字段 + if (StrUtil.isEmpty(task.getTo_x())) { + task.setTo_x(DateUtil.now()); + } + //添加车号 + if (StrUtil.isEmpty(task.getCar_no())) { + task.setCar_no(String.valueOf(carno)); + } taskserver.update(task); logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + "反馈:" + data); //车辆状态归零 @@ -179,6 +179,7 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic feed_jo.put("task_status","10"); JSONArray ja = new JSONArray(); ja.add(feed_jo); + log.info("acs开始请求二次分配,任务号{}",task.getTask_code()); acsToWmsService.feedTaskStatus(ja); Instruction inst1 = instructionService.findBytaskCode(inst.getTask_id()); log.info("二次分配指令终点是{}",inst1.getNext_point_code()); diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/data/one/CreateTaskRequest.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/data/one/CreateTaskRequest.java index c237a23..75036c7 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/data/one/CreateTaskRequest.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/data/one/CreateTaskRequest.java @@ -46,6 +46,7 @@ public class CreateTaskRequest extends BaseRequest { */ String vehicle_code2; + /** * 载具类型 */ diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java index eb9ca29..12f6c5c 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java @@ -7,7 +7,6 @@ import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.acs.device.domain.Device; @@ -20,13 +19,14 @@ import org.nl.acs.ext.wms.data.one.CreateTaskRequest; import org.nl.acs.ext.wms.data.one.CreateTaskResponse; import org.nl.acs.ext.wms.service.WmsToAcsService; import org.nl.acs.opc.DeviceAppService; -import org.nl.acs.storage_cell.domain.StorageCell; import org.nl.acs.storage_cell.service.mapper.StorageCellMapper; import org.nl.acs.task.service.TaskService; import org.nl.acs.task.service.dto.TaskDto; import org.nl.common.exception.BadRequestException; import org.nl.system.service.lucene.LuceneExecuteLogService; import org.nl.system.service.lucene.dto.LuceneLogDto; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; import org.slf4j.MDC; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -36,6 +36,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; @Service @RequiredArgsConstructor @@ -54,12 +55,16 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { @Autowired private TaskService taskserver; + @Autowired + private RedissonClient redissonClient; private String log_file_type = "log_file_type"; private String log_type = "LMS请求ACS"; + @Override public CreateTaskResponse crateTask(String param) { + try { MDC.put(log_file_type, log_type); log.info("ACS接收WMS任务-----输入参数{}", param); @@ -117,7 +122,6 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { String next_height = request.getNext_height(); String params2 = request.getParams2(); Map params = request.getParams(); - String start_point_code = ""; String start_point_code2 = ""; String next_point_code = ""; @@ -147,87 +151,13 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { errArr.add(json); continue; } - if (StrUtil.equals(task_type, "8")) { next_device_code = request.getPut_device_code(); put_device_code = request.getNext_device_code(); } - -// StorageCell start_storageCell = new LambdaQueryChainWrapper<>(storageCellMapper) -// .eq(StorageCell::getStorage_code, start_device_code) -// .one(); -// StorageCell next_storageCell = new LambdaQueryChainWrapper<>(storageCellMapper) -// .eq(StorageCell::getStorage_code, next_device_code) -// .one(); -// StorageCell start2_storageCell = new LambdaQueryChainWrapper<>(storageCellMapper) -// .eq(StorageCell::getStorage_code, start_device_code2) -// .one(); -// StorageCell next2_storageCell = new LambdaQueryChainWrapper<>(storageCellMapper) -// .eq(StorageCell::getStorage_code, next_device_code2) -// .one(); -// StorageCell put_storageCell = new LambdaQueryChainWrapper<>(storageCellMapper) -// .eq(StorageCell::getStorage_code, put_device_code) -// .one(); -// -// JSONObject start_device_json = (JSONObject) JSONObject.toJSON(start_storageCell); -// if (!ObjectUtil.isEmpty(start_device_json)) { -// start_point_code = (String) start_device_json.get("parent_storage_code") == null ? start_device_code : (String) start_device_json.get("storage_code"); -// } -// JSONObject next_device_json = (JSONObject) JSONObject.toJSON(next_storageCell); -// if (!ObjectUtil.isEmpty(next_device_json)) { -// next_point_code = (String) next_device_json.get("parent_storage_code") == null ? next_point_code : (String) next_device_json.get("storage_code"); -// } -// JSONObject start_device_json2 = (JSONObject) JSONObject.toJSON(start2_storageCell); -// if (!ObjectUtil.isEmpty(start_device_json2)) { -// start_point_code2 = (String) start_device_json2.get("parent_storage_code") == null ? start_device_code2 : (String) start_device_json2.get("storage_code"); -// } -// JSONObject next_device_json2 = (JSONObject) JSONObject.toJSON(next2_storageCell); -// if (!ObjectUtil.isEmpty(next_device_json2)) { -// next_point_code2 = (String) next_device_json2.get("parent_storage_code") == null ? next_device_code2 : (String) next_device_json2.get("storage_code"); -// } -// JSONObject put_device_json = (JSONObject) JSONObject.toJSON(put_storageCell); -// if (!ObjectUtil.isEmpty(put_device_json)) { -// put_point_code = (String) put_device_json.get("parent_storage_code") == null ? put_device_code : (String) put_device_json.get("storage_code"); -// } -// if (StrUtil.isNotEmpty(start_point_code) && start_point_code.indexOf("-") > 0) { -// String str[] = start_point_code.split("-"); -// start_device_code = str[0]; -// } else { -// start_device_code = start_point_code; -// } - -// if (StrUtil.isNotEmpty(next_point_code) && next_point_code.indexOf("-") > 0) { -// String str[] = next_point_code.split("-"); -// next_device_code = str[0]; -// } else { -// next_device_code = next_point_code; -// } - -// if (StrUtil.isNotEmpty(start_point_code2) && start_point_code2.indexOf("-") > 0) { -// String str[] = start_point_code2.split("-"); -// start_device_code2 = str[0]; -// } else { -// start_device_code2 = start_point_code2; -// } -// -// if (StrUtil.isNotEmpty(next_point_code2) && next_point_code2.indexOf("-") > 0) { -// String str[] = next_point_code2.split("-"); -// next_device_code2 = str[0]; -// } else { -// next_device_code2 = next_point_code2; -// } -// -// if (StrUtil.isNotEmpty(put_point_code) && put_point_code.indexOf("-") > 0) { -// String str[] = put_point_code.split("-"); -// put_device_code = str[0]; -// } else { -// put_device_code = put_point_code; -// } - if (StrUtil.isEmpty(route_plan_code)) { route_plan_code = "normal"; } - TaskDto taskDto = taskserver.findByCodeFromCache(task_code); if (taskDto != null) { JSONObject json = new JSONObject(); @@ -250,7 +180,6 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { } start_point_code=start_device_code; next_point_code=next_device_code; - if (StrUtil.isEmpty(start_point_code)) { JSONObject json = new JSONObject(); json.put("task_code", task_code); @@ -267,7 +196,6 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { errArr.add(json); continue; } - JSONObject jo = new JSONObject(); jo.put("task_id", IdUtil.simpleUUID()); jo.put("task_code", task_code); @@ -312,7 +240,6 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { if (!StrUtil.isEmpty(ext_task_id)) { jo.put("ext_task_id", ext_task_id); } - TaskDto task_dto = jo.toJavaObject(TaskDto.class); try { taskserver.create(task_dto); @@ -338,6 +265,239 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { } response.setErrArr(errArr); } + LuceneLogDto logDto1 = LuceneLogDto.builder() + .device_code("ACS接收WMS任务") + .content("ACS接收WMS任务-----返回参数:" + JSON.toJSONString(response)) + .build(); + logDto1.setLog_level(4); + luceneExecuteLogService.deviceExecuteLog(logDto1); + log.info("ACS接收WMS任务--------------:输出参数:" + JSON.toJSONString(response)); + return response; + } catch (Exception e) { + log.error("获取分布式锁或执行任务异常,可能 Redis 不可用", e); + CreateTaskResponse errorResp = new CreateTaskResponse(); + errorResp.setStatus(500); + errorResp.setMessage("系统异常:" + e.getMessage()); + return errorResp; + } finally { + MDC.remove(log_file_type); + } + } + + public CreateTaskResponse crateTask1(String param) { + RLock lock = redissonClient.getLock(this.getClass().getName() + "-crateTask"); + boolean locked = false; + try { + // 尝试获取分布式锁,避免并发创建相同任务号 + locked = lock.tryLock(5, 30, TimeUnit.SECONDS); + if (!locked) { + log.warn("未获取到分布式锁,系统繁忙"); + CreateTaskResponse errorResp = new CreateTaskResponse(); + errorResp.setStatus(400); + errorResp.setMessage("系统繁忙,请稍后重试"); + return errorResp; + } + + MDC.put(log_file_type, log_type); + log.info("ACS接收WMS任务-----输入参数{}", param); + LuceneLogDto logDto = LuceneLogDto.builder() + .device_code("ACS接收WMS任务") + .content("ACS接收WMS任务-----输入参数:" + param) + .build(); + logDto.setLog_level(4); + luceneExecuteLogService.deviceExecuteLog(logDto); + JSONArray datas = JSONArray.parseArray(param); + CreateTaskResponse response = new CreateTaskResponse(); + JSONArray errArr = new JSONArray(); + for (int i = 0; i < datas.size(); i++) { + String data = datas.get(i).toString(); + CreateTaskRequest request = JsonUtl.format(data, CreateTaskRequest.class); + String paper_array = request.getPaper_array(); + String ext_task_id = request.getExt_task_uuid(); + String task_code = request.getTask_code(); + //车辆类型 + String car_type=request.getCar_type(); + String car_width=request.getCar_width(); + String start_device_code = request.getStart_device_code(); + String start_device_code2 = request.getStart_device_code2(); + String next_device_code = request.getNext_device_code(); + String next_device_code2 = request.getNext_device_code2(); + String put_device_code = request.getPut_device_code(); + String task_type = request.getTask_type(); + if(task_type.equals("1")&&car_type.equals("2")){ + start_device_code=start_device_code+"-R"; + } + String priority = request.getPriority(); + String vehicle_code = request.getVehicle_code(); + String vehicle_code2 = request.getVehicle_code2(); + String vehicle_type = request.getVehicle_type(); + String route_plan_code = request.getRoute_plan_code(); + + String class_type = request.getClass_type(); + String truss_type = request.getTruss_type(); + Integer agv_action_type = request.getAgv_action_type(); + String empty_site = request.getEmpty_site(); + String is_bushing = request.getIs_bushing(); + String is_pulling = request.getIs_pulling(); + String size = request.getSize(); + String version = request.getVersion(); + String bushing_num = request.getBushing_num(); + String storage_task_type = request.getDtl_type(); + String agv_system_type = request.getAgv_system_type(); + String remark = request.getRemark(); + double oven_time = 0.00d; + if (StrUtil.isNotEmpty(request.getOven_time())) { + oven_time = Double.parseDouble(request.getOven_time()); + } + String temperature = request.getTemperature(); + String start_height = request.getStart_height(); + String next_height = request.getNext_height(); + String params2 = request.getParams2(); + Map params = request.getParams(); + String start_point_code = ""; + String start_point_code2 = ""; + String next_point_code = ""; + String next_point_code2 = ""; + String put_point_code = ""; + if (StrUtil.isEmpty(task_code)) { + JSONObject json = new JSONObject(); + json.put("task_code", task_code); + json.put("ext_task_id", ext_task_id); + json.put("message", "任务号不能为空"); + errArr.add(json); + continue; + } + if (StrUtil.isEmpty(start_device_code)) { + JSONObject json = new JSONObject(); + json.put("task_code", task_code); + json.put("ext_task_id", ext_task_id); + json.put("message", "起点不能为空"); + errArr.add(json); + continue; + } + if (StrUtil.isEmpty(next_device_code)) { + JSONObject json = new JSONObject(); + json.put("task_code", task_code); + json.put("ext_task_id", ext_task_id); + json.put("message", "终点不能为空"); + errArr.add(json); + continue; + } + if (StrUtil.equals(task_type, "8")) { + next_device_code = request.getPut_device_code(); + put_device_code = request.getNext_device_code(); + } + if (StrUtil.isEmpty(route_plan_code)) { + route_plan_code = "normal"; + } + TaskDto taskDto = taskserver.findByCodeFromCache(task_code); + if (taskDto != null) { + JSONObject json = new JSONObject(); + json.put("task_code", task_code); + json.put("ext_task_id", ext_task_id); + json.put("message", "存在相同的任务号:" + task_code); + errArr.add(json); + continue; + } + if (!StrUtil.isEmpty(vehicle_code)) { + TaskDto vehicle_dto = taskserver.findByContainer(vehicle_code); + if (vehicle_dto != null) { + JSONObject json = new JSONObject(); + json.put("task_code", task_code); + json.put("ext_task_id", ext_task_id); + json.put("message", "已存在任务编号为" + vehicle_dto.getTask_code() + "托盘号:" + vehicle_code); + errArr.add(json); + continue; + } + } + start_point_code=start_device_code; + next_point_code=next_device_code; + if (StrUtil.isEmpty(start_point_code)) { + JSONObject json = new JSONObject(); + json.put("task_code", task_code); + json.put("ext_task_id", ext_task_id); + json.put("message", request.getStart_device_code() + " 该设备号未找到对应点位"); + errArr.add(json); + continue; + } + if (StrUtil.isEmpty(next_point_code)) { + JSONObject json = new JSONObject(); + json.put("task_code", task_code); + json.put("ext_task_id", ext_task_id); + json.put("message", request.getNext_device_code() + " 该设备号未找到对应点位"); + errArr.add(json); + continue; + } + JSONObject jo = new JSONObject(); + jo.put("task_id", IdUtil.simpleUUID()); + jo.put("task_code", task_code); + jo.put("start_point_code", start_point_code); + jo.put("next_point_code", next_point_code); + jo.put("start_point_code2", start_point_code2); + jo.put("next_point_code2", next_point_code2); + jo.put("put_point_code", put_point_code); + jo.put("start_parent_code", start_point_code); + jo.put("next_parent_code", next_point_code); + jo.put("start_device_code", start_device_code); + jo.put("next_device_code", next_device_code); + jo.put("start_device_code2", start_device_code2); + jo.put("next_device_code2", next_device_code2); + jo.put("put_device_code", put_device_code); + jo.put("agv_action_type", agv_action_type); + jo.put("priority", priority); + jo.put("vehicle_code", vehicle_code); + jo.put("vehicle_code2", vehicle_code2); + jo.put("vehicle_type", vehicle_type); + jo.put("storage_task_type", storage_task_type); + jo.put("agv_system_type", agv_system_type); + jo.put("start_height", start_height); + jo.put("next_height", next_height); + jo.put("oven_time", (int) Math.ceil(oven_time)); + jo.put("remark", remark); + jo.put("params", params); + jo.put("params2", params2); + jo.put("task_type", StrUtil.isEmpty(task_type) ? 1 : Integer.parseInt(task_type)); + jo.put("class_type", class_type); + jo.put("route_plan_code", route_plan_code); + jo.put("paper_array", JSONUtil.toJsonStr(paper_array)); + jo.put("truss_type", JSONUtil.toJsonStr(truss_type)); + jo.put("empty_site", JSONUtil.toJsonStr(empty_site)); + jo.put("is_bushing", JSONUtil.toJsonStr(is_bushing)); + jo.put("is_pulling", JSONUtil.toJsonStr(is_pulling)); + jo.put("size", JSONUtil.toJsonStr(size)); + jo.put("version", JSONUtil.toJsonStr(version)); + jo.put("bushing_num", JSONUtil.toJsonStr(bushing_num)); + jo.put("car_type",car_type); + jo.put("car_width",car_width); + if (!StrUtil.isEmpty(ext_task_id)) { + jo.put("ext_task_id", ext_task_id); + } + TaskDto task_dto = jo.toJavaObject(TaskDto.class); + try { + taskserver.create(task_dto); + } catch (Exception e) { + JSONObject json = new JSONObject(); + json.put("task_code", task_code); + json.put("ext_task_id", ext_task_id); + json.put("message", e.getMessage()); + errArr.add(json); + continue; + } + } + if (ObjectUtil.isEmpty(errArr)) { + response.setStatus(200); + response.setCode(200); + response.setMessage("success"); + } else { + response.setStatus(400); + if (ObjectUtil.isNotEmpty(errArr)) { + response.setMessage(errArr.getJSONObject(0).getString("message")); + } else { + response.setMessage("false"); + } + response.setErrArr(errArr); + } + LuceneLogDto logDto1 = LuceneLogDto.builder() .device_code("ACS接收WMS任务") .content("ACS接收WMS任务-----返回参数:" + JSON.toJSONString(response)) @@ -347,7 +507,21 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { log.info("ACS接收WMS任务--------------:输出参数:" + JSON.toJSONString(response)); return response; + } catch (Exception e) { + log.error("获取分布式锁或执行任务异常,可能 Redis 不可用", e); + CreateTaskResponse errorResp = new CreateTaskResponse(); + errorResp.setStatus(500); + errorResp.setMessage("系统异常:" + e.getMessage()); + return errorResp; } finally { + // 确保释放锁,且只能释放自己持有的锁 + if (locked && lock.isHeldByCurrentThread()) { + try { + lock.unlock(); + } catch (Exception e) { + log.error("释放分布式锁失败", e); + } + } MDC.remove(log_file_type); } } 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 deabd73..193fd82 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 @@ -6,12 +6,10 @@ 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 cn.hutool.http.HttpResponse; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; @@ -187,6 +185,7 @@ public class InstructionServiceImpl extends CommonServiceImpl instructionMybatis.like(InstructionMybatis::getInstruction_code, code).or().like(InstructionMybatis::getTask_code, code)); wrapper.like(StringUtils.isNotBlank(vehicle_code), InstructionMybatis::getVehicle_code, vehicle_code); wrapper.eq(StringUtils.isNotBlank(material_type), InstructionMybatis::getMaterial, material_type); + wrapper.eq(StringUtils.isNotBlank(priority), InstructionMybatis::getPriority, priority); wrapper.eq(StringUtils.isNotBlank(status), InstructionMybatis::getInstruction_status, status); wrapper.and(StringUtils.isNotBlank(point_code), instructionMybatis -> 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); @@ -368,7 +368,7 @@ public class InstructionServiceImpl extends CommonServiceImpl(taskMapper) .eq(Task::getTask_id, insttaskid) .one(); - // =0 则不用再次请求 + // =0 则不用再次请求,单路由任务 if (StrUtil.equals(task.getRequest_again(), "0")) { if (StrUtil.equals(task.getNext_device_code(), instnextdevice)) { taskService.finish(task.getTask_id()); } else { + //多路由任务 finishAndCreateNextInst((Instruction) entity); } } - + //查询是否存在出库任务,如果存在,按优先级和创建时间,创建1条出库任务的指令 + List taskList = new LambdaQueryChainWrapper<>(taskMapper) + .eq(Task::getTask_status, "0") + .eq(Task::getIs_delete, "0") + .eq(Task::getCar_type, task.getCar_type()) + .eq(Task::getTask_type, "1".equals(task.getTask_type()) ? "2" : "1") + .orderByDesc(Task::getPriority) + .orderByAsc(Task::getTask_code) + .list(); + //指令列表 + List instructionList = new LambdaQueryChainWrapper<>(instructionMapper) + .lt(InstructionMybatis::getInstruction_status, InstructionStatusEnum.FINISHED.getIndex()) + .list(); + if (ObjectUtil.isNotEmpty(taskList)) { + TaskDto acsTask = null; + List priorityTaskList = ConvertUtil.convertList(taskList, TaskDto.class); + if (task.getTask_type().equals("2")) { + //包含"BCPRK"或"CPRK"的任务 + List collection1 = new ArrayList<>(); + List collection2 = new ArrayList<>(); + // 分组任务 + for (TaskDto taskDto : priorityTaskList) { + String startDeviceCode = taskDto.getStart_device_code(); + if (startDeviceCode != null && (startDeviceCode.contains("BCPRK") || startDeviceCode.contains("CPRK"))) { + collection1.add(taskDto); + } else { + collection2.add(taskDto); + } + } + // 包含"BCPRK"或"CPRK"的指令 + List collection3 = new ArrayList<>(); + // 分组指令 + for (InstructionMybatis instruction : instructionList) { + String startDeviceCode = instruction.getStart_device_code(); + if (startDeviceCode != null && (startDeviceCode.contains("BCPRK") || startDeviceCode.contains("CPRK"))) { + collection3.add(instruction); + } + } + // 处理集合1与集合3的相同入库点 + if (ObjectUtil.isNotEmpty(collection1) && ObjectUtil.isNotEmpty(collection3)) { + // 获取集合3中所有startDeviceCode.split("-")[0] + Set collection3Prefixes = collection3.stream() + .map(InstructionMybatis::getStart_device_code) + .filter(code -> code != null && code.contains("-")) + .map(code -> code.split("-")[0]) + .collect(Collectors.toSet()); + // 移除不符合条件的任务 + collection1.removeIf(taskDto -> { + String startDeviceCode = taskDto.getStart_device_code(); + return startDeviceCode != null + && startDeviceCode.contains("-") + && collection3Prefixes.contains(startDeviceCode.split("-")[0]); + }); + } + if (ObjectUtil.isNotEmpty(collection1)) { + acsTask = collection1.get(0); + } else { + if (ObjectUtil.isNotEmpty(collection2)) { + acsTask = collection2.get(0); + } + } + } else { + acsTask = priorityTaskList.get(0); + } + if (acsTask != null) { + //优先级最高 + acsTask.setPriority("98"); + acsTask.setUpdate_time(DateUtil.now()); + taskService.update(acsTask); + } + } removeByCodeFromCache(entity.getInstruction_code()); // this.reload(); } diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/domain/Task.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/domain/Task.java index dd6ffc4..54d6472 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/domain/Task.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/domain/Task.java @@ -98,6 +98,9 @@ public class Task extends CommonModel implements Serializable { /** 起始点位编码 */ private String start_point_code; + /**车号*/ + private String car_no; + /** 起始设备编码 */ private String start_device_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 b462dee..a38c18d 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 @@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.util.List; import java.util.Map; /** @@ -115,6 +116,7 @@ public class TaskController { return new ResponseEntity<>(HttpStatus.OK); } + @Log("手动创建指令") /** 手动创建指令 */ @PostMapping(value = "/createInst/{id}") @@ -165,4 +167,14 @@ public class TaskController { taskService.downloadTaskLogging(taskService.getTaskList(whereJson), response); } + + + + @SaIgnore + @Log("查询任务报表") + /** 查询任务报表 */ + @PostMapping(value = "/queryTaskSheet") + public ResponseEntity queryTaskSheet(@RequestBody Map whereJson) { + return new ResponseEntity<>(taskService.queryTaskSheet(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 9e20fbd..1b4a1eb 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 @@ -8,6 +8,7 @@ import org.nl.acs.task.domain.Task; import org.nl.acs.task.service.dto.TaskDto; import org.nl.acs.task.service.dto.TaskQueryParam; import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @@ -143,6 +144,15 @@ public interface TaskService extends CommonService { */ List queryAllByStatus(String task_status); + /** + * 根据状态查询 + * + * @param task_status task_status + * @return AcsTask + */ + List queryAllByInStatus(Set task_status); + + /** * 查询所有数据不分页 @@ -495,4 +505,8 @@ public interface TaskService extends CommonService { * @return 指令终点 B */ String queryAssignedByDeviceCode(String device_code, String task_nextDeice_code); + + + + List queryTaskSheet(Map whereJson); } diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/dto/TaskDto.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/dto/TaskDto.java index a2a9f50..2ca39b5 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/dto/TaskDto.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/dto/TaskDto.java @@ -293,6 +293,12 @@ public class TaskDto implements Serializable { private String agv_system_type; + + /** + * 车号 + */ + private String car_no; + /** * 烘箱时间(s) */ 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 7cbcc74..bdd2db3 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 @@ -1,7 +1,7 @@ package org.nl.acs.task.service.impl; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.IdUtil; @@ -15,6 +15,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.jetbrains.annotations.NotNull; import org.nl.acs.AcsConfig; import org.nl.acs.agv.server.XianGongAgvService; @@ -29,13 +30,13 @@ import org.nl.acs.device.service.DeviceAssignedService; import org.nl.acs.device.service.DeviceService; import org.nl.acs.device.service.dto.DeviceAssignedDto; import org.nl.acs.device.service.impl.DeviceServiceImpl; -import org.nl.acs.device_driver.DeviceDriverDefination; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.instruction.domain.Instruction; import org.nl.acs.instruction.domain.InstructionMybatis; import org.nl.acs.instruction.enums.InstructionStatusEnum; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.InstructionDto; +import org.nl.acs.instruction.service.mapper.InstructionMapper; import org.nl.acs.opc.DeviceAppService; import org.nl.acs.opc.DeviceAppServiceImpl; import org.nl.acs.route.domain.RoutePlan; @@ -55,7 +56,6 @@ import org.nl.common.exception.BadRequestException; import org.nl.common.utils.CodeUtil; import org.nl.common.utils.FileUtil; import org.nl.common.utils.SecurityUtils; -import org.nl.common.utils.StringUtils; import org.nl.config.SpringContextHolder; import org.nl.config.language.LangProcess; import org.nl.system.service.param.ISysParamService; @@ -105,7 +105,8 @@ public class TaskServiceImpl extends CommonServiceImpl impleme private DeviceAssignedService deviceAssignedService; @Autowired private InstructionService instructionService; - + @Autowired + private InstructionMapper instructionMapper; /** * 缓存 * 存储未完成的任务信息 @@ -199,6 +200,16 @@ public class TaskServiceImpl extends CommonServiceImpl impleme return ConvertUtil.convertList(taskList, TaskDto.class); } + public List queryAllByInStatus(Set task_status) { + List taskList = new LambdaQueryChainWrapper<>(taskMapper) + .in(Task::getTask_status, task_status) + .eq(Task::getIs_delete, "0") + .orderByDesc(Task::getPriority) + .orderByAsc(Task::getTask_code) + .list(); + return ConvertUtil.convertList(taskList, TaskDto.class); + } + @Override public Map queryAll(Map whereJson, Pageable page) { @@ -208,6 +219,7 @@ public class TaskServiceImpl extends CommonServiceImpl impleme String status = (String) whereJson.get("status"); String point_code = (String) whereJson.get("point_code"); String is_over = (String) whereJson.get("is_over"); + String priority = (String) whereJson.get("priority"); IPage queryPage = PageUtil.toMybatisPage(page); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); @@ -220,6 +232,9 @@ public class TaskServiceImpl extends CommonServiceImpl impleme if (!StrUtil.isEmpty(material_type)) { wrapper.eq(Task::getMaterial, material_type); } + if (!StrUtil.isEmpty(priority)) { + wrapper.eq(Task::getPriority, priority); + } if (!StrUtil.isEmpty(status)) { wrapper.eq(Task::getTask_status, status); } @@ -233,14 +248,7 @@ public class TaskServiceImpl extends CommonServiceImpl impleme wrapper.lt(Task::getTask_status, TaskStatusEnum.FINISHED.getIndex()); } } - - // 关键修改:替换原有的 wrapper.le(Task::getTask_status, 1) - // 方案1:使用 in 方法,直接指定需要的 task_status 值(推荐,简洁高效) wrapper.in(Task::getTask_status, 1, 4 ,10 ,0); - -// 方案2:使用 or 拼接 eq 条件(效果与方案1一致,适合复杂条件扩展) -// wrapper.eq(Task::getTask_status, 1).or().eq(Task::getTask_status, 4); - wrapper.orderByDesc(Task::getCreate_time); IPage taskPage = taskMapper.selectPage(queryPage, wrapper); final JSONObject json = (JSONObject) JSON.toJSON(ConvertUtil.convertPage(taskPage, TaskDto.class)); @@ -313,6 +321,7 @@ public class TaskServiceImpl extends CommonServiceImpl impleme @Override public Map getAll(Map whereJson, Pageable page) { String task_code = (String) whereJson.get("task_code"); + String car_no = (String) whereJson.get("car_no"); String vehicle_code = (String) whereJson.get("vehicle_code"); String material_type = (String) whereJson.get("material_type"); String status = (String) whereJson.get("status"); @@ -322,6 +331,9 @@ public class TaskServiceImpl extends CommonServiceImpl impleme IPage queryPage = PageUtil.toMybatisPage(page); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (!StrUtil.isEmpty(car_no)) { + wrapper.eq(Task::getCar_no, car_no); + } if (!StrUtil.isEmpty(task_code)) { wrapper.eq(Task::getTask_code, task_code); } @@ -750,6 +762,7 @@ public class TaskServiceImpl extends CommonServiceImpl impleme //反馈上位系统任务状态 //判断是否为WMS下发的任务,如果是反馈任务状态给WMS String hasWms = paramService.findByCode(AcsConfig.HASWMS).getValue(); + //&& !StrUtil.equals(dto.getTask_status(),"0") if (!StrUtil.startWith(entity.getTask_code(), "-") && StrUtil.equals(hasWms, "1")&& !StrUtil.equals(dto.getTask_status(), "8")) { this.feedWmsTaskStatus(entity); } @@ -781,10 +794,22 @@ public class TaskServiceImpl extends CommonServiceImpl impleme entity.setUpdate_time(now); entity.setUpdate_by(currentUsername); entity.setTask_status(TaskStatusEnum.FINISHED.getIndex()); - + //车辆执行任务完成计时字段 + entity.setTo_y(now); Task task = ConvertUtil.convert(entity, Task.class); + if (StrUtil.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)); + } taskMapper.updateById(task); - //移除任务缓存信息 this.removeByCodeFromCache(entity.getTask_code()); //反馈上位系统任务状态 @@ -830,6 +855,7 @@ public class TaskServiceImpl extends CommonServiceImpl impleme //判断是否为WMS下发的任务,如果是反馈任务状态给WMS String hasWms = paramService.findByCode(AcsConfig.HASWMS).getValue(); if (!StrUtil.startWith(entity.getTask_code(), "-") && StrUtil.equals(hasWms, "1")) { + log.info("acs手动取消任务,任务号为:"+entity.getTask_code()); this.feedWmsTaskStatus(entity); } } @@ -847,7 +873,14 @@ public class TaskServiceImpl extends CommonServiceImpl impleme if (inst != null) { throw new BadRequestException(LangProcess.msg("task_insRun")); } - + int unfinishedInstructionCount = new LambdaQueryChainWrapper<>(instructionMapper) + .lt(InstructionMybatis::getInstruction_status, InstructionStatusEnum.FINISHED.getIndex()) + .count(); + String maxInstNumber = paramService.findByCode(AcsConfig.MAXINSTNUMBER).getValue(); + int maxInst = Integer.parseInt(maxInstNumber); + if (unfinishedInstructionCount >= maxInst) { + throw new BadRequestException("超过最大指令数:"+maxInstNumber+"个,请等待指令列表完成后再创建!"); + } String taskid = acsTask.getTask_id(); String taskcode = acsTask.getTask_code(); String car_type=acsTask.getCar_type(); @@ -1237,8 +1270,10 @@ public class TaskServiceImpl extends CommonServiceImpl impleme @NotNull private LambdaQueryWrapper getTaskLambdaQueryWrapper(Map whereJson) { String task_code = (String) whereJson.get("task_code"); + String task_type = (String) whereJson.get("task_type"); + String car_no = (String) whereJson.get("car_no"); String vehicle_code = (String) whereJson.get("vehicle_code"); - String material_type = (String) whereJson.get("material_type"); + // String material_type = (String) whereJson.get("material_type"); String status = (String) whereJson.get("status"); String point_code = (String) whereJson.get("point_code"); String create_time = (String) whereJson.get("createTime"); @@ -1248,12 +1283,15 @@ public class TaskServiceImpl extends CommonServiceImpl impleme if (!StrUtil.isEmpty(task_code)) { wrapper.eq(Task::getTask_code, task_code); } + if (!StrUtil.isEmpty(car_no)) { + wrapper.eq(Task::getCar_no, car_no); + } + if (!StrUtil.isEmpty(task_type)) { + wrapper.eq(Task::getTask_type, task_type); + } if (!StrUtil.isEmpty(vehicle_code)) { wrapper.like(Task::getVehicle_code, vehicle_code); } - if (!StrUtil.isEmpty(material_type)) { - wrapper.eq(Task::getMaterial, material_type); - } if (!StrUtil.isEmpty(status)) { wrapper.eq(Task::getTask_status, status); } @@ -1296,16 +1334,19 @@ public class TaskServiceImpl extends CommonServiceImpl impleme for (JSONObject jsonObject : taskAndInst) { Map map = new LinkedHashMap<>(); map.put("任务号", jsonObject.getString("task_code")); + map.put("任务类型", jsonObject.getString("task_type")); map.put("载具号", jsonObject.getString("vehicle_code")); - map.put("任务状态", jsonObject.getString("task_status")); map.put("任务优先级", jsonObject.getString("priority")); map.put("起点", jsonObject.getString("start_point_code")); map.put("终点", jsonObject.getString("next_point_code")); - map.put("物料", jsonObject.getString("matarial")); - map.put("数量", jsonObject.getString("quantity")); - map.put("备注", jsonObject.getString("remark")); - map.put("创建者", jsonObject.getString("create_by")); + map.put("车号", jsonObject.getString("car_no")); + map.put("车辆运行开始时间", jsonObject.getString("to_x")); + map.put("车辆运行结束时间", jsonObject.getString("to_y")); + map.put("车辆运行时长(分钟)", jsonObject.getString("to_z")); map.put("创建时间", jsonObject.getString("create_time")); + map.put("修改时间", jsonObject.getString("update_time")); + map.put("任务状态", jsonObject.getString("task_status")); + map.put("创建者", jsonObject.getString("create_by")); list.add(map); } FileUtil.downloadExcel(list, response); @@ -1313,17 +1354,19 @@ public class TaskServiceImpl extends CommonServiceImpl impleme @Override public List getTaskList(Map whereJson) { + whereJson.put("status", "2"); LambdaQueryWrapper wrapper = getTaskLambdaQueryWrapper(whereJson); List taskList = taskMapper.selectList(wrapper); return Optional .ofNullable(taskList) .orElse(new ArrayList<>()) - .stream() + .stream().sorted(Comparator.comparing(Task::getTo_x, Comparator.nullsLast(Comparator.naturalOrder()))) .map(task -> { JSONObject ins = new JSONObject(); ins.put("task_code", task.getTask_code()); + ins.put("task_type", "1".equals(task.getTask_type()) ? "入库" : "出库"); ins.put("vehicle_code", task.getVehicle_code()); - ins.put("task_status", task.getTask_status()); + ins.put("task_status", "完成"); ins.put("priority", task.getPriority()); ins.put("start_point_code", task.getStart_point_code()); ins.put("next_point_code", task.getNext_point_code()); @@ -1332,6 +1375,11 @@ public class TaskServiceImpl extends CommonServiceImpl impleme ins.put("remark", task.getRemark()); ins.put("create_by", task.getCreate_by()); ins.put("create_time", task.getCreate_time()); + ins.put("car_no", task.getCar_no()); + ins.put("to_x", task.getTo_x()); + ins.put("to_y", task.getTo_y()); + ins.put("to_z", task.getTo_z()); + ins.put("update_time", task.getUpdate_time()); return ins; }) .collect(Collectors.toList()); @@ -1485,4 +1533,111 @@ public class TaskServiceImpl extends CommonServiceImpl impleme } + + + + @Override + public List queryTaskSheet(Map whereJson) { + //日期格式"2026-05-21" + 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"; + } + } + //1.根据时间获取任务列表 + LambdaQueryWrapper wrapper = getTaskLambdaQueryWrapper(whereJson); + wrapper.between(Task::getCreate_time, create_time, end_time); + List taskList = taskMapper.selectList(wrapper); + // 计算耗时 (分钟) + java.util.function.Function durationCalculator = task -> { + if (StrUtil.isEmpty(task.getTo_x()) || StrUtil.isEmpty(task.getTo_y())) { + return -1; + } + try { + long start = DateUtil.parse(task.getTo_x()).getTime(); + long end = DateUtil.parse(task.getTo_y()).getTime(); + return (int) ((end - start) / 60000); + } catch (Exception e) { + return -1; + } + }; + // 2.区分出入库任务并分组统计 + // 入库任务 (type 1), 按next_point_code分组 + Map> inTaskMap = taskList.stream() + .filter(t -> "1".equals(t.getTask_type())) + .filter(t -> StrUtil.isNotEmpty(t.getTo_x()) && StrUtil.isNotEmpty(t.getTo_y())) + .collect(Collectors.groupingBy( + t -> { + String code = t.getNext_point_code(); + if (StrUtil.isNotEmpty(code)) { + if (code.contains("AB")) return "AB"; + if (code.contains("AD")) return "AD"; + if (code.contains("AC")) return "AC"; + } + return "OTHER"; + }, + Collectors.mapping(durationCalculator, Collectors.toList()) + )); + long inTotal = inTaskMap.values().stream().mapToLong(List::size).sum(); + + // 出库任务 (type 2), 按start_point_code分组 + Map> outTaskMap = taskList.stream() + .filter(t -> "2".equals(t.getTask_type())) + .filter(t -> StrUtil.isNotEmpty(t.getTo_x()) && StrUtil.isNotEmpty(t.getTo_y())) + .collect(Collectors.groupingBy( + t -> { + String code = t.getStart_point_code(); + if (StrUtil.isNotEmpty(code)) { + if (code.contains("AB")) return "AB"; + if (code.contains("AD")) return "AD"; + if (code.contains("AC")) return "AC"; + } + return "OTHER"; + }, + Collectors.mapping(durationCalculator, Collectors.toList()) + )); + long outTotal = outTaskMap.values().stream().mapToLong(List::size).sum(); + // 3.组装结果数据 + JSONObject result = new JSONObject(); + String[] groups = {"AB", "AD", "AC"}; + int itemIndex = 1; + for (String group : groups) { + List durations = inTaskMap.getOrDefault(group, new ArrayList<>()); + long total = inTotal == 0 ? 1 : inTotal; + long c1 = durations.stream().filter(d -> d >= 1 && d < 3).count(); + long c2 = durations.stream().filter(d -> d >= 3 && d < 5).count(); + long c3 = durations.stream().filter(d -> d >= 5 && d < 8).count(); + long c4 = durations.stream().filter(d -> d >= 8).count(); + result.put("item" + itemIndex, String.valueOf(c1 * 100 / total)); + result.put("item" + (itemIndex + 1), String.valueOf(c2 * 100 / total)); + result.put("item" + (itemIndex + 2), String.valueOf(c3 * 100 / total)); + result.put("item" + (itemIndex + 3), String.valueOf(c4 * 100 / total)); + itemIndex += 4; + } + for (String group : groups) { + List durations = outTaskMap.getOrDefault(group, new ArrayList<>()); + long total = outTotal == 0 ? 1 : outTotal; + long c1 = durations.stream().filter(d -> d >= 1 && d < 3).count(); + long c2 = durations.stream().filter(d -> d >= 3 && d < 5).count(); + long c3 = durations.stream().filter(d -> d >= 5 && d < 8).count(); + long c4 = durations.stream().filter(d -> d >= 8).count(); + result.put("item" + itemIndex, String.valueOf(c1 * 100 / total)); + result.put("item" + (itemIndex + 1), String.valueOf(c2 * 100 / total)); + result.put("item" + (itemIndex + 2), String.valueOf(c3 * 100 / total)); + result.put("item" + (itemIndex + 3), String.valueOf(c4 * 100 / total)); + itemIndex += 4; + } + return Collections.singletonList(result); + } + } 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 3743497..4840af7 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 @@ -2,13 +2,18 @@ package org.nl.system.service.quartz.task; 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.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; +import org.nl.acs.AcsConfig; import org.nl.acs.instruction.domain.Instruction; +import org.nl.acs.instruction.domain.InstructionMybatis; import org.nl.acs.instruction.enums.InstructionStatusEnum; import org.nl.acs.instruction.service.InstructionService; +import org.nl.acs.instruction.service.mapper.InstructionMapper; import org.nl.acs.opc.DeviceAppService; import org.nl.acs.opc.DeviceAppServiceImpl; import org.nl.acs.task.enums.TaskStatusEnum; @@ -20,9 +25,9 @@ import org.nl.config.SpringContextHolder; import org.nl.system.service.lucene.LuceneExecuteLogService; import org.nl.system.service.lucene.dto.LuceneLogDto; import org.nl.system.service.lucene.impl.LuceneExecuteLogServiceImpl; +import org.nl.system.service.param.ISysParamService; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; @@ -39,265 +44,284 @@ import java.util.stream.Collectors; @RequiredArgsConstructor public class AutoCreateInst { private final RedissonClient redissonClient; + private final ISysParamService paramService; + private final InstructionMapper instructionMapper; + private final TaskService taskserver; + private final InstructionService instructionService; + private final DeviceAppService appService; + private final LuceneExecuteLogService luceneExecuteLogService; /** * 根据任务状态创建指令、生成下一条指令 * 创建指令前需要判断是否条件具备:起始位置是否有货、目标位置是否有货 */ -// public void run() throws Exception { -// log.info("自动生成指令" + DateUtil.now()); -// TaskService taskserver = SpringContextHolder.getBean(TaskService.class); -// InstructionService instructionService = SpringContextHolder.getBean(InstructionService.class); -// RouteLineService routeLineService = SpringContextHolder.getBean(RouteLineService.class); -// DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class); -// LuceneExecuteLogService luceneExecuteLogService = SpringContextHolder.getBean(LuceneExecuteLogServiceImpl.class); -// List list = taskserver.queryAllByStatus("0"); -// for (int i = 0; i < list.size(); i++) { -// TaskDto acsTask = list.get(i); -// if (StrUtil.equals(acsTask.getTask_type(), TaskTypeEnum.AGV_Task.getIndex()) && !StrUtil.startWith(acsTask.getTask_code(), "-")) { -// continue; -// } -// if (StrUtil.equals(acsTask.getTask_type(), TaskTypeEnum.Truss_Task.getIndex()) && !StrUtil.startWith(acsTask.getTask_code(), "-")) { -// continue; -// } -// Boolean flag=false; -// String taskid = acsTask.getTask_id(); -// String taskcode = acsTask.getTask_code(); -// String task_type = acsTask.getTask_type(); -// String vehiclecode = acsTask.getVehicle_code(); -// String priority = acsTask.getPriority(); -// String is_send = acsTask.getIs_send(); -// -// String start_device_code = acsTask.getStart_device_code(); -// String start_point=null; -// if(start_device_code.contains("BCPRK")){ -// String[] parts = start_device_code.split("-", 2); -// start_point=parts[0]; -// }else if(start_device_code.contains("CPRK")){ -// String[] parts = start_device_code.split("-", 2); -// start_point=parts[0]; -// } -// if(start_point != null) { -// if (start_point.equals("CPRK1")) { -// List list1 = taskserver.queryAllByStatus("1"); -// for (int j = 0; j < list1.size(); j++) { -// String start_device_code1 = list1.get(j).getStart_device_code(); -// String[] parts = start_device_code1.split("-", 2); -// start_point = parts[0]; -// if (start_point.equals("CPRK1")) { -// flag = true; -// } -// } -// } else if (start_point.equals("CPRK2")) { -// List list1 = taskserver.queryAllByStatus("1"); -// for (int j = 0; j < list1.size(); j++) { -// String start_device_code1 = list1.get(j).getStart_device_code(); -// String[] parts = start_device_code1.split("-", 2); -// start_point = parts[0]; -// if (start_point.equals("CPRK2")) { -// flag = true; -// } -// } -// } else if (start_point.equals("CPRK3")) { -// List list1 = taskserver.queryAllByStatus("1"); -// for (int j = 0; j < list1.size(); j++) { -// String start_device_code1 = list1.get(j).getStart_device_code(); -// String[] parts = start_device_code1.split("-", 2); -// start_point = parts[0]; -// if (start_point.equals("CPRK3")) { -// flag = true; -// } -// } -// } else if (start_point.equals("CPRK4")) { -// List list1 = taskserver.queryAllByStatus("1"); -// for (int j = 0; j < list1.size(); j++) { -// String start_device_code1 = list1.get(j).getStart_device_code(); -// String[] parts = start_device_code1.split("-", 2); -// start_point = parts[0]; -// if (start_point.equals("CPRK4")) { -// flag = true; -// } -// } -// } else if (start_point.equals("CPRK5")) { -// List list1 = taskserver.queryAllByStatus("1"); -// for (int j = 0; j < list1.size(); j++) { -// String start_device_code1 = list1.get(j).getStart_device_code(); -// String[] parts = start_device_code1.split("-", 2); -// start_point = parts[0]; -// if (start_point.equals("CPRK5")) { -// flag = true; -// } -// } -// }else if (start_point.equals("BCPRK1")) { -// List list1 = taskserver.queryAllByStatus("1"); -// for (int j = 0; j < list1.size(); j++) { -// String start_device_code1 = list1.get(j).getStart_device_code(); -// String[] parts = start_device_code1.split("-", 2); -// start_point = parts[0]; -// if (start_point.equals("BCPRK1")) { -// flag = true; -// } -// } -// } else if (start_point.equals("BCPRK2")) { -// List list1 = taskserver.queryAllByStatus("1"); -// for (int j = 0; j < list1.size(); j++) { -// String start_device_code1 = list1.get(j).getStart_device_code(); -// String[] parts = start_device_code1.split("-", 2); -// start_point = parts[0]; -// if (start_point.equals("BCPRK2")) { -// flag = true; -// } -// } -// } else if (start_point.equals("BCPRK3")) { -// List list1 = taskserver.queryAllByStatus("1"); -// for (int j = 0; j < list1.size(); j++) { -// String start_device_code1 = list1.get(j).getStart_device_code(); -// String[] parts = start_device_code1.split("-", 2); -// start_point = parts[0]; -// if (start_point.equals("BCPRK3")) { -// flag = true; -// } -// } -// } else if (start_point.equals("BCPRK4")) { -// List list1 = taskserver.queryAllByStatus("1"); -// for (int j = 0; j < list1.size(); j++) { -// String start_device_code1 = list1.get(j).getStart_device_code(); -// String[] parts = start_device_code1.split("-", 2); -// start_point = parts[0]; -// if (start_point.equals("BCPRK4")) { -// flag = true; -// } -// } -// } else if (start_point.equals("BCPRK5")) { -// List list1 = taskserver.queryAllByStatus("1"); -// for (int j = 0; j < list1.size(); j++) { -// String start_device_code1 = list1.get(j).getStart_device_code(); -// String[] parts = start_device_code1.split("-", 2); -// start_point = parts[0]; -// if (start_point.equals("BCPRK5")) { -// flag = true; -// } -// } -// } -// } -// if (flag){ -// continue; -// } -// String start_point_code = acsTask.getStart_point_code(); -// -// String put_device_code = acsTask.getPut_device_code(); -// String put_point_code = acsTask.getPut_point_code(); -// -// String next_device_code = acsTask.getNext_device_code(); -// String next_point_code = acsTask.getNext_point_code(); -// -// String route_plan_code = acsTask.getRoute_plan_code(); -// String vehicleType = acsTask.getVehicle_type(); -// String agv_system_type = acsTask.getAgv_system_type(); -// -// String start_height = acsTask.getStart_height(); -// String next_height = acsTask.getNext_height(); -// String car_type=acsTask.getCar_type(); -// String car_width=acsTask.getCar_width(); -// -// -// if (StrUtil.equals(is_send, "0")) { -// continue; -// } -// -//// //校验路由关系 -//// List shortPathsList = routeLineService.getShortPathLines(start_device_code, next_device_code, route_plan_code); -//// if (ObjectUtils.isEmpty(shortPathsList)) { -//// acsTask.setRemark("路由不通无法生成指令"); -//// taskserver.updateByCodeFromCache(acsTask); -//// continue; -//// } -//// -//// if (!StrUtil.equals(shortPathsList.get(0).getType(), CommonFinalParam.ONE)) { -//// continue; -//// } -//// RouteLineDto routeLineDto = shortPathsList.get(0); -//// String path = routeLineDto.getPath(); -//// String type = routeLineDto.getType(); -//// String[] str = path.split("->"); -//// List pathlist = Arrays.asList(str); -//// int index = 0; -//// for (int m = 0; m < pathlist.size(); m++) { -//// if (pathlist.get(m).equals(start_device_code)) { -//// index = m + 1; -//// break; -//// } -//// } -//// next_device_code = pathlist.get(index); -// -// if (StrUtil.equals(appService.findDeviceTypeByCode(next_device_code), "storage")) { -// next_point_code = next_device_code + "-" + acsTask.getTo_y() + "-" + acsTask.getTo_z(); -// } else { -// next_point_code = next_device_code; -// } -// -// Instruction instdto = new Instruction(); -// instdto.setInstruction_type(task_type); -// instdto.setInstruction_id(IdUtil.simpleUUID()); -// instdto.setRoute_plan_code(route_plan_code); -// instdto.setRemark(acsTask.getRemark()); -// instdto.setMaterial(acsTask.getMaterial()); -// instdto.setQuantity(acsTask.getQuantity()); -// instdto.setTask_id(taskid); -// instdto.setTask_code(taskcode); -// instdto.setVehicle_code(vehiclecode); -// String now = DateUtil.now(); -// instdto.setCreate_time(now); -// instdto.setCreate_by(SecurityUtils.getCurrentNickName()); -// -// instdto.setStart_device_code(start_point_code); -// instdto.setStart_point_code(start_point_code); -// instdto.setPut_device_code(put_device_code); -// instdto.setPut_point_code(put_point_code); -// instdto.setNext_device_code(next_device_code); -// instdto.setNext_point_code(next_point_code); -// instdto.setCar_type(car_type); -// instdto.setCar_width(car_width); -// instdto.setPriority(priority); -// instdto.setInstruction_status(InstructionStatusEnum.READY.getIndex()); -// instdto.setExecute_device_code(start_point_code); -// instdto.setVehicle_type(vehicleType); -// instdto.setAgv_system_type(agv_system_type); -// instdto.setStart_height(start_height); -// instdto.setNext_height(next_height); -// -// try { -// instructionService.create(instdto); -// } catch (Exception e) { -// acsTask.setRemark(e.getMessage()); -// taskserver.updateByCodeFromCache(acsTask); -// LuceneLogDto logDto = LuceneLogDto.builder() -// .device_code("定时创建指令失败") -// .content(e.getMessage()) -// .build(); -// logDto.setLog_level(2); -// luceneExecuteLogService.deviceExecuteLog(logDto); -// continue; -// } -// //创建指令后修改任务状态 -// acsTask.setTask_status(TaskStatusEnum.BUSY.getIndex()); -// acsTask.setUpdate_time(DateUtil.now()); -// taskserver.update(acsTask); -// -// } -// } + public void run() throws Exception { + //log.info("自动生成指令开始: {}", DateUtil.now()); + RLock lock = redissonClient.getLock("autoGenInstructionLock"); + boolean locked = false; + try { + String maxPsnumber = paramService.findByCode(AcsConfig.MAXINSTNUMBER).getValue(); + String maxRtNumber = paramService.findByCode(AcsConfig.MAXRTINSTNUMBER).getValue(); + int maxPsInst = Integer.parseInt(maxPsnumber); + int maxRtnst = Integer.parseInt(maxRtNumber); + int rtInstNum = 0; + int psInstNum = 0; + long estimatedTime = (maxPsInst + maxRtnst) * 5L + 10; + locked = lock.tryLock(0, estimatedTime, TimeUnit.SECONDS); + if (!locked) { + //log.debug("未获取到分布式锁,跳过本次执行"); + return; + } + //限制指令数:每次最多下发maxInstNumber个指令 + List list = taskserver.queryAllByStatus("0"); + if (CollectionUtils.isEmpty(list)) { + return; + } + List pslist = list.stream().filter(r -> !"2".equals(r.getCar_type())).collect(Collectors.toList()); + List rtlist = list.stream().filter(r -> "2".equals(r.getCar_type())).collect(Collectors.toList()); + //已创建 + List instructionList = new LambdaQueryChainWrapper<>(instructionMapper) + .lt(InstructionMybatis::getInstruction_status, InstructionStatusEnum.FINISHED.getIndex()) + .list(); + if (ObjectUtil.isNotEmpty(instructionList)) { + rtInstNum = Math.toIntExact(instructionList.stream().filter(r -> "2".equals(r.getCar_type())).count()); + psInstNum = instructionList.size() - rtInstNum; + } + if (ObjectUtil.isNotEmpty(pslist)) { + maxPsInst = Math.max(0, maxPsInst - psInstNum); + createInstruction(pslist, maxPsInst); + } + if (ObjectUtil.isNotEmpty(rtlist)) { + maxRtnst = Math.max(0, maxRtnst - rtInstNum); + createInstruction(rtlist, maxRtnst); + } + } catch (Exception e) { + log.error("自动生成指令异常", e); + } finally { + if (locked && lock.isHeldByCurrentThread()) { + try { + lock.unlock(); + } catch (Exception e) { + log.error("释放分布式锁异常", e); + } + } + } + } + + + private void createInstruction(List list, int maxNum) throws InterruptedException { + int createdCount = 0; + for (int i = 0; i < list.size(); i++) { + //每次循环前检查本次已创建指令数是否达到上限 + if (createdCount >= maxNum) { + break; + } + TaskDto acsTask = list.get(i); + Boolean flag = false; + String taskid = acsTask.getTask_id(); + String taskcode = acsTask.getTask_code(); + String task_type = acsTask.getTask_type(); + String vehiclecode = acsTask.getVehicle_code(); + String priority = acsTask.getPriority(); + String is_send = acsTask.getIs_send(); + String start_device_code = acsTask.getStart_device_code(); + String start_point = null; + if (start_device_code.contains("BCPRK")) { + String[] parts = start_device_code.split("-", 2); + start_point = parts[0]; + } else if (start_device_code.contains("CPRK")) { + String[] parts = start_device_code.split("-", 2); + start_point = parts[0]; + } + if (start_point != null) { + if (start_point.equals("CPRK1")) { + List list1 = taskserver.queryAllByStatus("1"); + for (int j = 0; j < list1.size(); j++) { + String start_device_code1 = list1.get(j).getStart_device_code(); + String[] parts = start_device_code1.split("-", 2); + start_point = parts[0]; + if (start_point.equals("CPRK1")) { + flag = true; + } + } + } else if (start_point.equals("CPRK2")) { + List list1 = taskserver.queryAllByStatus("1"); + for (int j = 0; j < list1.size(); j++) { + String start_device_code1 = list1.get(j).getStart_device_code(); + String[] parts = start_device_code1.split("-", 2); + start_point = parts[0]; + if (start_point.equals("CPRK2")) { + flag = true; + } + } + } else if (start_point.equals("CPRK3")) { + List list1 = taskserver.queryAllByStatus("1"); + for (int j = 0; j < list1.size(); j++) { + String start_device_code1 = list1.get(j).getStart_device_code(); + String[] parts = start_device_code1.split("-", 2); + start_point = parts[0]; + if (start_point.equals("CPRK3")) { + flag = true; + } + } + } else if (start_point.equals("CPRK4")) { + List list1 = taskserver.queryAllByStatus("1"); + for (int j = 0; j < list1.size(); j++) { + String start_device_code1 = list1.get(j).getStart_device_code(); + String[] parts = start_device_code1.split("-", 2); + start_point = parts[0]; + if (start_point.equals("CPRK4")) { + flag = true; + } + } + } else if (start_point.equals("CPRK5")) { + List list1 = taskserver.queryAllByStatus("1"); + for (int j = 0; j < list1.size(); j++) { + String start_device_code1 = list1.get(j).getStart_device_code(); + String[] parts = start_device_code1.split("-", 2); + start_point = parts[0]; + if (start_point.equals("CPRK5")) { + flag = true; + } + } + } else if (start_point.equals("BCPRK1")) { + List list1 = taskserver.queryAllByStatus("1"); + for (int j = 0; j < list1.size(); j++) { + String start_device_code1 = list1.get(j).getStart_device_code(); + String[] parts = start_device_code1.split("-", 2); + start_point = parts[0]; + if (start_point.equals("BCPRK1")) { + flag = true; + } + } + } else if (start_point.equals("BCPRK2")) { + List list1 = taskserver.queryAllByStatus("1"); + for (int j = 0; j < list1.size(); j++) { + String start_device_code1 = list1.get(j).getStart_device_code(); + String[] parts = start_device_code1.split("-", 2); + start_point = parts[0]; + if (start_point.equals("BCPRK2")) { + flag = true; + } + } + } else if (start_point.equals("BCPRK3")) { + List list1 = taskserver.queryAllByStatus("1"); + for (int j = 0; j < list1.size(); j++) { + String start_device_code1 = list1.get(j).getStart_device_code(); + String[] parts = start_device_code1.split("-", 2); + start_point = parts[0]; + if (start_point.equals("BCPRK3")) { + flag = true; + } + } + } else if (start_point.equals("BCPRK4")) { + List list1 = taskserver.queryAllByStatus("1"); + for (int j = 0; j < list1.size(); j++) { + String start_device_code1 = list1.get(j).getStart_device_code(); + String[] parts = start_device_code1.split("-", 2); + start_point = parts[0]; + if (start_point.equals("BCPRK4")) { + flag = true; + } + } + } else if (start_point.equals("BCPRK5")) { + List list1 = taskserver.queryAllByStatus("1"); + for (int j = 0; j < list1.size(); j++) { + String start_device_code1 = list1.get(j).getStart_device_code(); + String[] parts = start_device_code1.split("-", 2); + start_point = parts[0]; + if (start_point.equals("BCPRK5")) { + flag = true; + } + } + } + } + if (flag) { + continue; + } + String start_point_code = acsTask.getStart_point_code(); + String put_device_code = acsTask.getPut_device_code(); + String put_point_code = acsTask.getPut_point_code(); + String next_device_code = acsTask.getNext_device_code(); + String next_point_code = acsTask.getNext_point_code(); + String route_plan_code = acsTask.getRoute_plan_code(); + String vehicleType = acsTask.getVehicle_type(); + String agv_system_type = acsTask.getAgv_system_type(); + String start_height = acsTask.getStart_height(); + String next_height = acsTask.getNext_height(); + String car_type = acsTask.getCar_type(); + String car_width = acsTask.getCar_width(); + if (StrUtil.equals(is_send, "0")) { + continue; + } + if (StrUtil.equals(appService.findDeviceTypeByCode(next_device_code), "storage")) { + next_point_code = next_device_code + "-" + acsTask.getTo_y() + "-" + acsTask.getTo_z(); + } else { + next_point_code = next_device_code; + } + Instruction instdto = new Instruction(); + instdto.setInstruction_type(task_type); + instdto.setInstruction_id(IdUtil.simpleUUID()); + instdto.setRoute_plan_code(route_plan_code); + instdto.setRemark(acsTask.getRemark()); + instdto.setMaterial(acsTask.getMaterial()); + instdto.setQuantity(acsTask.getQuantity()); + instdto.setTask_id(taskid); + instdto.setTask_code(taskcode); + instdto.setVehicle_code(vehiclecode); + String now = DateUtil.now(); + instdto.setCreate_time(now); + instdto.setCreate_by(SecurityUtils.getCurrentNickName()); + instdto.setStart_device_code(start_point_code); + instdto.setStart_point_code(start_point_code); + instdto.setPut_device_code(put_device_code); + instdto.setPut_point_code(put_point_code); + instdto.setNext_device_code(next_device_code); + instdto.setNext_point_code(next_point_code); + instdto.setCar_type(car_type); + instdto.setCar_width(car_width); + instdto.setPriority(priority); + instdto.setInstruction_status(InstructionStatusEnum.READY.getIndex()); + instdto.setExecute_device_code(start_point_code); + instdto.setVehicle_type(vehicleType); + instdto.setAgv_system_type(agv_system_type); + instdto.setStart_height(start_height); + instdto.setNext_height(next_height); + try { + instructionService.create(instdto); + } catch (Exception e) { + acsTask.setRemark(e.getMessage()); + taskserver.updateByCodeFromCache(acsTask); + LuceneLogDto logDto = LuceneLogDto.builder() + .device_code("定时创建指令失败") + .content(e.getMessage()) + .build(); + logDto.setLog_level(2); + luceneExecuteLogService.deviceExecuteLog(logDto); + continue; + } + TimeUnit.SECONDS.sleep(5); + //创建指令后修改任务状态 + acsTask.setTask_status(TaskStatusEnum.BUSY.getIndex()); + acsTask.setUpdate_time(DateUtil.now()); + taskserver.update(acsTask); + log.info("自动生成指令成功: {},{}", DateUtil.now(), acsTask.getTask_code()); + createdCount++; + } + } + /** * 根据任务状态创建指令、生成下一条指令 */ - public void run() throws Exception { - log.info("自动生成指令开始: {}", DateUtil.now()); + public void run1() throws Exception { + //log.info("自动生成指令开始: {}", DateUtil.now()); RLock lock = redissonClient.getLock("autoGenInstructionLock"); boolean locked = false; try { locked = lock.tryLock(0, 5, TimeUnit.SECONDS); // 不等待,锁持有5秒自动释放 if (!locked) { - log.debug("未获取到分布式锁,跳过本次执行"); + //log.debug("未获取到分布式锁,跳过本次执行"); return; } TaskService taskserver = SpringContextHolder.getBean(TaskService.class); 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 4dff837..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,8 @@ spring: freemarker: check-template-location: false profiles: - active: prod + active: dev + # active: dev # active: prod jackson: time-zone: GMT+8 diff --git a/acs/nladmin-ui/package.json b/acs/nladmin-ui/package.json index 700366a..0707f3b 100644 --- a/acs/nladmin-ui/package.json +++ b/acs/nladmin-ui/package.json @@ -5,8 +5,8 @@ "author": "Zheng Jie", "license": "Apache-2.0", "scripts": { - "dev": "vue-cli-service serve", - "dev1": "set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve", + "dev": "set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve", + "build": "set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build", "build:prod": "vue-cli-service build", "build:stage": "vue-cli-service build --mode staging", "preview": "node build/index.js --preview", diff --git a/acs/nladmin-ui/src/api/acs/task/task.js b/acs/nladmin-ui/src/api/acs/task/task.js index 7a7b8d7..3d15975 100644 --- a/acs/nladmin-ui/src/api/acs/task/task.js +++ b/acs/nladmin-ui/src/api/acs/task/task.js @@ -95,5 +95,13 @@ export function reload() { }) } -export default { add, edit, del, finish, cancel, createTaskByClick, deviceAskTask, ordinaryTaskCreate, specialTaskCreate, createInst, reload } +export function queryTaskSheet(data) { + return request({ + url: 'api/task/queryTaskSheet', + method: 'post', + data + }) +} + +export default { add, edit, del, finish, cancel, createTaskByClick, deviceAskTask, ordinaryTaskCreate, specialTaskCreate, createInst, reload, queryTaskSheet } diff --git a/acs/nladmin-ui/src/components/ShowTrack/index.vue b/acs/nladmin-ui/src/components/ShowTrack/index.vue index 4e5df96..ccf9724 100644 --- a/acs/nladmin-ui/src/components/ShowTrack/index.vue +++ b/acs/nladmin-ui/src/components/ShowTrack/index.vue @@ -27,15 +27,15 @@ export default { 'baseApi' ]) }, - async created() { - const res1 = await apiTrack.trackEdit() - this.configInfo = [...res1.content][0] - const res2 = await apiTrack.carEdit() - this.carData = [...res2.content] - this.deviceData = this.carData.map(e => { return { device_code: e.device_code } }) - this._queryDevice(this.deviceData) - this.timerFun(this._queryDevice, this.configInfo.refresh_time * 1000)() - }, + // async created() { + // const res1 = await apiTrack.trackEdit() + // this.configInfo = [...res1.content][0] + // const res2 = await apiTrack.carEdit() + // this.carData = [...res2.content] + // this.deviceData = this.carData.map(e => { return { device_code: e.device_code } }) + // this._queryDevice(this.deviceData) + // this.timerFun(this._queryDevice, this.configInfo.refresh_time * 1000)() + // }, methods: { timerFun(f, time) { const _this = this 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 dcedbed..cd02221 100644 --- a/acs/nladmin-ui/src/views/acs/history/instRecord/index.vue +++ b/acs/nladmin-ui/src/views/acs/history/instRecord/index.vue @@ -154,7 +154,20 @@ - + + + + + + + + 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 a68b83b..64796a3 100644 --- a/acs/nladmin-ui/src/views/acs/history/taskRecord/index.vue +++ b/acs/nladmin-ui/src/views/acs/history/taskRecord/index.vue @@ -32,20 +32,31 @@ @keyup.enter.native="crud.toQuery" /> - - + - - + @keyup.enter.native="crud.toQuery" + /> + + + + + + + + + + + + + + - + - - - - + + - - + + + + + + + + +