|
|
|
|
@ -4,8 +4,7 @@ import cn.hutool.http.HttpRequest; |
|
|
|
|
import com.alibaba.fastjson.JSONObject; |
|
|
|
|
import com.shkj.common.constant.RedisConstant; |
|
|
|
|
import com.shkj.common.core.domain.Result; |
|
|
|
|
import com.shkj.plc.sdk.device.PLCReadAndWrite; |
|
|
|
|
import com.shkj.plc.sdk.device.PlcOperate; |
|
|
|
|
|
|
|
|
|
import com.shkj.system.service.ISysParameterService; |
|
|
|
|
import com.shkj.wcs.bo.AGVStatesBo; |
|
|
|
|
import com.shkj.wcs.bo.AGVUploadStatusBo; |
|
|
|
|
@ -19,6 +18,9 @@ import com.shkj.wcs.third.rcs.dto.RcsCancelTaskDto; |
|
|
|
|
import com.shkj.wcs.third.rcs.dto.RcsCreateTaskDto; |
|
|
|
|
import com.shkj.wcs.third.rcs.dto.RcsIdList; |
|
|
|
|
import com.shkj.wcs.third.rcs.dto.RcsThirdResult; |
|
|
|
|
import com.shkj.wcs.third.workbinWcs.dto.WcsIncomingCheckDto; |
|
|
|
|
import com.shkj.wcs.third.workbinWcs.dto.WcsIncomingTrayCheckBody; |
|
|
|
|
import com.shkj.wcs.vo.WcsResponseVo; |
|
|
|
|
import com.shkj.wms.bo.AGVMoveBo; |
|
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
|
@ -42,270 +44,54 @@ import java.util.Map; |
|
|
|
|
@Component |
|
|
|
|
public class WCSUtil { |
|
|
|
|
|
|
|
|
|
@Value("${third.wcsIncomingTrayCheckUrl:}") |
|
|
|
|
@Value("${ZKWZ.wcsIncomingTrayCheckUrl:}") |
|
|
|
|
private String wcsIncomingTrayCheckUrl; |
|
|
|
|
|
|
|
|
|
@Value("${third.agvCancelTaskUrl:}") |
|
|
|
|
private String agvCancelTaskUrl; |
|
|
|
|
|
|
|
|
|
@Value("${third.agvStatesUrl:}") |
|
|
|
|
private String agvStatesUrl; |
|
|
|
|
|
|
|
|
|
@Value("${third.queryAckByTaskUrl:}") |
|
|
|
|
private String queryAckByTaskUrl; |
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
BusinDataTaskMapper businDataTaskMapper; |
|
|
|
|
|
|
|
|
|
@Resource |
|
|
|
|
RedisTemplate redisTemplate; |
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
IWcsPlcPropertyService iWcsPlcPropertyService; |
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
PLCReadAndWrite plcReadAndWrite; |
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
ISysParameterService isysParameterService; |
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
IWcsPlcConnectService iWcsPlcConnectService; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
PlcInit plcInit; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 设置头部信息 |
|
|
|
|
* WMS向WCS推送新的目的地 |
|
|
|
|
* |
|
|
|
|
* @return {@code Map<String, String>} |
|
|
|
|
* @param dto |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
public Map<String, String> getHeaderMap() { |
|
|
|
|
public WcsResponseVo wcsPushNewPoint(WcsIncomingCheckDto dto) { |
|
|
|
|
Map<String, String> headerMap = new HashMap<>(1); |
|
|
|
|
headerMap.put("authorization", "mrbase64 mrrest:YWRtaW4mYWRtaW4="); |
|
|
|
|
return headerMap; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 创建任务 |
|
|
|
|
* wcs系统通过此接口向rcs系统下发创建任务指令 |
|
|
|
|
* |
|
|
|
|
* @param dto dto |
|
|
|
|
* @return {@code Result} |
|
|
|
|
*/ |
|
|
|
|
public Result rcsCreateTask(RcsCreateTaskDto dto) { |
|
|
|
|
headerMap.put("businessType", "trayCheck"); |
|
|
|
|
String json = JSONObject.toJSONString(dto); |
|
|
|
|
log.info("KJ向WZ请求生产区入库托盘码校验参数"+json); |
|
|
|
|
try { |
|
|
|
|
Map<String, String> headerMap = getHeaderMap(); |
|
|
|
|
String res = HttpRequest.post(agvCreateTaskUrl) |
|
|
|
|
String res = HttpRequest.post(wcsIncomingTrayCheckUrl) |
|
|
|
|
.addHeaders(headerMap) |
|
|
|
|
.body(json) |
|
|
|
|
.execute().body(); |
|
|
|
|
Result result = parseThirdRcsResult(res); |
|
|
|
|
return result; |
|
|
|
|
log.info("KJ向WZ请求生产区入库托盘码校验返回:" + res); |
|
|
|
|
WcsResponseVo wcsThirdResult = parseThirdRcsResult(res); |
|
|
|
|
return wcsThirdResult; |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
e.printStackTrace(); |
|
|
|
|
log.error("createTask 方法出错了 = {}", e.getMessage()); |
|
|
|
|
return Result.err().msg(e.getMessage()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
/** |
|
|
|
|
* 创建任务 |
|
|
|
|
* wcs系统通过此接口向rcs系统下发创建任务指令 |
|
|
|
|
* |
|
|
|
|
* @param dto dto |
|
|
|
|
* @return {@code Result} |
|
|
|
|
*/ |
|
|
|
|
public Result wcsIncomingTrayCheck(Wcs dto) { |
|
|
|
|
String json = JSONObject.toJSONString(dto); |
|
|
|
|
try { |
|
|
|
|
Map<String, String> headerMap = getHeaderMap(); |
|
|
|
|
String res = HttpRequest.post(agvCreateTaskUrl) |
|
|
|
|
.addHeaders(headerMap) |
|
|
|
|
.body(json) |
|
|
|
|
.execute().body(); |
|
|
|
|
Result result = parseThirdRcsResult(res); |
|
|
|
|
return result; |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
e.printStackTrace(); |
|
|
|
|
log.error("createTask 方法出错了 = {}", e.getMessage()); |
|
|
|
|
return Result.err().msg(e.getMessage()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 放行任务 |
|
|
|
|
* wcs系统通过此接口向rcs系统下发放行任务指令 |
|
|
|
|
* |
|
|
|
|
* @param dto dto |
|
|
|
|
* @return {@code Result} |
|
|
|
|
*/ |
|
|
|
|
public Result queryAck(RcsCreateTaskDto dto) { |
|
|
|
|
String json = JSONObject.toJSONString(dto); |
|
|
|
|
try { |
|
|
|
|
Map<String, String> headerMap = getHeaderMap(); |
|
|
|
|
String res = HttpRequest.post(queryAckByTaskUrl) |
|
|
|
|
.addHeaders(headerMap) |
|
|
|
|
.body(json) |
|
|
|
|
.execute().body(); |
|
|
|
|
return parseThirdRcsResult(res); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
e.printStackTrace(); |
|
|
|
|
log.error("放行 方法出错了 = {}", e.getMessage()); |
|
|
|
|
return Result.err().msg(e.getMessage()); |
|
|
|
|
log.error("KJ向WZ请求生产区入库托盘码校验 方法出错了 = {}", e.getMessage()); |
|
|
|
|
return WcsResponseVo.error(500,e.getMessage()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public Result parseThirdRcsResult(String res) { |
|
|
|
|
public WcsResponseVo parseThirdRcsResult(String res) { |
|
|
|
|
try { |
|
|
|
|
res = res.trim(); |
|
|
|
|
RcsThirdResult thirdResult = JSONObject.parseObject(res, RcsThirdResult.class); |
|
|
|
|
WcsResponseVo thirdResult = JSONObject.parseObject(res, WcsResponseVo.class); |
|
|
|
|
if (thirdResult == null) { |
|
|
|
|
// 添加到异常中去
|
|
|
|
|
return Result.err().msg(res); |
|
|
|
|
return WcsResponseVo.error(500,res); |
|
|
|
|
} |
|
|
|
|
if (!RcsThirdResult.isOk(thirdResult)) { |
|
|
|
|
return Result.err().msg(res); |
|
|
|
|
if (!WcsResponseVo.isOk(thirdResult)) { |
|
|
|
|
return WcsResponseVo.error(500,res); |
|
|
|
|
} |
|
|
|
|
return Result.ok(); |
|
|
|
|
return thirdResult; |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
log.error("parseThirdRcsResult res = {} e = {}", res, e); |
|
|
|
|
return Result.err().msg(res); |
|
|
|
|
return WcsResponseVo.error(500,res); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 任务取消 |
|
|
|
|
* 上游系统调⽤此接⼝,将已下发待处理的任务取消 |
|
|
|
|
* |
|
|
|
|
* @param /rest/tasks/del |
|
|
|
|
* @return {@code Result} |
|
|
|
|
*/ |
|
|
|
|
public Result rcsTaskCancel(RcsCancelTaskDto dto) { |
|
|
|
|
String json = JSONObject.toJSONString(dto); |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
Map<String, String> headerMap = getHeaderMap(); |
|
|
|
|
String res = HttpRequest.post(agvCancelTaskUrl) |
|
|
|
|
.addHeaders(headerMap) |
|
|
|
|
.body(json) |
|
|
|
|
.execute().body(); |
|
|
|
|
|
|
|
|
|
return parseThirdRcsResult(res); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
e.printStackTrace(); |
|
|
|
|
log.error("rcs taskCancel 方法出错了 = {}", e.getMessage()); |
|
|
|
|
return Result.err().msg(e.getMessage()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* AGV搬运 |
|
|
|
|
* |
|
|
|
|
* @param bo |
|
|
|
|
* @return {@link Result}<{@link Boolean}> |
|
|
|
|
*/ |
|
|
|
|
public Result<Boolean> moveByAGV(AGVMoveBo bo) { |
|
|
|
|
RcsCreateTaskDto dto = new RcsCreateTaskDto(); |
|
|
|
|
dto.setMapId(1); |
|
|
|
|
dto.setTaskType(bo.getTaskType()); |
|
|
|
|
dto.setTaskId(bo.getTaskId().toString()); |
|
|
|
|
//库位编号
|
|
|
|
|
List<RcsIdList> idList = new ArrayList<>(); |
|
|
|
|
List<String> points = bo.getPoints(); |
|
|
|
|
for (String point : points) { |
|
|
|
|
RcsIdList rcsIdList = new RcsIdList(); |
|
|
|
|
rcsIdList.setId(point); |
|
|
|
|
log.error(point); |
|
|
|
|
idList.add(rcsIdList); |
|
|
|
|
} |
|
|
|
|
dto.setTargets(idList); |
|
|
|
|
return rcsCreateTask(dto); |
|
|
|
|
// return Result.ok();
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 获取AGV实时状态信息 |
|
|
|
|
* |
|
|
|
|
* @param mapId bo |
|
|
|
|
* @return {@code Result} |
|
|
|
|
*/ |
|
|
|
|
public Result rcsRobotsStates(String mapId) { |
|
|
|
|
String json = JSONObject.toJSONString(mapId); |
|
|
|
|
try { |
|
|
|
|
Map<String, String> headerMap = getHeaderMap(); |
|
|
|
|
String res = HttpRequest.post(agvStatesUrl) |
|
|
|
|
.addHeaders(headerMap) |
|
|
|
|
.body(json) |
|
|
|
|
.execute().body(); |
|
|
|
|
//获取AGV状态信息 推送前端及存储数据库及存储redis TODO
|
|
|
|
|
return parseThirdRcsResult(res); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
e.printStackTrace(); |
|
|
|
|
log.error("createTask 方法出错了 = {}", e.getMessage()); |
|
|
|
|
return Result.err().msg(e.getMessage()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* AGV上报任务每一步状态 |
|
|
|
|
* |
|
|
|
|
* @param bo bo |
|
|
|
|
* @return {@code Result} |
|
|
|
|
*/ |
|
|
|
|
public Result<AGVStatesBo> uploadAgvTaskStatus(AGVUploadStatusBo bo) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Long plcId = (Long) redisTemplate.opsForValue().get(RedisConstant.redistaskPlc + bo.getTaskId().toString()); |
|
|
|
|
|
|
|
|
|
//根据plcId获取plc信息
|
|
|
|
|
WcsPlcConnect wcsplc = (WcsPlcConnect) redisTemplate.opsForValue().get(RedisConstant.redisPlcConnect + plcId); |
|
|
|
|
|
|
|
|
|
List<WcsPlcProperty> propertyList = iWcsPlcPropertyService.getWcsPlcPropertyByPlcId(plcId); |
|
|
|
|
String writeTaskId = ""; |
|
|
|
|
String valueType = ""; |
|
|
|
|
for (WcsPlcProperty wcsPlcProperty : propertyList) { |
|
|
|
|
//AGV取走完成
|
|
|
|
|
if (wcsPlcProperty.getPointType().equals("7")) { |
|
|
|
|
writeTaskId = wcsPlcProperty.getAddress(); |
|
|
|
|
valueType = wcsPlcProperty.getValueType(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Map<String, String> writeMap = new HashMap<>(1); |
|
|
|
|
writeMap.put(valueType, "true"); |
|
|
|
|
Map<String, Object> allMap = new HashMap<>(1); |
|
|
|
|
allMap.put(writeTaskId, writeMap); |
|
|
|
|
|
|
|
|
|
Map<String, String> readMap = new HashMap<>(1); |
|
|
|
|
readMap.put(writeTaskId, valueType); |
|
|
|
|
|
|
|
|
|
PlcOperate plcOperate = plcInit.getPlcOperateByIp(wcsplc.getPlcIp()); |
|
|
|
|
//回填plc状态
|
|
|
|
|
PLCReadAndWrite plcReadAndWrite = new PLCReadAndWrite(); |
|
|
|
|
//首先读取任务编号,同目前返回的任务编号是否一致,如果一致则回填状态;
|
|
|
|
|
Map<String, Object> stringObjectMap = plcReadAndWrite.readPlcData(plcOperate, JSONObject.toJSONString(readMap)); |
|
|
|
|
//if(stringObjectMap.get(writeTaskId).equals(bo.getTaskId())){
|
|
|
|
|
plcReadAndWrite.execWrite(plcOperate, JSONObject.toJSONString(allMap)); |
|
|
|
|
//}
|
|
|
|
|
return Result.ok(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* AGV上报任务每一步状态 |
|
|
|
|
* |
|
|
|
|
* @param |
|
|
|
|
* @return {@code Result} |
|
|
|
|
*/ |
|
|
|
|
public Result uploadAgvTaskStatusTmp(AGVUploadStatusBo bo) { |
|
|
|
|
return Result.ok(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|