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.WcsConstant; import com.vincent.rsf.openApi.entity.constant.WmsConstant; import com.vincent.rsf.openApi.entity.dto.CommonResponse; 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; 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 implements WmsWcsService { @Autowired private PlatformProperties.WmsApi wmsApi; @Autowired private PlatformProperties.WcsApi wcsApi; @Autowired private RestTemplate restTemplate; /** * @author Munch D. Luffy * @date 2026/01/09 * @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.getLocNo()); 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.getStaNo()));//目标站 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.getSourcelocNo()); missionWcsTaskIssueParam.setLocNo(param.getLocNo()); 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()); missionWcsTaskIssueParam.setStaNo(Integer.parseInt(param.getStaNo()));//目标站 missionWcsTaskIssueParam.setSourceStaNo(Integer.parseInt(param.getSourcestaNo()));//目标站 } /**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 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 @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 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(result.getMsg()).add(result.getData()); } 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 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(result.getMsg()).add(result.getData()); } 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 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(result.getMsg()).add(result.getData()); } 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 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(result.getMsg()).add(result.getData()); } else { return R.error(result.getMsg()); // throw new CoolException("任务执行状态上报失败!!"); } } catch (JsonProcessingException e) { // throw new CoolException(e.getMessage()); } } return R.error(); } }