This commit is contained in:
张怡蓉
2025-12-11 14:20:02 +08:00
parent 2fa7a06e76
commit 337ffd8ef4
7 changed files with 217 additions and 40 deletions

View File

@@ -3,12 +3,10 @@ package com.ruoyi.api.controller;
import com.ruoyi.api.domain.wcs2wms.JobParam;
import com.ruoyi.api.domain.wcs2wms.ReceiveJob;
import com.ruoyi.api.service.IApiService;
import com.ruoyi.bas.port.service.IWcsPortService;
import com.ruoyi.common.core.domain.AjaxResult;
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 org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/wcs2Wms/api")
@@ -16,6 +14,8 @@ public class Wcs2WmsController {
@Autowired
private IApiService apiService;
@Autowired
private IWcsPortService wcsPortService;
/**
* 接收出库任务
@@ -52,5 +52,15 @@ public class Wcs2WmsController {
}
/**
* 查询缓存点
* @param jobParam
* @return
*/
@PostMapping("/selectWcsPort")
@ResponseBody
public AjaxResult selectWcsPort(@RequestBody JobParam jobParam) {
return apiService.selectWcsPort(jobParam);
}
}

View File

@@ -100,6 +100,8 @@ public interface IApiService
*/
AjaxResult cancelMydoJob(JobParam jobParam);
AjaxResult selectWcsPort(JobParam jobParam);
/**

View File

@@ -18,6 +18,8 @@ import com.ruoyi.api.domain.agv.genAgvSchedulingTask.PositionCodeData;
import com.ruoyi.api.domain.wcs2wms.JobParam;
import com.ruoyi.api.domain.wcs2wms.ReceiveJob;
import com.ruoyi.api.service.IApiService;
import com.ruoyi.bas.port.domain.WcsPort;
import com.ruoyi.bas.port.service.IWcsPortService;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.job.domain.MydoJob;
@@ -51,6 +53,8 @@ public class ApiServiceImpl implements IApiService {
private IAgvQueueService agvQueueService;
@Autowired
private IMydoJobService mydoJobService;
@Autowired
private IWcsPortService wcsPortService;
@@ -169,9 +173,23 @@ public class ApiServiceImpl implements IApiService {
log.info("【AGV请求放货】任务号:{}", request.getTaskCode());
break;
case "end":
agvQueue.setStatus("7");
agvQueueService.updateAgvQueue(agvQueue);
log.info("【AGV任务结束】任务号:{}", request.getTaskCode());
List<WcsPort> wcsPorts = wcsPortService.selectWcsPortList(new WcsPort());
// 查询agvQueue中的positionCode2的值是否在wcsPorts列表中存在
boolean isPositionValid = wcsPorts.stream()
.anyMatch(port -> port.getPortCode().equals(agvQueue.getPositionCode2()));
if (isPositionValid) {
agvQueueService.insertHistory(agvQueue.getReqCode());
agvQueueService.deleteAgvQueueByReqCode(agvQueue.getReqCode());
WcsPort wcsPort = new WcsPort();
wcsPort.setPortCode(agvQueue.getPositionCode2());
wcsPort.setStatus("2");
wcsPortService.updateWcsPort(wcsPort);
}
break;
default:
log.info("未知方法");
@@ -311,7 +329,7 @@ public class ApiServiceImpl implements IApiService {
*/
@Override
public GenAgvSchedulingTaskResponse requestAgvQueue(AgvQueue agvQueue) {
//todo 请求ctu
GenAgvSchedulingTaskRequest genAgvSchedulingTaskRequest = new GenAgvSchedulingTaskRequest();
genAgvSchedulingTaskRequest.setReqCode(agvQueue.getReqCode());
genAgvSchedulingTaskRequest.setTaskMode("0");
@@ -391,4 +409,10 @@ public class ApiServiceImpl implements IApiService {
return AjaxResult.error();
}
}
@Override
public AjaxResult selectWcsPort(JobParam jobParam) {
List<WcsPort> wcsPorts = wcsPortService.selectWcsPortList(new WcsPort());
return AjaxResult.success(wcsPorts);
}
}

View File

