rsf-open-api/src/main/java/com/vincent/rsf/openApi/config/PlatformProperties.java
@@ -66,4 +66,34 @@ } @Data @Configuration @ConfigurationProperties(prefix = "platform.wcs") public class WcsApi { /** * rcs调用路径 */ private String host; /**rcs调用端口**/ private String port; } @Data @Configuration @ConfigurationProperties(prefix = "platform.hk") public class HkApi { /** * rcs调用路径 */ private String host; /**rcs调用端口**/ private String port; } } rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/WmsWcsController.java
New file @@ -0,0 +1,92 @@ package com.vincent.rsf.openApi.controller; import com.vincent.rsf.framework.common.R; 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.service.WmsWcsService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; 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; import org.springframework.web.bind.annotation.RestController; import java.util.Objects; @RestController @Api("WCS调度交互接口") @RequestMapping("/wcs") public class WmsWcsController { @Autowired private WmsWcsService wmsWcsService; /** * @author Munch D. Luffy * @date 2026/01/09 * @description: WCS入库任务申请 * @version 1.0 */ @ApiOperation("WCS入库任务申请") @PostMapping("/openapi/createInTask") public R wcsCreateInTask(@RequestBody WcsCreateInTaskParam params) { if (Objects.isNull(params)) { return R.error("参数不能为空!!"); } return R.ok().add(wmsWcsService.wcsCreateInTask(params)); } /** * @author Munch D. Luffy * @date 2026/01/09 * @description: WCS任务上报通知 * @version 1.0 */ @ApiOperation("WCS任务上报通知") @PostMapping("/openapi/report") public R wcsTaskReport(@RequestBody WcsTaskReportParam params) { if (Objects.isNull(params)) { return R.error("参数不能为空!!"); } return R.ok().add(wmsWcsService.wcsTaskReport(params)); } /** * @author Munch D. Luffy * @date 2026/01/09 * @description: WCS申请任务重新分配入库 * @version 1.0 */ @ApiOperation("WCS申请任务重新分配入库") @PostMapping("/openapi/reassign/loc") public R wcsReassignLoc(@RequestBody WcsReassignLocParam params) { if (Objects.isNull(params)) { return R.error("参数不能为空!!"); } return R.ok().add(wmsWcsService.wcsReassignLoc(params)); } /** * @author Munch D. Luffy * @date 2026/01/09 * @description: WCS申请在库库位更换库位 * @version 1.0 */ @ApiOperation("WCS申请在库库位更换库位") @PostMapping("/openapi/change/loc") public R wcsChangeLoc(@RequestBody WcsChangeLocParam params) { if (Objects.isNull(params)) { return R.error("参数不能为空!!"); } return R.ok().add(wmsWcsService.wcsChangeLoc(params)); } } rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/constant/WcsConstant.java
New file @@ -0,0 +1,9 @@ package com.vincent.rsf.openApi.entity.constant; public class WcsConstant { public static String pubTask = "/openapi/createInTask"; public static String syncLocs = "/api/open/loc/sync"; } rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/constant/WmsConstant.java
@@ -25,6 +25,21 @@ //订单完成回写 public static String REPORT_ORDER_CALLBACK = "/C3Api?SysCode=WMS"; //入库任务申请 public static String WCS_CREATE_IN_TASK = "/rsf-server/wcs/createInTask"; //WCS任务上报通知 public static String WCS_TASK_REPORT = "/rsf-server/wcs/task/report"; //WCS申请任务重新分配入库 public static String WCS_REASSIGN_LOC = "/rsf-server/wcs/reassign/loc"; //WCS申请在库库位更换库位 public static String WCS_CHANGE_LOC = "/rsf-server/wcs/change/loc"; //移库任务申请 public static String WCS_CREATE_LOC_MOVE_TASK = "/rsf-server/wcs/createLocMoveTask"; } rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/params/WcsChangeLocParam.java
New file @@ -0,0 +1,28 @@ package com.vincent.rsf.openApi.entity.params; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; import java.util.List; @Data @Accessors(chain = true) @ApiModel(value = "WcsTaskReportParam", description = "WCS任务上报通知") public class WcsChangeLocParam implements Serializable { @ApiModelProperty("托盘码") private String barcode; @ApiModelProperty("源站") private Integer sourceStaNo; @ApiModelProperty("可用排") private List<Integer> rowList; @ApiModelProperty("库位类型") private Integer locType1; } rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/params/WcsCreateInTaskParam.java
New file @@ -0,0 +1,28 @@ package com.vincent.rsf.openApi.entity.params; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; import java.util.List; @Data @Accessors(chain = true) @ApiModel(value = "WcsCreateInTaskParam", description = "入库任务申请") public class WcsCreateInTaskParam implements Serializable { @ApiModelProperty("托盘码") private String barcode; @ApiModelProperty("源站") private Integer sourceStaNo; @ApiModelProperty("可用排") private List<Integer> rowList; @ApiModelProperty("库位类型") private Integer locType1; } rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/params/WcsReassignLocParam.java
New file @@ -0,0 +1,28 @@ package com.vincent.rsf.openApi.entity.params; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; import java.util.List; @Data @Accessors(chain = true) @ApiModel(value = "WcsTaskReportParam", description = "WCS任务上报通知") public class WcsReassignLocParam implements Serializable { @ApiModelProperty("托盘码") private String barcode; @ApiModelProperty("源站") private Integer sourceStaNo; @ApiModelProperty("可用排") private List<Integer> rowList; @ApiModelProperty("库位类型") private Integer locType1; } rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/params/WcsTaskReportParam.java
New file @@ -0,0 +1,28 @@ package com.vincent.rsf.openApi.entity.params; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; import java.util.List; @Data @Accessors(chain = true) @ApiModel(value = "WcsTaskReportParam", description = "WCS任务上报通知") public class WcsTaskReportParam implements Serializable { @ApiModelProperty("托盘码") private String barcode; @ApiModelProperty("源站") private Integer sourceStaNo; @ApiModelProperty("可用排") private List<Integer> rowList; @ApiModelProperty("库位类型") private Integer locType1; } rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/WmsWcsService.java
New file @@ -0,0 +1,17 @@ package com.vincent.rsf.openApi.service; 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; public interface WmsWcsService extends IService<Loc> { R wcsCreateInTask(WcsCreateInTaskParam params); R wcsTaskReport(WcsTaskReportParam params); R wcsReassignLoc(WcsReassignLocParam params); R wcsChangeLoc(WcsChangeLocParam params); } rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/impl/WmsWcsServiceImpl.java
New file @@ -0,0 +1,198 @@ package com.vincent.rsf.openApi.service.impl; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.cfg.CoercionAction; import com.fasterxml.jackson.databind.cfg.CoercionInputShape; 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.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.mapper.LocMapper; import com.vincent.rsf.openApi.service.WmsWcsService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.client.RestTemplate; import java.util.Objects; @Slf4j @Service("wmsWcsService") public class WmsWcsServiceImpl extends ServiceImpl<LocMapper, Loc> implements WmsWcsService { @Autowired private PlatformProperties.WmsApi wmsApi; @Autowired private RestTemplate restTemplate; /** * @author Munch D. Luffy * @date 2026/01/09 * @description: 任务下发 * @version 1.0 */ @Override @Transactional(rollbackFor = Exception.class) public R wcsCreateInTask(WcsCreateInTaskParam params) { String createInTask = wmsApi.getHost() + ":" + wmsApi.getPort() + WmsConstant.WCS_CREATE_IN_TASK; /**WMS基础配置链接*/ log.info("入库任务申请,请求地址: {}, 请求参数: {}", createInTask , JSONObject.toJSONString(params)); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); headers.add("api-version", "v2.0"); HttpEntity httpEntity = new HttpEntity(params, headers); ResponseEntity<String> exchange = restTemplate.exchange(createInTask, HttpMethod.POST, httpEntity, String.class); log.info("WCS入库任务申请,响应结果: {}", exchange); if (Objects.isNull(exchange.getBody())) { return R.error().add("下发WMS返回参数为空!!!"); } 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(); } else { return R.error(result.getMsg()); // throw new CoolException("任务执行状态上报失败!!"); } } catch (JsonProcessingException e) { // throw new CoolException(e.getMessage()); } } return R.error(); } /** * @author Munch D. Luffy * @date 2026/01/09 * @description: WCS任务上报通知 * @version 1.0 */ @Override @Transactional(rollbackFor = Exception.class) public R wcsTaskReport(WcsTaskReportParam params) { String createInTask = wmsApi.getHost() + ":" + wmsApi.getPort() + WmsConstant.WCS_TASK_REPORT; /**WMS基础配置链接*/ log.info("WCS任务上报通知,请求地址: {}, 请求参数: {}", createInTask , JSONObject.toJSONString(params)); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); headers.add("api-version", "v2.0"); HttpEntity httpEntity = new HttpEntity(params, headers); ResponseEntity<String> exchange = restTemplate.exchange(createInTask, HttpMethod.POST, httpEntity, String.class); log.info("WCS任务上报通知,响应结果: {}", exchange); if (Objects.isNull(exchange.getBody())) { return R.error().add("WCS任务上报通知告知wms返回参数为空!!!"); } 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(); } else { return R.error(result.getMsg()); // throw new CoolException("任务执行状态上报失败!!"); } } catch (JsonProcessingException e) { // throw new CoolException(e.getMessage()); } } return R.error(); } /** * @author Munch D. Luffy * @date 2026/01/09 * @description: WCS申请任务重新分配入库 * @version 1.0 */ @Override @Transactional(rollbackFor = Exception.class) public R wcsReassignLoc(WcsReassignLocParam params) { String createInTask = wmsApi.getHost() + ":" + wmsApi.getPort() + WmsConstant.WCS_REASSIGN_LOC; /**WMS基础配置链接*/ log.info("WCS任务上报通知,请求地址: {}, 请求参数: {}", createInTask , JSONObject.toJSONString(params)); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); headers.add("api-version", "v2.0"); HttpEntity httpEntity = new HttpEntity(params, headers); ResponseEntity<String> exchange = restTemplate.exchange(createInTask, HttpMethod.POST, httpEntity, String.class); log.info("WCS任务上报通知,响应结果: {}", exchange); if (Objects.isNull(exchange.getBody())) { return R.error().add("WCS任务上报通知告知wms返回参数为空!!!"); } 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(); } else { return R.error(result.getMsg()); // throw new CoolException("任务执行状态上报失败!!"); } } catch (JsonProcessingException e) { // throw new CoolException(e.getMessage()); } } return R.error(); } /** * @author Munch D. Luffy * @date 2026/01/09 * @description: WCS申请在库库位更换库位 * @version 1.0 */ @Override @Transactional(rollbackFor = Exception.class) public R wcsChangeLoc(WcsChangeLocParam params) { String createInTask = wmsApi.getHost() + ":" + wmsApi.getPort() + WmsConstant.WCS_CHANGE_LOC; /**WMS基础配置链接*/ log.info("WCS任务上报通知,请求地址: {}, 请求参数: {}", createInTask , JSONObject.toJSONString(params)); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); headers.add("api-version", "v2.0"); HttpEntity httpEntity = new HttpEntity(params, headers); ResponseEntity<String> exchange = restTemplate.exchange(createInTask, HttpMethod.POST, httpEntity, String.class); log.info("WCS任务上报通知,响应结果: {}", exchange); if (Objects.isNull(exchange.getBody())) { return R.error().add("WCS任务上报通知告知wms返回参数为空!!!"); } 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(); } else { return R.error(result.getMsg()); // throw new CoolException("任务执行状态上报失败!!"); } } catch (JsonProcessingException e) { // throw new CoolException(e.getMessage()); } } return R.error(); } } rsf-open-api/src/main/resources/application-dev.yml
@@ -61,6 +61,18 @@ host: http://127.0.0.1 #端口 port: 8088 #WCS链接 wcs: #链接 host: http://192.168.4.78 #端口 port: 9091 #WCS链接 hk: #链接 host: http://127.0.0.1 #端口 port: 9090 wms: #链接 host: http://127.0.0.1 rsf-server/src/main/java/com/vincent/rsf/server/api/controller/WcsController.java
@@ -4,8 +4,7 @@ import com.vincent.rsf.framework.common.R; import com.vincent.rsf.server.api.entity.dto.InTaskMsgDto; import com.vincent.rsf.server.api.controller.erp.params.TaskInParam; import com.vincent.rsf.server.api.entity.params.ExMsgParams; import com.vincent.rsf.server.api.entity.params.WcsTaskParams; import com.vincent.rsf.server.api.entity.params.*; import com.vincent.rsf.server.common.annotation.OperationLog; import com.vincent.rsf.server.manager.enums.TaskType; import com.vincent.rsf.server.api.service.WcsService; @@ -121,5 +120,57 @@ return wcsService.receiveExMsg(params); } /** * @author Munch D. Luffy * @date 2026/01/09 * @description: WCS入库任务申请 * @version 1.0 */ @ApiOperation("WCS入库任务申请") @OperationLog("WCS入库任务申请") @PostMapping("/createInTask") public R wcsCreateInTask(@RequestBody CreateInTaskParam params) { return R.ok();//lsh 待完善 } /** * @author Munch D. Luffy * @date 2026/01/09 * @description: WCS任务上报通知 * @version 1.0 */ @ApiOperation("WCS任务上报通知") @OperationLog("WCS任务上报通知") @PostMapping("/task/report") public R wcsTaskReport(@RequestBody TaskReportParam params) { return R.ok();//lsh 待完善 } /** * @author Munch D. Luffy * @date 2026/01/09 * @description: WCS申请任务重新分配入库 * @version 1.0 */ @ApiOperation("WCS申请任务重新分配入库") @OperationLog("WCS申请任务重新分配入库") @PostMapping("/reassign/loc") public R wcsReassignLoc(@RequestBody ReassignLocParam params) { return R.ok();//lsh 待完善 } /** * @author Munch D. Luffy * @date 2026/01/09 * @description: WCS申请在库库位更换库位 * @version 1.0 */ @ApiOperation("WCS申请在库库位更换库位") @OperationLog("WCS申请在库库位更换库位") @PostMapping("/change/loc") public R wcsChangeLoc(@RequestBody TaskReportParam params) { return R.ok();//lsh 待完善 } } rsf-server/src/main/java/com/vincent/rsf/server/api/entity/params/CreateInTaskParam.java
New file @@ -0,0 +1,28 @@ package com.vincent.rsf.server.api.entity.params; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; import java.util.List; @Data @Accessors(chain = true) @ApiModel(value = "CreateInTaskParam", description = "入库任务申请") public class CreateInTaskParam implements Serializable { @ApiModelProperty("托盘码") private String barcode; @ApiModelProperty("源站") private Integer sourceStaNo; @ApiModelProperty("可用排") private List<Integer> rowList; @ApiModelProperty("库位类型") private Integer locType1; } rsf-server/src/main/java/com/vincent/rsf/server/api/entity/params/ReassignLocParam.java
New file @@ -0,0 +1,28 @@ package com.vincent.rsf.server.api.entity.params; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; import java.util.List; @Data @Accessors(chain = true) @ApiModel(value = "ReassignLocParam", description = "WCS任务上报通知") public class ReassignLocParam implements Serializable { @ApiModelProperty("托盘码") private String barcode; @ApiModelProperty("源站") private Integer sourceStaNo; @ApiModelProperty("可用排") private List<Integer> rowList; @ApiModelProperty("库位类型") private Integer locType1; } rsf-server/src/main/java/com/vincent/rsf/server/api/entity/params/TaskReportParam.java
New file @@ -0,0 +1,28 @@ package com.vincent.rsf.server.api.entity.params; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; import java.util.List; @Data @Accessors(chain = true) @ApiModel(value = "TaskReportParam", description = "WCS任务上报通知") public class TaskReportParam implements Serializable { @ApiModelProperty("托盘码") private String barcode; @ApiModelProperty("源站") private Integer sourceStaNo; @ApiModelProperty("可用排") private List<Integer> rowList; @ApiModelProperty("库位类型") private Integer locType1; } rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java
@@ -237,7 +237,7 @@ /** * 非光电站点任务下发 */ // @Scheduled(cron = "0/5 * * * * ? ") @Scheduled(cron = "0/5 * * * * ? ") @Transactional(rollbackFor = Exception.class) public void pubTaskToWcs() { Long loginUserId = SystemAuthUtils.getLoginUserId(); @@ -270,7 +270,7 @@ * @description: 光电站点任务下发 * @version 1.0 */ // @Scheduled(cron = "0/5 * * * * ? ") @Scheduled(cron = "0/5 * * * * ? ") @Transactional(rollbackFor = Exception.class) public void taskToWCS() throws Exception { Long loginUserId = SystemAuthUtils.getLoginUserId(); @@ -452,7 +452,7 @@ ResponseEntity<String> exchange = restTemplate.exchange(pubTakUrl, HttpMethod.POST, httpEntity, String.class); log.info("任务下发后,响应结果: {}", exchange); if (Objects.isNull(exchange.getBody())) { throw new CoolException("任务下发失败!!"); throw new CoolException("任务下发失败!!,返回参数为空!!!"); } else { try { ObjectMapper objectMapper = new ObjectMapper();