臂式ctu入库 流程测试

This commit is contained in:
liuhanqing
2025-07-16 16:02:25 +08:00
parent 570509f61c
commit 5cebe0369c
11 changed files with 108 additions and 97 deletions

View File

@@ -40,9 +40,9 @@ public class AgvController extends BaseController {
* @param mydoJob
* @return
*/
@PostMapping("/pushOutMydoJob")
public AjaxResult PushOutMydoJob(@RequestBody MydoJob mydoJob) {
return apiService.PushOutMydoJob(mydoJob);
@PostMapping("/receiveOutMydoJob")
public AjaxResult receiveOutMydoJob(@RequestBody MydoJob mydoJob) {
return apiService.receiveOutMydoJob(mydoJob);
}
/**
@@ -50,9 +50,9 @@ public class AgvController extends BaseController {
* @param genAgvSchedulingTaskRequest
* @return
*/
@PostMapping("/agvMoveJob")
public AjaxResult agvMoveJob(@RequestBody GenAgvSchedulingTaskRequest genAgvSchedulingTaskRequest) {
return apiService.agvMoveJob(genAgvSchedulingTaskRequest);
@PostMapping("/receiveAgvMoveJob")
public AjaxResult receiveAgvMoveJob(@RequestBody GenAgvSchedulingTaskRequest genAgvSchedulingTaskRequest) {
return apiService.receiveAgvMoveJob(genAgvSchedulingTaskRequest);
}
}

View File

@@ -23,7 +23,7 @@ public class GenAgvSchedulingTaskRequest {
* 请求时间
* 格式: “yyyy-MM-dd HH:mm:ss”
*/
private String reqTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")).toString();
private String reqTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
/**
* 客户端编号
* 客户端编号,如PDA,HCWMS等

View File

@@ -46,7 +46,7 @@ public interface IApiService
* WMS出库任务推送
* @param mydoJob
*/
public AjaxResult PushOutMydoJob(MydoJob mydoJob);
public AjaxResult receiveOutMydoJob(MydoJob mydoJob);
/**
* 取消AGV任务
@@ -83,7 +83,7 @@ public interface IApiService
* @param genAgvSchedulingTaskRequest
* @return
*/
AjaxResult agvMoveJob(GenAgvSchedulingTaskRequest genAgvSchedulingTaskRequest);
AjaxResult receiveAgvMoveJob(GenAgvSchedulingTaskRequest genAgvSchedulingTaskRequest);
RequestLog finishMydoJob(String agvFinishUrl, String point, Map<String, Object> param);
}

View File

@@ -31,6 +31,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -54,10 +55,15 @@ public class ApiServiceImpl implements IApiService {
@Override
public MydoJob requestEnter(MydoJob mydoJob) {
RequestLog requestLog = requestLogService.getRequestLog(GET_MYDOJOB_URL, "请求入库", JSONUtil.toJsonStr(mydoJob));
String responseBody = requestLog.getResponseBody();
InterfaceReceive bean = JSONUtil.toBean(responseBody, InterfaceReceive.class);
return JSONUtil.toBean(JSONUtil.toJsonStr(bean.getData()), MydoJob.class);
RequestLog requestLog = requestLogService.getRequestLog(REQUEST_ENTER, "请求入库", JSONUtil.toJsonStr(mydoJob));
if ("1".equals(requestLog.getIsSuccessful())) {
String responseBody = requestLog.getResponseBody();
InterfaceReceive bean = JSONUtil.toBean(responseBody, InterfaceReceive.class);
return JSONUtil.toBean(JSONUtil.toJsonStr(bean.getData()), MydoJob.class);
} else {
return null;
}
}
@Override
@@ -78,7 +84,7 @@ public class ApiServiceImpl implements IApiService {
@Transactional(rollbackFor = Exception.class)
public AgvCallbackResponse agvCallback(AgvCallbackRequest request) {
RequestLog requestLog = requestLogService.getRequestLog(JSONUtil.toJsonStr(request), "AGV任务执行通知");
requestLog.setRequestUrl("http://10.214.18.61:8089/external/log/outStockJob");
//requestLog.setRequestUrl("http://10.214.18.61:8089/external/log/outStockJob");
AgvCallbackResponse response = new AgvCallbackResponse(0, "成功", "");
try {
agvCallbackInfo(request);
@@ -97,12 +103,12 @@ public class ApiServiceImpl implements IApiService {
}
@Override
public AjaxResult agvMoveJob(GenAgvSchedulingTaskRequest genAgvSchedulingTaskRequest) {
public AjaxResult receiveAgvMoveJob(GenAgvSchedulingTaskRequest genAgvSchedulingTaskRequest) {
//todo 生成agvQueue队列
AgvQueue agvQueue = new AgvQueue();
agvQueueService.insertAgvQueue(agvQueue);
GenAgvSchedulingTaskResponse genAgvSchedulingTaskResponse = genAgvSchedulingTask(genAgvSchedulingTaskRequest);
if (genAgvSchedulingTaskResponse.getCode() == 0){
if (genAgvSchedulingTaskResponse.getCode() == 0) {
return AjaxResult.success();
}
return AjaxResult.error(genAgvSchedulingTaskResponse.getMessage());
@@ -141,55 +147,52 @@ public class ApiServiceImpl implements IApiService {
Map<String, Object> param = new HashMap<>();
param.put("wmsType", agvQueue.getWmsTaskType());
if ("1".equals(agvQueue.getWmsTaskType()) || "2".equals(agvQueue.getWmsTaskType())){
//通知wms 任务结束
MydoJob mydoJobParam = new MydoJob();
mydoJobParam.setTaskNo(agvQueue.getWmsTaskNo());
mydoJobParam.setTrayCode(agvQueue.getWmsTraycode());
List<MydoJob> mydoJobList = getMydoJobList(mydoJobParam);
if (CollUtil.isNotEmpty(mydoJobList)) {
MydoJob mydoJob = mydoJobList.get(0);
param.put("taskNo", agvQueue.getWmsTaskNo());
param.put("trayCode", agvQueue.getWmsTraycode());
if (Convert.toInt(mydoJob.getInOrOut()) < 20) {
//入库任务 暂无特殊逻辑
RequestLog requestLog = requestLogService.getRequestLog(AGV_FINISH_URL, "agv任务完成", JSONUtil.toJsonStr(param));
if ("1".equals(requestLog.getIsSuccessful())){
//插入历史
agvQueueService.insertHistory(agvQueue.getReqCode());
//删除队列
agvQueueService.deleteAgvQueueByReqCode(agvQueue.getReqCode());
log.info("【AGV入库任务结束】任务号:{}", taskCode);
}
} else {
//写入对应的plc 任务号
DeviceSsj deviceSsj = PlcRead.deviceMap.get(mydoJob.getExitId());
if (ObjUtil.isNotNull(deviceSsj)){
SendData rwh = new SendData(Tools.DINT, mydoJob.getTaskNo());
byte[] bytes = Tools.sendData(rwh);
//写入信息 取货完成
int i = PlcRead.WriteToSSJ(deviceSsj.getPlcDbWriteAddress(), bytes);
if (i==1){
//插入历史
agvQueueService.insertHistory(agvQueue.getReqCode());
//删除队列
agvQueueService.deleteAgvQueueByReqCode(agvQueue.getReqCode());
log.info("【AGV出库任务结束】任务号:{}", taskCode);
}
}
}
} else {
log.info("【AGV任务结束】任务号:{},wms不存在对应的作业", taskCode);
if ("1".equals(agvQueue.getWmsTaskType())) {
param.put("taskNo", agvQueue.getWmsTaskNo());
param.put("trayCode", agvQueue.getWmsTraycode());
//入库任务 暂无特殊逻辑
RequestLog requestLog = requestLogService.getRequestLog(AGV_FINISH_URL, "agv任务完成", JSONUtil.toJsonStr(param));
if ("1".equals(requestLog.getIsSuccessful())) {
agvQueue.setFinishTime(DateUtil.formatDateTime(new Date()));
agvQueueService.updateAgvQueue(agvQueue);
//插入历史
agvQueueService.insertHistory(agvQueue.getReqCode());
//删除队列
agvQueueService.deleteAgvQueueByReqCode(agvQueue.getReqCode());
log.info("【AGV入库任务结束】任务号:{}", taskCode);
}
}else if ("3".equals(agvQueue.getWmsTaskType())){
} else if ("2".equals(agvQueue.getWmsTaskType())) {
//通知wms 任务结束
param.put("taskNo", agvQueue.getWmsTaskNo());
param.put("trayCode", agvQueue.getWmsTraycode());
//写入对应的plc 任务号
DeviceSsj deviceSsj = PlcRead.deviceMap.get(agvQueue.getPositionCode2());
if (ObjUtil.isNotNull(deviceSsj)) {
SendData rwh = new SendData(Tools.DINT, agvQueue.getWmsTaskNo());
byte[] bytes = Tools.sendData(rwh);
//写入信息 取货完成
int i = PlcRead.WriteToSSJ(deviceSsj.getPlcDbWriteAddress(), bytes);
if (i == 1) {
agvQueue.setFinishTime(DateUtil.formatDateTime(new Date()));
agvQueueService.updateAgvQueue(agvQueue);
//插入历史
agvQueueService.insertHistory(agvQueue.getReqCode());
//删除队列
agvQueueService.deleteAgvQueueByReqCode(agvQueue.getReqCode());
log.info("【AGV出库任务结束】任务号:{}", taskCode);
}
}
} else if ("3".equals(agvQueue.getWmsTaskType())) {
param.put("positionCode1", agvQueue.getPositionCode1());
param.put("positionCode2", agvQueue.getPositionCode2());
param.put("containerCode", agvQueue.getWmsTraycode());
//绑定点位和料架
RequestLog requestLog = requestLogService.getRequestLog(AGV_FINISH_URL, "agv任务完成", JSONUtil.toJsonStr(param));
if ("1".equals(requestLog.getIsSuccessful())){
if ("1".equals(requestLog.getIsSuccessful())) {
//插入历史
agvQueueService.insertHistory(agvQueue.getReqCode());
//删除队列
@@ -226,7 +229,7 @@ public class ApiServiceImpl implements IApiService {
}
@Override
public AjaxResult PushOutMydoJob(MydoJob mydoJob) {
public AjaxResult receiveOutMydoJob(MydoJob mydoJob) {
AgvQueue agvQueue = new AgvQueue();
String reqCode = IdUtil.fastSimpleUUID();
agvQueue.setReqCode(reqCode);

View File

@@ -108,7 +108,7 @@ public class RequestLogServiceImpl implements IRequestLogService
* @return requestLog
*/
@Override
public RequestLog getRequestLog(String url, String param, String endPoint) {
public RequestLog getRequestLog(String url, String endPoint,String param) {
RequestLog requestLog = new RequestLog();
Date requestTime = new Date();
requestLog.setRequestTime(DateUtil.format(requestTime, "yyyy-MM-dd HH:mm:ss"));
@@ -124,7 +124,7 @@ public class RequestLogServiceImpl implements IRequestLogService
requestLog.setResponseBody(resStr);
InterfaceReceive bean = JSONUtil.toBean(resStr, InterfaceReceive.class);
Date responseTime =new Date();
if (bean.getCode() == 0) {
if (bean.getCode() == 200) {
requestLog.setResponseTime(DateUtil.format(responseTime, "yyyy-MM-dd HH:mm:ss"));
requestLog.setResponseStatus("1");
requestLog.setDuration(Convert.toStr(DateUtil.between(requestTime, responseTime, DateUnit.MS)));

View File

@@ -19,9 +19,10 @@ public class Constant {
public static final String BASEURL_AGV = BASEURL + "/rcms-dps/rest/queryAgvStatus/";
public static final String GET_MYDOJOB_URL = "http://127.0.0.1:8081/rcms-dps/rest/queryAgvStatus/";
public static final String GET_MYDOJOB_URL = "http://localhost:8080/api2wms/inJob";
public static final String REQUEST_ENTER = "http://localhost:8080/api2wms/requestEnter";
public static final String UPDATE_MYDOJOB_URL = "http://127.0.0.1:8081/rcms-dps/rest/queryAgvStatus/";
public static final String AGV_FINISH_URL = "http://127.0.0.1:8081/rcms-dps/rest/queryAgvStatus/";
public static final String AGV_FINISH_URL = "http://localhost:8080/api2wms/jobFinish";
public static final String CONTINUE_TASK_URL = "http://127.0.0.1:8081/rcms-dps/rest/queryAgvStatus/";
public static final String CANCEL_TASK_URL = "http://127.0.0.1:8081/rcms-dps/rest/queryAgvStatus/";
public static final String GEN_AGV_SCHEDULING_TASK = "http://127.0.0.1:8081/rcms-dps/rest/queryAgvStatus/";

View File

@@ -78,15 +78,15 @@ public class ScheduleThread {
//臂式入库线程调度
bsInSsjThread.getThread().start();
//剪式入库线程调度
jsInSsjThread.getThread().start();
//jsInSsjThread.getThread().start();
//臂式出库线程调度
bsOutSsjThread.getThread().start();
//bsOutSsjThread.getThread().start();
//剪式出库线程调度
jsOutSsjThread.getThread().start();
//jsOutSsjThread.getThread().start();
//臂式出库到位线程调度-wms电子屏交互
bsPickSsjThread.getThread().start();
//bsPickSsjThread.getThread().start();
//剪上出库到位线程调度-wms电子屏交互
jsPickSsjThread.getThread().start();
//jsPickSsjThread.getThread().start();
}
/**

View File

@@ -226,7 +226,7 @@ public class PlcRead implements Runnable {
break;
case "G1003":
// 处理 G1003
readAddress = "DB501." + baseOffset;
readAddress = "DB501.0";
writeAddress = "";
break;
case "G1009":
@@ -479,7 +479,7 @@ public class PlcRead implements Runnable {
ssjDevice.setDw(ParseUtil.optInt(2, ddsx1));
ssjDevice.setRkqq(ParseUtil.optInt(4, ddsx1));
ssjDevice.setTaskNo(ParseUtil.optDInt(6, ddsx1));
ssjDevice.setTrayCode(ParseUtil.optString(10, ddsx1));
ssjDevice.setTrayCode(ParseUtil.optString(12, ddsx1));
}
}

View File

@@ -61,10 +61,10 @@ public class BsInSsjThread implements Runnable {
@Override
public void run() {
init();
while (isRun){
while (isRun) {
for (String type : ssjCodeList.keySet()) {
switch ( type){
switch (type) {
case "ssjIn":
//正常入库
for (String ssjCode : ssjCodeList.get(type)) {
@@ -75,7 +75,7 @@ public class BsInSsjThread implements Runnable {
log.error("设备不存在 ssjCode{}", ssjCode);
}
} catch (RuntimeException e) {
log.error(e.getMessage(),e);
log.error(e.getMessage(), e);
}
}
@@ -84,9 +84,9 @@ public class BsInSsjThread implements Runnable {
//流利架 空料箱入库
for (String lljCode : ssjCodeList.get(type)) {
try {
inLljDispatch(lljCode);
//inLljDispatch(lljCode);
} catch (RuntimeException e) {
log.error(e.getMessage(),e);
log.error(e.getMessage(), e);
}
}
@@ -105,6 +105,7 @@ public class BsInSsjThread implements Runnable {
/**
* 流利架空料箱入库
*
* @param lljCode
*/
private void inLljDispatch(String lljCode) {
@@ -136,8 +137,8 @@ public class BsInSsjThread implements Runnable {
apiService.updateMydoJob(mydoJob);
}
}
}else {
if (ObjUtil.isNull(mydoJob)){
} else {
if (ObjUtil.isNull(mydoJob)) {
log.info("无入库库作业 lljCode:{}", lljCode);
}
if ("6".equals(mydoJob.getExecutionPhase())) {
@@ -148,27 +149,26 @@ public class BsInSsjThread implements Runnable {
/**
* 输送线入库
*
* @param inSsjDevice
*/
public void inDispatch(DeviceSsj inSsjDevice) {
//如果入库请求1 并且 托盘码不为空
if (inSsjDevice.getRkqq() == 1 && StrUtil.isNotEmpty(inSsjDevice.getTrayCode())) {
//根据入口,查询对应的入库作业
MydoJob mydoJobParam = new MydoJob();
mydoJobParam.setStatus("1");
mydoJobParam.setTrayCode(inSsjDevice.getTrayCode());
MydoJob mydoJob = apiService.requestEnter(mydoJobParam);
if (ObjUtil.isNotNull(mydoJob) && !"6".equals(mydoJob.getExecutionPhase())){
//通知wms 当前料箱的入库口
mydoJob.setEntranceId(inSsjDevice.getDeviceCode());
apiService.updateMydoJob(mydoJob);
//判断是否生成队列
AgvQueue agvQueueParam = new AgvQueue();
agvQueueParam.setWmsTaskNo(mydoJob.getTaskNo());
agvQueueParam.setPositionCode1(inSsjDevice.getDeviceCode());
agvQueueParam.setStatus("0");
List<AgvQueue> agvQueues = agvQueueService.selectAgvQueueList(agvQueueParam);
if (CollUtil.isEmpty(agvQueues)) {
//判断是否生成队列
AgvQueue agvQueueParam = new AgvQueue();
agvQueueParam.setWmsTraycode(inSsjDevice.getTrayCode());
agvQueueParam.setStatus("0");
List<AgvQueue> agvQueues = agvQueueService.selectAgvQueueList(agvQueueParam);
if (CollUtil.isEmpty(agvQueues)) {
//根据入口,查询对应的入库作业
MydoJob mydoJobParam = new MydoJob();
mydoJobParam.setStatus("1");
mydoJobParam.setTrayCode(inSsjDevice.getTrayCode());
mydoJobParam.setEntranceId(inSsjDevice.getDeviceCode());
MydoJob mydoJob = apiService.requestEnter(mydoJobParam);
if (ObjUtil.isNotNull(mydoJob)) {
//生成agv队列
AgvQueue agvQueue = createAgvQueue(inSsjDevice.getDeviceCode(), mydoJob);
//请求任务生成
@@ -179,13 +179,11 @@ public class BsInSsjThread implements Runnable {
agvQueue.setStatus("1");
agvQueueService.updateAgvQueue(agvQueue);
log.info("向CTU下入库库作业");
//修改mydoJob执行阶段
mydoJob.setExecutionPhase("6");
apiService.updateMydoJob(mydoJob);
}
}
}
}
}
@@ -200,6 +198,7 @@ public class BsInSsjThread implements Runnable {
//生成ctu执行队列
AgvQueue agvQueue = new AgvQueue();
String reqCode = IdUtil.fastSimpleUUID();
String taskCode = IdUtil.fastSimpleUUID();
agvQueue.setReqCode(reqCode);
agvQueue.setReqTime(DateUtil.formatDateTime(DateUtil.date()));
agvQueue.setAgvType("CTU");
@@ -215,6 +214,8 @@ public class BsInSsjThread implements Runnable {
agvQueue.setWmsTraycode(mydoJob.getTrayCode());
agvQueue.setWmsTaskNo(mydoJob.getTaskNo());
agvQueue.setStatus("0");
agvQueue.setTaskCode(taskCode);
agvQueue.setWmsTaskType("1");
agvQueueService.insertAgvQueue(agvQueue);
return agvQueue;
}
@@ -239,6 +240,8 @@ public class BsInSsjThread implements Runnable {
genAgvSchedulingTaskRequest.setGroupId(mydoJob.getTaskNo());
genAgvSchedulingTaskRequest.setAgvTyp("CTU");
genAgvSchedulingTaskRequest.setPositionSelStrategy("0");
genAgvSchedulingTaskRequest.setTaskCode(agvQueue.getTaskCode());
return apiService.genAgvSchedulingTask(genAgvSchedulingTaskRequest);
}
}

View File

@@ -81,6 +81,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="wmsTaskNo != null">wms_task_no,</if>
<if test="status != null">status,</if>
<if test="taskCode != null">task_code,</if>
<if test="wmsTaskType != null">wms_task_type,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="reqCode != null">#{reqCode},</if>
@@ -100,6 +101,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="wmsTaskNo != null">#{wmsTaskNo},</if>
<if test="status != null">#{status},</if>
<if test="taskCode != null">#{taskCode},</if>
<if test="wmsTaskType != null">#{wmsTaskType},</if>
</trim>
</insert>
<insert id="insertHistory">

View File

@@ -114,8 +114,10 @@ public class SecurityConfig
requests.antMatchers("/login", "/register", "/captchaImage").permitAll()
// 静态资源,可匿名访问
.antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
.antMatchers("/swagger-ui.html","/changeLanguage", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**","/pda/**").permitAll()
.antMatchers("/swagger-ui.html", "/changeLanguage", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**", "/pda/**").permitAll()
.antMatchers("/device/api/**").permitAll()
.antMatchers("/device/operation/**").permitAll()
.antMatchers("/agv/api/**").permitAll()
// 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated();
})