@@ -32,11 +32,11 @@ public class TaskStatusCode {
/**
* 任务执行阶段 AGV
*/
public static final String TASK_EP_AGV = "1";
public static final String TASK_EP_AGV = "2";
/**
* 任务执行阶段 入口输送机
*/
public static final String TASK_EP_SSJ = "2";
public static final String TASK_EP_SSJ = "3";
/**
* 任务执行阶段 巷道口
*/
@@ -49,6 +49,8 @@ public class TaskStatusCode {
/**
* 任务执行阶段 回传wms完成
*/
public static final String TASK_EP_WMS_FINISH = "5";
public static final String TASK_EP_WMS_FINISH = "6";
public static final String TASK_EP_LINE_SSJ = "1";
}

View File

@@ -1,6 +1,8 @@
package com.ruoyi.schedule.scheduleTask.ssj.floor2;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.api.service.IApiService;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.spring.SpringUtils;
@@ -19,6 +21,7 @@ import java.util.Date;
import java.util.HashMap;
import java.util.List;
import static com.ruoyi.common.TaskStatusCode.TASK_EP_LINE_SSJ;
import static com.ruoyi.common.TaskStatusCode.TASK_EP_SSJ;
import static com.ruoyi.schedule.plcRead.ssj.PlcSsjRead.writeToSsj;
@@ -44,6 +47,9 @@ public class Floor2InOutSsjThread implements Runnable {
ssjCodes.add("L1011");
ssjCodes.add("L1012");
ssjCodeList.put("inout", ssjCodes);
ssjCodes.add("L1001");
ssjCodes.add("L1003");
ssjCodeList.put("sm", ssjCodes);
apiService = SpringUtils.getBean(IApiService.class);
agvQueueService = SpringUtils.getBean(IAgvQueueService.class);
mydoJobService = SpringUtils.getBean(IMydoJobService.class);
@@ -59,7 +65,7 @@ public class Floor2InOutSsjThread implements Runnable {
switch (type) {
case "inout":
//生产线入库
//入库口
for (String ssjCode : ssjCodeList.get(type)) {
try {
if (PlcSsjRead.deviceSsjMap.containsKey(ssjCode)) {
@@ -73,6 +79,17 @@ public class Floor2InOutSsjThread implements Runnable {
}
break;
case "sm":
//入库扫码
for (String ssjCode : ssjCodeList.get(type)) {
try {
if (PlcSsjRead.deviceSsjMap.containsKey(ssjCode)) {
inDispatch1(PlcSsjRead.deviceSsjMap.get(ssjCode));
} else {
log.error("设备不存在 ssjCode{}", ssjCode);
}
} catch (RuntimeException e) {}
}
}
}
try {
@@ -90,16 +107,17 @@ public class Floor2InOutSsjThread implements Runnable {
if (inSsjDevice.getKx() == 1) {
AgvQueue agvQueue = new AgvQueue();
agvQueue.setStatus("5");//请求放货
//todo 与agv对点
agvQueue.setPositionCode2(inSsjDevice.getDeviceCode());
List<AgvQueue> agvQueues = agvQueueService.selectAgvQueueList(agvQueue);
//不允许放货
if (!agvQueues.isEmpty() && inSsjDevice.getAllowPut() == 0) {
//不允许放货 等着
// if (!agvQueues.isEmpty() && inSsjDevice.getAllowPut() == 0) {
//如果有这个输送机口的agv队列并请求放货(状态为6)
int i = writeToSsj(inSsjDevice.getPlcDbWriteAddress(), "0", Integer.parseInt(agvQueues.get(0).getCtnrType()),1);
if (i == 1) {
log.info(inSsjDevice.getDeviceCode() + "输送机下发请求放货成功");
}
}
// int i = writeToSsj(inSsjDevice.getPlcDbWriteAddress(), "0", Integer.parseInt(agvQueues.get(0).getCtnrType()),1);
// if (i == 1) {
// log.info(inSsjDevice.getDeviceCode() + "输送机下发请求放货异常成功");
// }
// }
//允许放货
if (!agvQueues.isEmpty() && inSsjDevice.getAllowPut() == 1) {
log.info("设备:{} 位置:{} 任务号:{} 请求放货成功", inSsjDevice.getDeviceCode(), "输送线", agvQueues.get(0).getTaskCode());
@@ -115,6 +133,7 @@ public class Floor2InOutSsjThread implements Runnable {
if (inSsjDevice.getKx() == 0 && inSsjDevice.getTaskNo() == 0) {
AgvQueue agvQueue = new AgvQueue();
agvQueue.setStatus("7"); //end
//todo 与agv对点
agvQueue.setPositionCode2(inSsjDevice.getDeviceCode());
List<AgvQueue> agvQueues = agvQueueService.selectAgvQueueList(agvQueue);
if (!agvQueues.isEmpty()) {
@@ -148,6 +167,73 @@ public class Floor2InOutSsjThread implements Runnable {
}
}
public void inDispatch1(DeviceSsj ssjDevice) {
//有入库请求就肯定是电气的任务号的作业,如果有正执行的出库作业退回
if(StrUtil.isNotBlank(ssjDevice.getTrayCode()) && ssjDevice.getRkqq()==1 && ssjDevice.getTaskNo()<=1000){
MydoJob mydoJobParam = new MydoJob();
mydoJobParam.setInOut("2");
mydoJobParam.setStatus("3");
mydoJobParam.setExitId(ssjDevice.getDeviceCode());
List<MydoJob> outMydoJobList = mydoJobService.selectInOrOutMydoJobList(mydoJobParam);
if(!outMydoJobList.isEmpty()){
//todo 去向不明朗
int i = writeToSsj(ssjDevice.getPlcDbWriteAddress(),"0",2,2);
if (i == 1) {
log.info(ssjDevice.getDeviceCode()+"有正执行的出库作业退回" );
}
}
MydoJob mydoJob = new MydoJob();
mydoJob.setInOrOut("1");
// mydoJob.setStatus("1");
mydoJob.setEntranceId(ssjDevice.getDeviceCode());
// mydoJob.setExecutionPhase("0");
List<MydoJob> mydoJobs = mydoJobService.selectMydoJobList(mydoJob);
if(!mydoJobs.isEmpty()){
MydoJob mydoJob1 = mydoJobs.get(0);
if(mydoJob1.getStatus().equals("1") && mydoJob1.getExecutionPhase().equals("0")){
int i = writeToSsj(ssjDevice.getPlcDbWriteAddress(),mydoJob1.getTaskNo(),1,1);
if (i == 1) {
mydoJob1.setExecutionPhase(TASK_EP_SSJ);
mydoJob1.setStatus("3");
mydoJobService.updateMydoJob(mydoJob1);
log.info(ssjDevice.getDeviceCode()+"输送机下发任务号成功:{}" , mydoJob1.getTaskNo());
}
}
}else{
HashMap<String, Object> map = new HashMap<>();
map.put("trayCode",ssjDevice.getTrayCode());
map.put("entranceId",ssjDevice.getDeviceCode());
AjaxResult ajaxResult = apiService.selectMydoJobByTrayCodeAndEntranceId(map);
if(ajaxResult.isSuccess()){
MydoJob mydoJob2 = BeanUtil.toBean(ajaxResult.get("data"), MydoJob.class) ;
mydoJob2.setStatus("1");
mydoJob2.setExecutionPhase("0");
mydoJob2.setCreateTime(new Date());
mydoJobService.insertMydoJob(mydoJob2);
int i = writeToSsj(ssjDevice.getPlcDbWriteAddress(),mydoJob2.getTaskNo(),1,1);
if (i == 1) {
mydoJob2.setExecutionPhase(TASK_EP_SSJ);
mydoJobService.updateMydoJob(mydoJob2);
log.info(ssjDevice.getDeviceCode()+"输送机下发任务号成功:{}" , mydoJob2.getTaskNo());
}
}else{
//todo 去向不明朗
int i = writeToSsj(ssjDevice.getPlcDbWriteAddress(),"0",2,2);
if (i == 1) {
log.info(ssjDevice.getDeviceCode()+"输送机没取到作业下发输送线" );
}
}
}
}
}
}

View File

@@ -4,6 +4,8 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.api.service.IApiService;
import com.ruoyi.bas.port.domain.WcsPort;
import com.ruoyi.bas.port.service.IWcsPortService;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.domain.SendData;
import com.ruoyi.common.utils.spring.SpringUtils;
@@ -22,6 +24,7 @@ import java.util.HashMap;
import java.util.List;
import static com.ruoyi.common.TaskStatusCode.TASK_EP_AGV;
import static com.ruoyi.common.TaskStatusCode.TASK_EP_LINE_SSJ;
import static com.ruoyi.schedule.plcRead.ssj.PlcSsjRead.deviceSsjMap;
import static com.ruoyi.schedule.plcRead.ssj.PlcSsjRead.writeToSsj;
@@ -36,6 +39,7 @@ public class LineSsjThread implements Runnable {
private IApiService apiService;
private IAgvQueueService agvQueueService;
private IMydoJobService mydoJobService;
private IWcsPortService wcsPortService;
public boolean isRun = true;
@@ -48,6 +52,7 @@ public class LineSsjThread implements Runnable {
apiService = SpringUtils.getBean(IApiService.class);
agvQueueService = SpringUtils.getBean(IAgvQueueService.class);
mydoJobService = SpringUtils.getBean(IMydoJobService.class);
wcsPortService = SpringUtils.getBean(IWcsPortService.class);
log.info("初始化服务 {},{}", apiService, agvQueueService);
}
@@ -75,6 +80,7 @@ public class LineSsjThread implements Runnable {
break;
}
}
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
@@ -93,21 +99,22 @@ public class LineSsjThread implements Runnable {
//查作业,入如果已经有了,直接下发输送线
MydoJob mydoJob = new MydoJob();
mydoJob.setInOrOut("1");
mydoJob.setStatus("1");
// mydoJob.setStatus("1");
mydoJob.setEntranceId("G1005");
mydoJob.setExecutionPhase("0");
// mydoJob.setExecutionPhase("0");
List<MydoJob> mydoJobs = mydoJobService.selectInOrOutMydoJobList(mydoJob);
//有作业,下发输送机任务号,覆盖任务号
if (!mydoJobs.isEmpty()) {
//永远有且只有一条
mydoJob = mydoJobs.get(0);
int i = writeToSsj(SsjDevice.getPlcDbWriteAddress(),mydoJob.getTaskNo(),1,1);
if(mydoJob.getStatus().equals("1")&& mydoJob.getExecutionPhase().equals("0")) {
int i = writeToSsj(SsjDevice.getPlcDbWriteAddress(), mydoJob.getTaskNo(), 1, 1);
if (i == 1) {
mydoJob.setExecutionPhase(TASK_EP_AGV);
mydoJob.setExecutionPhase(TASK_EP_LINE_SSJ);
mydoJobService.updateMydoJob(mydoJob);
log.info("G1005产线输送机下发任务号成功:" + mydoJob.getTaskNo());
}
}
} else {
@@ -124,11 +131,10 @@ public class LineSsjThread implements Runnable {
mydoJob2.setStatus("1");
mydoJob2.setExecutionPhase("0");
mydoJob2.setCreateTime(new Date());
mydoJobService.insertMydoJob(mydoJob2);
int i = writeToSsj(SsjDevice.getPlcDbWriteAddress(),mydoJob2.getTaskNo(),1,1);
if (i == 1) {
mydoJob2.setExecutionPhase(TASK_EP_AGV);
mydoJob2.setExecutionPhase(TASK_EP_LINE_SSJ);
mydoJobService.updateMydoJob(mydoJob2);
log.info("G1005产线输送机下发任务号成功:{}" , mydoJob2.getTaskNo());
}
@@ -140,6 +146,12 @@ public class LineSsjThread implements Runnable {
if (i == 1) {
log.info("G1005产线输送机下发错误信息成功");
}
//7是报工单失败,不处理
if(!"7".equals(Integer.parseInt(ajaxResult.get("code").toString()))){
createMoveToPort(SsjDevice);
}
}
@@ -153,18 +165,20 @@ public class LineSsjThread implements Runnable {
//查wcs有没作业,有下发给输送机任务号,覆盖任务号
MydoJob mydoJob = new MydoJob();
mydoJob.setInOrOut("1");
mydoJob.setStatus("1");
// mydoJob.setStatus("1");
mydoJob.setEntranceId("G1005");
mydoJob.setExecutionPhase("0");
// mydoJob.setExecutionPhase("0");
List<MydoJob> mydoJobs = mydoJobService.selectInOrOutMydoJobList(mydoJob);
if (!mydoJobs.isEmpty()) {
mydoJob = mydoJobs.get(0);
int i = writeToSsj(SsjDevice.getPlcDbWriteAddress(),mydoJob.getTaskNo(),1,1);
if(mydoJob.getStatus().equals("1") && mydoJob.getExecutionPhase().equals("0")) {
int i = writeToSsj(SsjDevice.getPlcDbWriteAddress(), mydoJob.getTaskNo(), 1, 1);
if (i == 1) {
mydoJob.setExecutionPhase(TASK_EP_AGV);
mydoJob.setExecutionPhase(TASK_EP_LINE_SSJ);
mydoJobService.updateMydoJob(mydoJob);
log.info("G1005产线输送机下发任务号成功:" + mydoJob.getTaskNo());
}
}
} else {
//没有,请求错误接口,找作业,返回成功,//拿到正常作业,插到wcs作业表,下发给输送机任务号,覆盖任务号,shibai...
HashMap<String, Object> paramMap = new HashMap<>();
@@ -175,7 +189,7 @@ public class LineSsjThread implements Runnable {
mydoJobService.insertMydoJob(mydoJob2);
int i = writeToSsj(SsjDevice.getPlcDbWriteAddress(),mydoJob2.getTaskNo(),1,1);
if (i == 1) {
mydoJob2.setExecutionPhase(TASK_EP_AGV);
mydoJob2.setExecutionPhase(TASK_EP_LINE_SSJ);
mydoJobService.updateMydoJob(mydoJob2);
log.info("G1005产线输送机下发任务号成功:" + mydoJob2.getTaskNo());
}
@@ -187,6 +201,10 @@ public class LineSsjThread implements Runnable {
if (i == 1) {
log.info("G1005产线输送机下发错误信息成功");
}
//7是报工单失败,不处理
if(!"7".equals(Integer.parseInt(ajaxResult.get("code").toString()))){
createMoveToPort(SsjDevice);
}
}
}
@@ -201,9 +219,9 @@ public class LineSsjThread implements Runnable {
String deviceCode = "";
if (mydoJob != null) {
if ("1".equals(mydoJob.getRoadwayId())) {
deviceCode = "L1011";
deviceCode = "L1001";
} else {
deviceCode = "L1012";
deviceCode = "L1003";
}
int kx = deviceSsjMap.get(deviceCode).getKx();
MydoJob mydoJobParam = new MydoJob();
@@ -228,8 +246,9 @@ public class LineSsjThread implements Runnable {
}else {
if ("1".equals(mydoJob.getStatus())){
HashMap<String, String> paramMap = new HashMap<>();
paramMap.put("trayCode", mydoJob.getTrayCode());
// paramMap.put("trayCode", mydoJob.getTrayCode());
paramMap.put("taskNo", mydoJob.getJobId());
//todo 与agv对点
paramMap.put("startPoint", "G1005");
paramMap.put("endPoint", deviceCode);
paramMap.put("traySize",String.valueOf(SsjDevice.getTraySize()));
@@ -253,6 +272,40 @@ public class LineSsjThread implements Runnable {
}
void createMoveToPort(DeviceSsj SsjDevice){
WcsPort wcsPort = new WcsPort();
wcsPort.setStatus("1");
List<WcsPort> wcsPorts = wcsPortService.selectWcsPortList(wcsPort);
List<AgvQueue> agvQueues = agvQueueService.selectAgvQueueList(new AgvQueue());
//检查agvQueues中是否有任何一个positionCode2是wcsPorts中的portCode
boolean hasMatchingPort = agvQueues.stream()
.map(AgvQueue::getPositionCode2)
.anyMatch(positionCode2 -> wcsPorts.stream()
.map(WcsPort::getPortCode)
.anyMatch(portCode -> portCode.equals(positionCode2)));
if(hasMatchingPort==false){
if(!wcsPorts.isEmpty()){
HashMap<String, String> map = new HashMap<>();
// map.put("trayCode", mydoJob.getTrayCode());
map.put("taskNo", StrUtil.uuid());
//todo 与agv对点
map.put("startPoint", "G1005");
map.put("endPoint", wcsPorts.get(0).getPortCode());
map.put("traySize",String.valueOf(SsjDevice.getTraySize()));
// map.put("wmsTaskNo", mydoJob.getTaskNo());
AjaxResult ajaxResult1 = apiService.receiveAgvMoveJob(map);
if(ajaxResult1.isSuccess()){
log.info("G1005产线生成作业失败,AGV下发搬运至缓存点任务成功:{}" , ajaxResult1.get("data"));
}
}
}
}

View File

@@ -79,7 +79,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="spare3 != null">spare3 = #{spare3},</if>
<if test="status != null">status = #{status},</if>
</trim>
where id = #{id}
where port_code = #{portCode}
</update>
<delete id="deleteWcsPortById" parameterType="Long">