parent
cf34501387
commit
e02018eaab
@ -0,0 +1,311 @@ |
|||||||
|
package com.shkj.wcs.third.workbinWcs; |
||||||
|
|
||||||
|
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; |
||||||
|
import com.shkj.wcs.domain.WcsPlcConnect; |
||||||
|
import com.shkj.wcs.domain.WcsPlcProperty; |
||||||
|
import com.shkj.wcs.mapper.BusinDataTaskMapper; |
||||||
|
import com.shkj.wcs.plc.PlcInit; |
||||||
|
import com.shkj.wcs.service.IWcsPlcConnectService; |
||||||
|
import com.shkj.wcs.service.IWcsPlcPropertyService; |
||||||
|
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.wms.bo.AGVMoveBo; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.beans.factory.annotation.Value; |
||||||
|
import org.springframework.data.redis.core.RedisTemplate; |
||||||
|
import org.springframework.stereotype.Component; |
||||||
|
|
||||||
|
import javax.annotation.Resource; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* AGV 接口文档 |
||||||
|
* |
||||||
|
* @author zjx |
||||||
|
* @date 2023/04/08 |
||||||
|
*/ |
||||||
|
@Slf4j |
||||||
|
@Component |
||||||
|
public class WCSUtil { |
||||||
|
|
||||||
|
@Value("${third.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; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 设置头部信息 |
||||||
|
* |
||||||
|
* @return {@code Map<String, String>} |
||||||
|
*/ |
||||||
|
public Map<String, String> getHeaderMap() { |
||||||
|
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) { |
||||||
|
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 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()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public Result parseThirdRcsResult(String res) { |
||||||
|
try { |
||||||
|
res = res.trim(); |
||||||
|
RcsThirdResult thirdResult = JSONObject.parseObject(res, RcsThirdResult.class); |
||||||
|
if (thirdResult == null) { |
||||||
|
// 添加到异常中去
|
||||||
|
return Result.err().msg(res); |
||||||
|
} |
||||||
|
if (!RcsThirdResult.isOk(thirdResult)) { |
||||||
|
return Result.err().msg(res); |
||||||
|
} |
||||||
|
return Result.ok(); |
||||||
|
} catch (Exception e) { |
||||||
|
log.error("parseThirdRcsResult res = {} e = {}", res, e); |
||||||
|
return Result.err().msg(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(); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,43 @@ |
|||||||
|
package com.shkj.wcs.third.workbinWcs.dto; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
import lombok.NoArgsConstructor; |
||||||
|
import lombok.experimental.Accessors; |
||||||
|
|
||||||
|
import javax.validation.constraints.NotBlank; |
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
@Data |
||||||
|
@NoArgsConstructor |
||||||
|
@Accessors(chain = true) |
||||||
|
public class WcsIncomingTrayCheckBody implements Serializable { |
||||||
|
|
||||||
|
/** |
||||||
|
* 托盘码 |
||||||
|
*/ |
||||||
|
@NotBlank(message = "托盘码不得为空") |
||||||
|
private String trayCode; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 任务类型 |
||||||
|
* 出库:1 |
||||||
|
* 入库:2 |
||||||
|
* 同层同巷道移库:3 |
||||||
|
*/ |
||||||
|
@NotBlank(message = "任务类型不得为空") |
||||||
|
private String taskType; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 时间 包括毫秒 |
||||||
|
*/ |
||||||
|
private String createDt; |
||||||
|
|
||||||
|
/** |
||||||
|
* 新增:1 |
||||||
|
*/ |
||||||
|
private String bussinessType; |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
Loading…
Reference in new issue