diff --git a/acs2/nladmin-system/doc/蓝芯调度系统-任务和设备接口协议V2.4.9(1).pdf b/acs2/nladmin-system/doc/蓝芯调度系统-任务和设备接口协议V2.4.9(1).pdf new file mode 100644 index 0000000..9161f62 Binary files /dev/null and b/acs2/nladmin-system/doc/蓝芯调度系统-任务和设备接口协议V2.4.9(1).pdf differ diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/AcsConfig.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/AcsConfig.java index 680f15f..4def3dd 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/AcsConfig.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/AcsConfig.java @@ -70,6 +70,31 @@ public interface AcsConfig { */ String WCSURL = "wcsurl"; + /** + * 蓝芯调度系统接口地址 + */ + String LXURL = "lxUrl"; + + /** + * 蓝芯调度系统请求token + */ + String LXTOKEN = "lxToken"; + + /** + * 蓝芯调度系统请求name + */ + String LXNAME = "lxName"; + + /** + * 蓝芯调度系统默认区域ID + */ + String LXAREAID = "lxAreaId"; + + /** + * 蓝芯调度系统默认地图ID + */ + String LXMAPID = "lxMapId"; + String HASOTHERSYSTEM = "hasOtherSystem"; String ERPURL = "erpurl"; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/rest/AcsToLxController.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/rest/AcsToLxController.java new file mode 100644 index 0000000..5a0910e --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/rest/AcsToLxController.java @@ -0,0 +1,160 @@ +package org.nl.acs.api.lx.rest; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.api.lx.service.AcsToLxService; +import org.nl.acs.api.lx.service.dto.LxGenericTemplateSubmitRequest; +import org.nl.acs.api.lx.service.dto.LxPauseAmrRequest; +import org.nl.acs.api.lx.service.dto.LxReassignRequest; +import org.nl.acs.api.lx.service.dto.LxShelfTaskSendRequest; +import org.nl.acs.api.lx.service.dto.LxTaskAddRequest; +import org.nl.acs.api.lx.service.dto.LxTaskChainTemplateListRequest; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/lx/acs") +@Slf4j +public class AcsToLxController { + + private final AcsToLxService acsToLxService; + + /** + * ACS请求蓝芯创建任务链。 + */ + @PostMapping("/task/add") + public ResponseEntity addTask(@RequestBody LxTaskAddRequest request) { + return new ResponseEntity(acsToLxService.addTask(request), HttpStatus.OK); + } + + /** + * ACS请求蓝芯按任务链ID查询任务状态。 + */ + @GetMapping("/task/getTaskChainByIds") + public ResponseEntity queryTaskChainByIds(@RequestParam List taskChainIds) { + return new ResponseEntity(acsToLxService.queryTaskChainByIds(taskChainIds), HttpStatus.OK); + } + + /** + * ACS请求蓝芯取消任务链。 + */ + @PostMapping("/task/cancel/{id}") + public ResponseEntity cancelTask(@PathVariable Long id) { + return new ResponseEntity(acsToLxService.cancelTask(id, null), HttpStatus.OK); + } + + /** + * ACS请求蓝芯强制或普通取消任务链。 + */ + @PostMapping("/task/cancel/{id}/{force}") + public ResponseEntity cancelTask(@PathVariable Long id, @PathVariable Boolean force) { + return new ResponseEntity(acsToLxService.cancelTask(id, force), HttpStatus.OK); + } + + /** + * ACS请求蓝芯按车辆改派任务。 + */ + @PutMapping("/taskChain/reassignByAmrId/{amrId}") + public ResponseEntity reassignByAmrId(@PathVariable Long amrId, @RequestBody LxReassignRequest request) { + return new ResponseEntity(acsToLxService.reassignByAmrId(amrId, request), HttpStatus.OK); + } + + /** + * ACS请求蓝芯按任务链改派任务。 + */ + @PutMapping("/taskChain/reassignByTaskChainId/{taskChainId}") + public ResponseEntity reassignByTaskChainId(@PathVariable Long taskChainId, @RequestBody LxReassignRequest request) { + return new ResponseEntity(acsToLxService.reassignByTaskChainId(taskChainId, request), HttpStatus.OK); + } + + /** + * ACS请求蓝芯按模板ID直接下发任务。 + */ + @GetMapping("/taskChainTemplate/submit/{id}") + public ResponseEntity submitTaskChainTemplate(@PathVariable Long id) { + return new ResponseEntity(acsToLxService.submitTaskChainTemplate(id), HttpStatus.OK); + } + + /** + * ACS请求蓝芯查询任务链模板列表。 + */ + @PostMapping("/taskChainTemplate/list") + public ResponseEntity listTaskChainTemplate(@RequestBody(required = false) LxTaskChainTemplateListRequest request) { + return new ResponseEntity(acsToLxService.listTaskChainTemplate(request), HttpStatus.OK); + } + + /** + * ACS请求蓝芯结束等待调度确认的任务链。 + */ + @GetMapping("/taskChain/endFinishPauseIsFalseTask/{taskChainId}") + public ResponseEntity endFinishPauseIsFalseTask(@PathVariable Long taskChainId) { + return new ResponseEntity(acsToLxService.endFinishPauseIsFalseTask(taskChainId), HttpStatus.OK); + } + + /** + * ACS请求蓝芯按通用模板提交任务。 + */ + @PostMapping("/taskChainTemplate/generic/submit") + public ResponseEntity submitGenericTemplate(@RequestBody LxGenericTemplateSubmitRequest request) { + return new ResponseEntity(acsToLxService.submitGenericTemplate(request), HttpStatus.OK); + } + + /** + * ACS请求蓝芯查询在线车辆信息。 + */ + @GetMapping("/amr/onlineAmr") + public ResponseEntity onlineAmr() { + return new ResponseEntity(acsToLxService.onlineAmr(), HttpStatus.OK); + } + + /** + * ACS请求蓝芯同步指定地图的点位数据。 + */ + @GetMapping("/map/getMapVertexes/{mapId}") + public ResponseEntity getMapVertexes(@PathVariable Long mapId) { + return new ResponseEntity(acsToLxService.getMapVertexes(mapId), HttpStatus.OK); + } + + /** + * ACS请求蓝芯暂停车辆。 + */ + @PostMapping("/amr/taskCommand/pause/{amrId}") + public ResponseEntity pauseAmr(@PathVariable Long amrId, @RequestBody(required = false) LxPauseAmrRequest request) { + return new ResponseEntity(acsToLxService.pauseAmr(amrId, request), HttpStatus.OK); + } + + /** + * ACS请求蓝芯恢复车辆。 + */ + @PostMapping("/amr/taskCommand/resume/{amrId}") + public ResponseEntity resumeAmr(@PathVariable Long amrId) { + return new ResponseEntity(acsToLxService.resumeAmr(amrId), HttpStatus.OK); + } + + /** + * ACS请求蓝芯修改任务链优先级。 + */ + @GetMapping("/task/priority") + public ResponseEntity changeTaskPriority(@RequestParam Long taskChainId, @RequestParam Integer priority) { + return new ResponseEntity(acsToLxService.changeTaskPriority(taskChainId, priority), HttpStatus.OK); + } + + /** + * ACS请求蓝芯下发货架任务。 + */ + @PostMapping("/shelf/task/send") + public ResponseEntity sendShelfTask(@RequestBody LxShelfTaskSendRequest request) { + return new ResponseEntity(acsToLxService.sendShelfTask(request), HttpStatus.OK); + } +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/rest/LxToAcsController.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/rest/LxToAcsController.java new file mode 100644 index 0000000..36e7243 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/rest/LxToAcsController.java @@ -0,0 +1,29 @@ +package org.nl.acs.api.lx.rest; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.api.lx.service.LxToAcsService; +import org.nl.acs.api.lx.service.dto.LxTaskInfoCallbackDto; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/lx") +@Slf4j +public class LxToAcsController { + + private final LxToAcsService lxToAcsService; + + /** + * 蓝芯回调ACS任务执行状态。 + */ + @PostMapping("/push/taskInfo") + public ResponseEntity receiveTaskInfo(@RequestBody LxTaskInfoCallbackDto request) { + return new ResponseEntity<>(lxToAcsService.receiveTaskInfo(request), HttpStatus.OK); + } +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/AcsToLxService.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/AcsToLxService.java new file mode 100644 index 0000000..1c14d2c --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/AcsToLxService.java @@ -0,0 +1,89 @@ +package org.nl.acs.api.lx.service; + +import org.nl.acs.api.lx.service.dto.LxBaseResponse; +import org.nl.acs.api.lx.service.dto.LxGenericTemplateSubmitRequest; +import org.nl.acs.api.lx.service.dto.LxPauseAmrRequest; +import org.nl.acs.api.lx.service.dto.LxReassignRequest; +import org.nl.acs.api.lx.service.dto.LxShelfTaskSendRequest; +import org.nl.acs.api.lx.service.dto.LxTaskAddRequest; +import org.nl.acs.api.lx.service.dto.LxTaskChainTemplateListRequest; + +import java.util.List; + +public interface AcsToLxService { + + /** + * 向蓝芯下发任务链和子任务,生成调度任务。 + */ + LxBaseResponse addTask(LxTaskAddRequest request); + + /** + * 根据任务链ID列表查询任务链执行信息。 + */ + LxBaseResponse queryTaskChainByIds(List taskChainIds); + + /** + * 取消指定任务链,可选择是否强制取消。 + */ + LxBaseResponse cancelTask(Long id, Boolean force); + + /** + * 按车辆改派任务,将指定车辆后续动作切换为新的任务点。 + */ + LxBaseResponse reassignByAmrId(Long amrId, LxReassignRequest request); + + /** + * 按任务链改派任务,将指定任务链后续动作切换为新的任务点。 + */ + LxBaseResponse reassignByTaskChainId(Long taskChainId, LxReassignRequest request); + + /** + * 根据蓝芯任务链模板ID直接下发任务。 + */ + LxBaseResponse submitTaskChainTemplate(Long id); + + /** + * 查询蓝芯任务链模板列表。 + */ + LxBaseResponse listTaskChainTemplate(LxTaskChainTemplateListRequest request); + + /** + * 结束处于调度确认等待中的任务链。 + */ + LxBaseResponse endFinishPauseIsFalseTask(Long taskChainId); + + /** + * 按通用模板并结合外部传入点位参数生成任务。 + */ + LxBaseResponse submitGenericTemplate(LxGenericTemplateSubmitRequest request); + + /** + * 查询在线车辆状态、电量、坐标和异常等信息。 + */ + LxBaseResponse onlineAmr(); + + /** + * 按地图ID同步地图点位信息。 + */ + LxBaseResponse getMapVertexes(Long mapId); + + /** + * 暂停车辆,可指定是否立即停车。 + */ + LxBaseResponse pauseAmr(Long amrId, LxPauseAmrRequest request); + + /** + * 恢复已暂停的车辆继续执行任务。 + */ + LxBaseResponse resumeAmr(Long amrId); + + /** + * 调整未执行任务链的优先级。 + */ + LxBaseResponse changeTaskPriority(Long taskChainId, Integer priority); + + /** + * 下发货架搬运任务。 + */ + LxBaseResponse sendShelfTask(LxShelfTaskSendRequest request); +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/LxToAcsService.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/LxToAcsService.java new file mode 100644 index 0000000..c6d6645 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/LxToAcsService.java @@ -0,0 +1,12 @@ +package org.nl.acs.api.lx.service; + +import org.nl.acs.api.lx.service.dto.LxReceiveResponse; +import org.nl.acs.api.lx.service.dto.LxTaskInfoCallbackDto; + +public interface LxToAcsService { + + /** + * 接收蓝芯回传的任务链和子任务执行状态。 + */ + LxReceiveResponse receiveTaskInfo(LxTaskInfoCallbackDto request); +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxBaseResponse.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxBaseResponse.java new file mode 100644 index 0000000..582d1d3 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxBaseResponse.java @@ -0,0 +1,40 @@ +package org.nl.acs.api.lx.service.dto; + +import lombok.Data; + +@Data +public class LxBaseResponse { + + /** + * 蓝芯接口业务状态。 + */ + private Boolean state; + /** + * 蓝芯业务错误码。 + */ + private String errCode; + /** + * 蓝芯业务错误描述。 + */ + private String errMsg; + /** + * 蓝芯接口返回数据。 + */ + private Object data; + /** + * HTTP状态码。 + */ + private Integer httpStatus; + /** + * 实际请求地址。 + */ + private String url; + /** + * 接口耗时。 + */ + private Long duration; + /** + * 当响应无法解析时保留原始响应体。 + */ + private String rawBody; +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxGenericTemplateSubmitRequest.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxGenericTemplateSubmitRequest.java new file mode 100644 index 0000000..3c68fc5 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxGenericTemplateSubmitRequest.java @@ -0,0 +1,60 @@ +package org.nl.acs.api.lx.service.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class LxGenericTemplateSubmitRequest { + + /** + * 是否需要蓝芯回传任务状态。 + */ + private Integer isReturn; + + /** + * 模板ID,与name二选一。 + */ + private Long id; + + /** + * 模板名称,与id二选一。 + */ + private String name; + + /** + * 指定车辆ID。 + */ + private Long amrId; + + /** + * 指定车辆分组ID。 + */ + private Long groupId; + + /** + * 任务优先级。 + */ + private Integer priority; + + /** + * 模板动态点位参数列表。 + */ + private List targets; + + @Data + public static class Target { + /** + * 地图ID。 + */ + private Long mapId; + /** + * 点位编号。 + */ + private String code; + /** + * 点位扩展参数。 + */ + private String extend; + } +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxPauseAmrRequest.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxPauseAmrRequest.java new file mode 100644 index 0000000..5f3168a --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxPauseAmrRequest.java @@ -0,0 +1,17 @@ +package org.nl.acs.api.lx.service.dto; + +import lombok.Data; + +@Data +public class LxPauseAmrRequest { + + /** + * 车辆ID。 + */ + private Long amrId; + + /** + * 是否立即停车。 + */ + private Boolean stopNow; +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxReassignRequest.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxReassignRequest.java new file mode 100644 index 0000000..813574f --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxReassignRequest.java @@ -0,0 +1,40 @@ +package org.nl.acs.api.lx.service.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class LxReassignRequest { + + /** + * 改派起始位置。 + */ + private Double sequence; + + /** + * 是否保留后续子任务。 + */ + private Boolean isRetained; + + /** + * 改派后的任务列表。 + */ + private List reassignTasks; + + @Data + public static class ReassignTask { + /** + * 子任务动作类型。 + */ + private String taskType; + /** + * 地图ID。 + */ + private Long mapId; + /** + * 目标点编号。 + */ + private String endPointCode; + } +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxReceiveResponse.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxReceiveResponse.java new file mode 100644 index 0000000..adaecef --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxReceiveResponse.java @@ -0,0 +1,12 @@ +package org.nl.acs.api.lx.service.dto; + +import lombok.Data; + +@Data +public class LxReceiveResponse { + + /** + * 蓝芯回调接收确认,固定返回1表示收到。 + */ + private Integer receive; +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxShelfTaskSendRequest.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxShelfTaskSendRequest.java new file mode 100644 index 0000000..e093f9c --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxShelfTaskSendRequest.java @@ -0,0 +1,58 @@ +package org.nl.acs.api.lx.service.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class LxShelfTaskSendRequest { + + /** + * 货架任务列表。 + */ + private List shelfTaskInfo; + + @Data + public static class ShelfTaskInfo { + /** + * 货架编号。 + */ + private String shelfCode; + /** + * 货架型号编号。 + */ + private String shelfModelCode; + /** + * 容器类型。 + */ + private String containerType; + /** + * 上游任务号。 + */ + private String taskId; + /** + * 任务名称。 + */ + private String taskName; + /** + * 区域编号。 + */ + private String areaCode; + /** + * 起点编号。 + */ + private String startCode; + /** + * 终点编号。 + */ + private String destCode; + /** + * 任务优先级。 + */ + private Integer priority; + /** + * 指定执行分组。 + */ + private Long groupId; + } +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxTaskAddRequest.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxTaskAddRequest.java new file mode 100644 index 0000000..1420b27 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxTaskAddRequest.java @@ -0,0 +1,75 @@ +package org.nl.acs.api.lx.service.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class LxTaskAddRequest { + + /** + * 任务链公共参数。 + */ + private TaskChain taskChain; + + /** + * 子任务列表。 + */ + private List tasks; + + @Data + public static class TaskChain { + /** + * 任务链优先级。 + */ + private Integer priority; + /** + * 指定执行车辆。 + */ + private Long amrId; + /** + * 指定执行分组。 + */ + private Long groupId; + /** + * 上游任务号。 + */ + private String taskSeq; + /** + * 请求来源。 + */ + private String fromDetail; + /** + * 是否需要蓝芯回传任务状态。 + */ + private Integer isReturn; + /** + * 区域ID。 + */ + private Long areaId; + /** + * 任务名称。 + */ + private String name; + } + + @Data + public static class TaskItem { + /** + * 子任务动作类型,如O1、O13、E2。 + */ + private String taskType; + /** + * 地图ID。 + */ + private Long mapId; + /** + * 目标点编号。 + */ + private String endPointCode; + /** + * 任务扩展参数。 + */ + private String extend; + } +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxTaskChainTemplateListRequest.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxTaskChainTemplateListRequest.java new file mode 100644 index 0000000..203d77f --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxTaskChainTemplateListRequest.java @@ -0,0 +1,27 @@ +package org.nl.acs.api.lx.service.dto; + +import lombok.Data; + +@Data +public class LxTaskChainTemplateListRequest { + + /** + * 车辆分组ID。 + */ + private Long groupId; + + /** + * 模板名称,支持模糊查询。 + */ + private String name; + + /** + * 当前页码。 + */ + private Integer currentPage; + + /** + * 每页条数。 + */ + private Integer pageSize; +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxTaskInfoCallbackDto.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxTaskInfoCallbackDto.java new file mode 100644 index 0000000..67e9cf6 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/dto/LxTaskInfoCallbackDto.java @@ -0,0 +1,110 @@ +package org.nl.acs.api.lx.service.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class LxTaskInfoCallbackDto { + + /** + * 任务链ID。 + */ + private Long taskChainId; + /** + * 任务链名称。 + */ + private String taskChainName; + /** + * 区域ID。 + */ + private Long areaId; + /** + * 任务链创建时间。 + */ + private Long createTime; + /** + * 任务链开始时间。 + */ + private Long chainStartTime; + /** + * 任务链结束时间。 + */ + private Long chainFinishTime; + /** + * 请求来源。 + */ + private String fromDetail; + /** + * 扩展参数。 + */ + private String extend; + /** + * 小车状态ID。 + */ + private Integer stateId; + /** + * 小车状态名称。 + */ + private String state; + /** + * 货架或物料信息。 + */ + private List materials; + /** + * 任务状态。 + */ + private Integer status; + /** + * 子任务ID。 + */ + private Long taskId; + /** + * 小车实际动作类型。 + */ + private Integer action; + /** + * 子任务类型。 + */ + private String taskType; + /** + * 车辆ID。 + */ + private Long amrId; + /** + * 目标点编号。 + */ + private String endPointCode; + /** + * 地图ID。 + */ + private Long mapId; + /** + * 子任务开始时间。 + */ + private Long startTime; + /** + * 子任务结束时间。 + */ + private Long finishTime; + /** + * 上下料属性。 + */ + private Integer loading; + + @Data + public static class MaterialDto { + /** + * 物料编码集合。 + */ + private List code; + /** + * 物料位置。 + */ + private String position; + /** + * 货架码或补充信息。 + */ + private String info; + } +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/impl/AcsToLxServiceImpl.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/impl/AcsToLxServiceImpl.java new file mode 100644 index 0000000..1cbc99e --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/impl/AcsToLxServiceImpl.java @@ -0,0 +1,471 @@ +package org.nl.acs.api.lx.service.impl; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSON; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.nl.acs.AcsConfig; +import org.nl.acs.api.lx.service.AcsToLxService; +import org.nl.acs.api.lx.service.dto.LxBaseResponse; +import org.nl.acs.api.lx.service.dto.LxGenericTemplateSubmitRequest; +import org.nl.acs.api.lx.service.dto.LxPauseAmrRequest; +import org.nl.acs.api.lx.service.dto.LxReassignRequest; +import org.nl.acs.api.lx.service.dto.LxShelfTaskSendRequest; +import org.nl.acs.api.lx.service.dto.LxTaskAddRequest; +import org.nl.acs.api.lx.service.dto.LxTaskChainTemplateListRequest; +import org.nl.system.service.param.ISysParamService; +import org.nl.system.service.param.dao.Param; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +@Slf4j +public class AcsToLxServiceImpl implements AcsToLxService { + + private static final int TIMEOUT = 8000; + private static final String DEFAULT_TOKEN = "admin123"; + private static final String DEFAULT_NAME = "lx-script"; + + private final ISysParamService paramService; + + /** + * 调用蓝芯任务下发接口。 + */ + @Override + public LxBaseResponse addTask(LxTaskAddRequest request) { + String url = buildUrl("/task/add"); + if (StringUtils.isBlank(url)) { + return buildMissingUrlResponse(); + } + String body = JSON.toJSONString(request); + long start = System.currentTimeMillis(); + try { + HttpResponse response = HttpRequest.post(url) + .header("token", resolveParam(AcsConfig.LXTOKEN, DEFAULT_TOKEN)) + .header("name", resolveParam(AcsConfig.LXNAME, DEFAULT_NAME)) + .header("Content-Type", "application/json;charset=UTF-8") + .body(body) + .timeout(TIMEOUT) + .execute(); + return buildResponse(response, url, start); + } catch (Exception ex) { + return buildErrorResponse(url, start, ex); + } + } + + /** + * 调用蓝芯任务链查询接口。 + */ + @Override + public LxBaseResponse queryTaskChainByIds(List taskChainIds) { + String url = buildUrl("/task/getTaskChainByIds"); + if (StringUtils.isBlank(url)) { + return buildMissingUrlResponse(); + } + long start = System.currentTimeMillis(); + try { + HttpResponse response = HttpRequest.get(url) + .header("token", resolveParam(AcsConfig.LXTOKEN, DEFAULT_TOKEN)) + .header("name", resolveParam(AcsConfig.LXNAME, DEFAULT_NAME)) + .form("taskChainIds", taskChainIds) + .timeout(TIMEOUT) + .execute(); + return buildResponse(response, url, start); + } catch (Exception ex) { + return buildErrorResponse(url, start, ex); + } + } + + /** + * 调用蓝芯任务取消接口。 + */ + @Override + public LxBaseResponse cancelTask(Long id, Boolean force) { + String url; + if (force == null) { + url = buildUrl("/task/cancel/" + id); + } else { + url = buildUrl("/task/cancel/" + id + "/" + force); + } + if (StringUtils.isBlank(url)) { + return buildMissingUrlResponse(); + } + long start = System.currentTimeMillis(); + try { + HttpResponse response = HttpRequest.post(url) + .header("token", resolveParam(AcsConfig.LXTOKEN, DEFAULT_TOKEN)) + .header("name", resolveParam(AcsConfig.LXNAME, DEFAULT_NAME)) + .timeout(TIMEOUT) + .execute(); + return buildResponse(response, url, start); + } catch (Exception ex) { + return buildErrorResponse(url, start, ex); + } + } + + /** + * 调用蓝芯按车辆改派接口。 + */ + @Override + public LxBaseResponse reassignByAmrId(Long amrId, LxReassignRequest request) { + String url = buildUrl("/taskChain/reassignByAmrId/" + amrId); + if (StringUtils.isBlank(url)) { + return buildMissingUrlResponse(); + } + String body = JSON.toJSONString(request); + long start = System.currentTimeMillis(); + try { + HttpResponse response = HttpRequest.put(url) + .header("token", resolveParam(AcsConfig.LXTOKEN, DEFAULT_TOKEN)) + .header("name", resolveParam(AcsConfig.LXNAME, DEFAULT_NAME)) + .header("Content-Type", "application/json;charset=UTF-8") + .body(body) + .timeout(TIMEOUT) + .execute(); + return buildResponse(response, url, start); + } catch (Exception ex) { + return buildErrorResponse(url, start, ex); + } + } + + /** + * 调用蓝芯按任务链改派接口。 + */ + @Override + public LxBaseResponse reassignByTaskChainId(Long taskChainId, LxReassignRequest request) { + String url = buildUrl("/taskChain/reassignByTaskChainId/" + taskChainId); + if (StringUtils.isBlank(url)) { + return buildMissingUrlResponse(); + } + String body = JSON.toJSONString(request); + long start = System.currentTimeMillis(); + try { + HttpResponse response = HttpRequest.put(url) + .header("token", resolveParam(AcsConfig.LXTOKEN, DEFAULT_TOKEN)) + .header("name", resolveParam(AcsConfig.LXNAME, DEFAULT_NAME)) + .header("Content-Type", "application/json;charset=UTF-8") + .body(body) + .timeout(TIMEOUT) + .execute(); + return buildResponse(response, url, start); + } catch (Exception ex) { + return buildErrorResponse(url, start, ex); + } + } + + /** + * 调用蓝芯任务链模板下发接口。 + */ + @Override + public LxBaseResponse submitTaskChainTemplate(Long id) { + String url = buildUrl("/taskChainTemplate/submit/" + id); + if (StringUtils.isBlank(url)) { + return buildMissingUrlResponse(); + } + long start = System.currentTimeMillis(); + try { + HttpResponse response = HttpRequest.get(url) + .header("token", resolveParam(AcsConfig.LXTOKEN, DEFAULT_TOKEN)) + .header("name", resolveParam(AcsConfig.LXNAME, DEFAULT_NAME)) + .timeout(TIMEOUT) + .execute(); + return buildResponse(response, url, start); + } catch (Exception ex) { + return buildErrorResponse(url, start, ex); + } + } + + /** + * 调用蓝芯任务链模板查询接口。 + */ + @Override + public LxBaseResponse listTaskChainTemplate(LxTaskChainTemplateListRequest request) { + String url = buildUrl("/taskChainTemplate/list"); + if (StringUtils.isBlank(url)) { + return buildMissingUrlResponse(); + } + String body = JSON.toJSONString(request); + long start = System.currentTimeMillis(); + try { + HttpResponse response = HttpRequest.post(url) + .header("token", resolveParam(AcsConfig.LXTOKEN, DEFAULT_TOKEN)) + .header("name", resolveParam(AcsConfig.LXNAME, DEFAULT_NAME)) + .header("Content-Type", "application/json;charset=UTF-8") + .body(body) + .timeout(TIMEOUT) + .execute(); + return buildResponse(response, url, start); + } catch (Exception ex) { + return buildErrorResponse(url, start, ex); + } + } + + /** + * 调用蓝芯结束调度确认任务接口。 + */ + @Override + public LxBaseResponse endFinishPauseIsFalseTask(Long taskChainId) { + String url = buildUrl("/taskChain/endFinishPauseIsFalseTask/" + taskChainId); + if (StringUtils.isBlank(url)) { + return buildMissingUrlResponse(); + } + long start = System.currentTimeMillis(); + try { + HttpResponse response = HttpRequest.get(url) + .header("token", resolveParam(AcsConfig.LXTOKEN, DEFAULT_TOKEN)) + .header("name", resolveParam(AcsConfig.LXNAME, DEFAULT_NAME)) + .timeout(TIMEOUT) + .execute(); + return buildResponse(response, url, start); + } catch (Exception ex) { + return buildErrorResponse(url, start, ex); + } + } + + /** + * 调用蓝芯通用模板任务提交接口。 + */ + @Override + public LxBaseResponse submitGenericTemplate(LxGenericTemplateSubmitRequest request) { + String url = buildUrl("/taskChainTemplate/generic/submit"); + if (StringUtils.isBlank(url)) { + return buildMissingUrlResponse(); + } + String body = JSON.toJSONString(request); + long start = System.currentTimeMillis(); + try { + HttpResponse response = HttpRequest.post(url) + .header("token", resolveParam(AcsConfig.LXTOKEN, DEFAULT_TOKEN)) + .header("name", resolveParam(AcsConfig.LXNAME, DEFAULT_NAME)) + .header("Content-Type", "application/json;charset=UTF-8") + .body(body) + .timeout(TIMEOUT) + .execute(); + return buildResponse(response, url, start); + } catch (Exception ex) { + return buildErrorResponse(url, start, ex); + } + } + + /** + * 调用蓝芯在线车辆查询接口。 + */ + @Override + public LxBaseResponse onlineAmr() { + String url = buildUrl("/amr/onlineAmr"); + if (StringUtils.isBlank(url)) { + return buildMissingUrlResponse(); + } + long start = System.currentTimeMillis(); + try { + HttpResponse response = HttpRequest.get(url) + .header("token", resolveParam(AcsConfig.LXTOKEN, DEFAULT_TOKEN)) + .header("name", resolveParam(AcsConfig.LXNAME, DEFAULT_NAME)) + .timeout(TIMEOUT) + .execute(); + return buildResponse(response, url, start); + } catch (Exception ex) { + return buildErrorResponse(url, start, ex); + } + } + + /** + * 调用蓝芯地图点位同步接口。 + */ + @Override + public LxBaseResponse getMapVertexes(Long mapId) { + String url = buildUrl("/map/getMapVertexes/" + mapId); + if (StringUtils.isBlank(url)) { + return buildMissingUrlResponse(); + } + long start = System.currentTimeMillis(); + try { + HttpResponse response = HttpRequest.get(url) + .header("token", resolveParam(AcsConfig.LXTOKEN, DEFAULT_TOKEN)) + .header("name", resolveParam(AcsConfig.LXNAME, DEFAULT_NAME)) + .timeout(TIMEOUT) + .execute(); + return buildResponse(response, url, start); + } catch (Exception ex) { + return buildErrorResponse(url, start, ex); + } + } + + /** + * 调用蓝芯暂停车辆接口。 + */ + @Override + public LxBaseResponse pauseAmr(Long amrId, LxPauseAmrRequest request) { + String url = buildUrl("/amr/taskCommand/pause/" + amrId); + if (StringUtils.isBlank(url)) { + return buildMissingUrlResponse(); + } + String body = JSON.toJSONString(request); + long start = System.currentTimeMillis(); + try { + HttpResponse response = HttpRequest.post(url) + .header("token", resolveParam(AcsConfig.LXTOKEN, DEFAULT_TOKEN)) + .header("name", resolveParam(AcsConfig.LXNAME, DEFAULT_NAME)) + .header("Content-Type", "application/json;charset=UTF-8") + .body(body) + .timeout(TIMEOUT) + .execute(); + return buildResponse(response, url, start); + } catch (Exception ex) { + return buildErrorResponse(url, start, ex); + } + } + + /** + * 调用蓝芯恢复车辆接口。 + */ + @Override + public LxBaseResponse resumeAmr(Long amrId) { + String url = buildUrl("/amr/taskCommand/resume/" + amrId); + if (StringUtils.isBlank(url)) { + return buildMissingUrlResponse(); + } + long start = System.currentTimeMillis(); + try { + HttpResponse response = HttpRequest.post(url) + .header("token", resolveParam(AcsConfig.LXTOKEN, DEFAULT_TOKEN)) + .header("name", resolveParam(AcsConfig.LXNAME, DEFAULT_NAME)) + .timeout(TIMEOUT) + .execute(); + return buildResponse(response, url, start); + } catch (Exception ex) { + return buildErrorResponse(url, start, ex); + } + } + + /** + * 调用蓝芯任务优先级调整接口。 + */ + @Override + public LxBaseResponse changeTaskPriority(Long taskChainId, Integer priority) { + String url = buildUrl("/task/priority"); + if (StringUtils.isBlank(url)) { + return buildMissingUrlResponse(); + } + long start = System.currentTimeMillis(); + try { + HttpResponse response = HttpRequest.get(url) + .header("token", resolveParam(AcsConfig.LXTOKEN, DEFAULT_TOKEN)) + .header("name", resolveParam(AcsConfig.LXNAME, DEFAULT_NAME)) + .form("taskChainId", taskChainId) + .form("priority", priority) + .timeout(TIMEOUT) + .execute(); + return buildResponse(response, url, start); + } catch (Exception ex) { + return buildErrorResponse(url, start, ex); + } + } + + /** + * 调用蓝芯货架任务下发接口。 + */ + @Override + public LxBaseResponse sendShelfTask(LxShelfTaskSendRequest request) { + String url = buildUrl("/shelf/task/send"); + if (StringUtils.isBlank(url)) { + return buildMissingUrlResponse(); + } + String body = JSON.toJSONString(request); + long start = System.currentTimeMillis(); + try { + HttpResponse response = HttpRequest.post(url) + .header("token", resolveParam(AcsConfig.LXTOKEN, DEFAULT_TOKEN)) + .header("name", resolveParam(AcsConfig.LXNAME, DEFAULT_NAME)) + .header("Content-Type", "application/json;charset=UTF-8") + .body(body) + .timeout(TIMEOUT) + .execute(); + return buildResponse(response, url, start); + } catch (Exception ex) { + return buildErrorResponse(url, start, ex); + } + } + + private LxBaseResponse buildResponse(HttpResponse response, String url, long start) { + LxBaseResponse result; + try { + result = JSON.parseObject(response.body(), LxBaseResponse.class); + if (result == null) { + result = new LxBaseResponse(); + } + } catch (Exception ex) { + result = new LxBaseResponse(); + result.setState(Boolean.TRUE); + result.setRawBody(response.body()); + } + result.setHttpStatus(response.getStatus()); + result.setUrl(url); + result.setDuration(System.currentTimeMillis() - start); + return result; + } + + private LxBaseResponse buildErrorResponse(String url, long start, Exception ex) { + LxBaseResponse result = new LxBaseResponse(); + result.setState(Boolean.FALSE); + result.setErrCode("LX_HTTP_ERROR"); + result.setErrMsg(ex.getMessage()); + result.setUrl(url); + result.setDuration(System.currentTimeMillis() - start); + return result; + } + + private LxBaseResponse buildMissingUrlResponse() { + LxBaseResponse result = new LxBaseResponse(); + result.setState(Boolean.FALSE); + result.setErrCode("LX_URL_MISSING"); + result.setErrMsg("未配置蓝芯接口地址,请先配置参数 lxUrl 或 agvurl/agvport"); + return result; + } + + private String buildUrl(String path) { + String baseUrl = resolveBaseUrl(); + if (StringUtils.isBlank(baseUrl)) { + return null; + } + return StringUtils.removeEnd(baseUrl, "/") + path; + } + + private String resolveBaseUrl() { + String lxUrl = resolveParam(AcsConfig.LXURL, null); + if (StringUtils.isNotBlank(lxUrl)) { + return lxUrl; + } + String agvUrl = resolveParam(AcsConfig.AGVURL, null); + String agvPort = resolveParam(AcsConfig.AGVPORT, null); + if (StringUtils.isBlank(agvUrl)) { + return null; + } + if (StringUtils.startsWithIgnoreCase(agvUrl, "http://") || StringUtils.startsWithIgnoreCase(agvUrl, "https://")) { + if (StringUtils.isNotBlank(agvPort) && !agvUrl.contains(":" + agvPort)) { + return StringUtils.removeEnd(agvUrl, "/") + ":" + agvPort; + } + return agvUrl; + } + if (StringUtils.isBlank(agvPort)) { + return "http://" + agvUrl; + } + return "http://" + agvUrl + ":" + agvPort; + } + + private String resolveParam(String code, String defaultValue) { + try { + Param param = paramService.findByCode(code); + if (param != null && StringUtils.isNotBlank(param.getValue())) { + return param.getValue(); + } + } catch (Exception ex) { + log.debug("load param {} failed", code, ex); + } + return defaultValue; + } +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/impl/LxToAcsServiceImpl.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/impl/LxToAcsServiceImpl.java new file mode 100644 index 0000000..1340ea8 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/lx/service/impl/LxToAcsServiceImpl.java @@ -0,0 +1,72 @@ +package org.nl.acs.api.lx.service.impl; + +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.nl.acs.api.lx.service.AcsToLxService; +import org.nl.acs.api.lx.service.LxToAcsService; +import org.nl.acs.api.lx.service.dto.LxBaseResponse; +import org.nl.acs.api.lx.service.dto.LxReceiveResponse; +import org.nl.acs.api.lx.service.dto.LxTaskInfoCallbackDto; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +@Slf4j +public class LxToAcsServiceImpl implements LxToAcsService { + + private final AcsToLxService acsToLxService; + + /** + * 接收蓝芯任务状态回调,并按协议返回receive=1。 + * 当前仅处理以下6类业务判断: + * 1. 上报车号 + * 2. 执行中 + * 3. 取消 + * 4. 完成 + * 5. 进入某个点请求 + * 6. 离开某个点请求 + */ + @Override + public LxReceiveResponse receiveTaskInfo(LxTaskInfoCallbackDto request) { + log.info("LX -> ACS taskInfo callback: {}", JSONObject.toJSONString(request)); + if (request != null) { + if (request.getAmrId() != null) { + log.info("LX -> ACS vehicle report, amrId={}", request.getAmrId()); + } + + if (request.getStatus() != null) { + if (request.getStatus() == 1) { + + } + if (request.getStatus() == 3) { + + } + if (request.getStatus() == 2 || request.getStatus() == 7) { + + } + } + + if (StringUtils.equalsIgnoreCase(request.getTaskType(), "E2")) { + + if (request.getTaskChainId() != null) { + LxBaseResponse response = acsToLxService.endFinishPauseIsFalseTask(request.getTaskChainId()); + + } else { + + } + } + + if (request.getStatus() != null + && (request.getStatus() == 2 || request.getStatus() == 7) + && StringUtils.isNotBlank(request.getEndPointCode()) + && !StringUtils.equalsIgnoreCase(request.getTaskType(), "E2")) { + + } + } + LxReceiveResponse result = new LxReceiveResponse(); + result.setReceive(1); + return result; + } +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/enums/DeviceType.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/enums/DeviceType.java index 93c4056..111e444 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/enums/DeviceType.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/enums/DeviceType.java @@ -12,7 +12,7 @@ public enum DeviceType { scanner("条码阅读器-BCR", 6), screen("LED点阵屏", 7), storage("货架", 8), - robot("机械手", 9), + robot("机器人", 9), autodoor("自动门", 10), plc("plc", 11), group("设备组", 12), diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/conveyor/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/conveyor/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java index bffb4b9..9b0c975 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/conveyor/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/conveyor/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java @@ -73,7 +73,7 @@ public class StandardOrdinarySiteDeviceDriver extends AbstractDeviceDriver imple @Override public void execute() { try { - Thread.sleep(2000); + // Thread.sleep(2000); this.deviceCode = this.getDevice().getDevice_code(); if (this.reqTakeRequireSuccess && ObjectUtil.isNotEmpty(this.reqTakeInstCode)) { Instruction instruction = instructionService.findByCodeFromCache(this.reqTakeInstCode); diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/robot/standard_wall_robat/ItemProtocol.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/robot/standard_wall_robat/ItemProtocol.java new file mode 100644 index 0000000..586a73e --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/robot/standard_wall_robat/ItemProtocol.java @@ -0,0 +1,165 @@ +package org.nl.acs.device.device_driver.robot.standard_wall_robat; + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.device.device.domain.ItemDto; + +import java.util.ArrayList; +import java.util.List; + +@Slf4j +@Data +public class ItemProtocol { + + /** + * 1-空闲、2-工作中、3-完成 + */ + public static String item_mode = "mode"; + /** + * 1-设备正常(允许工作)、2-设备故障(不允许工作) + */ + public static String item_error = "error"; + /** + * 0-禁止写入、1-允许接收、2-接收完成 + */ + public static String item_status = "status"; + /** + * 任务号 + */ + public static String item_task = "task"; + /** + * 下发出入库类型1-入库、2-出库 + */ + public static String item_to_inout_type = "to_inout_type"; + /** + * 下发AB库1-A库、2-B库 + */ + public static String item_to_warehouse = "to_warehouse"; + /** + * 下发暂存库位行0 + */ + public static String item_to_temp_row = "to_temp_row"; + /** + * 下发暂存库位列0-14 + */ + public static String item_to_temp_col = "to_temp_col"; + /** + * 下发存储库位位1位2 1-2,每个库2两存储位,正常排 + */ + public static String item_to_storage_slot = "to_storage_slot"; + /** + * 下发存储库位行 0-13,正常层 + */ + public static String item_to_storage_row = "to_storage_row"; + /** + * 下发存储库位列 0-19,正常列 + */ + public static String item_to_storage_col = "to_storage_col"; + /** + * 下发任务号 + */ + public static String item_to_task = "to_task"; + /** + * 反馈收到任务完成 1 + */ + public static String item_to_command = "to_command"; + + + private StandardWallRobotDeviceDriver driver; + + + public ItemProtocol(StandardWallRobotDeviceDriver driver) { + this.driver = driver; + } + + + public int getMode() { + return this.getOpcIntegerValue(item_mode); + } + + public int getError() { + return this.getOpcIntegerValue(item_error); + } + + public int getStatus() { + return this.getOpcIntegerValue(item_status); + } + + public int getTask() { + return this.getOpcIntegerValue(item_task); + } + + public int getToInoutType() { + return this.getOpcIntegerValue(item_to_inout_type); + } + + public int getToWarehouse() { + return this.getOpcIntegerValue(item_to_warehouse); + } + + public int getToTempRow() { + return this.getOpcIntegerValue(item_to_temp_row); + } + + public int getToTempCol() { + return this.getOpcIntegerValue(item_to_temp_col); + } + + public int getToStorageSlot() { + return this.getOpcIntegerValue(item_to_storage_slot); + } + + public int getToStorageRow() { + return this.getOpcIntegerValue(item_to_storage_row); + } + + public int getToStorageCol() { + return this.getOpcIntegerValue(item_to_storage_col); + } + + public int getToTask() { + return this.getOpcIntegerValue(item_to_task); + } + + + public int getToCommand() { + return this.getOpcIntegerValue(item_to_command); + } + + + public int getOpcIntegerValue(String protocol) { + Integer value = this.driver.getIntegeregerValue(protocol); + if (value == null) { + this.driver.setIsOnline(false); + } else { + this.driver.setIsOnline(true); + return value; + } + return 0; + } + + public static List getReadableItemDtos() { + ArrayList list = new ArrayList(); + list.add(new ItemDto(item_mode, "工作模式", "40651")); + list.add(new ItemDto(item_error, "报警信号", "40652")); + list.add(new ItemDto(item_status, "状态", "40653")); + list.add(new ItemDto(item_task, "任务号", "40654")); + return list; + } + + public static List getWriteableItemDtos() { + ArrayList list = new ArrayList(); + list.add(new ItemDto(item_to_inout_type, "下发出入库类型(1-入库、2-出库)", "40641")); + list.add(new ItemDto(item_to_warehouse, "下发AB库(1-A库、2-B库)", "40642")); + list.add(new ItemDto(item_to_temp_row, "下发暂存库位行(默认0)", "40643")); + list.add(new ItemDto(item_to_temp_col, "下发暂存库位列(0-14)", "40644")); + list.add(new ItemDto(item_to_storage_slot, "下发存储库位排(1-2)", "40645")); + list.add(new ItemDto(item_to_storage_row, "下发存储库位层(0-13)", "40646")); + list.add(new ItemDto(item_to_storage_col, "下发存储库位列(0-19)", "40647")); + list.add(new ItemDto(item_to_task, "下发任务号", "40648")); + list.add(new ItemDto(item_to_command, "下发收到任务完成", "40649")); + return list; + } + +} + diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/robot/standard_wall_robat/StandardWallRobotDefination.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/robot/standard_wall_robat/StandardWallRobotDefination.java new file mode 100644 index 0000000..706edce --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/robot/standard_wall_robat/StandardWallRobotDefination.java @@ -0,0 +1,61 @@ +package org.nl.acs.device.device_driver.robot.standard_wall_robat; + +import org.nl.acs.device.device.domain.Device; +import org.nl.acs.device.device.domain.ItemDto; +import org.nl.acs.device.device.enums.DeviceType; +import org.nl.acs.device.device_driver.DeviceDriver; +import org.nl.acs.device.device_driver.defination.OpcDeviceDriverDefination; +import org.springframework.stereotype.Service; + +import java.util.LinkedList; +import java.util.List; + +/** + * 说明:壁挂机器人 + */ +@Service +public class StandardWallRobotDefination implements OpcDeviceDriverDefination { + @Override + public String getDriverCode() { + return "standard_wall_robot"; + } + + @Override + public String getDriverName() { + return "标准版-壁挂机器人"; + } + + @Override + public String getDriverDescription() { + return "标准版-壁挂机器人"; + } + + @Override + public DeviceDriver getDriverInstance(Device device) { + return (new StandardWallRobotDeviceDriver()).setDevice(device).setDriverDefination(this); + + } + + @Override + public Class getDeviceDriverType() { + return StandardWallRobotDeviceDriver.class; + } + + @Override + public List getFitDeviceTypes() { + List types = new LinkedList(); + types.add(DeviceType.robot); + return types; + } + + @Override + public List getReadableItemDtos() { + return ItemProtocol.getReadableItemDtos(); + } + + @Override + public List getWriteableItemDtos() { + return ItemProtocol.getWriteableItemDtos(); + } + +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/robot/standard_wall_robat/StandardWallRobotDeviceDriver.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/robot/standard_wall_robat/StandardWallRobotDeviceDriver.java new file mode 100644 index 0000000..92ee33f --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/robot/standard_wall_robat/StandardWallRobotDeviceDriver.java @@ -0,0 +1,480 @@ +package org.nl.acs.device.device_driver.robot.standard_wall_robat; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.google.common.util.concurrent.Uninterruptibles; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.nl.acs.api.kit.service.AcsToKitService; +import org.nl.acs.device.device.domain.Device; +import org.nl.acs.device.device_driver.DeviceDriver; +import org.nl.acs.device.device_driver.RouteableDeviceDriver; +import org.nl.acs.device.device_driver.driver.AbstractOpcDeviceDriver; +import org.nl.acs.device.device_driver.driver.ExecutableDeviceDriver; +import org.nl.acs.iot.opc.DeviceAppService; +import org.nl.acs.layout.device.DeviceStageMonitor; +import org.nl.acs.task.instruction.domain.Instruction; +import org.nl.acs.task.instruction.enums.InstTypeEnum; +import org.nl.acs.task.instruction.enums.InstructionStatusEnum; +import org.nl.acs.task.instruction.service.InstructionService; +import org.nl.acs.task.task.enums.TaskStatusEnum; +import org.nl.acs.task.task.enums.TaskTypeEnum; +import org.nl.acs.task.task.service.TaskService; +import org.nl.acs.task.task.service.dto.TaskDto; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.CodeUtil; +import org.nl.common.utils.SecurityUtils; +import org.nl.config.SpringContextHolder; +import org.nl.config.lucene.service.LuceneExecuteLogService; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + + +/** + * 壁挂机器人 + */ +@Slf4j +@Data +@RequiredArgsConstructor +public class StandardWallRobotDeviceDriver extends AbstractOpcDeviceDriver implements DeviceDriver, ExecutableDeviceDriver, RouteableDeviceDriver, DeviceStageMonitor { + + protected ItemProtocol itemProtocol = new ItemProtocol(this); + + private final LuceneExecuteLogService logService = SpringContextHolder.getBean(LuceneExecuteLogService.class); + private final InstructionService instructionService = SpringContextHolder.getBean(InstructionService.class); + private final TaskService taskService = SpringContextHolder.getBean(TaskService.class); + private final AcsToKitService acsToKitService = SpringContextHolder.getBean(AcsToKitService.class); + private final DeviceAppService deviceAppService = SpringContextHolder.getBean(DeviceAppService.class); + + /** + * 设备在线标记 + */ + private Boolean isOnline = true; + + /** + * 设备报警标记 + */ + private Boolean isError = false; + + /** + * 请求标记 + */ + private boolean requireSuccess = false; + + /** + * 记录出入库标记,保证出入库均衡分配。如果是false,则认为是上一个出库任务,则下一个任务下发入库任务 + */ + private Boolean inOutFlag = false; + + /** + * 请求时间 + */ + private long requireTime = System.currentTimeMillis(); + + /** + * 请求间隔时间 + */ + private long requireTimeOut = 3000L; + + /** + * 工作模式 + */ + private int mode = 0; + private int last_mode = 0; + + /** + * 报警信号 + */ + private int error = 0; + private int last_error = 0; + + /** + * 状态 + */ + private int status = 0; + private int last_status = 0; + + /** + * 任务号 + */ + private int task = 0; + private int last_task = 0; + + /** + * 下发出入库类型 + */ + private int to_inout_type = 0; + private int last_to_inout_type = 0; + + /** + * 下发AB库 + */ + private int to_warehouse = 0; + private int last_to_warehouse = 0; + + /** + * 下发暂存位行 + */ + private int to_temp_row = 0; + private int last_to_temp_row = 0; + + /** + * 下发暂存位列 + */ + private int to_temp_col = 0; + private int last_to_temp_col = 0; + + /** + * 下发存储库位排 + */ + private int to_storage_slot = 0; + private int last_to_storage_slot = 0; + + /** + * 下发存储库位层 + */ + private int to_storage_row = 0; + private int last_to_storage_row = 0; + + /** + * 下发存储库位列 + */ + private int to_storage_col = 0; + private int last_to_storage_col = 0; + + /** + * 下发任务号 + */ + private int to_task = 0; + private int last_to_task = 0; + + /** + * 下发反馈收到任务完成 + */ + private int to_command = 0; + private int last_to_command = 0; + + /** + * 消息 + */ + private String message = null; + + /** + * 当前设备号 + */ + private String currentDeviceCode = null; + + @Override + public Device getDevice() { + return this.device; + } + + + @Override + public void execute() { + try { + this.mode = this.itemProtocol.getMode(); + this.error = this.itemProtocol.getError(); + this.status = this.itemProtocol.getStatus(); + this.task = this.itemProtocol.getTask(); + this.to_inout_type = this.itemProtocol.getToInoutType(); + this.to_warehouse = this.itemProtocol.getToWarehouse(); + this.to_temp_row = this.itemProtocol.getToTempRow(); + this.to_temp_col = this.itemProtocol.getToTempCol(); + this.to_storage_slot = this.itemProtocol.getToStorageSlot(); + this.to_storage_row = this.itemProtocol.getToStorageRow(); + this.to_storage_col = this.itemProtocol.getToStorageCol(); + this.to_task = this.itemProtocol.getToTask(); + this.to_command = this.itemProtocol.getToCommand(); + + if (this.mode != this.last_mode) { + System.out.println("mode由" + this.last_mode + "->" + this.mode); + //mode值不是工作中,复位任务下发执行标记 + if (this.mode != 2) { + System.out.println("复位请求标记:" + requireSuccess); + this.requireSuccess = false; + } + } + if (this.status != this.last_status) { + System.out.println("status由" + this.last_status + "->" + this.status); + } + + if (this.task != this.last_task) { + System.out.println("task由" + this.last_task + "->" + this.task); + } + + if (mode == 2){ + Instruction inst = this.instructionService.findByCodeFromCache(String.valueOf(this.task)); + if (inst != null && InstructionStatusEnum.READY.getIndex().equals(inst.instruction_status)){ + inst.setInstruction_status(InstructionStatusEnum.BUSY.getIndex()); + instructionService.update(inst); + } + } + + if (mode == 3 && !requireSuccess) { + Instruction inst = this.instructionService.findByCodeFromCache(String.valueOf(this.task)); + if (inst != null) { + instructionService.finish(inst.getInstruction_id()); + Map param = new HashMap<>(); + param.put("to_command", 1); + this.writing(param); + this.requireSuccess = true; + } + } + + if (!this.isOnline) { + this.message = "设备离线"; + } else if (this.error == 2) { + this.message = "设备报警"; + this.isError = true; + } else if (this.status == 0) { + this.message = "设备禁止写入"; + this.isError = true; + } else { + this.isError = false; + this.isOnline = true; + this.message = null; + + if (this.mode == 1 && this.error == 1 && this.status == 1 && !this.requireSuccess) { + this.executeTask(); + } + + } + } catch (Exception e) { + //logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "当前设备执行逻辑报错,错误堆栈信息: " + Arrays.toString(e.getStackTrace()))); + Uninterruptibles.sleepUninterruptibly(5, TimeUnit.SECONDS); + } + + this.last_mode = this.mode; + this.last_error = this.error; + this.last_status = this.status; + this.last_task = this.task; + this.last_to_inout_type = this.to_inout_type; + this.last_to_warehouse = this.to_warehouse; + this.last_to_temp_row = this.to_temp_row; + this.last_to_temp_col = this.to_temp_col; + this.last_to_storage_slot = this.to_storage_slot; + this.last_to_storage_row = this.to_storage_row; + this.last_to_storage_col = this.to_storage_col; + this.last_to_task = this.to_task; + this.last_to_command = this.to_command; + } + + + public void writing(Map param) { + String to_param = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code(); + Map newParam = param.entrySet().stream().collect(Collectors.toMap(entry -> to_param + "." + entry.getKey(), Map.Entry::getValue)); + try { + this.checkcontrol(newParam); + System.out.println("下发PLC信号:" + JSON.toJSONString(param)); + //logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "下发PLC信号成功" + param)); + } catch (Exception e) { + //logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "下发PLC信号失败" + param)); + } + } + + @Override + public JSONObject getDeviceStatusName() { + JSONObject jo = new JSONObject(); + return jo; + } + + @Override + public void setDeviceStatus(JSONObject data) { + + } + + private boolean isTimeValid(long currentTimeMillis) { + return currentTimeMillis - this.requireTime >= this.requireTimeOut; + } + + private Device getRequiredDevice(String deviceCode, String errorMessage) { + Device device = deviceAppService.findDeviceByCode(deviceCode); + if (device == null) { + this.message = errorMessage; + } + return device; + } + + private Integer getRequiredExtraValue(Device device, String key, String errorMessage) { + Integer value = Optional.ofNullable(device.getExtraValue().get(key)) + .map(Object::toString) + .map(Integer::parseInt) + .orElse(-1); + if (value == -1) { + this.message = errorMessage; + } + return value; + } + + private boolean dispatchInstruction(Instruction inst, boolean inbound, boolean storageAreaFromStart, + String slotValue, String rowValue, String colValue) { + Device startDevice = getRequiredDevice(inst.getStart_device_code(), "指令起点不存在"); + if (startDevice == null) { + return false; + } + Device nextDevice = getRequiredDevice(inst.getNext_device_code(), "指令终点不存在"); + if (nextDevice == null) { + return false; + } + + Device storageAreaDevice = storageAreaFromStart ? startDevice : nextDevice; + Device tempDevice = inbound ? startDevice : nextDevice; + Integer storage_area = getRequiredExtraValue(storageAreaDevice, "storage_area", "A/B库配置错误"); + if (storage_area == -1) { + return false; + } + Integer temp_row = getRequiredExtraValue(tempDevice, "temp_z", "暂存库位行配置错误"); + if (temp_row == -1) { + return false; + } + Integer temp_col = getRequiredExtraValue(tempDevice, "temp_y", "暂存库位列配置错误"); + if (temp_col == -1) { + return false; + } + + Map param = new HashMap<>(); + param.put("to_inout_type", inst.getInstruction_type()); + param.put("to_warehouse", storage_area); + param.put("to_temp_row", temp_row); + param.put("to_temp_col", temp_col); + param.put("to_storage_slot", Integer.parseInt(slotValue)); + param.put("to_storage_row", Integer.parseInt(rowValue) - 1); + param.put("to_storage_col", Integer.parseInt(colValue) - 1); + param.put("to_task", inst.getInstruction_code()); + this.writing(param); + this.inOutFlag = inbound; + this.requireSuccess = true; + return true; + } + + private void executeTask() { + long currentTimeMillis = System.currentTimeMillis(); + if (!isTimeValid(currentTimeMillis)) { + log.trace("触发时间因为小于{}毫秒,而被无视", this.requireTimeOut); + } else { + this.requireTime = currentTimeMillis; + //先查询当前任务号,是否存在 + //若存在直接return + Instruction instruction = instructionService.findByCodeFromCache(String.valueOf(this.task)); + if (ObjectUtil.isNotEmpty(instruction)) { + this.message = "存在执行中的任务,不再下发"; + return; + } + //如果上一个任务是出库任务 + if (!inOutFlag) { + //先查询是否存在就绪状态下的入库指令,如果存在就下发壁挂机器人入库信息 + Instruction inInst = instructionService.findByInstType(InstTypeEnum.WALL_ROBOT_IN.getCode()); + if (ObjectUtil.isNotEmpty(inInst)) { + if (dispatchInstruction(inInst, true, false, inInst.getTo_x(), inInst.getTo_z(), inInst.getTo_y())) { + return; + } + return; + } + //如果不存在就绪状态下的入库指令,则查询是否存在就绪状态下的出库指令 + Instruction outInst = instructionService.findByInstType(InstTypeEnum.WALL_ROBOT_OUT.getCode()); + if (ObjectUtil.isNotEmpty(outInst)) { + if (dispatchInstruction(outInst, false, true, outInst.getFrom_x(), outInst.getTo_z(), outInst.getFrom_y())) { + return; + } + return; + } + //如果不存在就绪状态下的出库指令,查询就绪状态下的入库任务,并按照优先级、时间进行排序 + TaskDto inTask = taskService.findByTaskType(TaskTypeEnum.WALL_ROBOT_IN.getCode()); + if (ObjectUtil.isNotEmpty(inTask)) { + //创建指令 + Instruction inst = this.packInst(inTask); + if (dispatchInstruction(inst, true, false, inst.getTo_x(), inst.getTo_z(), inst.getTo_y())) { + return; + } + return; + } + //如果不存在入库任务,查询出库任务,并按照优先级、时间进行排序 + TaskDto outTask = taskService.findByTaskType(TaskTypeEnum.WALL_ROBOT_OUT.getCode()); + if (ObjectUtil.isNotEmpty(outTask)) { + //创建指令 + Instruction inst = this.packInst(outTask); + dispatchInstruction(inst, false, true, inst.getFrom_x(), inst.getTo_z(), inst.getFrom_y()); + } + } else { + //先查询是否存在就绪状态下的出库指令 + Instruction outInst = instructionService.findByInstType(InstTypeEnum.WALL_ROBOT_OUT.getCode()); + if (ObjectUtil.isNotEmpty(outInst)) { + if (dispatchInstruction(outInst, false, true, outInst.getFrom_x(), outInst.getTo_z(), outInst.getFrom_y())) { + return; + } + return; + } + //如果不存在则查询是否存在就绪状态下的入库指令 + Instruction inInst = instructionService.findByInstType(InstTypeEnum.WALL_ROBOT_IN.getCode()); + if (ObjectUtil.isNotEmpty(inInst)) { + if (dispatchInstruction(inInst, true, false, inInst.getTo_x(), inInst.getTo_z(), inInst.getTo_y())) { + return; + } + return; + } + //如果入库指令不存在,则再查询出库任务 + TaskDto outTask = taskService.findByTaskType(TaskTypeEnum.WALL_ROBOT_OUT.getCode()); + if (ObjectUtil.isNotEmpty(outTask)) { + //创建指令 + Instruction inst = this.packInst(outTask); + dispatchInstruction(inst, false, true, inst.getFrom_x(), inst.getTo_z(), inst.getFrom_y()); + } + //如果出库任务不存在,则查询入库任务 + TaskDto inTask = taskService.findByTaskType(TaskTypeEnum.WALL_ROBOT_IN.getCode()); + if (ObjectUtil.isNotEmpty(inTask)) { + //创建指令 + Instruction inst = this.packInst(inTask); + dispatchInstruction(inst, true, false, inst.getTo_x(), inst.getTo_z(), inst.getTo_y()); + } + } + } + } + + private Instruction packInst(TaskDto taskDto) { + Instruction inst = new Instruction(); + inst.setInstruction_id(IdUtil.simpleUUID()); + inst.setInstruction_code(CodeUtil.getNewCode("INSTRUCT_NO")); + inst.setRoute_plan_code(taskDto.getRoute_plan_code()); + inst.setRemark(taskDto.getRemark()); + inst.setMaterial(taskDto.getMaterial()); + inst.setQuantity(taskDto.getQuantity()); + inst.setTask_id(taskDto.getTask_id()); + inst.setTask_code(taskDto.getTask_code()); + inst.setVehicle_code(taskDto.getVehicle_code()); + inst.setVehicle_type(taskDto.getVehicle_type()); + String now = DateUtil.now(); + inst.setCreate_time(now); + inst.setCreate_by(SecurityUtils.getCurrentNickName()); + inst.setStart_device_code(taskDto.getStart_device_code()); + inst.setNext_device_code(taskDto.getNext_device_code()); + inst.setStart_point_code(taskDto.getStart_point_code()); + inst.setNext_point_code(taskDto.getNext_point_code()); + inst.setPriority(taskDto.getPriority()); + inst.setInstruction_status(InstructionStatusEnum.READY.getIndex()); + inst.setExecute_device_code(this.currentDeviceCode); + inst.setInstruction_type(taskDto.getTask_type()); + try { + instructionService.create(inst); + taskDto.setTask_status(TaskStatusEnum.BUSY.getIndex()); + taskDto.setUpdate_time(DateUtil.now()); + taskDto.setRemark(" "); + taskService.update(taskDto); + } catch (Exception e) { + //logService + throw new BadRequestException(e.getMessage()); + } + return inst; + } + + +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/storage/standard_storage/StandardStorageDefination.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/storage/standard_storage/StandardStorageDefination.java new file mode 100644 index 0000000..48ee047 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/storage/standard_storage/StandardStorageDefination.java @@ -0,0 +1,49 @@ +package org.nl.acs.device.device_driver.storage.standard_storage; + +import org.nl.acs.device.device.domain.Device; +import org.nl.acs.device.device.enums.DeviceType; +import org.nl.acs.device.device_driver.DeviceDriver; +import org.nl.acs.device.device_driver.DeviceDriverDefination; +import org.springframework.stereotype.Service; + +import java.util.LinkedList; +import java.util.List; + +/** + * 货架 + */ +@Service +public class StandardStorageDefination implements DeviceDriverDefination { + @Override + public String getDriverCode() { + return "standard_storage"; + } + + @Override + public String getDriverName() { + return "标准版-货架"; + } + + @Override + public String getDriverDescription() { + return "标准版-货架"; + } + + @Override + public DeviceDriver getDriverInstance(Device device) { + return (new StandardStorageDeviceDriver()).setDevice(device).setDriverDefination(this); + + } + + @Override + public Class getDeviceDriverType() { + return StandardStorageDeviceDriver.class; + } + + @Override + public List getFitDeviceTypes() { + List types = new LinkedList(); + types.add(DeviceType.storage); + return types; + } +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/storage/standard_storage/StandardStorageDeviceDriver.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/storage/standard_storage/StandardStorageDeviceDriver.java new file mode 100644 index 0000000..e23275c --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/storage/standard_storage/StandardStorageDeviceDriver.java @@ -0,0 +1,17 @@ +package org.nl.acs.device.device_driver.storage.standard_storage; + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.device.device_driver.DeviceDriver; +import org.nl.acs.device.device_driver.RouteableDeviceDriver; +import org.nl.acs.device.device_driver.driver.AbstractDeviceDriver; + + +/** + * 标准版货架 + */ +@Slf4j +@Data +public class StandardStorageDeviceDriver extends AbstractDeviceDriver implements RouteableDeviceDriver, DeviceDriver { +} + diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/instruction/enums/InstTypeEnum.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/instruction/enums/InstTypeEnum.java new file mode 100644 index 0000000..3a0f6a0 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/instruction/enums/InstTypeEnum.java @@ -0,0 +1,71 @@ +package org.nl.acs.task.instruction.enums; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author 20220102CG\noblelift + */ +@Getter +@AllArgsConstructor +public enum InstTypeEnum { + /** + * 任务类型 + */ + WALL_ROBOT_IN("1", "1", "壁挂机器人-入库任务"), + WALL_ROBOT_OUT("2", "2", "壁挂机器人-出库任务"); + + + /** + * 索引 + */ + private String index; + /** + * 编码 + */ + private String code; + /** + * 名字 + */ + private String name; + /** + * 描述 + */ + private String desc; + + /** + * 构造方法 + * @param index + * @param code + * @param name + */ + InstTypeEnum(String index, String code, String name) { + this.index = index; + this.code = code; + this.name = name; + + } + + public static JSONArray getList() { + JSONArray arr = new JSONArray(); + JSONObject json = new JSONObject(); + for (InstTypeEnum em : InstTypeEnum.values()) { + json.put("code", em.getCode()); + json.put("name", em.getName()); + arr.add(json); + } + return arr; + } + + public static String getName(String code) { + for (InstTypeEnum c : InstTypeEnum.values()) { + if (c.code == code) { + return c.name; + } + } + return null; + } + +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/instruction/service/InstructionService.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/instruction/service/InstructionService.java index 8a8564d..7c9bc08 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/instruction/service/InstructionService.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/instruction/service/InstructionService.java @@ -80,14 +80,6 @@ public interface InstructionService extends CommonService { */ int removeByIds(Set ids); - /** - * 导出数据 - * @param all 待导出的数据 - * @param response / - * @throws IOException / - */ - // void download(List all, HttpServletResponse response) throws IOException; - /** * 查询数据分页 * @@ -135,14 +127,6 @@ public interface InstructionService extends CommonService { */ void reload(); - /** - * 根据ID查询 - * - * @param instruction_id ID - * @return Instruction - */ -// Instruction findById(String instruction_id); - /** * 根据编码查询 * @@ -151,22 +135,6 @@ public interface InstructionService extends CommonService { */ Instruction findByCode(String code); - /** - * 根据任务code查询 - * - * @param code code - * @return Instruction - */ - Instruction findByTaskcode(String code); - - /** - * 根据任务code查询 - * - * @param code code - * @return Instruction - */ - Instruction findByTaskcodeAndStatus(String code); - /** * 根据任务id查询 * @@ -184,9 +152,6 @@ public interface InstructionService extends CommonService { */ void create(Instruction dto) throws Exception; - - - /** * 创建2 * @@ -195,13 +160,6 @@ public interface InstructionService extends CommonService { */ void create2(Instruction dto) throws Exception; - /** - * 再次创建 - * - * @param dto - * @throws Exception - */ - void createAgain(Instruction dto) throws Exception; /** * 编辑 @@ -260,7 +218,6 @@ public interface InstructionService extends CommonService { */ void finishAndCreateHXInst(Instruction dto) throws Exception; - /** * 取消指令 * @@ -293,92 +250,6 @@ public interface InstructionService extends CommonService { */ Instruction findByCodeFromCache(String code); - /** - * 根据编码查询 - * - * @param code - * @return - */ - List findByLinkNum(String code); - - /** - * 根据关联编号查询下发任务 - * - * @param code code - * @return Instruction - */ - Instruction findByLinkNumSend(String code); - - /** - * 根据关联编号查询非下发任务 - * - * @param code code - * @return Instruction - */ - Instruction findByLinkNumNoSend(String code); - - /** - * 根据条码缓存查询 - * - * @param barcode barcode - * @return Instruction - */ - Instruction findByBarcodeFromCache(String barcode); - - /** - * 根据设备缓存查询 - * - * @param devicecode code - * @return Instruction - */ - Instruction findByDeviceCodeFromCache(String devicecode); - - /** - * 查找起点是否有就绪或者执行中的指令 - */ - - Instruction findByNextCodeAndReadyAndRun(String device_code); - - /** - * 根据起点设备编号查询当前是否有就绪指令 - * - * @param device_code - * @return - */ - Instruction findByStartCodeAndReady(String device_code); - - /** - * 根据起点设备编号查询当前是否有运行的指令 - * - * @param device_code - * @return - */ - Instruction findByDeviceCodeRunFromCache(String device_code); - - /** - * 根据终点设备编号查询当前是否有就绪指令 - * - * @param device_code - * @return - */ - Instruction findByEndCodeAndReady(String device_code); - - - /** - * 根据终点查询指令 - * @param devicecode - * @return - */ - Instruction findByNextDeviceCodeFromCache(String devicecode); - - /** - * 根据设备id查询 - * - * @param id - * @return Instruction - */ - Instruction findByIdFromCache(String id); - /** * 格式化 * @@ -402,30 +273,6 @@ public interface InstructionService extends CommonService { */ Integer querySameDestinationInst(String code); - /** - * 查询相同指令类型的数量 - * - * @param inst_type - * @return - */ - Integer querySameInstType(String inst_type); - - /** - * 查询相同起点指令的数量 - * - * @param code - * @return - */ - Integer querySameOriginInst(String code); - - /** - * 查询相同起点、终点指令的数量 - * - * @param code - * @return - */ - //Integer querySameOriginInst(String code); - /** * 根据编码删除 * @@ -434,15 +281,6 @@ public interface InstructionService extends CommonService { */ boolean removeByCodeFromCache(String code); - /** - * 创建关联指令 - * - * @param type - * @param inst - * @return - */ - boolean createLkInst(String type, Instruction inst); - /** * 初始化指令 * @@ -450,15 +288,6 @@ public interface InstructionService extends CommonService { */ void init(String id); - /** - * 根据指令某个参数查找指令集合 - * - * @param instruction1 - * @param flay - * @return - */ - List findByDeviceCodes(Instruction instruction1, Boolean flay); - /** * 根据条件查询指令 @@ -478,29 +307,5 @@ public interface InstructionService extends CommonService { void downloadInstLogging(List instList, HttpServletResponse response) throws IOException; - /** - * 查询是否有相同终点的指令,但是是入库的指令,即指令起点设备类型不是货架 - * - * @param nextDeviceCode - * @return - */ - Boolean querySameNextDeviceCodeInstByIn(String nextDeviceCode); - - /** - * 查询是否有相同终点的指令,但是是出库的指令,即指令起点设备类型是货架 - * - * @param nextDeviceCode - * @return - */ - Boolean querySameNextDeviceCodeInstByOut(String nextDeviceCode); - - List findByCodeAndExcute(String nextDeviceCode); - - - List findByNextCode(String nextDeviceCode); - - List findReadyIns(); - List findReadyIns2(); - - Instruction findByStarCodeAndExcute(String deviceCode); + Instruction findByInstType(String instType); } diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/instruction/service/impl/InstructionServiceImpl.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/instruction/service/impl/InstructionServiceImpl.java index 4e14209..99841b9 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/instruction/service/impl/InstructionServiceImpl.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/instruction/service/impl/InstructionServiceImpl.java @@ -17,6 +17,10 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; +import org.nl.acs.AcsConfig; +import org.nl.acs.api.lx.service.AcsToLxService; +import org.nl.acs.api.lx.service.dto.LxBaseResponse; +import org.nl.acs.api.lx.service.dto.LxTaskAddRequest; import org.nl.acs.autoThread.initial.ApplicationAutoInitial; import org.nl.acs.task.instruction.domain.Instruction; import org.nl.acs.task.instruction.domain.InstructionMybatis; @@ -57,6 +61,7 @@ import org.nl.config.lucene.enums.LogLevelEnum; import org.nl.config.lucene.service.LuceneExecuteLogService; import org.nl.config.lucene.service.dto.LuceneLogDto; import org.nl.system.service.param.ISysParamService; +import org.nl.system.service.param.dao.Param; import org.nl.common.utils.CodeUtil; import org.nl.config.SpringContextHolder; import org.springframework.beans.factory.annotation.Autowired; @@ -97,6 +102,8 @@ public class InstructionServiceImpl extends CommonServiceImpl instructions = new CopyOnWriteArrayList(); @@ -169,10 +176,7 @@ public class InstructionServiceImpl extends CommonServiceImpl list = new LambdaQueryChainWrapper(instructionMapper) - .lt(InstructionMybatis::getInstruction_status, InstructionStatusEnum.FINISHED.getIndex()) - .eq(InstructionMybatis::getIs_delete, "0") - .list(); + List list = new LambdaQueryChainWrapper(instructionMapper).lt(InstructionMybatis::getInstruction_status, InstructionStatusEnum.FINISHED.getIndex()).eq(InstructionMybatis::getIs_delete, "0").list(); // List list = this.queryAll("instruction_status <2 and is_delete =0"); this.instructions = new CopyOnWriteArrayList<>(ConvertUtil.convertList(list, Instruction.class)); } @@ -257,9 +261,7 @@ public class InstructionServiceImpl extends CommonServiceImpl getByTaskId(String id) { - List insList = new LambdaQueryChainWrapper<>(instructionMapper) - .eq(InstructionMybatis::getTask_id, id) - .list(); + List insList = new LambdaQueryChainWrapper<>(instructionMapper).eq(InstructionMybatis::getTask_id, id).list(); JSONObject jsonObject = new JSONObject(); JSONArray content = JSONArray.parseArray(JSON.toJSONString(insList)); JSONArray array = new JSONArray(); @@ -283,16 +285,13 @@ public class InstructionServiceImpl extends CommonServiceImpl queryAll(Map whereJson) { - List insList = new LambdaQueryChainWrapper<>(instructionMapper) - .list(); + List insList = new LambdaQueryChainWrapper<>(instructionMapper).list(); return ConvertUtil.convertList(insList, Instruction.class); } @Override public List queryAll(String whereJson) { - List insList = new LambdaQueryChainWrapper<>(instructionMapper) - .lt(InstructionMybatis::getInstruction_status, InstructionStatusEnum.FINISHED.getIndex()) - .list(); + List insList = new LambdaQueryChainWrapper<>(instructionMapper).lt(InstructionMybatis::getInstruction_status, InstructionStatusEnum.FINISHED.getIndex()).list(); return ConvertUtil.convertList(insList, Instruction.class); } @@ -309,31 +308,6 @@ public class InstructionServiceImpl extends CommonServiceImpl(instructionMapper) - .eq(InstructionMybatis::getTask_code, code) - .eq(InstructionMybatis::getInstruction_status, InstructionStatusEnum.BUSY.getIndex()) - .one(); - if (ObjectUtil.isEmpty(ins)) { - return null; - } - return ConvertUtil.convert(ins, Instruction.class); - } - - @Override - public Instruction findByTaskcodeAndStatus(String code) { - Iterator var3 = instructions.iterator(); - while (var3.hasNext()) { - Instruction instruction = (Instruction) var3.next(); - if (StrUtil.equals(instruction.getTask_code(), code) - && StrUtil.equals(instruction.getInstruction_status(), InstructionStatusEnum.READY.getIndex())) { - return instruction; - } - } - return null; - } - @Override public Instruction findByTaskid(String id, String wherecaluse) { @@ -344,13 +318,6 @@ public class InstructionServiceImpl extends CommonServiceImpl 0){ -// List collect = instructions.stream().filter(instruction -> instruction.getTask_id().equals(id) -// && Integer.parseInt(instruction.getInstruction_status()) < 2).collect(Collectors.toList()); -// if(collect.size() > 0){ -// return collect.get(0); -// } -// } return null; } @@ -366,10 +333,8 @@ public class InstructionServiceImpl extends CommonServiceImpl instructionMybatis = instructionMapper.selectList(Wrappers.lambdaQuery(InstructionMybatis.class) - .eq(InstructionMybatis::getTask_code, dto.getTask_code())); - if (CollUtil.isNotEmpty(instructionMybatis) && instructionMybatis.stream().anyMatch(inst -> inst.getStart_device_code() - .equals(start_device_code))) { + List instructionMybatis = instructionMapper.selectList(Wrappers.lambdaQuery(InstructionMybatis.class).eq(InstructionMybatis::getTask_code, dto.getTask_code())); + if (CollUtil.isNotEmpty(instructionMybatis) && instructionMybatis.stream().anyMatch(inst -> inst.getStart_device_code().equals(start_device_code))) { return; } } @@ -399,8 +364,7 @@ public class InstructionServiceImpl extends CommonServiceImpl shortPathsList = - routeLineService.getShortPathLines(start_device_code, next_device_code, route_plan_code); + List shortPathsList = routeLineService.getShortPathLines(start_device_code, next_device_code, route_plan_code); if (ObjectUtils.isEmpty(shortPathsList)) { throw new Exception(dto.getStart_device_code() + "->" + dto.getNext_device_code() + "路由不通"); } @@ -434,64 +397,79 @@ public class InstructionServiceImpl extends CommonServiceImpl 0 && StrUtil.equals(shortPathsList.get(0).getType(), CommonFinalParam.ONE) && dto.getAgv_system_type().equals(AgvSystemTypeEnum.Two_NDC_System_Type.getIndex())) { // 0为输送、立库任务 1 1楼叉车系统 2 2楼1区域AGV系统 3 2楼2区域AGV系统 - if (!StrUtil.equals(task.getAgv_system_type(), "0") - && ObjectUtil.isNotEmpty(task.getAgv_system_type())) { - if (StrUtil.isBlank(dto.getAgv_inst_type())) { - String agv_system_type = task.getAgv_system_type(); - String task_type = task.getTask_type(); - if (!StrUtil.equals(agv_system_type, "1")) { - // task_type - //1、生箔; Itype=1:取空,取满,放空,放满; - //2、分切 Itype=3取满、取空、放满、放空; - //3、普通任务 Itype=2:取货、放货; - //4、叉车任务 - //5、输送任务 - //6、行架 - //7、立库 - if (StrUtil.equals(task_type, "1")) { - dto.setAgv_inst_type("1"); - } else if (StrUtil.equals(task_type, "3")) { - dto.setAgv_inst_type("2"); - } else if (StrUtil.equals(task_type, "2")) { - dto.setAgv_inst_type("3"); - } else if (StrUtil.equals(task_type, "8")) { - dto.setAgv_inst_type("2"); - } else { - log.info("未找到对应的AGV指令类型,任务号:" + task.getTask_code() + ",task_type:" + task.getTask_type()); - } - } else { - dto.setAgv_inst_type("4"); - } - dto.setAgv_system_type(task.getAgv_system_type()); - } - // NDCAgvService ndcAgvService = SpringContextHolder.getBean(NDCAgvService.class); - log.warn("下发AGV指令数据," + "指令号:" + dto.getInstruction_code() + ",AGV系统类型:" + dto.getAgv_system_type() - + ",AGV指令类型:" + dto.getInstruction_type()); + if (!StrUtil.equals(task.getAgv_system_type(), "0") && ObjectUtil.isNotEmpty(task.getAgv_system_type())) { + // NDCAgvService ndcAgvService = SpringContextHolder.getBean(NDCAgvService.class); + log.warn("下发AGV指令数据," + "指令号:" + dto.getInstruction_code() + ",AGV系统类型:" + dto.getAgv_system_type() + ",AGV指令类型:" + dto.getInstruction_type()); try { if (StrUtil.isEmpty(dto.getAgv_inst_type()) || StrUtil.isEmpty(dto.getAgv_system_type())) { - log.info("sendAgvInstToNDC 指令校验:" + dto.getInstruction_code() + ",inst_type:" + dto.getInstruction_type() - + ",inst_system_type:" + dto.getAgv_system_type()); + log.info("sendAgvInstToNDC 指令校验:" + dto.getInstruction_code() + ",inst_type:" + dto.getInstruction_type() + ",inst_system_type:" + dto.getAgv_system_type()); + } + LxTaskAddRequest request = new LxTaskAddRequest(); + LxTaskAddRequest.TaskChain taskChain = new LxTaskAddRequest.TaskChain(); + taskChain.setPriority(StrUtil.isNumeric(dto.getPriority()) ? Integer.valueOf(dto.getPriority()) : 0); + taskChain.setTaskSeq(dto.getInstruction_code()); + taskChain.setFromDetail("InstructionServiceImpl.create"); + taskChain.setIsReturn(1); + taskChain.setName(dto.getTask_code()); + if (StrUtil.isNotBlank(dto.getCarno()) && StrUtil.isNumeric(dto.getCarno())) { + taskChain.setAmrId(Long.valueOf(dto.getCarno())); + } + Param areaParam = paramService.findByCode(AcsConfig.LXAREAID); + if (areaParam != null && StrUtil.isNotBlank(areaParam.getValue()) && StrUtil.isNumeric(areaParam.getValue())) { + taskChain.setAreaId(Long.valueOf(areaParam.getValue())); + } else { + taskChain.setAreaId(1L); + } + request.setTaskChain(taskChain); + + Param mapParam = paramService.findByCode(AcsConfig.LXMAPID); + Long mapId = 1L; + if (mapParam != null && StrUtil.isNotBlank(mapParam.getValue()) && StrUtil.isNumeric(mapParam.getValue())) { + mapId = Long.valueOf(mapParam.getValue()); + } + + LxTaskAddRequest.TaskItem firstTask = new LxTaskAddRequest.TaskItem(); + firstTask.setTaskType("O1"); + firstTask.setMapId(mapId); + firstTask.setEndPointCode(dto.getStart_point_code()); + if (StrUtil.isNotBlank(dto.getStart_height()) && !"0".equals(dto.getStart_height())) { + JSONObject extend = new JSONObject(); + extend.put("platform_height", dto.getStart_height()); + firstTask.setExtend(extend.toJSONString()); + } + + LxTaskAddRequest.TaskItem secondTask = new LxTaskAddRequest.TaskItem(); + secondTask.setTaskType("O13"); + secondTask.setMapId(mapId); + secondTask.setEndPointCode(dto.getNext_point_code()); + if (StrUtil.isNotBlank(dto.getNext_height()) && !"0".equals(dto.getNext_height())) { + JSONObject extend = new JSONObject(); + extend.put("platform_height", dto.getNext_height()); + secondTask.setExtend(extend.toJSONString()); + } + + if (StrUtil.isBlank(dto.getStart_point_code())) { + secondTask.setTaskType("O0"); + request.setTasks(Collections.singletonList(secondTask)); + } else { + request.setTasks(Arrays.asList(firstTask, secondTask)); + } + + LxBaseResponse lxResponse = acsToLxService.addTask(request); + if (Boolean.FALSE.equals(lxResponse.getState())) { + dto.setSend_status("2"); + dto.setRemark("蓝芯下发失败:" + lxResponse.getErrMsg()); + throw new BadRequestException("蓝芯下发失败:" + lxResponse.getErrMsg()); + } else { + dto.setSend_status("1"); + dto.setRemark("蓝芯下发成功"); } -// log.info("2楼1区域AGV系统链接开始"); -// String ip = paramService.findByCode(AcsConfig.AGVURL).getValue(); -// int port = Integer.parseInt(paramService.findByCode(AcsConfig.AGVPORT).getValue()); -// InetSocketAddress socketAddress = new InetSocketAddress(ip, port); -// Socket s = new Socket(); -// s.connect(socketAddress, 2 * 1000); -// if (ObjectUtil.isNotEmpty(s)&&s.isConnected()==true) { - // ndcAgvService.sendAgvInstToNDC(task.getAgv_system_type(), dto); -// } else { -// log.error("agv连接出现异常:服务端被关闭"); -// } } catch (Exception e) { dto.setSend_status("2"); dto.setRemark(e.getMessage()); e.printStackTrace(); log.warn("下发AGV指令异常:" + e); - LuceneLogDto logDto1 = LuceneLogDto.builder() - .deviceCode(start_device_code) - .content("下发AGV指令异常") - .build(); + LuceneLogDto logDto1 = LuceneLogDto.builder().deviceCode(start_device_code).content("下发AGV指令异常").build(); logDto1.setLogLevel((LogLevelEnum.ERROR)); luceneExecuteLogService.deviceExecuteLog(logDto1); } @@ -519,14 +497,7 @@ public class InstructionServiceImpl extends CommonServiceImpl instructionMybatis = instructionMapper.selectList(Wrappers.lambdaQuery(InstructionMybatis.class) -// .eq(InstructionMybatis::getTask_code, dto.getTask_code())); -// if (CollUtil.isNotEmpty(instructionMybatis) && instructionMybatis.stream().anyMatch(inst -> inst.getStart_device_code() -// .equals(start_device_code))) { -// return; -// } -// } + String currentUsername = SecurityUtils.getCurrentNickName(); String now = DateUtil.now(); if (StrUtil.isEmpty(dto.getRoute_plan_code())) { @@ -544,14 +515,10 @@ public class InstructionServiceImpl extends CommonServiceImpl shortPathsList = - routeLineService.getShortPathLines(start_device_code, next_device_code, route_plan_code); + List shortPathsList = routeLineService.getShortPathLines(start_device_code, next_device_code, route_plan_code); RouteLineDto route = null; for (int i = 0; i < shortPathsList.size(); i++) { RouteLineDto routeLineDto = shortPathsList.get(i); String route_device = routeLineDto.getDevice_code(); String route_next_device = routeLineDto.getNext_device_code(); - if (route_device.equals(dto.getStart_device_code()) - && route_next_device.equals(dto.getNext_device_code())) { + if (route_device.equals(dto.getStart_device_code()) && route_next_device.equals(dto.getNext_device_code())) { route = routeLineDto; break; } @@ -622,6 +567,68 @@ public class InstructionServiceImpl extends CommonServiceImpl 0 && StrUtil.equals(shortPathsList.get(0).getType(), CommonFinalParam.ONE)) { Device deviceByCode = deviceAppService.findDeviceByCode(dto.getStart_device_code()); + if (dto.getAgv_system_type().equals(AgvSystemTypeEnum.Two_NDC_System_Type.getIndex())) { + LxTaskAddRequest request = new LxTaskAddRequest(); + LxTaskAddRequest.TaskChain taskChain = new LxTaskAddRequest.TaskChain(); + taskChain.setPriority(StrUtil.isNumeric(dto.getPriority()) ? Integer.valueOf(dto.getPriority()) : 0); + taskChain.setTaskSeq(dto.getInstruction_code()); + taskChain.setFromDetail("InstructionServiceImpl.create2"); + taskChain.setIsReturn(1); + taskChain.setName(dto.getTask_code()); + if (StrUtil.isNotBlank(dto.getCarno()) && StrUtil.isNumeric(dto.getCarno())) { + taskChain.setAmrId(Long.valueOf(dto.getCarno())); + } + Param areaParam = paramService.findByCode(AcsConfig.LXAREAID); + if (areaParam != null && StrUtil.isNotBlank(areaParam.getValue()) && StrUtil.isNumeric(areaParam.getValue())) { + taskChain.setAreaId(Long.valueOf(areaParam.getValue())); + } else { + taskChain.setAreaId(1L); + } + request.setTaskChain(taskChain); + + Param mapParam = paramService.findByCode(AcsConfig.LXMAPID); + Long mapId = 1L; + if (mapParam != null && StrUtil.isNotBlank(mapParam.getValue()) && StrUtil.isNumeric(mapParam.getValue())) { + mapId = Long.valueOf(mapParam.getValue()); + } + + LxTaskAddRequest.TaskItem firstTask = new LxTaskAddRequest.TaskItem(); + firstTask.setTaskType("O1"); + firstTask.setMapId(mapId); + firstTask.setEndPointCode(dto.getStart_point_code()); + if (StrUtil.isNotBlank(dto.getStart_height()) && !"0".equals(dto.getStart_height())) { + JSONObject extend = new JSONObject(); + extend.put("platform_height", dto.getStart_height()); + firstTask.setExtend(extend.toJSONString()); + } + + LxTaskAddRequest.TaskItem secondTask = new LxTaskAddRequest.TaskItem(); + secondTask.setTaskType("O13"); + secondTask.setMapId(mapId); + secondTask.setEndPointCode(dto.getNext_point_code()); + if (StrUtil.isNotBlank(dto.getNext_height()) && !"0".equals(dto.getNext_height())) { + JSONObject extend = new JSONObject(); + extend.put("platform_height", dto.getNext_height()); + secondTask.setExtend(extend.toJSONString()); + } + + if (StrUtil.isBlank(dto.getStart_point_code())) { + secondTask.setTaskType("O0"); + request.setTasks(Collections.singletonList(secondTask)); + } else { + request.setTasks(Arrays.asList(firstTask, secondTask)); + } + + LxBaseResponse lxResponse = acsToLxService.addTask(request); + if (Boolean.FALSE.equals(lxResponse.getState())) { + dto.setSend_status("2"); + dto.setRemark("蓝芯下发失败:" + lxResponse.getErrMsg()); + throw new BadRequestException("蓝芯下发失败:" + lxResponse.getErrMsg()); + } else { + dto.setSend_status("1"); + dto.setRemark("蓝芯下发成功"); + } + } } } catch (Exception e) { @@ -634,96 +641,6 @@ public class InstructionServiceImpl extends CommonServiceImpl shortPathsList = - routeLineService.getShortPathLines( - dto.getStart_device_code(), dto.getNext_device_code(), dto.getRoute_plan_code()); - if (ObjectUtils.isEmpty(shortPathsList)) { - throw new Exception(dto.getStart_device_code() + "->" + dto.getNext_device_code() + "路由不通"); - } - String type = shortPathsList.get(0).getType(); - if (!StrUtil.equals(type, "0")) { -// JSONObject instcheckjson = -// instwo -// .query( -// " instruction_status <3 and next_point_code= '" -// + dto.getNext_point_code() -// + "'" -// + " and start_point_code = '" -// + dto.getStart_point_code() -// + "'" -// + " and task_id = '" -// + dto.getTask_id() -// + "'") -// .uniqueResult(0); - InstructionMybatis ins = new LambdaQueryChainWrapper<>(instructionMapper) - .lt(InstructionMybatis::getInstruction_status, InstructionStatusEnum.CANCEL.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() + ":该任务已存在待完成指令!"); - } - } - - if (!StrUtil.equals(dto.getCompound_inst(), "0") - && StrUtil.equals(task.getCompound_task(), CommonFinalParam.ONE)) { - dto.setCompound_inst(CommonFinalParam.ONE); - dto.setCompound_inst_data(task.getCompound_task_data()); - } - - dto.setCreate_by(currentUsername); - dto.setUpdate_by(currentUsername); - dto.setUpdate_time(now); - dto.setCreate_time(now); - - - InstructionMybatis entity = ConvertUtil.convert(dto, InstructionMybatis.class); - instructionMapper.insert(entity); - - DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class); - Device startdevice = appService.findDeviceByCode(dto.getStart_device_code()); - Device nextdevice = appService.findDeviceByCode(dto.getNext_device_code()); - - - if (!ObjectUtils.isEmpty(nextdevice.getExtraValue().get("link_three_lamp"))) { - String lamd_device = nextdevice.getExtraValue().get("link_three_lamp").toString(); - Device lamddevice = appService.findDeviceByCode(lamd_device); - } - - // != 0 为agv任务 - // if(!StrUtil.equals(type,"0")){ - // if (StrUtil.equals(paramService.findByCode(AcsConfig.AGVTYPE).getValue(), CommonFinalParam.ONE)) - // { - // agvService.sendAgvInstToMagic(dto); - // } else if (StrUtil.equals(paramService.findByCode(AcsConfig.AGVTYPE).getValue(), - // "2")) { - // agvService.sendAgvInstToNDC(dto); - // } else if (StrUtil.equals(paramService.findByCode(AcsConfig.AGVTYPE).getValue(), - // "3")) { - // agvService.addOrderSequences(dto); - // } - // } - instructions.add(dto); - } - @Override @Transactional(rollbackFor = Exception.class) public void update(Instruction dto) { @@ -791,7 +708,6 @@ public class InstructionServiceImpl extends CommonServiceImpl(taskMapper) - .eq(Task::getTask_id, insttaskid) - .one(); + Task task = new LambdaQueryChainWrapper<>(taskMapper).eq(Task::getTask_id, insttaskid).one(); // =0 则不用再次请求 if (StrUtil.equals(task.getRequest_again(), "0")) { if (StrUtil.equals(task.getTask_type(), "8")) { @@ -914,9 +828,7 @@ public class InstructionServiceImpl extends CommonServiceImpl(taskMapper) - .eq(Task::getTask_id, insttaskid) - .one(); + Task task = new LambdaQueryChainWrapper<>(taskMapper).eq(Task::getTask_id, insttaskid).one(); // =0 则不用再次请求 if (StrUtil.equals(task.getRequest_again(), "0")) { if (StrUtil.equals(task.getTask_type(), "8")) { @@ -971,14 +883,10 @@ public class InstructionServiceImpl extends CommonServiceImpl(taskMapper) - .eq(Task::getTask_id, dto.getTask_id()) - .one(); + Task acsTask = new LambdaQueryChainWrapper<>(taskMapper).eq(Task::getTask_id, dto.getTask_id()).one(); RouteLineService routeLineService = SpringContextHolder.getBean(RouteLineServiceImpl.class); - List list = - routeLineService.getShortPathLines( - dto.getNext_device_code(), acsTask.getNext_device_code(), acsTask.getRoute_plan_code()); + List list = routeLineService.getShortPathLines(dto.getNext_device_code(), acsTask.getNext_device_code(), acsTask.getRoute_plan_code()); if (ObjectUtils.isEmpty(list)) { throw new BadRequestException(LangProcess.msg("route_isNull")); } @@ -999,20 +907,8 @@ public class InstructionServiceImpl extends CommonServiceImpl it = instructions.iterator(); - while (it.hasNext()) { - Instruction inst = it.next(); - if (StrUtil.equals(code, inst.getLink_num()) && StrUtil.equals(inst.getIs_send(), CommonFinalParam.ONE)) { - return inst; - } - } - - return null; - } - - @Override - public List findByLinkNum(String code) { - List list = new ArrayList<>(); - Iterator it = instructions.iterator(); - while (it.hasNext()) { - Instruction inst = it.next(); - if (StrUtil.equals(code, inst.getLink_num()) && StrUtil.equals(inst.getIs_send(), "0")) { - list.add(inst); - } - } - return list; - } - - @Override - public Instruction findByLinkNumNoSend(String code) { - Iterator it = instructions.iterator(); - while (it.hasNext()) { - Instruction inst = it.next(); - if (StrUtil.equals(code, inst.getLink_num()) && StrUtil.equals(inst.getIs_send(), "0")) { - return inst; - } - } - - return null; - } - @Override public Instruction findByCodeFromCache(String code) { Iterator it = instructions.iterator(); @@ -1362,30 +1207,6 @@ public class InstructionServiceImpl extends CommonServiceImpl it = instructions.iterator(); - while (it.hasNext()) { - Instruction inst = it.next(); - if (StrUtil.equals(barcode, inst.getVehicle_code())) { - return inst; - } - } - return null; - } - - @Override - public Instruction findByIdFromCache(String id) { - Iterator it = instructions.iterator(); - while (it.hasNext()) { - Instruction inst = it.next(); - if (StrUtil.equals(id, inst.getInstruction_id())) { - return inst; - } - } - return null; - } - @Override public Instruction foramte(Instruction inst) { CommonFinalParam commonFinalParam = new CommonFinalParam(); @@ -1415,11 +1236,7 @@ public class InstructionServiceImpl extends CommonServiceImpl instructionList = instructions; - ListUtil.sort( - instructionList, - new Comparator() { - @Override - public int compare(Instruction o1, Instruction o2) { - return o1.getCreate_time().compareTo(o2.getCreate_time()); - } - }); - Iterator it = instructions.iterator(); - while (it.hasNext()) { - Instruction inst = it.next(); - if (StrUtil.equals(devicecode, inst.getStart_device_code()) - && inst.getInstruction_status().equals(InstructionStatusEnum.READY.getIndex())) { - return inst; - } - } - - return null; - } - - - @Override - public Instruction findByDeviceCodeRunFromCache(String devicecode) { - List instructionList = instructions; - ListUtil.sort( - instructionList, - new Comparator() { - @Override - public int compare(Instruction o1, Instruction o2) { - return o1.getCreate_time().compareTo(o2.getCreate_time()); - } - }); - Iterator it = instructions.iterator(); - while (it.hasNext()) { - Instruction inst = it.next(); - if (StrUtil.equals(devicecode, inst.getStart_device_code()) - && inst.getInstruction_status().equals(InstructionStatusEnum.BUSY.getIndex())) { - return inst; - } - } - - return null; - } - - - @Override - public Instruction findByNextDeviceCodeFromCache(String devicecode) { - List instructionList = instructions; - ListUtil.sort( - instructionList, - new Comparator() { - @Override - public int compare(Instruction o1, Instruction o2) { - return o1.getCreate_time().compareTo(o2.getCreate_time()); - } - }); - Iterator it = instructions.iterator(); - while (it.hasNext()) { - Instruction inst = it.next(); - if (StrUtil.equals(devicecode, inst.getNext_device_code()) && Integer.parseInt(inst.getInstruction_status()) <= Integer.parseInt(InstructionStatusEnum.BUSY.getIndex()) && !inst.getInstruction_type().equals(TaskTypeEnum.Mxddhj_Task.getIndex())) { - return inst; - } - } - - return null; - } - @Override public List findAllInstFromCache() { return instructions; @@ -1540,43 +1283,7 @@ public class InstructionServiceImpl extends CommonServiceImpl()) - .stream() - .filter(instruction -> deviceCode.equals(instruction.getNext_point_code().indexOf(".") != -1 ? instruction.getNext_point_code().substring(0, instruction.getNext_point_code().indexOf(".")) : instruction.getNext_point_code())) - .count(); - } - - @Override - public Integer querySameInstType(String inst_type) { - int num = 0; - Iterator it = instructions.iterator(); - while (it.hasNext()) { - Instruction inst = it.next(); - if (StrUtil.equals(inst.getInstruction_type(), inst_type)) { - num = num + 1; - } - } - return num; - } - - @Override - public Integer querySameOriginInst(String devicecode) { - int num = 0; - Iterator it = instructions.iterator(); - while (it.hasNext()) { - Instruction inst = it.next(); - // 处理空盘位站点 - String start_code = inst.getStart_point_code(); - if (start_code.indexOf(".") != -1) { - start_code = start_code.substring(0, start_code.indexOf(".")); - } - if (StrUtil.equals(devicecode, start_code)) { - num = num + 1; - } - } - return num; + return (int) Optional.ofNullable(this.instructions).orElse(new CopyOnWriteArrayList<>()).stream().filter(instruction -> deviceCode.equals(instruction.getNext_point_code().indexOf(".") != -1 ? instruction.getNext_point_code().substring(0, instruction.getNext_point_code().indexOf(".")) : instruction.getNext_point_code())).count(); } @Override @@ -1585,21 +1292,9 @@ public class InstructionServiceImpl extends CommonServiceImpl { return inst.getInstruction_code().equals(code); }); -// while (iterator.hasNext()) { -// Instruction instruction = iterator.next(); -// if (instruction.getInstruction_code().equals(code)) { -// iterator.remove(); -// return true; -// } -// } return true; } - @Override - public boolean createLkInst(String type, Instruction dto) { - return false; - } - /* * 判断是否为整数 * @param str 传入的字符串 @@ -1623,69 +1318,6 @@ public class InstructionServiceImpl extends CommonServiceImpl optionalInstruction = instructions.stream() - .filter(instruction -> StrUtil.equals(instruction.getStart_device_code(), device_code) - && StrUtil.equals(instruction.getInstruction_status(), InstructionStatusEnum.READY.getIndex()) && !instruction.getInstruction_type().equals(TaskTypeEnum.Mxddhj_Task.getIndex())) - .findFirst(); - return optionalInstruction.orElse(null); - } - - @Override - public Instruction findByNextCodeAndReadyAndRun(String device_code) { - Optional optionalInstruction = instructions.stream() - .filter(instruction -> StrUtil.equals(instruction.getNext_device_code(), device_code) - && (StrUtil.equals(instruction.getInstruction_status(), InstructionStatusEnum.READY.getIndex()) || StrUtil.equals(instruction.getInstruction_status(), InstructionStatusEnum.BUSY.getIndex()))) - .findFirst(); - return optionalInstruction.orElse(null); - } - - @Override - public Instruction findByEndCodeAndReady(String device_code) { - Optional optionalInstruction = instructions.stream() - .filter(instruction -> StrUtil.equals(instruction.getNext_device_code(), device_code) - && StrUtil.equals(instruction.getInstruction_status(), InstructionStatusEnum.READY.getIndex())) - .findFirst(); - return optionalInstruction.orElse(null); - } - - @Override - public List findByDeviceCodes(Instruction instruction1, Boolean flay) { - List instructionList = new ArrayList<>(); - for (Instruction instruction : instructions) { - if (flay) { - if (Integer.parseInt(instruction.getInstruction_status()) < 2) { - instructionList.add(instruction); - } - } else { - if (instruction.getInstruction_status().equals(instruction1.getInstruction_status())) { - instructionList.add(instruction); - } - } - if (StrUtil.isNotBlank(instruction.getStart_device_code()) && instruction.getStart_device_code().equals(instruction1.getStart_device_code())) { - instructionList.add(instruction); - } - if (StrUtil.isNotBlank(instruction.getNext_device_code()) && instruction.getNext_device_code().equals(instruction1.getNext_device_code())) { - instructionList.add(instruction); - } - } - /*if (ObjectUtil.isNull(instruction1)) { - return null; - } - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - if (flay) { - wrapper.le(StrUtil.isNotBlank(instruction1.getInstruction_status()), InstructionMybatis::getInstruction_status, instruction1.getInstruction_status()); - } else { - wrapper.eq(StrUtil.isNotBlank(instruction1.getInstruction_status()), InstructionMybatis::getInstruction_status, instruction1.getInstruction_status()); - } - wrapper.eq(StrUtil.isNotBlank(instruction1.getStart_device_code()), InstructionMybatis::getStart_device_code, instruction1.getStart_device_code()); - wrapper.eq(StrUtil.isNotBlank(instruction1.getNext_device_code()), InstructionMybatis::getNext_device_code, instruction1.getNext_device_code()); - List instructionMybatis = instructionMapper.selectList(wrapper); - List instructions = ConvertUtil.convertList(instructionMybatis, Instruction.class);*/ - return instructionList; - } - @Override public List getInstList(Map whereJson) { String task_code = (String) whereJson.get("code"); @@ -1763,81 +1395,23 @@ public class InstructionServiceImpl extends CommonServiceImpl()) + public Instruction findByInstType(String instType) { + return Optional.ofNullable(this.instructions) + .orElse(Collections.emptyList()) .stream() - .filter(instruction -> instruction.getNext_device_code().equals(nextDeviceCode) - && !deviceAppService.findDeviceByCode(instruction.getStart_device_code()).getDevice_type().equals(DeviceType.storage.toString())) - .collect(Collectors.toList()) - .isEmpty(); - } - - @Override - public Boolean querySameNextDeviceCodeInstByOut(String nextDeviceCode) { - return Optional - .ofNullable(this.instructions) - .orElse(new CopyOnWriteArrayList<>()) - .stream() - .filter(instruction -> instruction.getNext_device_code().equals(nextDeviceCode) - && deviceAppService.findDeviceByCode(instruction.getStart_device_code()).getDevice_type().equals(DeviceType.storage.toString())) - .collect(Collectors.toList()) - .isEmpty(); - } - - @Override - public List findByCodeAndExcute(String next_code) { - List instructionList = instructions.stream().filter(item -> item.getNext_device_code().equals(next_code)).collect(Collectors.toList()); - - return instructionList; - } - - - @Override - public List findByNextCode(String next_code) { - List instructionList = instructions.stream().filter(item -> item.getNext_device_code().equals(next_code)).collect(Collectors.toList()); - - return instructionList; - } - - @Override - public List findReadyIns2() { - - //根据时间升序取第一个 - List instructionsList = instructions.stream() - .filter(item -> StrUtil.equals(item.getInstruction_type(), TaskTypeEnum.Truss_Task.getIndex()) - && StrUtil.equals(item.getInstruction_status(), TaskStatusEnum.READY.getIndex())).collect(Collectors.toList()); - return instructionsList; - } - - @Override - public List findReadyIns() { - - //根据时间升序取第一个 - List instructionsList = instructions.stream() - .filter(item -> StrUtil.equals(item.getInstruction_type(), TaskTypeEnum.Mxddhj_Task.getIndex()) - && StrUtil.equals(item.getInstruction_status(), TaskStatusEnum.READY.getIndex())).collect(Collectors.toList()); - return instructionsList; - } - - @Override - public Instruction findByStarCodeAndExcute(String start_code) { - Optional optionalInstruction = instructions.stream() - .filter(instruction -> StrUtil.equals(instruction.getStart_device_code(), start_code) - && StrUtil.equals(instruction.getInstruction_status(), InstructionStatusEnum.READY.getIndex())) - .findFirst(); - return optionalInstruction.orElse(null); - } - - - public List findReadyInstructions() { - - //根据时间升序取第一个 - List instructionsList = instructions.stream() - .filter(item -> StrUtil.equals(item.getInstruction_type(), TaskTypeEnum.Truss_Task.getIndex()) - && StrUtil.equals(item.getInstruction_status(), TaskStatusEnum.READY.getIndex())).collect(Collectors.toList()); - return instructionsList; + .filter(inst -> Objects.equals(inst.getInstruction_type(), instType)) + .filter(inst -> Objects.equals(inst.getInstruction_status(), InstructionStatusEnum.READY.getIndex())) + .sorted(Comparator + .comparingInt((Instruction inst) -> { + try { + return Integer.parseInt(inst.getPriority()); + } catch (Exception e) { + return Integer.MAX_VALUE; + } + }) + .thenComparing(inst -> Optional.ofNullable(inst.getCreate_time()).orElse(""))) + .findFirst() + .orElse(null); } } diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/task/enums/TaskTypeEnum.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/task/enums/TaskTypeEnum.java index bbee672..82a7d35 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/task/enums/TaskTypeEnum.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/task/enums/TaskTypeEnum.java @@ -13,24 +13,8 @@ public enum TaskTypeEnum { /** * 任务类型 */ - Raw_Foil_AGV_Task("1", "1", "生箔AGV任务"), - Cutting_AGV_Task("2", "2", "分切AGV任务"), - Standard_AGV_Task("3", "3", "普通AGV任务"), - Forklift_AGV_Task("4", "4", "叉车AGV任务"), - Conveyor_Task("5", "5", "输送线任务"), - Truss_Task("6", "6", "行架任务"), - AGV_Task("7", "7", "立库任务"), - - Oven_Truss_Task("8", "8", "烘箱行架任务"), - - - Stacker_Task("11", "11", "堆垛机任务"), - Box_Storage("12", "12", "木箱入库行架任务"), - Box_Package("13", "13", "装箱入库行架任务"), - Return_Good("14", "14", "退货入库行架任务"), - Rgv_Conveyor_Task("15", "15", "RGV输送任务"), - Inner_Truss_Task("16", "16", "子卷下线行架任务"), - Mxddhj_Task("17", "17", "木箱堆叠行架任务"); + WALL_ROBOT_IN("1", "1", "壁挂机器人-入库任务"), + WALL_ROBOT_OUT("2", "2", "壁挂机器人-出库任务"); /** diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/task/rest/TaskController.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/task/rest/TaskController.java index 7348638..cbad222 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/task/rest/TaskController.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/task/rest/TaskController.java @@ -1,16 +1,12 @@ package org.nl.acs.task.task.rest; import cn.dev33.satoken.annotation.SaIgnore; -import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; -import org.nl.acs.task.task.enums.TaskTypeEnum; import org.nl.acs.task.task.service.TaskService; import org.nl.acs.task.task.service.dto.TaskDto; import org.nl.acs.task.task.service.dto.TaskIdAndStatusDTO; -import org.nl.common.exception.BadRequestException; import org.nl.common.logging.annotation.Log; -import org.nl.config.language.LangProcess; import org.springframework.data.domain.Pageable; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -57,20 +53,10 @@ public class TaskController { //@SaCheckPermission("task:add") public ResponseEntity create(@Validated @RequestBody TaskDto dto) throws Exception { //校验排列层为空 - checkYZ(dto); taskService.create(dto); return new ResponseEntity<>(HttpStatus.CREATED); } - private static void checkYZ(TaskDto dto) { - if (dto.getTask_type().equals(TaskTypeEnum.AGV_Task.getIndex())){ - if ((dto.getNext_point_code().startsWith("L")&&(StrUtil.isEmpty(dto.getTo_y()) || StrUtil.isEmpty(dto.getTo_z()))) || (dto.getStart_point_code().startsWith("L")&&(StrUtil.isEmpty(dto.getFrom_y()) || StrUtil.isEmpty(dto.getFrom_z())))){ - throw new BadRequestException(LangProcess.msg("point_null")); - } - - } - } - @PostMapping(value = "/adds") @Log("常规任务保存") //@PreAuthorize("@el.check('task:add')") diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/task/service/TaskService.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/task/service/TaskService.java index e4cd249..97fe60f 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/task/service/TaskService.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/task/service/TaskService.java @@ -50,13 +50,6 @@ public interface TaskService extends CommonService { */ Task getById(String id); - /** - * 根据设备号和任务状态查询 - * @param device_code - * @return - */ - List queryTaskByDeviceCodeAndStatus2(String device_code); - /** * 根据ID查询 * @@ -97,14 +90,6 @@ public interface TaskService extends CommonService { */ int removeByIds(Set ids); - /** - * 导出数据 - * @param all 待导出的数据 - * @param response / - * @throws IOException / - */ - // void download(List all, HttpServletResponse response) throws IOException; - /** * 查询数据分页 * @@ -114,15 +99,6 @@ public interface TaskService extends CommonService { */ Map queryAll(Map whereJson, Pageable page); - /** - * 在缓存中查询所有任务列表 - * - * @param whereJson 条件 - * @param page 分页参数 - * @return - */ - Map queryAllByCache(Map whereJson, Pageable page); - /** * 数据同步 */ @@ -161,42 +137,6 @@ public interface TaskService extends CommonService { */ List queryAll(Map whereJson); - /** - * 根据ID查询 - * - * @param task_id ID - * @return AcsTask - */ -// TaskDto findById(String task_id); - - /** - * 查询所有未完成任务 - * - * @param whereJson 条件参数 - * @return List - */ - List queryAllUnfinished(Map whereJson); - - /** - * 根据设备号查询未完成的任务 - */ - List queryUnfinishTaskByDeviceCode(String device_code); - - /** - * 根据状态查询 - * - * @param task_status task_status - * @return AcsTask - */ - List queryByStauts(String task_status); - - /** - * 根绝状态查询缓存 - * @param task_status - * @return - */ - List findByTaskStatus(String task_status); - /** * 根据编码查询 * @@ -205,69 +145,6 @@ public interface TaskService extends CommonService { */ TaskDto findByCode(String code); - TaskDto findByBarcodeFromCache(String barcode); - - /** - * 根据设备号查询未执行的任务 - * - * @param device_code - * @return - */ - List queryTaskByDeviceCode(String device_code); - - /** - * 根据设备号查询未执行的任务 - * - * @param start_device_code - * @return List - */ - List queryTaskByStartDeviceCode(String start_device_code); - - /** - * 根据设备号查询未执行的任务 - * - * @param back_start_device_code - * @return List - */ - List queryTaskByBackDeviceCode(String back_start_device_code); - - /** - * 根据设备号和任务状态查询 - * - * @param device_code - * @return List - */ - List queryTaskByDeviceCodeAndStatus(String device_code); - - - /** - * 根据设备号和任务状态查询 - * - * @param device_code - * @return List - */ - List queryTaskByDeviceCodeAndStatus3(String device_code); - - - - - /** - * 根据前工位取货点查找执行中的任务 - * - * @param head_start_device_code - * @return List - */ - List queryTaskByStartAndIntStatus(String head_start_device_code); - - /** - * 根据后工位取货点查找执行中的任务 - * - * @param head_next_device_code - * @return List - */ - List queryTaskByNextAndIntStatus(String head_next_device_code); - - /** * 创建 * @@ -322,8 +199,6 @@ public interface TaskService extends CommonService { */ void cancel(String ids) throws Exception; - - /** * 取消任务和指令 * @@ -332,16 +207,6 @@ public interface TaskService extends CommonService { */ void cancelAndInst(String ids) throws Exception; - - /** - * 强制取消任务和指令 - * - * @param ids - * @throws Exception - */ - void forceCancelAndInst(String ids) throws Exception; - - /** * 手动创建指令 * @@ -420,64 +285,6 @@ public interface TaskService extends CommonService { TaskDto findByStartCode(String device_code); - /** - * 根据起点设备编号查询当前是否有就绪任务 - * - * @param device_code - * @return - */ - TaskDto findByStartCodeAndReady(String device_code); - - - /** - * 查找符合条件的堆叠行架任务 - * @return - */ - List findByTrappedManipulatorReady(); - - - /** - * 根据起载具号查询就绪任务 - * - * @param device_code - * @return - */ - TaskDto findByVehicleCodeCodeAndReady(String device_code); - - /** - * 根据木箱号查询执行中任务 - * - * @param device_code - * @return - */ - TaskDto findByVehicleCode2AndExcute(String device_code); - - /** - * 根据起点设备编号查询当前是否有执行中任务 - * - * @param start_code - * @param next_code - * @return - */ - TaskDto findByCodeAndExcute(String start_code,String next_code); - - - /** - * 查询起点执行的任务 - * @param start_code - * @return - */ - TaskDto findByStarCodeAndExcute(String start_code); - - /** - * 根据终点设备编号查询当前是否有就绪任务 - * - * @param device_code - * @return - */ - TaskDto findByEndCodeAndReady(String device_code); - - /** * 查询内存任务 * @@ -509,32 +316,6 @@ public interface TaskService extends CommonService { */ String queryAssignedByDevice(String device_code, String task_nextdevice_code); - - /** - * 查询相同起点任务的数量 - * - * @param code - * @return - */ - Integer querySameOriginTask(String code); - - /** - * 查询相同终点任务的数量 - * - * @param code - * @return - */ - Integer querySameDestinationTask(String code); - - /** - * 查询相同起终任务的数量 - * - * @param - * @return - */ - Integer querySameDeviceReadyTask(String start_device,String next_device,String status); - - /** * 条件查询任务和指令 * @@ -569,31 +350,9 @@ public interface TaskService extends CommonService { */ List getTaskList(Map whereJson); - List findByStartCodeAndBusy(String deviceCode); - - /** - * 任务平均分配原则 根据任务起点和终点去找对应的指令终点 - * 除了包含之前的分配原则外 - * 新增了立库堆叠机双向点位出入库点位分配的逻辑 - * 即任务信息A->C,则拆分成指令信息为A->B,B->C - * - * @param device_code A - * @param task_nextDeice_code C - * @return 指令终点 B - */ - String queryAssignedByDeviceCode(String device_code, String task_nextDeice_code); - - /** - * 根据编号查询 - * - * @param task_code - * @return AcsTask - */ - TaskDto findByTaskCode(String task_code); - - List queryAllHJReadyTask(); - List> countByStatusAndCreateTimeBetween( Date start, Date end); + + TaskDto findByTaskType(String taskType); } diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/task/service/impl/TaskServiceImpl.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/task/service/impl/TaskServiceImpl.java index c5eda0b..de707db 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/task/service/impl/TaskServiceImpl.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/task/service/impl/TaskServiceImpl.java @@ -137,33 +137,6 @@ public class TaskServiceImpl extends CommonServiceImpl impleme return taskMapper.selectById(id); } - @Override - public List queryTaskByDeviceCodeAndStatus2(String device_code) { - List list = new ArrayList<>(); - Iterator iterator = tasks.iterator(); - while (iterator.hasNext()) { - TaskDto task = iterator.next(); - if (task.getStart_device_code().equals(device_code) - && StrUtil.equals(task.getTask_status(), TaskStatusEnum.BUSY.getIndex())) { - Instruction instruction = instructionService.findByTaskcodeAndStatus(task.getTask_code()); - if (ObjectUtil.isNotEmpty(instruction)) { - list.add(task); - } - } else { - if (StrUtil.equals(task.getTask_type(), TaskTypeEnum.Truss_Task.getIndex()) && StrUtil.isNotEmpty(task.getPut_device_code())) { - Instruction instruction = instructionService.findByDeviceCodeFromCache(task.getNext_device_code()); - if (ObjectUtil.isNotEmpty(instruction)) { - if (StrUtil.equals(instruction.getStart_device_code(), device_code)) { - list.add(task); - } - } - } - } - } - return list; - } - - @Override public TaskDto findById(String id) { return ConvertUtil.convert(getById(id), TaskDto.class); @@ -214,20 +187,13 @@ public class TaskServiceImpl extends CommonServiceImpl impleme @Override public List queryAll() { - List taskList = new LambdaQueryChainWrapper<>(taskMapper) - .lt(Task::getTask_status, TaskStatusEnum.FINISHED.getIndex()) - .eq(Task::getIs_delete, "0") - .orderByDesc(Task::getCreate_time) - .list(); + List taskList = new LambdaQueryChainWrapper<>(taskMapper).lt(Task::getTask_status, TaskStatusEnum.FINISHED.getIndex()).eq(Task::getIs_delete, "0").orderByDesc(Task::getCreate_time).list(); return ConvertUtil.convertList(taskList, TaskDto.class); } @Override public List queryAllByStatus(String task_status) { - List taskList = new LambdaQueryChainWrapper<>(taskMapper) - .eq(Task::getTask_status, task_status) - .eq(Task::getIs_delete, "0") - .list(); + List taskList = new LambdaQueryChainWrapper<>(taskMapper).eq(Task::getTask_status, task_status).eq(Task::getIs_delete, "0").list(); return ConvertUtil.convertList(taskList, TaskDto.class); } @@ -280,70 +246,6 @@ public class TaskServiceImpl extends CommonServiceImpl impleme return json; } - @Override - public Map queryAllByCache(Map whereJson, Pageable page) { - String task_code = (String) whereJson.get("task_code"); - String vehicle_code = (String) whereJson.get("vehicle_code"); - String vehicle_code2 = (String) whereJson.get("vehicle_code2"); - String material_type = (String) whereJson.get("material_type"); - String status = (String) whereJson.get("status"); - String point_code = (String) whereJson.get("point_code"); - String task_type = (String) whereJson.get("task_type"); - String is_over = (String) whereJson.get("is_over"); - Integer currentPageNumber = page.getPageNumber() + 1; - Integer pageMaxSize = page.getPageSize(); - List taskList = - Optional - .ofNullable(this.tasks) - .orElse(new CopyOnWriteArrayList<>()) - .stream() - .filter(t -> { - if (StrUtil.isNotEmpty(task_code)) { - return t.getTask_code().contains(task_code); - } - return true; - }) - .filter(t -> { - if (StrUtil.isNotEmpty(vehicle_code)) { - return t.getVehicle_code().contains(vehicle_code); - } - return true; - }) - .filter(t -> { - if (StrUtil.isNotEmpty(material_type)) { - return t.getMaterial().contains(material_type); - } - return true; - }) - .filter(t -> { - if (StrUtil.isNotEmpty(status)) { - return t.getTask_status().contains(status); - } - return true; - }) - .filter(t -> { - if (StrUtil.isNotEmpty(point_code)) { - return t.getStart_point_code().contains(point_code) || t.getNext_point_code().equals(point_code) || t.getPut_point_code().equals(point_code); - } - return true; - }) - .filter(t -> { - if (StrUtil.isNotEmpty(task_type)) { - return t.getTask_type().contains(task_type); - } - return true; - }) - .sorted((task1, task2) -> DateUtil.compare(DateUtil.parseDate(task1.getCreate_time()), DateUtil.parse(task2.getCreate_time()))) - .collect(Collectors.toList()); - List skipList = taskList.stream().skip((currentPageNumber - 1) * pageMaxSize) - .limit(pageMaxSize) - .collect(Collectors.toList()); - JSONObject jo = new JSONObject(); - jo.put("content", skipList); - jo.put("totalElements", taskList.size()); - return jo; - } - @Override public Map getAll(Map whereJson, Pageable page) { String task_code = (String) whereJson.get("task_code"); @@ -401,197 +303,17 @@ public class TaskServiceImpl extends CommonServiceImpl impleme @Override public List queryAll(Map whereJson) { - List taskList = new LambdaQueryChainWrapper<>(taskMapper) - .list(); + List taskList = new LambdaQueryChainWrapper<>(taskMapper).list(); return ConvertUtil.convertList(taskList, TaskDto.class); } - @Override - public List queryAllUnfinished(Map whereJson) { - List taskList = new LambdaQueryChainWrapper<>(taskMapper) - .lt(Task::getTask_status, TaskStatusEnum.FINISHED.getIndex()) - .list(); - return ConvertUtil.convertList(taskList, TaskDto.class); - } - - @Override - public List queryUnfinishTaskByDeviceCode(String device_code) { - List list = new ArrayList<>(); - Iterator iterator = tasks.iterator(); - while (iterator.hasNext()) { - TaskDto task = iterator.next(); - if (task.getStart_point_code().equals(device_code) - && (StrUtil.equals(task.getTask_status(), "0"))) { - list.add(task); - } - } - return list; - } - @Override public TaskDto findByCode(String code) { - Task task = new LambdaQueryChainWrapper<>(taskMapper) - .eq(Task::getTask_code, code) - .one(); + Task task = new LambdaQueryChainWrapper<>(taskMapper).eq(Task::getTask_code, code).one(); return ConvertUtil.convert(task, TaskDto.class); } - @Override - public TaskDto findByBarcodeFromCache(String barcode) { - Task task = new LambdaQueryChainWrapper<>(taskMapper) - .eq(Task::getVehicle_code, barcode) - .eq(Task::getTask_status, TaskStatusEnum.READY.getIndex()) - .one(); - return ConvertUtil.convert(task, TaskDto.class); - } - - @Override - public List queryTaskByDeviceCode(String device_code) { - return Optional - .ofNullable(this.tasks) - .orElse(new CopyOnWriteArrayList<>()) - .stream() - .filter(taskDto -> taskDto.getStart_device_code().equals(device_code) - && StrUtil.equals(taskDto.getTask_status(), TaskStatusEnum.READY.getIndex())) - .collect(Collectors.toList()); - } - - @Override - public List queryTaskByStartDeviceCode(String start_device_code) { - return Optional - .ofNullable(this.tasks) - .orElse(new CopyOnWriteArrayList<>()) - .stream() - .filter(task -> StrUtil.equals(task.getTask_type(), "6") - && StrUtil.equals(task.getTask_status(), TaskStatusEnum.READY.getIndex()) - && (task.getStart_device_code().equals(start_device_code) - || task.getStart_device_code2().equals(start_device_code))) - .collect(Collectors.toList()); - } - - @Override - public List queryTaskByBackDeviceCode(String back_start_device_code) { - return Optional - .ofNullable(this.tasks) - .orElse(new CopyOnWriteArrayList<>()) - .stream() - .filter(task -> StrUtil.equals(task.getTask_type(), "6") - && task.getStart_device_code().equals(back_start_device_code) - && StrUtil.equals(task.getTask_status(), TaskStatusEnum.READY.getIndex())) - .collect(Collectors.toList()); - } - - @Override - public List queryTaskByDeviceCodeAndStatus(String device_code) { - - List collect = Optional - .ofNullable(this.tasks) - .orElse(new CopyOnWriteArrayList<>()) - .stream() - .filter(task -> task.getStart_device_code().equals(device_code) - && StrUtil.equals(task.getTask_status(), TaskStatusEnum.BUSY.getIndex())) - .filter(task -> instructionService.findByTaskcodeAndStatus(task.getTask_code()) != null) - .collect(Collectors.toList()); - if (CollUtil.isEmpty(collect)) { - tasks.forEach( - task -> { - if (TASK_TYPE.equals(task.getTask_type()) && StrUtil.isNotEmpty(task.getPut_device_code())) { - Instruction instruction = instructionService.findByDeviceCodeFromCache(task.getNext_device_code()); - if (ObjectUtil.isNotEmpty(instruction)) { - if (StrUtil.equals(instruction.getStart_device_code(), device_code)) { - collect.add(task); - } - } - } - } - ); - } - return collect; - - } - - - @Override - public List queryTaskByDeviceCodeAndStatus3(String device_code) { - - List collect = Optional - .ofNullable(this.tasks) - .orElse(new CopyOnWriteArrayList<>()) - .stream() - .filter(task -> task.getStart_device_code().equals(device_code) - && StrUtil.equals(task.getTask_status(), TaskStatusEnum.BUSY.getIndex())) - .filter(task -> instructionService.findByTaskcodeAndStatus(task.getTask_code()) != null) - .collect(Collectors.toList()); - if (CollUtil.isEmpty(collect)) { - tasks.forEach( - task -> { - if (BQHJ_TYPE.equals(task.getTask_type()) && StrUtil.isNotEmpty(task.getPut_device_code())) { - Instruction instruction = instructionService.findByDeviceCodeFromCache(task.getNext_device_code()); - if (ObjectUtil.isNotEmpty(instruction)) { - if (StrUtil.equals(instruction.getStart_device_code(), device_code)) { - collect.add(task); - } - } - } - } - ); - } - return collect; - - } - - @Override - public List queryTaskByStartAndIntStatus(String head_start_device_code) { - return Optional - .ofNullable(this.tasks) - .orElse(new CopyOnWriteArrayList<>()) - .stream() - .filter(task -> StrUtil.equals(task.getTask_type(), "6") - && StrUtil.equals(task.getTask_status(), TaskStatusEnum.BUSY.getIndex()) - && (task.getStart_device_code().equals(head_start_device_code) - || task.getStart_device_code2().equals(head_start_device_code))) - .filter(task -> instructionService.findByTaskcodeAndStatus(task.getTask_code()) != null) - .collect(Collectors.toList()); - } - - @Override - public List queryTaskByNextAndIntStatus(String back_start_device_code) { - return Optional - .ofNullable(this.tasks) - .orElse(new CopyOnWriteArrayList<>()) - .stream() - .filter(task -> StrUtil.equals(task.getTask_type(), "6") - && task.getStart_device_code().equals(back_start_device_code) - && StrUtil.equals(task.getTask_status(), TaskStatusEnum.BUSY.getIndex())) - .filter(task -> instructionService.findByTaskcodeAndStatus(task.getTask_code()) != null) - .collect(Collectors.toList()); - } - - - @Override - public List queryByStauts(String status) { - List taskList = new LambdaQueryChainWrapper<>(taskMapper) - .eq(Task::getTask_status, status) - .list(); - return ConvertUtil.convertList(taskList, TaskDto.class); - } - - - @Override - public List findByTaskStatus(String status) { - List taskDtoList = new ArrayList<>(); - Iterator iterator = tasks.iterator(); - while (iterator.hasNext()) { - TaskDto task = iterator.next(); - if (StrUtil.equals(task.getTask_status(), status)) { - taskDtoList.add(task); - } - } - return taskDtoList; - } - - @Override public void create(TaskDto dto) throws Exception { dto = foramte(dto); @@ -638,10 +360,7 @@ public class TaskServiceImpl extends CommonServiceImpl impleme String nextDeviceType = deviceAppService.findDeviceTypeByCode(dto.getNext_device_code()); // 同一排转库任务不做路由校验 if (!(StrUtil.equals(DeviceType.storage.toString(), startDeviceType) && StrUtil.equals(DeviceType.storage.toString(), nextDeviceType) && StrUtil.equals(start_device_code, next_device_code))) { - if (routeLineService - .getShortPathLines(dto.getStart_device_code(), dto.getNext_device_code(), plan_code) - .size() - == 0) { + if (routeLineService.getShortPathLines(dto.getStart_device_code(), dto.getNext_device_code(), plan_code).size() == 0) { throw new BadRequestException(dto.getStart_point_code() + "->" + dto.getNext_point_code() + " " + LangProcess.msg("route_isNull")); } } @@ -751,10 +470,7 @@ public class TaskServiceImpl extends CommonServiceImpl impleme String device_code = MapUtil.getStr(whereJson, "device_code"); dto.setRoute_plan_code("one"); String next_device_code = ""; - String plan_uuid = - new LambdaQueryChainWrapper<>(routePlanMapper) - .eq(RoutePlan::getPlan_code, dto.getRoute_plan_code()) - .one().getPlan_uuid(); + String plan_uuid = new LambdaQueryChainWrapper<>(routePlanMapper).eq(RoutePlan::getPlan_code, dto.getRoute_plan_code()).one().getPlan_uuid(); JSONArray ja = routeLineService.queryNextLine(device_code, plan_uuid); for (int j = 0; j < ja.size(); j++) { JSONObject jo = (JSONObject) ja.get(j); @@ -824,8 +540,7 @@ public class TaskServiceImpl extends CommonServiceImpl impleme next_device_code = MapUtil.getStr(whereJson, "device_code"); } - if (ObjectUtil.isNotEmpty(this.findByStartCode(start_device_code)) - || ObjectUtil.isNotEmpty(this.findByNextCode(next_device_code))) { + if (ObjectUtil.isNotEmpty(this.findByStartCode(start_device_code)) || ObjectUtil.isNotEmpty(this.findByNextCode(next_device_code))) { throw new BadRequestException(LangProcess.msg("task_checkExist", start_device_code + " or " + next_device_code)); } if (StrUtil.equals(material_type, "") || StrUtil.equals(quantity, "")) { @@ -932,34 +647,6 @@ public class TaskServiceImpl extends CommonServiceImpl impleme this.feedWmsTaskStatus(entity); } - @Override - public void forceCancelAndInst(String id) throws Exception { - TaskDto entity = this.findById(id); - if (entity == null) { - throw new BadRequestException(LangProcess.msg("error_sysAuth")); - } - - InstructionDto instdto = instructionService.findByTaskid(id, "instruction_status <2 "); - if (instdto != null) { - instructionService.cancel(instdto.getInstruction_id()); - } - - String currentUsername = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); - 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); - - //移除任务缓存信息 - this.removeByCodeFromCache(entity.getTask_code()); - //反馈上位系统任务状态 -// this.feedWmsTaskStatus(entity); - } - @Override @Transactional(rollbackFor = Exception.class) public void cancelAndInst(String id) throws Exception { @@ -1021,12 +708,9 @@ public class TaskServiceImpl extends CommonServiceImpl impleme String start_height = acsTask.getStart_height(); String next_height = acsTask.getNext_height(); /** 开始平均分解校验 */ - String this_device_code = - this.queryAssignedByDevice(acsTask.getStart_device_code(), acsTask.getNext_device_code()); + String this_device_code = this.queryAssignedByDevice(acsTask.getStart_device_code(), acsTask.getNext_device_code()); if (StrUtil.isEmpty(this_device_code)) { - List shortPathsList = - routeLineService.getShortPathLines( - start_device_code, acsTask.getNext_device_code(), route_plan_code); + List shortPathsList = routeLineService.getShortPathLines(start_device_code, acsTask.getNext_device_code(), route_plan_code); if (shortPathsList.size() == 0) { throw new BadRequestException(start_device_code + "->" + acsTask.getNext_device_code() + "路由不存在!"); } @@ -1064,6 +748,7 @@ public class TaskServiceImpl extends CommonServiceImpl impleme instdto.setTask_id(taskid); instdto.setTask_code(taskcode); instdto.setVehicle_code(vehiclecode); + instdto.setCarno(acsTask.getCarno()); String now = DateUtil.now(); instdto.setCreate_time(now); instdto.setCreate_by(SecurityUtils.getCurrentNickName()); @@ -1178,111 +863,28 @@ public class TaskServiceImpl extends CommonServiceImpl impleme @Override public TaskDto findByContainer(String container_code) { - Optional optionalTask = tasks.stream() - .filter(task -> StrUtil.equals(task.getVehicle_code(), container_code)) - .findFirst(); + Optional optionalTask = tasks.stream().filter(task -> StrUtil.equals(task.getVehicle_code(), container_code)).findFirst(); return optionalTask.orElse(null); } @Override public TaskDto findByCodeFromCache(String task_code) { - Optional optionalTask = tasks.stream() - .filter(task -> StrUtil.equals(task.getTask_code(), task_code)) - .findFirst(); + Optional optionalTask = tasks.stream().filter(task -> StrUtil.equals(task.getTask_code(), task_code)).findFirst(); return optionalTask.orElse(null); } @Override public TaskDto findByNextCode(String device_code) { - Optional optionalTask = tasks.stream() - .filter(task -> StrUtil.equals(task.getNext_device_code(), device_code)) - .findFirst(); - return optionalTask.orElse(null); - } - - - @Override - public TaskDto findByStartCodeAndReady(String device_code) { - //根据时间升序取第一个 - Optional optionalTask = tasks.stream() - .filter(task -> StrUtil.equals(task.getStart_device_code(), device_code) - && StrUtil.equals(task.getTask_status(), TaskStatusEnum.READY.getIndex())).sorted(Comparator.comparing(TaskDto::getCreate_time)) - .findFirst(); - return optionalTask.orElse(null); - } - - @Override - public List findByTrappedManipulatorReady() { - //根据时间升序取第一个 - List taskDtoList = tasks.stream() - .filter(task -> StrUtil.equals(task.getTask_type(), TaskTypeEnum.Truss_Task.getIndex()) - && StrUtil.equals(task.getTask_status(), TaskStatusEnum.READY.getIndex())).collect(Collectors.toList()); - return taskDtoList; - } - - @Override - public TaskDto findByVehicleCodeCodeAndReady(String vehicleCode) { - Optional optionalTask = tasks.stream() - .filter(task -> StrUtil.equals(task.getVehicle_code(), vehicleCode) - && StrUtil.equals(task.getTask_status(), TaskStatusEnum.READY.getIndex())) - .findFirst(); - return optionalTask.orElse(null); - } - - - @Override - public TaskDto findByVehicleCode2AndExcute(String vehicleCode) { - Optional optionalTask = tasks.stream() - .filter(task -> StrUtil.equals(task.getVehicle_code2(), vehicleCode) - && StrUtil.equals(task.getTask_status(), TaskStatusEnum.BUSY.getIndex())) - .findFirst(); - return optionalTask.orElse(null); - } - - @Override - public TaskDto findByCodeAndExcute(String start_code, String next_code) { - Task task = this.lambdaQuery() - .eq(Task::getStart_device_code, start_code) - .eq(Task::getNext_device_code, next_code) - .eq(Task::getTask_status, TaskStatusEnum.BUSY.getIndex()) - .one(); - TaskDto taskDto = BeanUtil.copyProperties(task, TaskDto.class); - return taskDto; - } - - - @Override - public TaskDto findByStarCodeAndExcute(String start_code) { - Optional optionalTask = tasks.stream() - .filter(task -> StrUtil.equals(task.getStart_device_code(), start_code) - && (StrUtil.equals(task.getTask_status(), TaskStatusEnum.BUSY.getIndex()) || StrUtil.equals(task.getTask_status(), TaskStatusEnum.READY.getIndex()))) - .findFirst(); - return optionalTask.orElse(null); - } - - - @Override - public TaskDto findByEndCodeAndReady(String device_code) { - Optional optionalTask = tasks.stream() - .filter(task -> StrUtil.equals(task.getNext_device_code(), device_code) - && StrUtil.equals(task.getTask_status(), TaskStatusEnum.READY.getIndex()) - ) - .findFirst(); + Optional optionalTask = tasks.stream().filter(task -> StrUtil.equals(task.getNext_device_code(), device_code)).findFirst(); return optionalTask.orElse(null); } @Override public TaskDto findByStartCode(String device_code) { - return Optional - .ofNullable(this.tasks) - .orElse(new CopyOnWriteArrayList<>()) - .stream() - .filter(task -> StrUtil.equals(task.getStart_device_code(), device_code)) - .findFirst() - .orElse(null); + return Optional.ofNullable(this.tasks).orElse(new CopyOnWriteArrayList<>()).stream().filter(task -> StrUtil.equals(task.getStart_device_code(), device_code)).findFirst().orElse(null); } @Override @@ -1322,11 +924,7 @@ public class TaskServiceImpl extends CommonServiceImpl impleme } else { DeviceDriverDefination deviceDriverDefination = deviceAppService.findDeviceByCode(start_point_code).getDeviceDriverDefination(); if (BeanUtil.isNotEmpty(deviceDriverDefination)) { - String start_device = - deviceDriverDefination - .getFitDeviceTypes() - .get(0) - .name(); + String start_device = deviceDriverDefination.getFitDeviceTypes().get(0).name(); // 如果point_device为货架,则不包含列层信息,需要重新拼接 if (StrUtil.equals("storage", start_device)) { if (StrUtil.isEmpty(task.getFrom_x())) { @@ -1388,11 +986,7 @@ public class TaskServiceImpl extends CommonServiceImpl impleme } else { DeviceDriverDefination deviceDriverDefination = deviceAppService.findDeviceByCode(next_point_code).getDeviceDriverDefination(); if (BeanUtil.isNotEmpty(deviceDriverDefination)) { - String next_device = - deviceDriverDefination - .getFitDeviceTypes() - .get(0) - .name(); + String next_device = deviceDriverDefination.getFitDeviceTypes().get(0).name(); if (StrUtil.equals("storage", next_device)) { if (StrUtil.isEmpty(task.getTo_x())) { throw new BadRequestException(LangProcess.msg("endpoint_column")); @@ -1435,8 +1029,7 @@ public class TaskServiceImpl extends CommonServiceImpl impleme @Override public String queryAssignedByDevice(String device_code, String task_nextdeice_code) { - List list = - deviceAssignedService.queryAssignedByDevice(device_code, task_nextdeice_code); + List list = deviceAssignedService.queryAssignedByDevice(device_code, task_nextdeice_code); int flag1 = 0; String flag2 = null; for (int i = 0; i < list.size(); i++) { @@ -1601,146 +1194,46 @@ public class TaskServiceImpl extends CommonServiceImpl impleme public List getTaskList(Map whereJson) { LambdaQueryWrapper wrapper = getTaskLambdaQueryWrapper(whereJson); List taskList = taskMapper.selectList(wrapper); - return Optional - .ofNullable(taskList) - .orElse(new ArrayList<>()) - .stream() - .map(task -> { - JSONObject ins = new JSONObject(); - ins.put("task_code", task.getTask_code()); - ins.put("vehicle_code", task.getVehicle_code()); - ins.put("task_status", task.getTask_status()); - ins.put("priority", task.getPriority()); - ins.put("start_point_code", task.getStart_point_code()); - ins.put("next_point_code", task.getNext_point_code()); - ins.put("matarial", task.getMaterial()); - ins.put("quantity", task.getQuantity()); - ins.put("remark", task.getRemark()); - ins.put("create_by", task.getCreate_by()); - ins.put("create_time", task.getCreate_time()); - return ins; - }) - .collect(Collectors.toList()); - } - - @Override - public List findByStartCodeAndBusy(String deviceCode) { - return Optional - .ofNullable(this.tasks) - .orElse(new CopyOnWriteArrayList<>()) - .stream() - .filter(task -> StrUtil.equals(task.getStart_device_code(), deviceCode) - && StrUtil.equals(task.getTask_status(), TaskStatusEnum.BUSY.getIndex())) - .limit(2) - .collect(Collectors.toList()); - } - - - @Override - public Integer querySameOriginTask(String code) { - return (int) Optional - .ofNullable(this.tasks) - .orElse(new CopyOnWriteArrayList<>()) - .stream() - .filter(task -> StrUtil.equals(task.getStart_device_code(), code)) - .count(); - } - - @Override - public Integer querySameDestinationTask(String code) { - return Optional - .ofNullable(this.tasks) - .orElse(new CopyOnWriteArrayList<>()) - .stream() - .filter(taskDto -> StrUtil.equals(taskDto.getNext_device_code(), code)) - .collect(Collectors.toList()) - .size(); - } - - @Override - public Integer querySameDeviceReadyTask(String start_device, String next_device, String status) { - int num = 0; - Iterator iterator = tasks.iterator(); - while (iterator.hasNext()) { - TaskDto task = iterator.next(); - if (StrUtil.equals(task.getStart_device_code(), start_device) - && StrUtil.equals(task.getNext_device_code(), next_device) - && StrUtil.equals(task.getTask_status(), status)) { - num++; - } - } - - return num; - } - - @Override - public String queryAssignedByDeviceCode(String device_code, String task_nextDeice_code) { - List list = - deviceAssignedService.queryAssignedByDevice(device_code, task_nextDeice_code); - for (int i = 0; i < list.size(); i++) { - DeviceAssignedDto dto = list.get(i); - String deviceCode = dto.getDevice_code(); - String inst_nextDevice_code = dto.getInst_nextDevice_code(); - JSONObject param = JSON.parseObject(dto.getParam()); - List pathList = this.getPathList(inst_nextDevice_code); - for (int j = 0; j < pathList.size(); j++) { - String inst_next_device_code = pathList.get(j); - String limit = param.getString("limit"); - Boolean inOut = param.getBoolean("inOut"); - if (inOut) { - Device device = deviceAppService.findDeviceByCode(deviceCode); - if (device != null) { - if (StrUtil.equals(device.getDevice_type(), DeviceType.storage.toString())) { - if (instructionService.querySameNextDeviceCodeInstByIn(inst_next_device_code)) { - return inst_next_device_code; - } - } else { - if (instructionService.querySameNextDeviceCodeInstByOut(inst_next_device_code)) { - return inst_next_device_code; - } - } - } - } else { - Integer sameInstNum = instructionService.querySameDestinationInst(inst_next_device_code); - if (sameInstNum < Integer.parseInt(limit)) { - return inst_next_device_code; - } - } - } - } - return null; - } - - @Override - public TaskDto findByTaskCode(String task_code) { - - List list = new ArrayList<>(); - Iterator iterator = tasks.iterator(); - while (iterator.hasNext()) { - TaskDto task = iterator.next(); - if (StrUtil.equals(task.getTask_code(), task_code)) { - return task; - } - } - return null; - } - - @Override - public List queryAllHJReadyTask() { - return Optional - .ofNullable(this.tasks) - .orElse(new CopyOnWriteArrayList<>()) - .stream() - .filter(taskDto -> StrUtil.equals(taskDto.getTask_type(), TaskTypeEnum.Truss_Task.getIndex()) - && StrUtil.equals(taskDto.getTask_status(), TaskStatusEnum.READY.getIndex())) - .collect(Collectors.toList()); + return Optional.ofNullable(taskList).orElse(new ArrayList<>()).stream().map(task -> { + JSONObject ins = new JSONObject(); + ins.put("task_code", task.getTask_code()); + ins.put("vehicle_code", task.getVehicle_code()); + ins.put("task_status", task.getTask_status()); + ins.put("priority", task.getPriority()); + ins.put("start_point_code", task.getStart_point_code()); + ins.put("next_point_code", task.getNext_point_code()); + ins.put("matarial", task.getMaterial()); + ins.put("quantity", task.getQuantity()); + ins.put("remark", task.getRemark()); + ins.put("create_by", task.getCreate_by()); + ins.put("create_time", task.getCreate_time()); + return ins; + }).collect(Collectors.toList()); } @Override public List> countByStatusAndCreateTimeBetween(Date start, Date end) { + return taskMapper.countByStatusAndCreateTimeBetween(DateUtil.format(start, "yyyy-MM-dd HH:mm:ss.SSS"), DateUtil.format(end, "yyyy-MM-dd HH:mm:ss.SSS")); + } - return taskMapper.countByStatusAndCreateTimeBetween(DateUtil.format(start,"yyyy-MM-dd HH:mm:ss.SSS"), - DateUtil.format(end,"yyyy-MM-dd HH:mm:ss.SSS")); + @Override + public TaskDto findByTaskType(String taskType) { + return Optional.ofNullable(this.tasks) + .orElse(new CopyOnWriteArrayList<>()) + .stream() + .filter(taskDto -> Objects.equals(taskDto.getTask_type(), taskType)) + .filter(taskDto -> Objects.equals(taskDto.getTask_status(), TaskStatusEnum.READY.getIndex())) + .sorted(Comparator + .comparingInt((TaskDto taskDto) -> { + try { + return Integer.parseInt(taskDto.getPriority()); + } catch (Exception e) { + return Integer.MAX_VALUE; + } + }) + .thenComparing(taskDto -> Optional.ofNullable(taskDto.getCreate_time()).orElse(""))) + .findFirst() + .orElse(null); } @@ -1771,12 +1264,6 @@ public class TaskServiceImpl extends CommonServiceImpl impleme TaskDto entity = this.findById(taskDto.getTask_id()); String hasWms = paramService.findByCode(AcsConfig.HASWMS).getValue(); if (!StrUtil.startWith(taskDto.getTask_code(), CommonFinalParam.HYPHEN_) && StrUtil.equals(hasWms, CommonFinalParam.ONE)) { -// FeedBackTaskStatusRequest request = new FeedBackTaskStatusRequest(); -// request.setTask_id(taskDto.getExt_task_id()); -// request.setTask_code(taskDto.getTask_code()); -// request.setTask_status(taskDto.getTask_status()); -// request.setRequest_medthod_code(RequestMethodEnum.feedback_task_status.getCode()); -// request.setRequest_medthod_name(RequestMethodEnum.feedback_task_status.getName()); JSONObject feed_jo = new JSONObject(); feed_jo.put("task_id", entity.getExt_task_id()); feed_jo.put("task_code", entity.getTask_code()); diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/AutoCreateInst.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/AutoCreateInst.java index ff068a7..7fd6399 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/AutoCreateInst.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/AutoCreateInst.java @@ -22,6 +22,7 @@ import org.nl.common.utils.CodeUtil; import org.nl.common.utils.SecurityUtils; import org.nl.config.SpringContextHolder; import org.nl.config.lucene.service.LuceneExecuteLogService; +import org.nl.config.lucene.service.dto.LuceneLogDto; import org.nl.config.lucene.service.impl.LuceneExecuteLogServiceImpl; import org.springframework.stereotype.Component; @@ -49,12 +50,6 @@ public class AutoCreateInst { 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; - } String taskid = acsTask.getTask_id(); String taskcode = acsTask.getTask_code(); String task_type = acsTask.getTask_type(); @@ -149,6 +144,7 @@ public class AutoCreateInst { instdto.setTask_id(taskid); instdto.setTask_code(taskcode); instdto.setVehicle_code(vehiclecode); + instdto.setCarno(acsTask.getCarno()); instdto.setVehicle_code2(vehiclecode2); String now = DateUtil.now(); instdto.setCreate_time(now); @@ -203,17 +199,17 @@ public class AutoCreateInst { instdto.setAgv_inst_type("4"); } try { - instructionService.create(instdto); + instructionService.create(instdto); } catch (Exception e) { acsTask.setRemark(e.getMessage()); taskserver.updateByCodeFromCache(acsTask); continue; } //创建指令后修改任务状态 - acsTask.setTask_status(TaskStatusEnum.BUSY.getIndex()); - acsTask.setUpdate_time(DateUtil.now()); - acsTask.setRemark(" "); - taskserver.update(acsTask); + acsTask.setTask_status(TaskStatusEnum.BUSY.getIndex()); + acsTask.setUpdate_time(DateUtil.now()); + acsTask.setRemark(" "); + taskserver.update(acsTask); } } diff --git a/acs2/nladmin-system/nlsso-server/src/main/resources/config/application-dev.yml b/acs2/nladmin-system/nlsso-server/src/main/resources/config/application-dev.yml index dd02509..f388ea6 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/resources/config/application-dev.yml +++ b/acs2/nladmin-system/nlsso-server/src/main/resources/config/application-dev.yml @@ -8,9 +8,9 @@ spring: druid: db-type: com.alibaba.druid.pool.DruidDataSource driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy - url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.81.251}:${DB_PORT:3306}/${DB_NAME:stand_acs_kit}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true + url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:stand_acs_kit}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true username: ${DB_USER:root} - password: ${DB_PWD:P@ssw0rd.} + password: ${DB_PWD:password} # password: ${DB_PWD:p@ssw0rd} # 初始连接数 initial-size: 20 diff --git a/acs2/nladmin-system/nlsso-server/src/main/resources/logback-spring.xml b/acs2/nladmin-system/nlsso-server/src/main/resources/logback-spring.xml index 427aaa5..e133110 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/resources/logback-spring.xml +++ b/acs2/nladmin-system/nlsso-server/src/main/resources/logback-spring.xml @@ -68,11 +68,11 @@ https://juejin.cn/post/6844903775631572999 - - - + + + - + @@ -114,7 +114,7 @@ https://juejin.cn/post/6844903775631572999 - + diff --git a/acs2/nladmin-ui/src/views/acs/device/config.vue b/acs2/nladmin-ui/src/views/acs/device/config.vue index 5f73b43..2aece4f 100644 --- a/acs2/nladmin-ui/src/views/acs/device/config.vue +++ b/acs2/nladmin-ui/src/views/acs/device/config.vue @@ -63,7 +63,9 @@ - + + + @@ -76,7 +78,9 @@ import { getDicts } from '@/views/system/dict/dict' import standard_autodoor from '@/views/acs/device/driver/standard_autodoor' import standard_inspect_site from './driver/standard_inspect_site' import standard_ordinary_site from './driver/standard_ordinary_site' +import standard_wall_robot from './driver/standard_wall_robot' import belt_conveyor from '@/views/acs/device/driver/belt_conveyor' +import standard_storage from '@/views/acs/device/driver/standard_storage' import agv_ndc_one from '@/views/acs/device/driver/agv/agv_ndc_one' import agv_ndc_two from '@/views/acs/device/driver/agv/agv_ndc_two' import xg_agv from '@/views/acs/device/driver/agv/xg_agv' @@ -93,7 +97,9 @@ export default { xg_agv, belt_conveyor, standard_manipulator, - xg_agv_car + xg_agv_car, + standard_wall_robot, + standard_storage }, dicts: ['device_type'], mixins: [crud], diff --git a/acs2/nladmin-ui/src/views/acs/device/driver/standard_ordinary_site.vue b/acs2/nladmin-ui/src/views/acs/device/driver/standard_ordinary_site.vue index 1e00648..73faf97 100644 --- a/acs2/nladmin-ui/src/views/acs/device/driver/standard_ordinary_site.vue +++ b/acs2/nladmin-ui/src/views/acs/device/driver/standard_ordinary_site.vue @@ -1,151 +1,114 @@ @@ -165,13 +128,31 @@ export default { } }, data() { + const validateOptionalNonNegativeInteger = (rule, value, callback) => { + if (value === '' || value === null || value === undefined) { + callback() + return + } + const num = Number(value) + if (!Number.isInteger(num) || num < 0) { + callback(new Error('请输入非负整数')) + return + } + callback() + } return { device_code: '', device_id: '', configLoading: false, deviceList: [], address: '', + tempXInput: '0', + tempYInput: '0', + tempZInput: '0', form: { + temp_x: 0, + temp_y: 0, + temp_z: 0, inspect_in_stocck: true, ignore_pickup_check: true, ignore_release_check: true, @@ -186,7 +167,17 @@ export default { input_material: true, reqWms: true }, - rules: {} + rules: { + temp_x: [ + { validator: (rule, value, callback) => validateOptionalNonNegativeInteger(rule, this.tempXInput, callback), trigger: 'blur' } + ], + temp_y: [ + { validator: (rule, value, callback) => validateOptionalNonNegativeInteger(rule, this.tempYInput, callback), trigger: 'blur' } + ], + temp_z: [ + { validator: (rule, value, callback) => validateOptionalNonNegativeInteger(rule, this.tempZInput, callback), trigger: 'blur' } + ] + } } }, created() { @@ -202,6 +193,9 @@ export default { if (arr.length > 0) { this.form = data.form } + this.tempXInput = this.normalizeCoordinate(this.form.temp_x) + this.tempYInput = this.normalizeCoordinate(this.form.temp_y) + this.tempZInput = this.normalizeCoordinate(this.form.temp_z) } }) deviceCrud.selectDeviceList().then(data => { @@ -210,6 +204,20 @@ export default { }) }, methods: { + normalizeCoordinate(value) { + if (value === '' || value === null || value === undefined) { + return '0' + } + const num = Number(value) + return Number.isNaN(num) ? '0' : String(num) + }, + normalizeCoordinateForSubmit(value) { + if (value === '' || value === null || value === undefined) { + return 0 + } + const num = Number(value) + return Number.isNaN(num) ? 0 : num + }, doSubmit() { this.$refs['form'].validate((valid) => { if (valid) { @@ -217,7 +225,16 @@ export default { // 根据驱动类型判断是否为路由设备 const parentForm = this.parentForm parentForm.is_route = false - updateConfig(parentForm, this.form).then(res => { + this.form.temp_x = this.normalizeCoordinateForSubmit(this.tempXInput) + this.form.temp_y = this.normalizeCoordinateForSubmit(this.tempYInput) + this.form.temp_z = this.normalizeCoordinateForSubmit(this.tempZInput) + const submitForm = { + ...this.form, + temp_x: this.form.temp_x, + temp_y: this.form.temp_y, + temp_z: this.form.temp_z + } + updateConfig(parentForm, submitForm).then(res => { this.notify('保存成功', 'success') this.configLoading = false }).catch(err => { @@ -232,5 +249,137 @@ export default { diff --git a/acs2/nladmin-ui/src/views/acs/device/driver/standard_storage.vue b/acs2/nladmin-ui/src/views/acs/device/driver/standard_storage.vue new file mode 100644 index 0000000..c5ed42b --- /dev/null +++ b/acs2/nladmin-ui/src/views/acs/device/driver/standard_storage.vue @@ -0,0 +1,353 @@ + + + + + diff --git a/acs2/nladmin-ui/src/views/acs/device/driver/standard_wall_robot.vue b/acs2/nladmin-ui/src/views/acs/device/driver/standard_wall_robot.vue new file mode 100644 index 0000000..995a991 --- /dev/null +++ b/acs2/nladmin-ui/src/views/acs/device/driver/standard_wall_robot.vue @@ -0,0 +1,458 @@ + + + + + diff --git a/acs2/nladmin-ui/src/views/acs/device/opc/index.vue b/acs2/nladmin-ui/src/views/acs/device/opc/index.vue index c5d7477..c85bc07 100644 --- a/acs2/nladmin-ui/src/views/acs/device/opc/index.vue +++ b/acs2/nladmin-ui/src/views/acs/device/opc/index.vue @@ -104,12 +104,11 @@ { + if (item.hasOwnProperty('hasChildren')) { + item.hasChildren = item.hasChildren === "1" || item.hasChildren === 1 || item.hasChildren === true; + } else if (item.children && item.children.length > 0) { + item.hasChildren = true; + } else { + item.hasChildren = false; + } + if (item.children && Array.isArray(item.children)) { + item.children = this.processTreeData(item.children); + } + return item; + }); + }, handleClick(row, flag) { // flag为0是新增,flag为1是编辑,flag为2是删除 // 如果是父类操作