rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/MissionTransferStationController.java
@@ -1,9 +1,15 @@ package com.vincent.rsf.openApi.controller; import com.vincent.rsf.framework.common.Cools; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.openApi.entity.dto.CommonResponse; import com.vincent.rsf.openApi.entity.params.MissionTaskIssueParam; import com.vincent.rsf.openApi.enums.MissionSystemCodeEnum; import com.vincent.rsf.openApi.service.WmsWcsService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -15,13 +21,43 @@ @RequestMapping("/mission") public class MissionTransferStationController { @Autowired private WmsWcsService wmsWcsService; @ApiOperation("任务总控") @PostMapping("/task/master/control") public CommonResponse missionMasterControl(@RequestBody Object objParams) { System.out.println("111"); public CommonResponse missionMasterControl(@RequestBody MissionTaskIssueParam param) { try{ if (Cools.isEmpty(param)){ return CommonResponse.error("参数为空!!!"); } //判断需要下发系统 if (param.getSystemCode().equals(MissionSystemCodeEnum.MISSION_SYSTEM_CODE_ENUM_HK_RCS_YZ_5.type)){ //转海康下发程序 // R r = wmsWcsService.issueTaskWcs(param); // if (!r.get("code").equals(200)){ // return CommonResponse.error(""+r.get("msg")); // } } else if (param.getSystemCode().equals(MissionSystemCodeEnum.MISSION_SYSTEM_CODE_ENUM_ZY_WCS_TWO.type)){ //转wcs下发程序 R r = wmsWcsService.issueTaskWcs(param); if (!r.get("code").equals(200)){ return CommonResponse.error(""+r.get("msg")); } } else if (param.getSystemCode().equals(MissionSystemCodeEnum.MISSION_SYSTEM_CODE_ENUM_WEIGHING_YZ_5.type)){ //转称重 // R r = wmsWcsService.issueTaskWcs(param); // if (!r.get("code").equals(200)){ // return CommonResponse.error(""+r.get("msg")); // } } else { return CommonResponse.error("未知系统类型"); } //判断下发方式 //返回结果 return CommonResponse.ok(); } catch (Exception e){ return CommonResponse.error(e.getMessage()); } } } rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/constant/WcsConstant.java
@@ -2,8 +2,13 @@ public class WcsConstant { public static String pubTask = "/openapi/createInTask"; public static String createInTask = "/wcs/openapi/createInTask";//入库任务申请 public static String syncLocs = "/api/open/loc/sync"; public static String createOutTask = "/wcs/openapi/createOutTask";//出库任务下发 public static String createLocMoveTask = "/wcs/openapi/createLocMoveTask";//移库任务下发 public static String STA_TO_STA = "/wcs/openapi/createLocMoveTask";//移库任务下发 public static String syncLocs = "/wcs/api/open/loc/sync"; } rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/params/MissionTaskIssueParam.java
New file @@ -0,0 +1,119 @@ package com.vincent.rsf.openApi.entity.params; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.Date; @Data public class MissionTaskIssueParam { /** * WMS任务号 */ private String taskNo; private String barcode;//条码 private Integer taskPri;//优先级 /* * 类型:出库、入库、移库、站到站 * */ private String type; /** * 起点编码 */ private String sourceCode; /** * 终点编码 */ private String targetCode; /** * 子系统编码 */ private String systemCode; /** * 子系统名称 */ private String systemName; /** * 步骤类型:REQUEST-请求, RESPONSE-响应, VALIDATE-校验, TRANSFORM-转换 */ private String stepType; /** * 动作类型:HTTP_CALL, RPC_CALL, MQ_SEND, DB_OPERATION */ private String actionType; /** * 关联flow_instance.id */ private Long flowInstanceId; /** * 流程实例编号 */ private String flowInstanceNo; /** * 步骤顺序 */ private Integer stepOrder; /** * 步骤编码 */ private String stepCode; /** * 步骤名称 */ private String stepName; /** * 步骤模板ID */ private Long stepTemplateId; /** * 状态:0-排队中 1-待执行 2-执行中 3-执行成功 4-执行失败 5-已跳过 6-已取消 */ private Short status; /** * 执行结果 */ private String executeResult; /** * 错误码 */ private String errorCode; /** * 错误信息 */ private String errorMessage; /** * 开始时间 */ private Date startTime; /** * 执行耗时(秒) */ private Integer durationSeconds; /** * 步骤重试次数 */ private Integer retryTimes; } rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/params/MissionWcsTaskIssueParam.java
New file @@ -0,0 +1,80 @@ package com.vincent.rsf.openApi.entity.params; import lombok.Data; import java.util.Date; @Data public class MissionWcsTaskIssueParam { //移库 ********************************************************************** /** * WMS任务号 工作号 */ private String taskNo; /* * 源库位 * */ private String sourceLocNo; /* * 目标库位 * */ private String locNo; /* * 任务优先级 * */ private Integer taskPri = 1; //出库 ********************************************************************** // /** // * WMS任务号 工作号 // */ // private String taskNo; // /* // * 出库库位 // * */ // private String locNo; // /* // * 任务优先级 // * */ // private String taskPri; /* * 目标站(优先级高于出库区域) * */ private Integer staNo; /* * 出库区域 * */ private String outArea; /* * 出库批次号 * */ private String batch; /* * 出库顺序号 * */ private Integer batchSeq; //入库 ********************************************************************** // /** // * WMS任务号 工作号 // */ // private String taskNo; // /* // * 库位号 // * */ // private String locNo; // /* // * 任务优先级 // * */ // private String taskPri; /* * 条码 * */ private String barcode; } rsf-open-api/src/main/java/com/vincent/rsf/openApi/enums/MissionActionTypeEnum.java
New file @@ -0,0 +1,21 @@ package com.vincent.rsf.openApi.enums; /** * @author Ryan * @version 1.0 * @title TaskType * @description * @create 2025/3/29 17:02 */ public enum MissionActionTypeEnum { MISSION_ACTION_TYPE_ENUM_HTTP_CALL("HTTP_CALL", "HTTP_CALL"), MISSION_ACTION_TYPE_ENUM_NO_EXECUTE("NO_EXECUTE", "NO_EXECUTE"), ; public String type; public String desc; MissionActionTypeEnum(String type, String desc) { this.type = type; this.desc = desc; } } rsf-open-api/src/main/java/com/vincent/rsf/openApi/enums/MissionStepTypeEnum.java
New file @@ -0,0 +1,33 @@ package com.vincent.rsf.openApi.enums; /** * @author Ryan * @version 1.0 * @title TaskType * @description * @create 2025/3/29 17:02 */ public enum MissionStepTypeEnum { MISSION_STEP_TYPE_RESPONSE("RESPONSE", "响应"), MISSION_STEP_TYPE_RECEIVE("RECEIVE", "接收"), MISSION_STEP_TYPE_RECEIVE_BIN("RECEIVE_BIN", "接收-解绑"), MISSION_STEP_TYPE_REQUEST("REQUEST", "请求"), MISSION_STEP_TYPE_UNBIND("UNBIND", "解绑"), MISSION_STEP_TYPE_BIND("BIND", "绑定"), MISSION_STEP_TYPE_OBTAIN("OBTAIN", "获取"), MISSION_STEP_TYPE_NO_EXECUTE("NO_EXECUTE", "越过"), MISSION_STEP_TYPE_VALIDATE("VALIDATE", "校验"), MISSION_STEP_TYPE_TRANSFORM("TRANSFORM", "转换"), ; public String type; public String desc; MissionStepTypeEnum(String type, String desc) { this.type = type; this.desc = desc; } } rsf-open-api/src/main/java/com/vincent/rsf/openApi/enums/MissionSystemCodeEnum.java
New file @@ -0,0 +1,24 @@ package com.vincent.rsf.openApi.enums; /** * @author Ryan * @version 1.0 * @title TaskType * @description * @create 2025/3/29 17:02 */ public enum MissionSystemCodeEnum { MISSION_SYSTEM_CODE_ENUM_ZY_WCS_TWO("ZY_WCS_TWO", "中扬WCS2.0"), MISSION_SYSTEM_CODE_ENUM_HK_RCS_YZ_5("HK_RCS_YZ_5", "银座五期对接海康RCS"), MISSION_SYSTEM_CODE_ENUM_WEIGHING_YZ_5("WEIGHING_YZ_5", "银座五期称重"), MISSION_SYSTEM_CODE_ENUM_NO_EXECUTE("NO_EXECUTE", "不执行"), ; public String type; public String desc; MissionSystemCodeEnum(String type, String desc) { this.type = type; this.desc = desc; } } rsf-open-api/src/main/java/com/vincent/rsf/openApi/enums/TaskTypeEnum.java
@@ -14,13 +14,13 @@ TASK_TYPE_ENUM_STA("STA_TO_STA", "站点间搬运") ; public String code; public String desc; TaskTypeEnum(String code, String desc) { this.code = code; this.desc = desc; } private String code; private String desc; } rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/WmsWcsService.java
@@ -3,13 +3,11 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.openApi.entity.Loc; import com.vincent.rsf.openApi.entity.params.WcsChangeLocParam; import com.vincent.rsf.openApi.entity.params.WcsCreateInTaskParam; import com.vincent.rsf.openApi.entity.params.WcsReassignLocParam; import com.vincent.rsf.openApi.entity.params.WcsTaskReportParam; import com.vincent.rsf.openApi.entity.params.*; public interface WmsWcsService extends IService<Loc> { R issueTaskWcs(MissionTaskIssueParam params); R wcsCreateInTask(WcsCreateInTaskParam params); R wcsTaskReport(WcsTaskReportParam params); R wcsReassignLoc(WcsReassignLocParam params); rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/impl/WmsRcsServiceImpl.java
@@ -100,7 +100,7 @@ @Transactional(rollbackFor = Exception.class) public CommonResponse pubTasksWcs(RcsPubTaskParams params) { /**WCS基础配置链接*/ String rcsUrl = wcsApi.getHost() + ":" + wcsApi.getPort() + WcsConstant.pubTask; String rcsUrl = wcsApi.getHost() + ":" + wcsApi.getPort() + WcsConstant.createInTask; log.info("WCS任务下发,请求地址: {}, 请求参数: {}", rcsUrl , JSONObject.toJSONString(params)); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/impl/WmsWcsServiceImpl.java
@@ -9,12 +9,13 @@ import com.vincent.rsf.framework.common.R; import com.vincent.rsf.openApi.config.PlatformProperties; import com.vincent.rsf.openApi.entity.Loc; import com.vincent.rsf.openApi.entity.constant.WcsConstant; import com.vincent.rsf.openApi.entity.constant.WmsConstant; import com.vincent.rsf.openApi.entity.dto.CommonResponse; import com.vincent.rsf.openApi.entity.params.WcsChangeLocParam; import com.vincent.rsf.openApi.entity.params.WcsCreateInTaskParam; import com.vincent.rsf.openApi.entity.params.WcsReassignLocParam; import com.vincent.rsf.openApi.entity.params.WcsTaskReportParam; import com.vincent.rsf.openApi.entity.params.*; import com.vincent.rsf.openApi.enums.MissionActionTypeEnum; import com.vincent.rsf.openApi.enums.MissionStepTypeEnum; import com.vincent.rsf.openApi.enums.TaskTypeEnum; import com.vincent.rsf.openApi.mapper.LocMapper; import com.vincent.rsf.openApi.service.WmsWcsService; import lombok.extern.slf4j.Slf4j; @@ -38,12 +39,121 @@ private PlatformProperties.WmsApi wmsApi; @Autowired private PlatformProperties.WcsApi wcsApi; @Autowired private RestTemplate restTemplate; /** * @author Munch D. Luffy * @date 2026/01/09 * @description: 任务下发 * @description: 任务下发(指令下发) * @version 1.0 */ @Override @Transactional(rollbackFor = Exception.class) public R issueTaskWcs(MissionTaskIssueParam param) { if (param.getActionType().equals(MissionActionTypeEnum.MISSION_ACTION_TYPE_ENUM_HTTP_CALL.type)){ return issueTaskWcsHttp(param); } return R.error(); } /** * @author Munch D. Luffy * @date 2026/01/09 * @description: 任务下发(指令下发,HTTP方式) * @version 1.0 */ @Transactional(rollbackFor = Exception.class) public R issueTaskWcsHttp(MissionTaskIssueParam param) { if (param.getStepType().equals(MissionStepTypeEnum.MISSION_STEP_TYPE_REQUEST.type)){ return issueTaskWcsHttpREQUEST(param); } else if (param.getStepType().equals(MissionStepTypeEnum.MISSION_STEP_TYPE_UNBIND.type)){ return issueTaskWcsHttpREQUEST(param);//待完善 } else if (param.getStepType().equals(MissionStepTypeEnum.MISSION_STEP_TYPE_BIND.type)){ return issueTaskWcsHttpREQUEST(param);//待完善 } else if (param.getStepType().equals(MissionStepTypeEnum.MISSION_STEP_TYPE_OBTAIN.type)){ return issueTaskWcsHttpREQUEST(param);//待完善 } else if (param.getStepType().equals(MissionStepTypeEnum.MISSION_STEP_TYPE_NO_EXECUTE.type)){ return issueTaskWcsHttpREQUEST(param);//待完善 } return R.error(); } /** * @author Munch D. Luffy * @date 2026/01/09 * @description: 任务下发(指令下发,HTTP方式) * @version 1.0 */ @Transactional(rollbackFor = Exception.class) public R issueTaskWcsHttpREQUEST(MissionTaskIssueParam param) { try{ String wcsUrl = wcsApi.getHost() + ":" + wcsApi.getPort(); MissionWcsTaskIssueParam missionWcsTaskIssueParam = new MissionWcsTaskIssueParam(); if (param.getType().equals(TaskTypeEnum.TASK_TYPE_ENUM_IN.code)){ wcsUrl = wcsUrl + WcsConstant.createInTask; missionWcsTaskIssueParam.setTaskNo(param.getTaskNo()); missionWcsTaskIssueParam.setLocNo(param.getTargetCode()); missionWcsTaskIssueParam.setBarcode(param.getBarcode()); missionWcsTaskIssueParam.setTaskPri(param.getTaskPri()); } else if (param.getType().equals(TaskTypeEnum.TASK_TYPE_ENUM_OUT.code)){ wcsUrl = wcsUrl + WcsConstant.createOutTask; missionWcsTaskIssueParam.setTaskNo(param.getTaskNo()); missionWcsTaskIssueParam.setLocNo(param.getSourceCode()); missionWcsTaskIssueParam.setTaskPri(param.getTaskPri()); missionWcsTaskIssueParam.setStaNo(Integer.parseInt(param.getTargetCode()));//目标站 missionWcsTaskIssueParam.setOutArea("");//目标区域 missionWcsTaskIssueParam.setBatch("");//出库批次号 missionWcsTaskIssueParam.setBatchSeq(1);//出库顺序号 } else if (param.getType().equals(TaskTypeEnum.TASK_TYPE_ENUM_TRANSFER.code)){ wcsUrl = wcsUrl + WcsConstant.createLocMoveTask; missionWcsTaskIssueParam.setTaskNo(param.getTaskNo()); missionWcsTaskIssueParam.setSourceLocNo(param.getSourceCode()); missionWcsTaskIssueParam.setLocNo(param.getTargetCode()); missionWcsTaskIssueParam.setTaskPri(param.getTaskPri()); } else if (param.getType().equals(TaskTypeEnum.TASK_TYPE_ENUM_STA.code)){ wcsUrl = wcsUrl + WcsConstant.STA_TO_STA; missionWcsTaskIssueParam.setTaskNo(param.getTaskNo()); } /**WMS基础配置链接*/ log.info("入库任务申请,请求地址: {}, 请求参数: {}", wcsUrl , JSONObject.toJSONString(param)); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); headers.add("api-version", "v2.0"); HttpEntity httpEntity = new HttpEntity(param, headers); ResponseEntity<String> exchange = restTemplate.exchange(wcsUrl, HttpMethod.POST, httpEntity, String.class); log.info("WCS任务申请,响应结果: {}", exchange); if (Objects.isNull(exchange.getBody())) { return R.error().add("下发Wcs返回参数为空!!!"); } else { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.coercionConfigDefaults() .setCoercion(CoercionInputShape.EmptyString, CoercionAction.AsEmpty); try { CommonResponse result = objectMapper.readValue(exchange.getBody(), CommonResponse.class); if (result.getCode() == 200) { return R.ok(result.getMsg()).add(result.getData()); } else { return R.error(result.getMsg()); // throw new CoolException("任务执行状态上报失败!!"); } } catch (JsonProcessingException e) { // throw new CoolException(e.getMessage()); } } } catch (Exception e){ log.error(e.getMessage(),e); } return R.error(); } /** * @author Munch D. Luffy * @date 2026/01/09 * @description: 任务下发(被动接收) * @version 1.0 */ @Override rsf-server/src/main/java/com/vincent/rsf/server/api/entity/params/MissionTaskIssueParam.java
New file @@ -0,0 +1,148 @@ package com.vincent.rsf.server.api.entity.params; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.vincent.rsf.server.system.entity.FlowStepInstance; import com.vincent.rsf.server.system.entity.FlowStepTemplate; import com.vincent.rsf.server.system.entity.SubsystemFlowTemplate; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.util.Date; import java.util.List; @Data public class MissionTaskIssueParam { /** * WMS任务号 */ private String taskNo; /* * 类型:出库、入库、移库、站到站 * */ private String type; /** * 起点编码 */ private String sourceCode; /** * 终点编码 */ private String targetCode; /** * 子系统编码 */ private String systemCode; /** * 子系统名称 */ private String systemName; /** * 步骤类型:REQUEST-请求, RESPONSE-响应, VALIDATE-校验, TRANSFORM-转换 */ private String stepType; /** * 动作类型:HTTP_CALL, RPC_CALL, MQ_SEND, DB_OPERATION */ private String actionType; /** * 关联flow_instance.id */ private Long flowInstanceId; /** * 流程实例编号 */ private String flowInstanceNo; /** * 步骤顺序 */ private Integer stepOrder; /** * 步骤编码 */ private String stepCode; /** * 步骤名称 */ private String stepName; /** * 步骤模板ID */ private Long stepTemplateId; /** * 状态:0-排队中 1-待执行 2-执行中 3-执行成功 4-执行失败 5-已跳过 6-已取消 */ private Short status; /** * 执行结果 */ private String executeResult; /** * 错误码 */ private String errorCode; /** * 错误信息 */ private String errorMessage; /** * 开始时间 */ private Date startTime; /** * 执行耗时(秒) */ private Integer durationSeconds; /** * 步骤重试次数 */ private Integer retryTimes; public MissionTaskIssueParam() {} public MissionTaskIssueParam(FlowStepInstance flowStepInstance, SubsystemFlowTemplate subsystemFlowTemplate, FlowStepTemplate flowStepTemplate ) { this.taskNo = flowStepInstance.getTaskNo(); this.systemCode = subsystemFlowTemplate.getSystemCode(); this.systemName = subsystemFlowTemplate.getSystemName(); this.stepType = flowStepTemplate.getStepType(); this.actionType = flowStepTemplate.getActionType(); this.flowInstanceId = flowStepInstance.getFlowInstanceId(); this.flowInstanceNo = flowStepInstance.getFlowInstanceNo(); this.stepOrder = flowStepInstance.getStepOrder(); this.stepCode = flowStepInstance.getStepCode(); this.stepName = flowStepInstance.getStepName(); this.stepType = flowStepInstance.getStepType(); this.stepTemplateId = flowStepInstance.getStepTemplateId(); this.status = flowStepInstance.getStatus(); this.executeResult = flowStepInstance.getExecuteResult(); this.errorCode = flowStepInstance.getErrorCode(); this.errorMessage = flowStepInstance.getErrorMessage(); this.startTime = flowStepInstance.getStartTime(); this.durationSeconds = flowStepInstance.getDurationSeconds(); this.retryTimes = flowStepInstance.getRetryTimes(); } } rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java
@@ -15,6 +15,7 @@ import com.vincent.rsf.server.api.config.RemotesInfoProperties; import com.vincent.rsf.server.api.entity.CommonResponse; import com.vincent.rsf.server.api.entity.constant.RcsConstant; import com.vincent.rsf.server.api.entity.params.MissionTaskIssueParam; import com.vincent.rsf.server.api.entity.params.TaskItemParam; import com.vincent.rsf.server.api.entity.params.WcsTaskParams; import com.vincent.rsf.server.api.utils.LocUtils; @@ -28,10 +29,7 @@ import com.vincent.rsf.server.system.constant.SerialRuleCode; import com.vincent.rsf.server.system.entity.*; import com.vincent.rsf.server.system.service.ConfigService; import com.vincent.rsf.server.system.service.impl.FlowInstanceServiceImpl; import com.vincent.rsf.server.system.service.impl.FlowStepInstanceServiceImpl; import com.vincent.rsf.server.system.service.impl.TaskInstanceNodeServiceImpl; import com.vincent.rsf.server.system.service.impl.TaskInstanceServiceImpl; import com.vincent.rsf.server.system.service.impl.*; import com.vincent.rsf.server.system.utils.SerialRuleUtils; import com.vincent.rsf.server.system.utils.SystemAuthUtils; import lombok.extern.slf4j.Slf4j; @@ -107,6 +105,10 @@ private TaskInstanceNodeServiceImpl taskInstanceNodeService; @Autowired private TaskInstanceServiceImpl taskInstanceService; @Autowired private SubsystemFlowTemplateServiceImpl subsystemFlowTemplateService; @Autowired private FlowStepTemplateServiceImpl flowStepTemplateService; /** @@ -168,6 +170,15 @@ throw new CoolException(e.getMessage()); } } else { SubsystemFlowTemplate subsystemFlowTemplate = subsystemFlowTemplateService.getById(flowInstance.getFlowTemplateId()); FlowStepTemplate flowStepTemplate = flowStepTemplateService.getById(flowStepInstance.getStepTemplateId()); MissionTaskIssueParam missionTaskIssueParam = new MissionTaskIssueParam(flowStepInstance,subsystemFlowTemplate,flowStepTemplate); missionTaskIssueParam.setType(RcsTaskType.getTypeDesc(task.getTaskType())); missionTaskIssueParam.setSourceCode(taskInstance.getSourceCode()); missionTaskIssueParam.setTargetCode(taskInstance.getTargetCode()); /**任务下发接口*/ String pubTakUrl = wmsOpenApi.getHost() + ":" + wmsOpenApi.getPort() + RcsConstant.MISSION_TRANSFER_STATION; @@ -176,7 +187,7 @@ HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); headers.add("api-version", "v2.0"); HttpEntity httpEntity = new HttpEntity(flowStepInstance, headers); HttpEntity httpEntity = new HttpEntity(missionTaskIssueParam, headers); ResponseEntity<String> exchange = restTemplate.exchange(pubTakUrl, HttpMethod.POST, httpEntity, String.class); log.info("任务下发后,响应结果: {}", exchange); if (Objects.isNull(exchange.getBody())) {