7 Commits

Author SHA1 Message Date
张怡蓉
ad9f8d87fd 小车 2026-03-19 15:08:50 +08:00
1009473166@qq.com
cafcde4a35 2026.3.18 2026-03-18 14:26:26 +08:00
1009473166@qq.com
24eaaa2823 2026.3.18 2026-03-18 14:22:57 +08:00
猫猫guowen
24fb696a67 数字孪生:修改输送机入库时到位信号为到位,出库时为空闲 2026-03-18 14:13:14 +08:00
liuhanqing
9b008f5fe7 现场调度修改 2026-03-11 09:02:58 +08:00
liuhanqing
03e30d1db0 现场调度修改 2026-03-02 08:40:01 +08:00
liuhanqing
9c6c32b7ed 现场调度修改 2026-02-26 09:46:54 +08:00
54 changed files with 1569 additions and 665 deletions

View File

@@ -1,5 +1,6 @@
package com.ruoyi; package com.ruoyi;
import com.ruoyi.schedule.ScheduleThread;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -7,6 +8,8 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
import javax.annotation.Resource;
/** /**
* 启动程序 * 启动程序
* *
@@ -17,6 +20,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
@EnableAsync @EnableAsync
public class RuoYiApplication public class RuoYiApplication
{ {
public static void main(String[] args) public static void main(String[] args)
{ {
// System.setProperty("spring.devtools.restart.enabled", "false"); // System.setProperty("spring.devtools.restart.enabled", "false");

View File

@@ -7,6 +7,7 @@ import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.Map; import java.util.Map;
@@ -46,8 +47,14 @@ public class AgvController extends BaseController {
* @return * @return
*/ */
@PostMapping("/receiveAgvMoveJob") @PostMapping("/receiveAgvMoveJob")
public AjaxResult receiveAgvMoveJob(@RequestBody Map<String, String> param) { public int receiveAgvMoveJob(@RequestBody Map<String, String> param) {
return apiService.receiveAgvMoveJob(param); return apiService.receiveAgvMoveJob(param);
} }
//@Scheduled(cron = "0/5 * * * * ?")
public void sendAgvTask(){
apiService.sendAgvTask();
}
} }

View File

@@ -14,143 +14,187 @@ import java.util.UUID;
@Data @Data
public class GenAgvSchedulingTaskRequest { public class GenAgvSchedulingTaskRequest {
/** /**
* 请求编号 * 起始站点
* 同一个请求重复提交, 使用同一编号
*/ */
@NotNull private String FromStation;
private String reqCode = UUID.randomUUID().toString();
/**
* 请求时间
* 格式: “yyyy-MM-dd HH:mm:ss”
*/
private String reqTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
/**
* 客户端编号
* 客户端编号,如PDA,HCWMS等
*/
private String clientCode;
/**
* 令牌号
* 由调度系统颁发
*/
private String tokenCode;
/**
* 任务类型
* 内置任务类型:
* 厂内货架搬运: F01
* 厂内货架空满交换: F02
* 辊筒搬运接驳:F03
* 厂内货架出库AGV待命:F04
* 旋转货架: F05
* 厂内电梯任务: F06
* 以下为叉车专用任务类型
* 高位货架到工作台: F11
* 工作台到高位货架: F12
* 巷道到工作台: F13
* 工作台到巷道: F14
* 高位货架到工作台(接驳) : F15
* 工作台到高位货架 (接驳) : F16
* 巷道到工作台(接驳) : F17
* 工作台到巷道(接驳) : F18
* 叉车电梯主任务: F20
*/
@NotNull
private String taskTyp;
/**
* 容器类型(叉车/CTU专用) 叉车项目必传
*/
private String ctnrTyp;
/**
* 容器编号 (叉车/CTU专用)
*/
private String ctnrCode; //
/**
* 容器数量(叉车堆叠专用),默认值1,仅记录堆叠的数量不记录堆叠的每个容器号
*/
private String ctnrNum;
/**
* 任务模式
* 0-普通move 1-出库move 2-入库move 3-移库move
*/
private String taskMode;
/**
* 工作位
* 与RCS-2000端配置的位置名称一致, 工作位名称为字母\数字\或组合
*/
private String wbCode;
/**
* 位置路径
* AGV关键路径位置集合,与任务类型中模板配置的位置路径一一对应。待现场地图部署、配置完成后可获取
*/
private List<PositionCodeData> positionCodePath;
/**
* 货架编号
* 不指定货架可以为空
*/
private String podCode;
/**
* 货架方向
* “180”,”0”,”90”,”-90” 分别对应地图的”左”,”右”,”上”,”下”
* 不指定方向可以为空
* 如果终点不是工作台或工作台未配置操作方向则货架拣货方向podDir作为终点方向
* 如果工作台配有操作方向,则系统会根据货架拣货方向podDir和工作台操作方向计算货架终点方向
*/
private String podDir;
/**
* 货架类型, 传空时表示随机找个货架
* 找空货架传参方式如下:
* -1: 代表不关心货架类型, 找到空货架即可.
* -2: 代表从工作位获取关联货架类型, 如果未配置, 只找空货架.
* 货架类型编号: 只找该货架类型的空货架
*/
private String podTyp;
/**
* 物料批次
* 物料批次或货架上的物料唯一编码,生成任务单时,货架与物料直接绑定时使用. (通过同时传podCode和materialLot来绑定或通过 wbCode 找到位置上的货架和materialLot来绑定)
* 如果是区域/策略内查找货架,可以匹配对应物料批次的货架,支持以下值:
* 0:区域/策略内查找空货架
* 1:区域/策略内查找满货架
* 其他值:查找指定物料批次对应的货架
* 巷道任务通过该字段传入特征值
*/
private String materialLot;
/**
* 优先级
* 从(1~127)级,最大优先级最高。为空时,采用任务模板的优先级
*/
private String priority;
/**
* AGV编号
* 填写表示指定某一编号的AGV执行该任务
*/
private String agvCode;
/**
* 任务单号
* 选填, 不填系统自动生成
*/
private String taskCode;
/**
* 组编号
* CTU场景下用于按组出库,同组任务优先拼车。 如业务需要任务组间或组内按顺序出库,则需调用料箱顺序出库(CTU)接口。
* 潜伏式场景下,通过组号来管理顺序出库的顺序,组号小的优先出库。
*/
private String groupId;
/**
* 设备类型
*/
private String agvTyp;
/**
* 选择策略
* 区域/策略中挑选货架以及根据物料批次挑选货架时的先进先出规则,支持以下4个值:
* 1:按照货架到达储位的时间顺序,先进先出
* 2:按照货架到达储位的时间顺序,先进后出
* 9:按照货架绑定物料批次的时间顺序,先进先出
* 10:按照货架绑定物料批次的时间顺序,先进后出
*/
private String positionSelStrategy;
/**
* 自定义数据
*/
private String data;
/**
* 目的站点
*/
private String ToStation;
/**
* 任务类型(以实际的任务类型为准)
*/
private String Type;
/**
* 类名
*/
private String ClassName;
/**
* 任务引导ID
*/
private String TaskGuideId;
/**
* 订单 ID
*/
private String OrderId;
/**
* 触发ID
*/
private String TriggerId;
/**
* 扩展字段4
*/
private String Extend4;
/**
* 扩展字段5
*/
private String Extend5;
/**
* 扩展字段6
*/
private String Extend6;
/**
* 扩展字段7
*/
private String Extend7;
/**
* 扩展字段8
*/
private String Extend8;
/**
* 扩展字段9
*/
private String Extend9;
/**
* 任务附加信息
*/
private TaskAdditionallInfo TaskAdditionallInfo;
/**
* 任务附加信息类
*/
@Data
public static class TaskAdditionallInfo {
/**
* 任务ID
*/
private String TaskId;
/**
* 库存ID
*/
private String StockId;
/**
* 任务引导ID
*/
private String TaskGuideId;
/**
* 触发ID
*/
private String TriggerId;
/**
* 下一任务添加阶段
*/
private String NextTaskAddStage;
/**
* 链ID
*/
private String ChainId;
/**
* 链类型
*/
private Integer ChainType;
/**
* 链排序
*/
private Integer ChainSort;
/**
* 图号
*/
private String FigureNo;
/**
* 尺寸
*/
private String Size;
/**
* 箱号
*/
private String BoxNo;
/**
* 物料
*/
private String Mater;
/**
* 相关数量
*/
private Integer RelatedCount;
/**
* 序列号
*/
private String SerialNo;
/**
* 重量
*/
private String Weight;
/**
* 站点号
*/
private String StationNo;
/**
* 手动计数
*/
private String HandCount;
/**
* 批次
*/
private String Batch;
/**
* 前置相关任务ID
*/
private String PreviousRelatedTaskId;
/**
* 下一相关任务ID
*/
private String NextRelatedTaskId;
/**
* 级联任务开始
*/
private String CascadeTaskBeginning;
/**
* 级联任务结束
*/
private String CascadeTaskEnding;
}
} }

View File

@@ -10,11 +10,14 @@ import lombok.NoArgsConstructor;
public class ReceiveJob { public class ReceiveJob {
private String taskNo; private String taskNo;
private String cargoSpaceId; private String cargoSpaceId;
private String targetCargoSpaceId;
private String exitId; private String exitId;
private String trayCode; private String trayCode;
private String entranceId; private String entranceId;
private String inOrOut; private String inOrOut;
private String jobId; private String jobId;
private String roadwayId; private String roadwayId;
private String classId;
private Long priority;
} }

View File

@@ -34,11 +34,11 @@ public interface IApiService
* @param code1 起点 * @param code1 起点
* @param code2 终点 * @param code2 终点
* @param wmsTrayCode 容器码 托盘料箱码/容器码 * @param wmsTrayCode 容器码 托盘料箱码/容器码
* @param wmsTaskNo mydojob 任务 * @param type mydojob 任务
* @param wmsTaskType 1-入库 2-出库 3-agv搬运 * @param jobId 1-入库 2-出库 3-agv搬运
* @return * @return
*/ */
public AgvQueue createAgvQueue(String code1,String code2,String wmsTrayCode,String taskCode,String wmsTaskType,String traySize,String wmsTaskNo); public int createAgvQueue(String code1,String code2,String wmsTrayCode,String taskCode,String type,String jobId);
/** /**
* 取消AGV任务 * 取消AGV任务
@@ -76,7 +76,9 @@ public interface IApiService
* @param param * @param param
* @return * @return
*/ */
AjaxResult receiveAgvMoveJob(Map<String, String> param); int receiveAgvMoveJob(Map<String, String> param);
void sendAgvTask();
/** /**
* 任务到达拣选口 * 任务到达拣选口
@@ -121,6 +123,10 @@ public interface IApiService
*/ */
public AjaxResult createInMydoJob(Map<String, Object> param); public AjaxResult createInMydoJob(Map<String, Object> param);
public AjaxResult sendCargoSpace(Map<String, Object> param);
public AjaxResult selectMydoJobByNoTrayCode(Map<String, Object> param); public AjaxResult selectMydoJobByNoTrayCode(Map<String, Object> param);
AjaxResult receiveOutMydoJob(ReceiveJob receiveOutJob); AjaxResult receiveOutMydoJob(ReceiveJob receiveOutJob);

View File

@@ -68,6 +68,8 @@ public interface IRequestLogService
*/ */
public RequestLog getRequestLog(String url, String param, String endPoint); public RequestLog getRequestLog(String url, String param, String endPoint);
public RequestLog getRequestLogAgv(String url, String endPoint, String param);
/** /**
* 接收请求,并插入日志 * 接收请求,并插入日志
* @param url * @param url

View File

@@ -62,17 +62,22 @@ public class ApiServiceImpl implements IApiService {
*/ */
@Override @Override
public GenAgvSchedulingTaskResponse genAgvSchedulingTask(GenAgvSchedulingTaskRequest genAgvSchedulingTaskRequest) { public GenAgvSchedulingTaskResponse genAgvSchedulingTask(GenAgvSchedulingTaskRequest genAgvSchedulingTaskRequest) {
RequestLog requestLog = requestLogService.getRequestLog(GEN_AGV_SCHEDULING_TASK, "生成AGV任务", JSONUtil.toJsonStr(genAgvSchedulingTaskRequest)); RequestLog requestLog = requestLogService.getRequestLogAgv(CREATE_AGV_TASK_URL, "生成AGV任务", JSONUtil.toJsonStr(genAgvSchedulingTaskRequest));
if ("1".equals(requestLog.getIsSuccessful())) { if ("1".equals(requestLog.getIsSuccessful())) {
return BeanUtil.toBean(requestLog.getResponseBody(), GenAgvSchedulingTaskResponse.class); GenAgvSchedulingTaskRequest bean = BeanUtil.toBean(requestLog.getResponseBody(), GenAgvSchedulingTaskRequest.class);
GenAgvSchedulingTaskResponse response = new GenAgvSchedulingTaskResponse();
response.setCode(0);
response.setMessage("请求成功");
response.setReqCode(genAgvSchedulingTaskRequest.getOrderId());
return response;
} else { } else {
//todo 需要调试 //todo 需要调试
GenAgvSchedulingTaskResponse response = new GenAgvSchedulingTaskResponse(); GenAgvSchedulingTaskResponse response = new GenAgvSchedulingTaskResponse();
response.setCode(500); response.setCode(500);
response.setMessage("请求失败"); response.setMessage("请求失败");
//todo 需要调试小车请求 //todo 需要调试小车请求
response.setCode(0); // response.setCode(0);
response.setMessage("模拟测试"); // response.setMessage("模拟测试");
return response; return response;
} }
} }
@@ -111,18 +116,39 @@ public class ApiServiceImpl implements IApiService {
* @return * @return
*/ */
@Override @Override
public AjaxResult receiveAgvMoveJob(Map<String, String> param) { public int receiveAgvMoveJob(Map<String, String> param) {
String startPoint = param.get("startPoint"); String startPoint = param.get("startPoint");
String endPoint = param.get("endPoint"); String endPoint = param.get("endPoint");
String traySize = param.get("traySize"); String type = param.get("type");
String wmsTaskNo = param.get("wmsTaskNo"); String jobId = param.get("jobId");
AgvQueue agvQueue = createAgvQueue(startPoint, endPoint, param.get("trayCode"), param.get("taskNo"), "1", traySize, wmsTaskNo); int i = createAgvQueue(startPoint, endPoint, param.get("trayCode"), param.get("taskNo"), type,jobId);
GenAgvSchedulingTaskResponse genAgvSchedulingTaskResponse = requestAgvQueue(agvQueue);
if (genAgvSchedulingTaskResponse.getCode() == 0) { return i;
return AjaxResult.success(); // GenAgvSchedulingTaskResponse genAgvSchedulingTaskResponse = requestAgvQueue(agvQueue);
// if (genAgvSchedulingTaskResponse.getCode() == 0) {
// return AjaxResult.success();
// }
// return AjaxResult.error(genAgvSchedulingTaskResponse.getMessage());
}
@Override
public void sendAgvTask() {
AgvQueue agvQueue = agvQueueService.selectAgvQueueByStatus();
if (agvQueue != null) {
GenAgvSchedulingTaskResponse genAgvSchedulingTaskResponse = requestAgvQueue(agvQueue);
if (genAgvSchedulingTaskResponse.getCode() == 0) {
agvQueue.setStatus("1");
agvQueueService.updateAgvQueue(agvQueue);
agvQueueService.insertHistory(agvQueue.getReqCode());
}else{
agvQueue.setStatus("2");
agvQueueService.updateAgvQueue(agvQueue);
}
} }
return AjaxResult.error(genAgvSchedulingTaskResponse.getMessage());
} }
@@ -242,12 +268,12 @@ public class ApiServiceImpl implements IApiService {
* @param code1 起点 * @param code1 起点
* @param code2 终点 * @param code2 终点
* @param wmsTrayCode 容器码 托盘料箱码/容器码 * @param wmsTrayCode 容器码 托盘料箱码/容器码
* @param wmsTaskNo mydojob 任务 * @param type mydojob 任务
* @param wmsTaskType 1-入库 2-出库 3-agv搬运 * @param jobId 1-入库 2-出库 3-agv搬运
* @return * @return
*/ */
@Override @Override
public AgvQueue createAgvQueue(String code1, String code2, String wmsTrayCode, String taskCode, String wmsTaskType, String traySize, String wmsTaskNo) { public int createAgvQueue(String code1, String code2, String wmsTrayCode, String taskCode,String type,String jobId) {
//生成ctu执行队列 //生成ctu执行队列
AgvQueue agvQueue = new AgvQueue(); AgvQueue agvQueue = new AgvQueue();
String reqCode = IdUtil.fastSimpleUUID(); String reqCode = IdUtil.fastSimpleUUID();
@@ -257,20 +283,21 @@ public class ApiServiceImpl implements IApiService {
agvQueue.setAgvType("AGV"); agvQueue.setAgvType("AGV");
agvQueue.setPositionCode1(code1); agvQueue.setPositionCode1(code1);
agvQueue.setPositionCode2(code2); agvQueue.setPositionCode2(code2);
agvQueue.setTaskType("F01"); agvQueue.setTaskType(type);
agvQueue.setCtnrType(traySize); agvQueue.setCtnrType("0");
agvQueue.setCtnrCode("0"); agvQueue.setCtnrCode("0");
agvQueue.setCtnrNum("0"); agvQueue.setCtnrNum("0");
agvQueue.setTaskMode("0"); agvQueue.setTaskMode("0");
agvQueue.setPriority("10"); agvQueue.setPriority("10");
agvQueue.setRequest("0"); agvQueue.setRequest("0");
agvQueue.setWmsTraycode(wmsTrayCode); agvQueue.setWmsTraycode(wmsTrayCode);
agvQueue.setWmsTaskNo(wmsTaskNo); agvQueue.setWmsTaskNo(taskCode);
agvQueue.setStatus("0"); agvQueue.setStatus("0");
agvQueue.setTaskCode(taskCode); agvQueue.setTaskCode(jobId);
agvQueue.setWmsTaskType(wmsTaskType); agvQueue.setWmsTaskType("0");
agvQueueService.insertAgvQueue(agvQueue); int i = agvQueueService.insertAgvQueue(agvQueue);
return agvQueue; return i;
} }
/** /**
@@ -317,20 +344,15 @@ public class ApiServiceImpl implements IApiService {
public GenAgvSchedulingTaskResponse requestAgvQueue(AgvQueue agvQueue) { public GenAgvSchedulingTaskResponse requestAgvQueue(AgvQueue agvQueue) {
//todo 请求ctu //todo 请求ctu
GenAgvSchedulingTaskRequest genAgvSchedulingTaskRequest = new GenAgvSchedulingTaskRequest(); GenAgvSchedulingTaskRequest genAgvSchedulingTaskRequest = new GenAgvSchedulingTaskRequest();
genAgvSchedulingTaskRequest.setReqCode(agvQueue.getReqCode()); genAgvSchedulingTaskRequest.setFromStation(agvQueue.getPositionCode1());
genAgvSchedulingTaskRequest.setTaskMode("0"); genAgvSchedulingTaskRequest.setToStation(agvQueue.getPositionCode2());
genAgvSchedulingTaskRequest.setPriority("10"); genAgvSchedulingTaskRequest.setOrderId(agvQueue.getTaskCode());
genAgvSchedulingTaskRequest.setTaskTyp("F01"); genAgvSchedulingTaskRequest.setType(agvQueue.getTaskType());
genAgvSchedulingTaskRequest.setCtnrCode("0"); genAgvSchedulingTaskRequest.setTaskGuideId("00000000-0000-0000-0000-000000000000");
genAgvSchedulingTaskRequest.setCtnrNum("0"); genAgvSchedulingTaskRequest.setTriggerId("00000000-0000-0000-0000-000000000000");
genAgvSchedulingTaskRequest.setTaskMode("0"); GenAgvSchedulingTaskRequest.TaskAdditionallInfo taskAdditionallInfo = new GenAgvSchedulingTaskRequest.TaskAdditionallInfo();
genAgvSchedulingTaskRequest.setTaskCode(agvQueue.getTaskCode()); genAgvSchedulingTaskRequest.setTaskAdditionallInfo(taskAdditionallInfo);
genAgvSchedulingTaskRequest.setAgvTyp("AGV");
genAgvSchedulingTaskRequest.setPositionSelStrategy("0");
List<PositionCodeData> positionCodePath = new ArrayList<>();
positionCodePath.add(new PositionCodeData(agvQueue.getPositionCode1(), "0"));
positionCodePath.add(new PositionCodeData(agvQueue.getPositionCode2(), "0"));
genAgvSchedulingTaskRequest.setPositionCodePath(positionCodePath);
return genAgvSchedulingTask(genAgvSchedulingTaskRequest); return genAgvSchedulingTask(genAgvSchedulingTaskRequest);
} }
@@ -347,12 +369,27 @@ public class ApiServiceImpl implements IApiService {
} }
@Override
public AjaxResult sendCargoSpace(Map<String, Object> param) {
// 访问请求路径,生成入库作业 ,如果生成返回信息
RequestLog requestLog = requestLogService.getRequestLog(SEND_CARGOSPACE, "请求分配货位", JSONUtil.toJsonStr(param));
if ("1".equals(requestLog.getIsSuccessful())) {
InterfaceReceive bean = JSONUtil.toBean(requestLog.getResponseBody(), InterfaceReceive.class);
return AjaxResult.success(bean.getData());
} else {
return AjaxResult.error();
}
}
@Override @Override
public AjaxResult receiveOutMydoJob(ReceiveJob receiveOutJob) { public AjaxResult receiveOutMydoJob(ReceiveJob receiveOutJob) {
MydoJob mydoJob = new MydoJob(); MydoJob mydoJob = new MydoJob();
mydoJob.setJobId(receiveOutJob.getJobId()); mydoJob.setJobId(receiveOutJob.getJobId());
mydoJob.setTaskNo(receiveOutJob.getTaskNo()); mydoJob.setTaskNo(receiveOutJob.getTaskNo());
mydoJob.setCargoSpaceId(receiveOutJob.getCargoSpaceId()); mydoJob.setCargoSpaceId(receiveOutJob.getCargoSpaceId());
mydoJob.setTargetCargoSpaceId(receiveOutJob.getTargetCargoSpaceId());
mydoJob.setExitId(receiveOutJob.getExitId()); mydoJob.setExitId(receiveOutJob.getExitId());
mydoJob.setInOrOut(receiveOutJob.getInOrOut()); mydoJob.setInOrOut(receiveOutJob.getInOrOut());
mydoJob.setStatus("1"); mydoJob.setStatus("1");
@@ -360,6 +397,8 @@ public class ApiServiceImpl implements IApiService {
mydoJob.setRoadwayId(receiveOutJob.getRoadwayId()); mydoJob.setRoadwayId(receiveOutJob.getRoadwayId());
mydoJob.setCreateTime(DateUtils.getNowDate()); mydoJob.setCreateTime(DateUtils.getNowDate());
mydoJob.setExecutionPhase("0"); mydoJob.setExecutionPhase("0");
mydoJob.setTheFloor(receiveOutJob.getClassId());
mydoJob.setPriority(receiveOutJob.getPriority());
int i = mydoJobService.insertMydoJob(mydoJob); int i = mydoJobService.insertMydoJob(mydoJob);
if (i > 0) { if (i > 0) {
return AjaxResult.success(); return AjaxResult.success();

View File

@@ -6,6 +6,8 @@ import java.util.List;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil; import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.ruoyi.api.domain.InterfaceReceive; import com.ruoyi.api.domain.InterfaceReceive;
@@ -137,6 +139,7 @@ public class RequestLogServiceImpl implements IRequestLogService
requestLog.setDuration(Convert.toStr(DateUtil.between(requestTime, responseTime, DateUnit.MS))); requestLog.setDuration(Convert.toStr(DateUtil.between(requestTime, responseTime, DateUnit.MS)));
requestLog.setIsSuccessful("1"); requestLog.setIsSuccessful("1");
}else { }else {
requestLog.setResponseTime(DateUtil.format(responseTime, "yyyy-MM-dd HH:mm:ss"));
requestLog.setResponseStatus("0"); requestLog.setResponseStatus("0");
requestLog.setErrorDetails(bean.getMsg()); requestLog.setErrorDetails(bean.getMsg());
requestLog.setIsSuccessful("0"); requestLog.setIsSuccessful("0");
@@ -152,6 +155,56 @@ public class RequestLogServiceImpl implements IRequestLogService
return requestLog; return requestLog;
} }
@Override
public RequestLog getRequestLogAgv(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"));
requestLog.setSourceSystem("wms");
requestLog.setTargetSystem("agv");
requestLog.setEndpoint(endPoint);
requestLog.setRequestMethod("post");
requestLog.setRequestHeaders(null);
requestLog.setRequestBody(param);
requestLog.setRequestUrl(url);
try {
// 使用HttpRequest获取HTTP状态码
HttpResponse response = HttpRequest.post(url)
.body(param)
.timeout(5000)
.execute();
int httpStatusCode = response.getStatus();
String resStr = response.body();
requestLog.setResponseBody(resStr);
Date responseTime = new Date();
// 判断HTTP状态码是否成功(200-299都算成功)
if (httpStatusCode == 200) {
requestLog.setResponseTime(DateUtil.format(responseTime, "yyyy-MM-dd HH:mm:ss"));
requestLog.setResponseStatus(String.valueOf(httpStatusCode));
requestLog.setDuration(Convert.toStr(DateUtil.between(requestTime, responseTime, DateUnit.MS)));
requestLog.setIsSuccessful("1");
} else {
requestLog.setResponseTime(DateUtil.format(responseTime, "yyyy-MM-dd HH:mm:ss"));
requestLog.setResponseStatus(String.valueOf(httpStatusCode));
requestLog.setErrorDetails("HTTP请求失败,状态码: " + httpStatusCode);
requestLog.setIsSuccessful("0");
}
} catch (Exception e) {
requestLog.setErrorDetails(e.getMessage());
requestLog.setIsSuccessful("0");
requestLog.setResponseStatus("0");
} finally {
insertRequestLog(requestLog);
}
return requestLog;
}
/** /**
* 插入请求日志 * 插入请求日志
* *

View File

@@ -1,7 +1,9 @@
package com.ruoyi.bas.srgvmap.mapper; package com.ruoyi.bas.srgvmap.mapper;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap; import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap;
import org.apache.ibatis.annotations.Param;
/** /**
* 小车点位地图表Mapper接口 * 小车点位地图表Mapper接口
@@ -62,4 +64,8 @@ public interface WcsSrgvMapMapper
* @return 结果 * @return 结果
*/ */
public int deleteWcsSrgvMapByGuids(String[] guids); public int deleteWcsSrgvMapByGuids(String[] guids);
List<WcsSrgvMap> selectNotInsite( @Param("cache") String cache,
@Param("floor") Integer floor,
@Param("sites") ArrayList<String> sites);
} }

View File

@@ -1,5 +1,6 @@
package com.ruoyi.bas.srgvmap.service; package com.ruoyi.bas.srgvmap.service;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap; import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap;
@@ -62,4 +63,6 @@ public interface IWcsSrgvMapService
* @return 结果 * @return 结果
*/ */
public int deleteWcsSrgvMapByGuid(String guid); public int deleteWcsSrgvMapByGuid(String guid);
List<WcsSrgvMap> selectNotInsite(String cache, Integer floor, ArrayList<String> sites);
} }

View File

@@ -4,7 +4,6 @@ package com.ruoyi.bas.srgvmap.service;
import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap; import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap;
import com.ruoyi.device.srgv.domain.DeviceSrgv; import com.ruoyi.device.srgv.domain.DeviceSrgv;
import java.util.List;
import java.util.Map; import java.util.Map;
public interface RoadCacheService { public interface RoadCacheService {
@@ -18,11 +17,13 @@ public interface RoadCacheService {
/** /**
* 处理地图 * 处理地图
*
* @param arrByRoadSite * @param arrByRoadSite
* @param deviceSrgv * @param deviceSrgv
* @param floor
* @return * @return
*/ */
int[][] handleMap(Map<String, WcsSrgvMap> arrByRoadSite, DeviceSrgv deviceSrgv); int[][] handleMap(Map<String, WcsSrgvMap> arrByRoadSite, DeviceSrgv deviceSrgv, Integer floor);
/** /**
* 根据x y z 获取指定位置的缓存 * 根据x y z 获取指定位置的缓存
* @param x * @param x

View File

@@ -41,29 +41,27 @@ public class RoadCacheServiceImpl implements RoadCacheService {
for (WcsSrgvMap wcsSrgvMap : wcsSrgvMaps) { for (WcsSrgvMap wcsSrgvMap : wcsSrgvMaps) {
maps.put(wcsSrgvMap.getSiteId(), wcsSrgvMap); maps.put(wcsSrgvMap.getSiteId(), wcsSrgvMap);
} }
param.setAxy("11,9");
List<WcsSrgvMap> tsjMap = wcsSrgvMapMapper.selectWcsSrgvMapList(param);
for (WcsSrgvMap wcsSrgvMap : tsjMap) {
maps.put("tsj",wcsSrgvMap);
}
return maps; return maps;
} }
@Override @Override
public int[][] handleMap(Map<String, WcsSrgvMap> maps, DeviceSrgv deviceSrgv) { public int[][] handleMap(Map<String, WcsSrgvMap> maps, DeviceSrgv deviceSrgv, Integer floor) {
//1.锁定其他车任务路径 //1.锁定其他车任务路径
lockedOtherCarQueuePath(maps, deviceSrgv); lockedOtherCarQueuePath(maps, deviceSrgv);
//2.锁定无任务小车当前位置 //2.锁定无任务小车当前位置
lockedOtherCarCurrSite(maps, deviceSrgv); // lockedOtherCarCurrSite(maps, deviceSrgv);
//3.锁定离线小车当前位置 //3.锁定离线小车当前位置
lockedOfflineCarCurrSite(maps, deviceSrgv); lockedOfflineCarCurrSite(maps, deviceSrgv);
maps.put("tsj", maps.get("07050" + floor));
//4.锁定满货位的位置 TODO 是否存在移库影响效率
int[][] mapsInt = new int[50][50]; int[][] mapsInt = new int[50][50];
for (String site : maps.keySet()) { for (String site : maps.keySet()) {
WcsSrgvMap wcsSrgvMap = maps.get(site); WcsSrgvMap wcsSrgvMap = maps.get(site);
mapsInt[wcsSrgvMap.getX()][wcsSrgvMap.getY()] = wcsSrgvMap.getValue(); mapsInt[wcsSrgvMap.getX()][wcsSrgvMap.getY()] = wcsSrgvMap.getValue();
if (wcsSrgvMap.getAxy().equals("11,8")){
if (wcsSrgvMap.getAxy().equals("11,9")) {
System.err.println(wcsSrgvMap.getValue()); System.err.println(wcsSrgvMap.getValue());
} }
} }
@@ -77,7 +75,7 @@ public class RoadCacheServiceImpl implements RoadCacheService {
param.setY(y); param.setY(y);
param.setZ(z); param.setZ(z);
List<WcsSrgvMap> wcsSrgvMaps = wcsSrgvMapMapper.selectWcsSrgvMapList(param); List<WcsSrgvMap> wcsSrgvMaps = wcsSrgvMapMapper.selectWcsSrgvMapList(param);
if (CollUtil.isNotEmpty(wcsSrgvMaps)){ if (CollUtil.isNotEmpty(wcsSrgvMaps)) {
return wcsSrgvMaps.get(0); return wcsSrgvMaps.get(0);
} }
return null; return null;
@@ -142,8 +140,18 @@ public class RoadCacheServiceImpl implements RoadCacheService {
//添加其他小车路径列表 //添加其他小车路径列表
HashSet<String> otherCarSiteList = new HashSet<>(); HashSet<String> otherCarSiteList = new HashSet<>();
for (WcsSrgvQueue wcsSrgvQueue : otherCarQueue) { for (WcsSrgvQueue wcsSrgvQueue : otherCarQueue) {
if (wcsSrgvQueue.getPathInfo()!=null) { if (wcsSrgvQueue.getPathInfo() != null) {
otherCarSiteList.addAll(Arrays.asList(wcsSrgvQueue.getPathInfo().split(","))); //根据小车当前点位去除已走路径
DeviceSrgv otherCarCurrStatus = deviceSrgvService.selectDeviceSrgvByGuid(wcsSrgvQueue.getAgvId());
String currSite = otherCarCurrStatus.getCurrSite();
List<String> allSiteList = Arrays.asList(wcsSrgvQueue.getPathInfo().split(","));
int i = allSiteList.indexOf(currSite);
if (i == -1) {
i = 0;
}
List<String> resultSiteList = allSiteList.subList(i, allSiteList.size());
otherCarSiteList.addAll(resultSiteList);
//otherCarSiteList.addAll(Arrays.asList(wcsSrgvQueue.getPathInfo().split(",")));
} }
} }
//锁定其他小车路径 //锁定其他小车路径

View File

@@ -1,6 +1,8 @@
package com.ruoyi.bas.srgvmap.service.impl; package com.ruoyi.bas.srgvmap.service.impl;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.ruoyi.bas.srgvmap.mapper.WcsSrgvMapMapper; import com.ruoyi.bas.srgvmap.mapper.WcsSrgvMapMapper;
@@ -14,8 +16,7 @@ import com.ruoyi.bas.srgvmap.service.IWcsSrgvMapService;
* @date 2025-11-21 * @date 2025-11-21
*/ */
@Service @Service
public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService {
{
@Autowired @Autowired
private WcsSrgvMapMapper wcsSrgvMapMapper; private WcsSrgvMapMapper wcsSrgvMapMapper;
@@ -26,8 +27,7 @@ public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService
* @return 小车点位地图表 * @return 小车点位地图表
*/ */
@Override @Override
public WcsSrgvMap selectWcsSrgvMapByGuid(String guid) public WcsSrgvMap selectWcsSrgvMapByGuid(String guid) {
{
return wcsSrgvMapMapper.selectWcsSrgvMapByGuid(guid); return wcsSrgvMapMapper.selectWcsSrgvMapByGuid(guid);
} }
@@ -43,8 +43,7 @@ public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService
* @return 小车点位地图表 * @return 小车点位地图表
*/ */
@Override @Override
public List<WcsSrgvMap> selectWcsSrgvMapList(WcsSrgvMap wcsSrgvMap) public List<WcsSrgvMap> selectWcsSrgvMapList(WcsSrgvMap wcsSrgvMap) {
{
return wcsSrgvMapMapper.selectWcsSrgvMapList(wcsSrgvMap); return wcsSrgvMapMapper.selectWcsSrgvMapList(wcsSrgvMap);
} }
@@ -55,8 +54,7 @@ public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService
* @return 结果 * @return 结果
*/ */
@Override @Override
public int insertWcsSrgvMap(WcsSrgvMap wcsSrgvMap) public int insertWcsSrgvMap(WcsSrgvMap wcsSrgvMap) {
{
return wcsSrgvMapMapper.insertWcsSrgvMap(wcsSrgvMap); return wcsSrgvMapMapper.insertWcsSrgvMap(wcsSrgvMap);
} }
@@ -67,8 +65,7 @@ public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService
* @return 结果 * @return 结果
*/ */
@Override @Override
public int updateWcsSrgvMap(WcsSrgvMap wcsSrgvMap) public int updateWcsSrgvMap(WcsSrgvMap wcsSrgvMap) {
{
return wcsSrgvMapMapper.updateWcsSrgvMap(wcsSrgvMap); return wcsSrgvMapMapper.updateWcsSrgvMap(wcsSrgvMap);
} }
@@ -79,8 +76,7 @@ public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService
* @return 结果 * @return 结果
*/ */
@Override @Override
public int deleteWcsSrgvMapByGuids(String[] guids) public int deleteWcsSrgvMapByGuids(String[] guids) {
{
return wcsSrgvMapMapper.deleteWcsSrgvMapByGuids(guids); return wcsSrgvMapMapper.deleteWcsSrgvMapByGuids(guids);
} }
@@ -91,8 +87,12 @@ public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService
* @return 结果 * @return 结果
*/ */
@Override @Override
public int deleteWcsSrgvMapByGuid(String guid) public int deleteWcsSrgvMapByGuid(String guid) {
{
return wcsSrgvMapMapper.deleteWcsSrgvMapByGuid(guid); return wcsSrgvMapMapper.deleteWcsSrgvMapByGuid(guid);
} }
@Override
public List<WcsSrgvMap> selectNotInsite(String cache, Integer floor, ArrayList<String> sites) {
return wcsSrgvMapMapper.selectNotInsite(cache, floor, sites);
}
} }

View File

@@ -5,6 +5,7 @@ public class Constant {
public static final String WMS_BASE_URL = "http://localhost:8080/api2wms/"; public static final String WMS_BASE_URL = "http://localhost:8080/api2wms/";
public static final String RCS_BASE_URL = "http://127.0.0.1:8081/rcms-dps/rest/"; public static final String RCS_BASE_URL = "http://127.0.0.1:8081/rcms-dps/rest/";
public static final String AGV_BASE_URL = "http://127.0.0.1:9501/api/app/agvs-task";
public static final String JOB_FINISH_URL = WMS_BASE_URL+"jobFinish"; public static final String JOB_FINISH_URL = WMS_BASE_URL+"jobFinish";
@@ -12,10 +13,12 @@ public class Constant {
public static final String CANCEL_TASK_URL = RCS_BASE_URL+"queryAgvStatus";; public static final String CANCEL_TASK_URL = RCS_BASE_URL+"queryAgvStatus";;
public static final String GEN_AGV_SCHEDULING_TASK = RCS_BASE_URL+"genAgvSchedulingTask";; public static final String GEN_AGV_SCHEDULING_TASK = RCS_BASE_URL+"genAgvSchedulingTask";;
public static final String CREATE_IN_MYDO_JOB_URL = WMS_BASE_URL+"requestEnterByTrayCode"; public static final String CREATE_IN_MYDO_JOB_URL = WMS_BASE_URL+"requestEnterByTrayCode";
public static final String SEND_CARGOSPACE = WMS_BASE_URL+"sendCargoSpace";
public static final String REQUEST_MYDO_JOB_URL = WMS_BASE_URL+"requestByNoTrayCode"; public static final String REQUEST_MYDO_JOB_URL = WMS_BASE_URL+"requestByNoTrayCode";
public static final String RE_ASSIGN_URL = WMS_BASE_URL+"reAssign"; public static final String RE_ASSIGN_URL = WMS_BASE_URL+"reAssign";
public static final String RE_MATERIAL_URL = WMS_BASE_URL+"reMaterial"; public static final String RE_MATERIAL_URL = WMS_BASE_URL+"reMaterial";
public static final String REQUEST_ENTER_URL = WMS_BASE_URL+"requestEnterByTrayCodeAndEntranceId"; public static final String REQUEST_ENTER_URL = WMS_BASE_URL+"requestEnterByTrayCodeAndEntranceId";
public static final String CREATE_AGV_TASK_URL = AGV_BASE_URL+"agvs-task";
public static final String WAREHOUSE_01 = "01"; public static final String WAREHOUSE_01 = "01";

View File

@@ -68,4 +68,6 @@ public interface DeviceCdzMapper
* @return * @return
*/ */
List<DeviceCdz> selectDeviceCdzHasSRgvList(); List<DeviceCdz> selectDeviceCdzHasSRgvList();
void updateDeviceCdzSpare(DeviceCdz deviceCdz);
} }

View File

@@ -68,4 +68,6 @@ public interface IDeviceCdzService
* @return * @return
*/ */
List<DeviceCdz> selectDeviceCdzHasSRgvList(); List<DeviceCdz> selectDeviceCdzHasSRgvList();
void updateDeviceCdzSpare(DeviceCdz deviceCdz);
} }

View File

@@ -100,4 +100,9 @@ public class DeviceCdzServiceImpl implements IDeviceCdzService
public List<DeviceCdz> selectDeviceCdzHasSRgvList() { public List<DeviceCdz> selectDeviceCdzHasSRgvList() {
return deviceCdzMapper.selectDeviceCdzHasSRgvList(); return deviceCdzMapper.selectDeviceCdzHasSRgvList();
} }
@Override
public void updateDeviceCdzSpare(DeviceCdz deviceCdz) {
deviceCdzMapper.updateDeviceCdzSpare(deviceCdz);
}
} }

View File

@@ -94,4 +94,5 @@ public class MydoJob extends BaseEntity
private String productId; private String productId;
private String productName; private String productName;
private String classId;
} }

View File

@@ -81,4 +81,12 @@ public interface MydoJobMapper
List<MydoJob> selectMydoJobFinishList(MydoJob mydoJob); List<MydoJob> selectMydoJobFinishList(MydoJob mydoJob);
MydoJob selectRunningMydoJobByExitList(@Param("exitList") List<String> exitList); MydoJob selectRunningMydoJobByExitList(@Param("exitList") List<String> exitList);
List<MydoJob> selectMydoJobOut();
MydoJob selectMydoJobByTrayCode(String trayCode);
Integer selectExit(String ssj);
Integer selectMydoJobCount();
} }

View File

@@ -80,4 +80,12 @@ public interface IMydoJobService
MydoJob selectRunningMydoJobByExitList(List<String> strings); MydoJob selectRunningMydoJobByExitList(List<String> strings);
AjaxResult manualCallback(String jobId); AjaxResult manualCallback(String jobId);
List<MydoJob> selectMydoJobOut();
MydoJob selectMydoJobByTrayCode(String trayCode);
Integer selectExit(String ssj);
Integer selectMydoJobCount();
} }

View File

@@ -173,4 +173,24 @@ public class MydoJobServiceImpl implements IMydoJobService
} }
return AjaxResult.error("手动回调失败"); return AjaxResult.error("手动回调失败");
} }
@Override
public List<MydoJob> selectMydoJobOut() {
return mydoJobMapper.selectMydoJobOut();
}
@Override
public MydoJob selectMydoJobByTrayCode(String trayCode) {
return mydoJobMapper.selectMydoJobByTrayCode(trayCode);
}
@Override
public Integer selectExit(String ssj) {
return mydoJobMapper.selectExit(ssj);
}
@Override
public Integer selectMydoJobCount() {
return mydoJobMapper.selectMydoJobCount();
}
} }

View File

@@ -66,5 +66,7 @@ public interface AgvQueueMapper
*/ */
AgvQueue selectAgvQueueByTaskCode(String taskCode); AgvQueue selectAgvQueueByTaskCode(String taskCode);
AgvQueue selectAgvQueueByStatus();
void insertHistory(String reqCode); void insertHistory(String reqCode);
} }

View File

@@ -66,6 +66,8 @@ public interface IAgvQueueService
*/ */
AgvQueue selectAgvQueueByTaskCode(String taskCode); AgvQueue selectAgvQueueByTaskCode(String taskCode);
AgvQueue selectAgvQueueByStatus();
/** /**
* 插入agv完成历史 * 插入agv完成历史
* @param reqCode * @param reqCode

View File

@@ -96,6 +96,11 @@ public class AgvQueueServiceImpl implements IAgvQueueService
return agvQueueMapper.selectAgvQueueByTaskCode(taskCode); return agvQueueMapper.selectAgvQueueByTaskCode(taskCode);
} }
@Override
public AgvQueue selectAgvQueueByStatus() {
return agvQueueMapper.selectAgvQueueByStatus();
}
@Override @Override
public void insertHistory(String reqCode) { public void insertHistory(String reqCode) {
agvQueueMapper.insertHistory(reqCode); agvQueueMapper.insertHistory(reqCode);

View File

@@ -9,8 +9,7 @@ import com.ruoyi.queue.srgv.domain.WcsSrgvQueue;
* @author ruoyi * @author ruoyi
* @date 2025-11-21 * @date 2025-11-21
*/ */
public interface WcsSrgvQueueMapper public interface WcsSrgvQueueMapper {
{
/** /**
* 查询四向小车任务队列 * 查询四向小车任务队列
* *
@@ -28,9 +27,6 @@ public interface WcsSrgvQueueMapper
public WcsSrgvQueue selectWcsSrgvQueueByFloor(String theFloor); public WcsSrgvQueue selectWcsSrgvQueueByFloor(String theFloor);
/** /**
* 查询四向小车任务队列列表 * 查询四向小车任务队列列表
* *
@@ -70,4 +66,13 @@ public interface WcsSrgvQueueMapper
* @return 结果 * @return 结果
*/ */
public int deleteWcsSrgvQueueByGuids(String[] guids); public int deleteWcsSrgvQueueByGuids(String[] guids);
String selectMinCountJob(@Param("list") List<String> outModelSSJ);
Integer selectTsj();
Integer selectByCaogoPlaceSite(String siteId);
Integer selectByEndSite();
} }

View File

@@ -77,4 +77,12 @@ public interface IWcsSrgvQueueService
* @param taskNo * @param taskNo
*/ */
public WcsSrgvQueue insertHistory(String taskNo); public WcsSrgvQueue insertHistory(String taskNo);
String selectMinCountJob(List<String> outModelSSJ);
Integer selectTsj();
Integer selectByCaogoPlaceSite(String siteId);
Integer selectByEndSite();
} }

View File

@@ -115,6 +115,29 @@ public class WcsSrgvQueueServiceImpl implements IWcsSrgvQueueService
return wcsSrgvQueueMapper.deleteWcsSrgvQueueByGuid(guid); return wcsSrgvQueueMapper.deleteWcsSrgvQueueByGuid(guid);
} }
@Override
public String selectMinCountJob( List<String> outModelSSJ) {
return wcsSrgvQueueMapper.selectMinCountJob(outModelSSJ) ;
}
@Override
public Integer selectTsj() {
return wcsSrgvQueueMapper.selectTsj();
}
@Override
public Integer selectByCaogoPlaceSite(String siteId) {
return wcsSrgvQueueMapper.selectByCaogoPlaceSite(siteId);
}
@Override
public Integer selectByEndSite() {
return wcsSrgvQueueMapper.selectByEndSite();
}
@Override @Override
public WcsSrgvQueue insertHistory(String taskNo) { public WcsSrgvQueue insertHistory(String taskNo) {
WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueMapper.selectWcsSrgvQueueByTaskNo(taskNo); WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueMapper.selectWcsSrgvQueueByTaskNo(taskNo);

View File

@@ -65,4 +65,6 @@ public interface TsjDeviceExecutionQueueMapper
* @return 提升机执行队列 * @return 提升机执行队列
*/ */
TsjDeviceExecutionQueue selectTsjDeviceExecutionQueueByRwh(Long taskNo); TsjDeviceExecutionQueue selectTsjDeviceExecutionQueueByRwh(Long taskNo);
Integer selectCount();
} }

View File

@@ -64,4 +64,6 @@ public interface ITsjDeviceExecutionQueueService
* @return * @return
*/ */
TsjDeviceExecutionQueue selectTsjDeviceExecutionQueueByRwh(Long taskNo); TsjDeviceExecutionQueue selectTsjDeviceExecutionQueueByRwh(Long taskNo);
Integer selectCount();
} }

View File

@@ -104,5 +104,10 @@ public class TsjDeviceExecutionQueueServiceImpl implements ITsjDeviceExecutionQu
return tsjDeviceExecutionQueueMapper.selectTsjDeviceExecutionQueueByRwh(taskNo); return tsjDeviceExecutionQueueMapper.selectTsjDeviceExecutionQueueByRwh(taskNo);
} }
@Override
public Integer selectCount() {
return tsjDeviceExecutionQueueMapper.selectCount();
}
} }

View File

@@ -67,12 +67,12 @@ public class PlcCdzRead implements Runnable {
} }
private void plcRead(DeviceCdz deviceCdz) { private void plcRead(DeviceCdz deviceCdz) {
OperateResultExOne<byte[]> read2 = readWriteNet.Read(deviceCdz.getPlcDbReadAddress(), Short.parseShort("4")); OperateResultExOne<byte[]> read2 = readWriteNet.Read(deviceCdz.getPlcDbReadAddress(), Short.parseShort("2"));
String ddsx1 = "0"; String ddsx1 = "0";
if (read2.IsSuccess) { if (read2.IsSuccess) {
ddsx1 = SoftBasic.ByteToHexString(read2.Content); ddsx1 = SoftBasic.ByteToHexString(read2.Content);
deviceCdz.setStatus(ParseUtil.optInt(0, ddsx1)); deviceCdz.setStatus(ParseUtil.optInt(0, ddsx1));
deviceCdz.setModel(ParseUtil.optInt(2, ddsx1)); // deviceCdz.setModel(ParseUtil.optInt(2, ddsx1));
} }
} }

View File

@@ -79,6 +79,12 @@ public class PlcSrgvRead implements Runnable {
if (read1.IsSuccess) { if (read1.IsSuccess) {
setValueByByte1(read1.Content, deviceSrgv); setValueByByte1(read1.Content, deviceSrgv);
} }
OperateResultExOne<byte[]> read5 = modbusTcpNet.Read("4081", (short) 2);//2400-2414
if (read5.IsSuccess) {
setValueByByte5(read1.Content, deviceSrgv);
}
//读取二段任务 小车是否接收完成1段作业 //读取二段任务 小车是否接收完成1段作业
OperateResultExOne<byte[]> read3 = modbusTcpNet.Read("1000", (short) 2);//2400-2414 OperateResultExOne<byte[]> read3 = modbusTcpNet.Read("1000", (short) 2);//2400-2414
if (read3.IsSuccess) { if (read3.IsSuccess) {
@@ -90,6 +96,12 @@ public class PlcSrgvRead implements Runnable {
if (read2.IsSuccess) { if (read2.IsSuccess) {
setValueByByte2(read2.Content, deviceSrgv); setValueByByte2(read2.Content, deviceSrgv);
} }
// //读取双字,路径
OperateResultExOne<byte[]> read4 = modbusTcpNet.Read("6000", (short) 800);// 5000-5799 路径 400个
if (read4.IsSuccess) {
setValueByByte4(read4.Content, deviceSrgv);
}
} }
//单字 //单字
@@ -104,6 +116,8 @@ public class PlcSrgvRead implements Runnable {
agvData.setAlarm(Convert.toInt(byteTransform.TransInt16(content, 6))); agvData.setAlarm(Convert.toInt(byteTransform.TransInt16(content, 6)));
// agvData.setStatus(0); // agvData.setStatus(0);
agvData.setStatus(Convert.toInt(byteTransform.TransInt16(content, 8))); agvData.setStatus(Convert.toInt(byteTransform.TransInt16(content, 8)));
//载货标志
// agvData.setCargoFlag(Convert.toInt(byteTransform.TransInt32(content[1], 13)));
//接收完成标志 //接收完成标志
// agvData.setFinish(Convert.toInt(byteTransform.TransInt16(content, 10))); // agvData.setFinish(Convert.toInt(byteTransform.TransInt16(content, 10)));
// agvData.setFinish(0); // agvData.setFinish(0);
@@ -123,6 +137,15 @@ public class PlcSrgvRead implements Runnable {
} }
private void setValueByByte5(byte[] content, DeviceSrgv agvData) {
int cargoFlag = content[27] & 0xFF;
agvData.setCargoFlag(cargoFlag);
}
//单字 //单字
private void setValueByByte3(byte[] content, DeviceSrgv agvData) { private void setValueByByte3(byte[] content, DeviceSrgv agvData) {
// agvData.setTaskType(0); // agvData.setTaskType(0);
@@ -150,6 +173,29 @@ public class PlcSrgvRead implements Runnable {
agvData.setCurrFloor(floor); agvData.setCurrFloor(floor);
} }
private void setValueByByte4(byte[] content, DeviceSrgv agvData) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < content.length; i += 4) {
// 检查剩余字节是否足够4个
if (i + 4 > content.length) break;
// TODO 注意双字反转
int value = byteTransform.TransInt32(content, i);
// 如果值为0,终止循环
if (value == 0) {
break;
}
sb.append(String.format("%06d", value)).append(","); // 用逗号分隔每个int值
}
// 移除最后多余的 ","
if (sb.length() > 0) {
sb.setLength(sb.length() - 1);
}
agvData.setPath(sb.toString());
}
public void ConnectServer() { public void ConnectServer() {
modbusTcpNet = new ModbusTcpNet();//创建一个Modbus对象 modbusTcpNet = new ModbusTcpNet();//创建一个Modbus对象
log.info("创建连接对象,IP{}", this.ip); log.info("创建连接对象,IP{}", this.ip);

View File

@@ -198,6 +198,7 @@ public class PathFinder {
if (gCost[endX][endY] == Integer.MAX_VALUE) { if (gCost[endX][endY] == Integer.MAX_VALUE) {
List<int[]> path = new ArrayList<>(); List<int[]> path = new ArrayList<>();
path.add(new int[]{-1, -1}); path.add(new int[]{-1, -1});
return path; return path;
} }

View File

@@ -68,6 +68,10 @@ public class PlcSsjRead implements Runnable {
// 线体到位输送机 // 线体到位输送机
readPlcOtherSsj(ssjDevice); readPlcOtherSsj(ssjDevice);
break; break;
case "4":
// 线体到位输送机
readPlcInDwSsj(ssjDevice);
break;
} }
} }
@@ -86,6 +90,18 @@ public class PlcSsjRead implements Runnable {
} }
} }
private void readPlcInDwSsj(DeviceSsj ssjDevice) {
OperateResultExOne<byte[]> read2 = readWriteNet.Read(ssjDevice.getPlcDbReadAddress(), Short.parseShort("10"));
String ddsx1 = "0";
if (read2.IsSuccess) {
ddsx1 = SoftBasic.ByteToHexString(read2.Content);
ssjDevice.setKx(ParseUtil.optInt(4, ddsx1));
ssjDevice.setDw(ParseUtil.optInt(6, ddsx1));
ssjDevice.setTaskNo(ParseUtil.optDInt(0, ddsx1));
}
}
/** /**
* 其他输送机 * 其他输送机
* *
@@ -99,6 +115,7 @@ public class PlcSsjRead implements Runnable {
ssjDevice.setKx(ParseUtil.optInt(4, ddsx1)); ssjDevice.setKx(ParseUtil.optInt(4, ddsx1));
ssjDevice.setDw(ParseUtil.optInt(6, ddsx1)); ssjDevice.setDw(ParseUtil.optInt(6, ddsx1));
ssjDevice.setTaskNo(ParseUtil.optDInt(0, ddsx1)); ssjDevice.setTaskNo(ParseUtil.optDInt(0, ddsx1));
ssjDevice.setModel(ParseUtil.optInt(8, ddsx1));//出入库模式 1入 2出
} }
} }

View File

@@ -13,6 +13,8 @@ import com.ruoyi.device.srgv.domain.DeviceSrgv;
import com.ruoyi.device.srgv.service.IDeviceSrgvService; import com.ruoyi.device.srgv.service.IDeviceSrgvService;
import com.ruoyi.job.charg.domain.SrgvChargingJob; import com.ruoyi.job.charg.domain.SrgvChargingJob;
import com.ruoyi.job.charg.service.ISrgvChargingJobService; import com.ruoyi.job.charg.service.ISrgvChargingJobService;
import com.ruoyi.job.mapper.MydoJobMapper;
import com.ruoyi.job.service.IMydoJobService;
import com.ruoyi.queue.srgv.domain.WcsSrgvQueue; import com.ruoyi.queue.srgv.domain.WcsSrgvQueue;
import com.ruoyi.queue.srgv.service.IWcsSrgvQueueService; import com.ruoyi.queue.srgv.service.IWcsSrgvQueueService;
import com.ruoyi.schedule.plcRead.cdz.PlcCdzRead; import com.ruoyi.schedule.plcRead.cdz.PlcCdzRead;
@@ -32,19 +34,22 @@ public class CdzThread implements Runnable {
public boolean isRun = true; public boolean isRun = true;
private final Integer LITTLE_BETTERY = 30; private final Integer LITTLE_BETTERY = 40;
private final Integer MIDDLE_BETTERY = 70; private final Integer MIDDLE_BETTERY = 70;
private final Integer MAX_BETTERY = 90;
private final Integer JOB_BETTERY=50;
private ISrgvChargingJobService chargingJobService; private ISrgvChargingJobService chargingJobService;
private IDeviceCdzService deviceCdzService; private IDeviceCdzService deviceCdzService;
private IDeviceSrgvService deviceSrgvService; private IDeviceSrgvService deviceSrgvService;
private IWcsSrgvQueueService wcsSrgvQueueService; private IWcsSrgvQueueService wcsSrgvQueueService;
public IMydoJobService mydoJobService;
public void init() { public void init() {
chargingJobService = SpringUtils.getBean(ISrgvChargingJobService.class); chargingJobService = SpringUtils.getBean(ISrgvChargingJobService.class);
deviceCdzService = SpringUtils.getBean(IDeviceCdzService.class); deviceCdzService = SpringUtils.getBean(IDeviceCdzService.class);
deviceSrgvService = SpringUtils.getBean(IDeviceSrgvService.class); deviceSrgvService = SpringUtils.getBean(IDeviceSrgvService.class);
wcsSrgvQueueService = SpringUtils.getBean(IWcsSrgvQueueService.class); wcsSrgvQueueService = SpringUtils.getBean(IWcsSrgvQueueService.class);
mydoJobService = SpringUtils.getBean(IMydoJobService.class);
} }
@Override @Override
@@ -64,17 +69,17 @@ public class CdzThread implements Runnable {
void dispatch() { void dispatch() {
Integer count = mydoJobService.selectMydoJobCount();
//获取低电量小车 //获取低电量小车
List<DeviceSrgv> littleBatterySRgv = new ArrayList<>(); List<DeviceSrgv> littleBatterySRgv = new ArrayList<>();
//获取中电量小车 //获取中电量小车
List<DeviceSrgv> middleBatterySRgv = new ArrayList<>(); List<DeviceSrgv> middleBatterySRgv = new ArrayList<>();
for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) { for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) {
DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(sRgv); DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(sRgv);
if (deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() != 3) { if (deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() != 3 && deviceSrgv.getChargeFlag() != 2) {
if (deviceSrgv.getBattery() <= LITTLE_BETTERY) { if (deviceSrgv.getBattery() <= LITTLE_BETTERY) {
littleBatterySRgv.add(deviceSrgv); littleBatterySRgv.add(deviceSrgv);
} else if (deviceSrgv.getBattery() <= MIDDLE_BETTERY) { } else if (deviceSrgv.getBattery() <= MIDDLE_BETTERY && count == 0) {
middleBatterySRgv.add(deviceSrgv); middleBatterySRgv.add(deviceSrgv);
} }
} }
@@ -92,22 +97,20 @@ public class CdzThread implements Runnable {
} }
//超过30分钟自动生成充电任务 //超过30分钟自动生成充电任务
List<DeviceSrgv> deviceSrgvs = deviceSrgvService.selectDeviceSrgvList(new DeviceSrgv()); // List<DeviceSrgv> deviceSrgvs = deviceSrgvService.selectDeviceSrgvList(new DeviceSrgv());
List<DeviceSrgv> timeOutSrgvList = deviceSrgvs.stream().filter(x -> DateUtil.between(DateUtil.parse(x.getLastTime()), DateUtil.date(), DateUnit.MINUTE) > 30).collect(Collectors.toList()); // List<DeviceSrgv> timeOutSrgvList = deviceSrgvs.stream().filter(x -> DateUtil.between(DateUtil.parse(x.getLastTime()), DateUtil.date(), DateUnit.MINUTE) > 30).collect(Collectors.toList());
if (CollUtil.isNotEmpty(timeOutSrgvList)) { // if (CollUtil.isNotEmpty(timeOutSrgvList)) {
//生成充电任务 // //生成充电任务
createChargingInJob(timeOutSrgvList); // createChargingInJob(timeOutSrgvList);
} // }
//充电任务下发 //充电任务下发 查到充电任务并且充电桩未开启直接开启
SrgvChargingJob srgvChargingJobParam = new SrgvChargingJob(); SrgvChargingJob srgvChargingJobParam = new SrgvChargingJob();
srgvChargingJobParam.setChargingStatus("0"); srgvChargingJobParam.setChargingStatus("0");
srgvChargingJobParam.setJobType("1"); srgvChargingJobParam.setJobType("1");
srgvChargingJobParam.setJobStatus("3");
List<SrgvChargingJob> srgvChargingJobs = chargingJobService.selectSrgvChargingJobList(srgvChargingJobParam); List<SrgvChargingJob> srgvChargingJobs = chargingJobService.selectSrgvChargingJobList(srgvChargingJobParam);
if (CollUtil.isNotEmpty(srgvChargingJobs)) { if (CollUtil.isNotEmpty(srgvChargingJobs)) {
for (SrgvChargingJob srgvChargingJob : srgvChargingJobs) { for (SrgvChargingJob srgvChargingJob : srgvChargingJobs) {
if ("0".equals(srgvChargingJob.getChargingStatus())) { if ("0".equals(srgvChargingJob.getChargingStatus())) {
String chargingSite = srgvChargingJob.getChargingSite(); String chargingSite = srgvChargingJob.getChargingSite();
@@ -118,44 +121,29 @@ public class CdzThread implements Runnable {
SendData qxSendData = new SendData(Tools.INT, 1); SendData qxSendData = new SendData(Tools.INT, 1);
byte[] bytes = Tools.sendData(qxSendData); byte[] bytes = Tools.sendData(qxSendData);
int i = PlcCdzRead.WriteToCdz(plcDbWriteAddress, bytes); int i = PlcCdzRead.WriteToCdz(plcDbWriteAddress, bytes);
// 查到充电任务,并且充电桩未开启就直接开启
if (i == 1) { if (i == 1) {
log.info("下发{" + deviceCdzs.get(0).getId() + "}号充电桩开启");
srgvChargingJob.setChargingStatus("2"); srgvChargingJob.setChargingStatus("2");
srgvChargingJob.setChargingDate(DateUtil.formatDateTime(DateUtil.date())); srgvChargingJob.setChargingDate(DateUtil.formatDateTime(DateUtil.date()));
chargingJobService.updateSrgvChargingJob(srgvChargingJob); chargingJobService.updateSrgvChargingJob(srgvChargingJob);
} }
} }
} }
} }
//生成断电任务 有任务且电量大于50
//生成断电任务 有任务且电量大于50 todo 代码无效 List<DeviceCdz> deviceCdzdd = deviceCdzService.selectDeviceCdzHasSRgvList();
WcsSrgvQueue wcsSrgvQueueParam = new WcsSrgvQueue(); for (DeviceCdz deviceCdz : deviceCdzdd) {
wcsSrgvQueueParam.setIssued("0"); DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1());
List<WcsSrgvQueue> wcsSrgvQueues = wcsSrgvQueueService.selectWcsSrgvQueueList(wcsSrgvQueueParam); if (((deviceSrgv.getBattery() >= JOB_BETTERY && count > 0) || deviceSrgv.getBattery() >= MAX_BETTERY)
if (CollUtil.isNotEmpty(wcsSrgvQueues)) { && deviceSrgv.getWorkMode() == 5
boolean existsKxSRgv = false; && deviceSrgv.getChargeFlag() == 2 && deviceCdz.getStatus() == 1) {
//判断有没有空闲小车 createChargingOutJob(PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()), deviceCdz);
for (DeviceSrgv x : PlcSrgvRead.deviceSrgvMap.values()) {
if (x.getWorkMode() == 5 && x.getStatus() == 1) {
existsKxSRgv = true;
break;
}
}
if (!existsKxSRgv) {
List<DeviceCdz> deviceCdzs = deviceCdzService.selectDeviceCdzHasSRgvList();
if (CollUtil.isNotEmpty(deviceCdzs)) {
for (DeviceCdz deviceCdz : deviceCdzs) {
if (PlcSrgvRead.deviceSrgvMap.containsKey(deviceCdz.getSpare1())) {
DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1());
if (deviceSrgv.getBattery() >= 50) {
//生成断电任务
createChargingOutJob(deviceSrgv, deviceCdz);
break;
}
}
}
}
} }
} }
@@ -166,7 +154,6 @@ public class CdzThread implements Runnable {
srgvChargingJobDdParam.setJobType("2"); srgvChargingJobDdParam.setJobType("2");
List<SrgvChargingJob> srgvChargingJobDds = chargingJobService.selectSrgvChargingJobList(srgvChargingJobDdParam); List<SrgvChargingJob> srgvChargingJobDds = chargingJobService.selectSrgvChargingJobList(srgvChargingJobDdParam);
if (CollUtil.isNotEmpty(srgvChargingJobDds)) { if (CollUtil.isNotEmpty(srgvChargingJobDds)) {
for (SrgvChargingJob srgvChargingJob : srgvChargingJobDds) { for (SrgvChargingJob srgvChargingJob : srgvChargingJobDds) {
if ("0".equals(srgvChargingJob.getChargingStatus())) { if ("0".equals(srgvChargingJob.getChargingStatus())) {
String chargingSite = srgvChargingJob.getChargingSite(); String chargingSite = srgvChargingJob.getChargingSite();
@@ -178,6 +165,7 @@ public class CdzThread implements Runnable {
byte[] bytes = Tools.sendData(qxSendData); byte[] bytes = Tools.sendData(qxSendData);
int i = PlcCdzRead.WriteToCdz(plcDbWriteAddress, bytes); int i = PlcCdzRead.WriteToCdz(plcDbWriteAddress, bytes);
if (i == 1) { if (i == 1) {
log.info("下发{" + deviceCdzs.get(0).getId() + "}号充电桩关闭");
srgvChargingJob.setChargingStatus("1"); srgvChargingJob.setChargingStatus("1");
srgvChargingJob.setChargingDate(DateUtil.formatDateTime(DateUtil.date())); srgvChargingJob.setChargingDate(DateUtil.formatDateTime(DateUtil.date()));
chargingJobService.updateSrgvChargingJob(srgvChargingJob); chargingJobService.updateSrgvChargingJob(srgvChargingJob);
@@ -185,14 +173,11 @@ public class CdzThread implements Runnable {
chargingJobService.insertHistory(srgvChargingJob.getGuid()); chargingJobService.insertHistory(srgvChargingJob.getGuid());
chargingJobService.deleteSrgvChargingJobByGuid(srgvChargingJob.getGuid()); chargingJobService.deleteSrgvChargingJobByGuid(srgvChargingJob.getGuid());
deviceCdzs.get(0).setSpare1(null); deviceCdzs.get(0).setSpare1(null);
deviceCdzService.updateDeviceCdz(deviceCdzs.get(0)); deviceCdzService.updateDeviceCdzSpare(deviceCdzs.get(0));
} }
} }
} }
} }
} }
/** /**
@@ -207,42 +192,43 @@ public class CdzThread implements Runnable {
wcsChargingJob.setAgvId(deviceSrgv.getDeviceId().toString()); wcsChargingJob.setAgvId(deviceSrgv.getDeviceId().toString());
List<SrgvChargingJob> srgvChargingJobs = chargingJobService.selectSrgvChargingJobList(wcsChargingJob); List<SrgvChargingJob> srgvChargingJobs = chargingJobService.selectSrgvChargingJobList(wcsChargingJob);
if (CollUtil.isEmpty(srgvChargingJobs)) { if (CollUtil.isEmpty(srgvChargingJobs)) {
List<DeviceCdz> cdzList = deviceCdzService.selectDeviceCdzListNoSRgvId(); DeviceCdz deviceCdz = deviceCdzService.selectDeviceCdzById(Long.valueOf(deviceSrgv.getDeviceId()));
if (CollUtil.isNotEmpty(cdzList)) { // List<DeviceCdz> cdzList = deviceCdzService.selectDeviceCdzListNoSRgvId();
//寻找最接近的充电桩 // if (CollUtil.isNotEmpty(deviceCdz)) {
Integer floor = deviceSrgv.getCurrFloor(); //寻找最接近的充电桩
DeviceCdz cdz = null; // Integer floor = deviceSrgv.getCurrFloor();
Optional<DeviceCdz> min = cdzList.stream().filter(c -> c.getSzcs().equals(floor)).min((o1, o2) -> { // DeviceCdz cdz = null;
Integer distance1 = Math.abs(o1.getSzcs()); // Optional<DeviceCdz> min = cdzList.stream().min((o1, o2) -> {
Integer distance2 = Math.abs(o2.getSzcs()); // Integer distance1 = Math.abs(o1.getSzcs());
return distance1 - distance2; // Integer distance2 = Math.abs(o2.getSzcs());
}); // return distance1 - distance2;
if (min.isPresent()) { // });
cdz = min.get(); // if (min.isPresent()) {
} // cdz = min.get();
if (ObjUtil.isNotNull(cdz)) { // }
//生成充电任务 if (ObjUtil.isNotNull(deviceCdz)) {
SrgvChargingJob srgvChargingJobParam = new SrgvChargingJob(); //生成充电任务
srgvChargingJobParam.setAgvId(deviceSrgv.getDeviceId().toString()); SrgvChargingJob srgvChargingJobParam = new SrgvChargingJob();
srgvChargingJobParam.setChargingSite("08020" + cdz.getSzcs()); srgvChargingJobParam.setAgvId(deviceSrgv.getDeviceId().toString());
srgvChargingJobParam.setChargingId(cdz.getId().toString()); srgvChargingJobParam.setChargingSite("08020" + deviceCdz.getSzcs());
List<SrgvChargingJob> wcsChargingJobs = chargingJobService.selectSrgvChargingJobList(srgvChargingJobParam); srgvChargingJobParam.setChargingId(deviceCdz.getId().toString());
if (CollUtil.isEmpty(wcsChargingJobs)) { List<SrgvChargingJob> wcsChargingJobs = chargingJobService.selectSrgvChargingJobList(srgvChargingJobParam);
SrgvChargingJob scj = new SrgvChargingJob(); if (CollUtil.isEmpty(wcsChargingJobs)) {
scj.setGuid(IdUtil.fastSimpleUUID()); SrgvChargingJob scj = new SrgvChargingJob();
scj.setChargingSite(cdz.getSiteId()); scj.setGuid(IdUtil.fastSimpleUUID());
scj.setJobStatus("1"); scj.setChargingSite(deviceCdz.getSiteId());
scj.setChargingStatus("0"); scj.setJobStatus("1");
scj.setStartDate(DateUtil.now()); scj.setChargingStatus("0");
scj.setJobType("1");//到充电桩 scj.setStartDate(DateUtil.now());
scj.setAgvId(deviceSrgv.getDeviceId().toString()); scj.setJobType("1");//到充电桩
scj.setChargingId(cdz.getId().toString()); scj.setAgvId(deviceSrgv.getDeviceId().toString());
chargingJobService.insertSrgvChargingJob(scj); scj.setChargingId(deviceCdz.getId().toString());
cdz.setSpare1(deviceSrgv.getDeviceId().toString()); chargingJobService.insertSrgvChargingJob(scj);
deviceCdzService.updateDeviceCdz(cdz); deviceCdz.setSpare1(deviceSrgv.getDeviceId().toString());
} deviceCdzService.updateDeviceCdz(deviceCdz);
} }
} }
// }
} }
} }
} }
@@ -265,7 +251,7 @@ public class CdzThread implements Runnable {
srgvChargingJobParamOut.setJobType("2"); srgvChargingJobParamOut.setJobType("2");
List<SrgvChargingJob> srgvChargingJobOut = chargingJobService.selectSrgvChargingJobList(srgvChargingJobParamOut); List<SrgvChargingJob> srgvChargingJobOut = chargingJobService.selectSrgvChargingJobList(srgvChargingJobParamOut);
if (CollUtil.isNotEmpty(srgvChargingJobs)&&CollUtil.isEmpty(srgvChargingJobOut)) { if (CollUtil.isNotEmpty(srgvChargingJobs) && CollUtil.isEmpty(srgvChargingJobOut)) {
SrgvChargingJob scj = srgvChargingJobs.get(0); SrgvChargingJob scj = srgvChargingJobs.get(0);
//插入历史 //插入历史

View File

@@ -51,7 +51,9 @@ public class MonitoringThread implements Runnable {
} }
for (String srgvCode : PlcSrgvRead.deviceSrgvMap.keySet()) { for (String srgvCode : PlcSrgvRead.deviceSrgvMap.keySet()) {
DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(srgvCode); DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(srgvCode);
deviceSrgvService.updateDeviceSrgv(deviceSrgv); if (!deviceSrgv.getCurrSite().equals("000000")){
deviceSrgvService.updateDeviceSrgv(deviceSrgv);
}
} }
for (String tsjCode : PlcTsjRead.deviceTsjMap.keySet()) { for (String tsjCode : PlcTsjRead.deviceTsjMap.keySet()) {
DeviceTsj deviceTsj = PlcTsjRead.deviceTsjMap.get(tsjCode); DeviceTsj deviceTsj = PlcTsjRead.deviceTsjMap.get(tsjCode);
@@ -59,6 +61,8 @@ public class MonitoringThread implements Runnable {
} }
for (String cdzCode : PlcCdzRead.deviceCdzMap.keySet()) { for (String cdzCode : PlcCdzRead.deviceCdzMap.keySet()) {
DeviceCdz deviceCdz = PlcCdzRead.deviceCdzMap.get(cdzCode); DeviceCdz deviceCdz = PlcCdzRead.deviceCdzMap.get(cdzCode);
deviceCdz.setSpare1(null);
deviceCdz.setModel(deviceCdz.getStatus());
deviceCdzService.updateDeviceCdz(deviceCdz); deviceCdzService.updateDeviceCdz(deviceCdz);
} }
try { try {

View File

@@ -124,46 +124,58 @@ public class SsjThread implements Runnable {
} }
void inDispatch1(DeviceSsj deviceSsj) { void inDispatch1(DeviceSsj deviceSsj) {
if (deviceSsj.getRkqq() == 1 && StrUtil.isNotBlank(deviceSsj.getTrayCode())) { if (deviceSsj.getRkqq() == 1 && StrUtil.isNotBlank(deviceSsj.getTrayCode().trim())) {
//todo 查是否为入库模式,不是退回,是否超重 String trayCode = deviceSsj.getTrayCode().trim();
HashMap<String, Object> map = new HashMap<>(); MydoJob getMydoJob = mydoJobService.selectMydoJobByTrayCode(trayCode);
map.put("trayCode", deviceSsj.getTrayCode()); if (getMydoJob != null && deviceSsj.getTaskNo() < 1000) {
//拉取 int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), getMydoJob.getTaskNo(), 1, 1);
AjaxResult ajaxResult = apiService.createInMydoJob(map);
if (ajaxResult.isSuccess()) {
//拿到正常作业,插到wcs作业表,下发给输送机任务号,覆盖任务号
MydoJob mydoJob = BeanUtil.toBean(ajaxResult.get("data"), MydoJob.class);
mydoJob.setStatus("1");
mydoJob.setExecutionPhase("1");
mydoJob.setCreateTime(new Date());
if ("GS1002".equals(deviceSsj.getDeviceCode())) {
mydoJob.setEntranceId("L1004");
} else {
mydoJob.setEntranceId("L1005");
}
// 插入入库作业,并且根据作业直接下发 ,下发完毕直接修改执行阶段
MydoJob mydoJob1 = new MydoJob();
mydoJob1.setTaskNo(mydoJob.getTaskNo());
List<MydoJob> mydoJobs = mydoJobService.selectMydoJobList(mydoJob1);
if (mydoJobs.size() > 0) {
return;
}
mydoJobService.insertMydoJob(mydoJob);
int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), mydoJob.getTaskNo(), 1, 1);
if (i == 1) { if (i == 1) {
mydoJob.setStatus("3"); getMydoJob.setStatus("3");
mydoJobService.updateMydoJob(mydoJob); mydoJobService.updateMydoJob(getMydoJob);
log.info(deviceSsj.getDeviceCode() + "输送机下发任务号成功:{}", mydoJob.getTaskNo()); log.info(deviceSsj.getDeviceCode() + "输送机下发任务号成功:{}", getMydoJob.getTaskNo());
} }
} else { } else {
int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), "0", 2, 2); //todo 查是否为入库模式,不是退回,是否超重
if (i == 1) { HashMap<String, Object> map = new HashMap<>();
log.info(deviceSsj.getDeviceCode() + "未查到该托盘码作业,下发退回,去向2"); map.put("trayCode", deviceSsj.getTrayCode());
//拉取
AjaxResult ajaxResult = apiService.createInMydoJob(map);
if (ajaxResult.isSuccess()) {
//拿到正常作业,插到wcs作业表,下发给输送机任务号,覆盖任务号
MydoJob mydoJob = BeanUtil.toBean(ajaxResult.get("data"), MydoJob.class);
mydoJob.setStatus("1");
mydoJob.setExecutionPhase("1");
mydoJob.setCreateTime(new Date());
mydoJob.setTheFloor(mydoJob.getClassId());
mydoJob.setTrayCode(trayCode);
if ("GS1002".equals(deviceSsj.getDeviceCode())) {
mydoJob.setEntranceId("L1004");
} else {
mydoJob.setEntranceId("L1005");
}
// 插入入库作业,并且根据作业直接下发 ,下发完毕直接修改执行阶段
MydoJob mydoJob1 = new MydoJob();
mydoJob1.setTaskNo(mydoJob.getTaskNo());
mydoJob1.setTrayCode(mydoJob.getTrayCode());
List<MydoJob> mydoJobs = mydoJobService.selectMydoJobList(mydoJob1);
if (mydoJobs.size() > 0) {
return;
}
mydoJobService.insertMydoJob(mydoJob);
int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), mydoJob.getTaskNo(), 1, 1);
if (i == 1) {
mydoJob.setStatus("3");
mydoJobService.updateMydoJob(mydoJob);
log.info(deviceSsj.getDeviceCode() + "输送机下发任务号成功:{}", mydoJob.getTaskNo());
}
} else {
int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), "0", 2, 2);
if (i == 1) {
log.info(deviceSsj.getDeviceCode() + "未查到该托盘码作业,下发退回,去向2 条码" + deviceSsj.getTrayCode());
}
} }
} }
} }
} }
@@ -171,11 +183,28 @@ public class SsjThread implements Runnable {
void inDispatch2(DeviceSsj deviceSsj) { void inDispatch2(DeviceSsj deviceSsj) {
if (deviceSsj.getDw() == 1 && deviceSsj.getTaskNo() > 1000) { if (deviceSsj.getDw() == 1 && deviceSsj.getTaskNo() > 1000) {
MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo((long) deviceSsj.getTaskNo()); MydoJob mydoJob1 = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(deviceSsj.getTaskNo()));
if (mydoJob != null) { if (mydoJob1.getCargoSpaceId() != null) {
mydoJob.setExecutionPhase("2"); return;
mydoJobService.updateMydoJob(mydoJob);
} }
HashMap<String, Object> map = new HashMap<>();
map.put("taskNo", deviceSsj.getTaskNo());
//拉取
AjaxResult ajaxResult = apiService.sendCargoSpace(map);
if (ajaxResult.isSuccess()) {
MydoJob data = BeanUtil.toBean(ajaxResult.get("data"), MydoJob.class);
String cargoSpaceId = data.getCargoSpaceId();
String theFloor = data.getClassId();
MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo((long) deviceSsj.getTaskNo());
if (mydoJob != null) {
mydoJob.setTheFloor(theFloor);
mydoJob.setCargoSpaceId(cargoSpaceId);
mydoJob.setExecutionPhase("2");
mydoJobService.updateMydoJob(mydoJob);
}
}
} }
} }
} }

View File

@@ -8,6 +8,8 @@ import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.ruoyi.bas.port.service.IWcsPortService; import com.ruoyi.bas.port.service.IWcsPortService;
import com.ruoyi.bas.srgvmap.domain.WcsSrgvMap;
import com.ruoyi.bas.srgvmap.service.IWcsSrgvMapService;
import com.ruoyi.common.domain.SendData; import com.ruoyi.common.domain.SendData;
import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.device.srgv.domain.DeviceSrgv; import com.ruoyi.device.srgv.domain.DeviceSrgv;
@@ -25,7 +27,9 @@ import com.ruoyi.schedule.plcRead.util.Tools;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.Date; import java.util.Date;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
@Slf4j @Slf4j
public class TsjThread implements Runnable { public class TsjThread implements Runnable {
@@ -35,13 +39,17 @@ public class TsjThread implements Runnable {
private ITsjDeviceExecutionQueueFinishService tsjDeviceExecutionQueueFinishService; private ITsjDeviceExecutionQueueFinishService tsjDeviceExecutionQueueFinishService;
private IWcsPortService wcsPortService; private IWcsPortService wcsPortService;
private IWcsSrgvQueueService wcsSrgvQueueService; private IWcsSrgvQueueService wcsSrgvQueueService;
public IMydoJobService mydoJobService; private IMydoJobService mydoJobService;
private IWcsSrgvMapService wcsSrgvMapService;
public void init() { public void init() {
tsjDeviceExecutionQueueService = SpringUtils.getBean(ITsjDeviceExecutionQueueService.class); tsjDeviceExecutionQueueService = SpringUtils.getBean(ITsjDeviceExecutionQueueService.class);
tsjDeviceExecutionQueueFinishService = SpringUtils.getBean(ITsjDeviceExecutionQueueFinishService.class); tsjDeviceExecutionQueueFinishService = SpringUtils.getBean(ITsjDeviceExecutionQueueFinishService.class);
wcsPortService = SpringUtils.getBean(IWcsPortService.class); wcsPortService = SpringUtils.getBean(IWcsPortService.class);
wcsSrgvQueueService = SpringUtils.getBean(IWcsSrgvQueueService.class); wcsSrgvQueueService = SpringUtils.getBean(IWcsSrgvQueueService.class);
wcsSrgvMapService = SpringUtils.getBean(IWcsSrgvMapService.class);
} }
@Override @Override
@@ -76,7 +84,7 @@ public class TsjThread implements Runnable {
* 1、下发完成 如果设备状态为 2-工作 ,触发方式 2-自动,任务号大于999,则代表任务下发完成 * 1、下发完成 如果设备状态为 2-工作 ,触发方式 2-自动,任务号大于999,则代表任务下发完成
* *
* */ * */
if (czfs == 2 && sbzt == 2 && rwh > 999) { if (czfs == 2 && sbzt == 2 && rwh > 500) {
// finishSend(rwh, tsj); // finishSend(rwh, tsj);
} }
@@ -84,11 +92,16 @@ public class TsjThread implements Runnable {
* 2、四向车任务生成 2-工作 ,触发方式 2-自动,任务号大于999 * 2、四向车任务生成 2-工作 ,触发方式 2-自动,任务号大于999
* *
* */ * */
if (czfs == 2 && sbzt == 2 && jdbz == 4 && rwh > 999) { if (czfs == 2 && sbzt == 2 && jdbz == 4 && rwh > 500) {
createSRgvQueue(rwh, tsj); WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueService.selectWcsSrgvQueueByTaskNo(String.valueOf(rwh));
String agvId = wcsSrgvQueue.getAgvId();
DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(agvId);
if (deviceSrgv.getCurrSite().equals("09050" + tsj.getDqcs())) {
createSRgvQueue(rwh, tsj);
}
} }
// 提升机取货中 说明对齐当前要取货层 开始给小车下发 // 提升机取货中 说明对齐当前要取货层 开始给小车下发
if (czfs == 2 && sbzt == 2 && jdbz == 2 && rwh > 999) { if (czfs == 2 && sbzt == 2 && jdbz == 2 && rwh > 500) {
createSRgvQueueTsjQd(rwh, tsj); createSRgvQueueTsjQd(rwh, tsj);
} }
@@ -96,7 +109,7 @@ public class TsjThread implements Runnable {
* 2、任务完成 * 2、任务完成
* *
* */ * */
if (czfs == 2 && sbzt == 2 && jdbz == 5 && rwh > 999) { if (czfs == 2 && sbzt == 2 && jdbz == 5 && rwh > 500) {
//任务完成 //任务完成
finishTask(rwh, tsj); finishTask(rwh, tsj);
} }
@@ -117,8 +130,7 @@ public class TsjThread implements Runnable {
private void createSRgvQueueTsjQd(Long rwh, DeviceTsj tsj) { private void createSRgvQueueTsjQd(Long rwh, DeviceTsj tsj) {
for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) { for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) {
DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(sRgv); DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(sRgv);
if (deviceSrgv.getCurrSite().equals("09050" + deviceSrgv.getCurrFloor()) && deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() == 2 && tsj.getHczt() == 1) { if ((deviceSrgv.getCurrSite().equals("09050" + deviceSrgv.getCurrFloor()) || deviceSrgv.getCurrSite().equals("10050" + deviceSrgv.getCurrFloor())) && deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() == 1 && tsj.getHczt() == 1) {
SendData rwlxSendData = new SendData(Tools.INT, 1); SendData rwlxSendData = new SendData(Tools.INT, 1);
DeviceTsj deviceTsj = PlcTsjRead.deviceTsjMap.get(Convert.toStr(1)); DeviceTsj deviceTsj = PlcTsjRead.deviceTsjMap.get(Convert.toStr(1));
byte[] bytes = Tools.sendData(rwlxSendData); byte[] bytes = Tools.sendData(rwlxSendData);
@@ -147,11 +159,15 @@ public class TsjThread implements Runnable {
WcsSrgvQueue sRgvQueueParam = new WcsSrgvQueue(); WcsSrgvQueue sRgvQueueParam = new WcsSrgvQueue();
sRgvQueueParam.setTaskNo(Convert.toStr(rwh)); sRgvQueueParam.setTaskNo(Convert.toStr(rwh));
sRgvQueueParam.setEndSite(Convert.toStr("tsj")); sRgvQueueParam.setEndSite(Convert.toStr("tsj"));
sRgvQueueParam.setIssued("1");
sRgvQueueParam.setExecutionStatus("3");
List<WcsSrgvQueue> wcsSrgvQueues = wcsSrgvQueueService.selectWcsSrgvQueueList(sRgvQueueParam); List<WcsSrgvQueue> wcsSrgvQueues = wcsSrgvQueueService.selectWcsSrgvQueueList(sRgvQueueParam);
if (CollUtil.isEmpty(wcsSrgvQueues)) { if (CollUtil.isEmpty(wcsSrgvQueues)) {
return; return;
} }
WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueService.insertHistory(Convert.toStr(rwh)); WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueService.insertHistory(Convert.toStr(rwh));
String cargoPickSite = wcsSrgvQueue.getCargoPickSite();
String cargoPlaceSite = wcsSrgvQueue.getCargoPlaceSite();
//修改起点终点 //修改起点终点
if (ObjUtil.isNotEmpty(wcsSrgvQueue)) { if (ObjUtil.isNotEmpty(wcsSrgvQueue)) {
wcsSrgvQueue.setCreateDate(DateUtil.formatDateTime(DateUtil.date())); wcsSrgvQueue.setCreateDate(DateUtil.formatDateTime(DateUtil.date()));
@@ -175,7 +191,6 @@ public class TsjThread implements Runnable {
endSite = wcsSrgvQueue.getCargoPlaceSite(); endSite = wcsSrgvQueue.getCargoPlaceSite();
break; break;
case "3": case "3":
//充电
break; break;
case "4": case "4":
//点到点 //点到点
@@ -192,10 +207,52 @@ public class TsjThread implements Runnable {
log.info("任务类型错误"); log.info("任务类型错误");
} }
break; break;
case "8":
//换层任务直接变成点到点任务
switch (wcsSrgvQueue.getTaskType()) {
case "1":
WcsSrgvMap wcsSrgvMapq = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPickSite);
WcsSrgvMap wcsSrgvMapf = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPlaceSite);
if (wcsSrgvMapq != null && wcsSrgvMapf != null) {
Integer count = wcsSrgvQueueService.selectByEndSite();
List<DeviceSrgv> collect = PlcSrgvRead.deviceSrgvMap.values().stream().filter(d ->
d.getCurrSite().equals(cargoPickSite))
.collect(Collectors.toList());
if (count > 0 || !collect.isEmpty()) {
wcsSrgvQueue.setEndSite("070301");
} else {
wcsSrgvQueue.setEndSite(cargoPickSite);
}
wcsSrgvQueue.setDefault02("4");
wcsSrgvQueue.setTheFloor(wcsSrgvMapq.getTheLayer().toString());
wcsSrgvQueue.setDefault07(wcsSrgvMapf.getTheLayer().toString());
wcsSrgvQueue.setIssued("0");
wcsSrgvQueue.setExecutionStatus("1");
wcsSrgvQueue.setTaskType("1");
}
wcsSrgvQueue.setStartSite("09050" + tsj.getDqcs());
wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue);
break;
case "3":
WcsSrgvMap wcsSrgvMapq1 = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPickSite);
WcsSrgvMap wcsSrgvMapf1 = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPlaceSite);
if (wcsSrgvMapq1 != null && wcsSrgvMapf1 != null) {
wcsSrgvQueue.setEndSite(cargoPlaceSite);
wcsSrgvQueue.setDefault02("3");
wcsSrgvQueue.setTheFloor(wcsSrgvMapq1.getTheLayer().toString());
wcsSrgvQueue.setDefault07(wcsSrgvMapf1.getTheLayer().toString());
wcsSrgvQueue.setIssued("0");
wcsSrgvQueue.setExecutionStatus("1");
wcsSrgvQueue.setTaskType("3");
}
wcsSrgvQueue.setStartSite("09050" + tsj.getDqcs());
wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue);
break;
}
} }
if (StrUtil.isNotEmpty(startSite) && StrUtil.isNotEmpty(endSite)) { if (StrUtil.isNotEmpty(startSite) && StrUtil.isNotEmpty(endSite) && !wcsSrgvQueue.getDefault02().equals("8")) {
wcsSrgvQueue.setStartSite(startSite); wcsSrgvQueue.setStartSite(startSite);
wcsSrgvQueue.setEndSite(endSite); wcsSrgvQueue.setEndSite(endSite);
wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue); wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue);
@@ -209,7 +266,8 @@ public class TsjThread implements Runnable {
private void createQueue(DeviceTsj tsj) { private void createQueue(DeviceTsj tsj) {
for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) { for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) {
DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(sRgv); DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(sRgv);
if (deviceSrgv.getSpare2().equals("1") && deviceSrgv.getTaskNo() > 0) { Integer count = tsjDeviceExecutionQueueService.selectCount();
if (deviceSrgv.getSpare2().equals("1") && deviceSrgv.getTaskNo() > 0 && count == 0) {
//请求进入输送机 //请求进入输送机
WcsSrgvQueue sRgvQueueParam = new WcsSrgvQueue(); WcsSrgvQueue sRgvQueueParam = new WcsSrgvQueue();
sRgvQueueParam.setAgvId(Convert.toStr(deviceSrgv.getDeviceId())); sRgvQueueParam.setAgvId(Convert.toStr(deviceSrgv.getDeviceId()));

View File

@@ -80,7 +80,7 @@ public class GetDeviceSrgvMap {
AgvDto dto = new AgvDto(); AgvDto dto = new AgvDto();
dto.setId(d.getDeviceId() == null ? "" : String.format("%04d", d.getDeviceId())); dto.setId(d.getDeviceId() == null ? "" : String.format("%04d", d.getDeviceId()));
dto.setTaskNo(d.getTaskNo() == null ? "" : String.valueOf(d.getTaskNo())); dto.setTaskNo(d.getTaskNo() == null ? "" : String.valueOf(d.getTaskNo()));
dto.setIsThere((d.getWorkPhase() >= 3 && d.getWorkPhase() < 6 ? "1" : "0")); dto.setIsThere(d.getCargoFlag()==256?"1":"0");
Integer wp = d.getWorkPhase(); Integer wp = d.getWorkPhase();
String status = "0"; String status = "0";
if (wp != null) { if (wp != null) {
@@ -90,6 +90,9 @@ public class GetDeviceSrgvMap {
} }
dto.setStatus(status); dto.setStatus(status);
dto.setLocation(d.getCurrSite() == null ? "" : d.getCurrSite()); dto.setLocation(d.getCurrSite() == null ? "" : d.getCurrSite());
dto.setRow(d.getCurrSite() == null ? "" : d.getCurrSite().substring(2,4));
dto.setColumn(d.getCurrSite() == null ? "" :d.getCurrSite().substring(0,2));
dto.setLayer(d.getCurrSite() == null ? "" : d.getCurrSite().substring(4,6));
dto.setAlarm(d.getAlarm() == null ? "" : String.valueOf(d.getAlarm())); dto.setAlarm(d.getAlarm() == null ? "" : String.valueOf(d.getAlarm()));
dto.setAlarmMsg(DictUtils.getDictLabel("srgv_alarm", d.getAlarm() == null ? "" : String.valueOf(d.getAlarm()))); dto.setAlarmMsg(DictUtils.getDictLabel("srgv_alarm", d.getAlarm() == null ? "" : String.valueOf(d.getAlarm())));
if (d.getTaskNo() != null && d.getTaskNo() > 0) { if (d.getTaskNo() != null && d.getTaskNo() > 0) {
@@ -132,6 +135,9 @@ public class GetDeviceSrgvMap {
private String isThere; private String isThere;
private String status; private String status;
private String location; private String location;
private String row;
private String column;
private String layer;
private String alarm; private String alarm;
private String alarmMsg; private String alarmMsg;
private String trayCode; private String trayCode;

View File

@@ -99,8 +99,17 @@ public class GetDeviceSsjMap {
dto.setRotationDirection(calcRotationDirection(d.getTaskNo())); dto.setRotationDirection(calcRotationDirection(d.getTaskNo()));
dto.setAlarm(String.valueOf(d.getException())); dto.setAlarm(String.valueOf(d.getException()));
dto.setAlarmMsg(DictUtils.getDictLabel("ssj_ex", String.valueOf(d.getException()))); dto.setAlarmMsg(DictUtils.getDictLabel("ssj_ex", String.valueOf(d.getException())));
dto.setDW(String.valueOf(d.getDw()));
dto.setKX(String.valueOf(d.getKx())); dto.setKX(String.valueOf(d.getKx()));
if (!dto.getTaskNo().equals("0")){
if (dto.getKX().equals("0")){
dto.setDW("1");
}else {
dto.setDW("0");
}
}else {
dto.setDW("0");
}
if (d.getTaskNo() > 0) { if (d.getTaskNo() > 0) {
try { try {
MydoJob job = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(d.getTaskNo())); MydoJob job = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(d.getTaskNo()));
@@ -128,16 +137,10 @@ public class GetDeviceSsjMap {
*/ */
private String calcRotationDirection(int taskNo) { private String calcRotationDirection(int taskNo) {
try { try {
if (taskNo <= 0) return "0"; if (taskNo <= 0) {
MydoJob job = mydoJobService.selectMydoJobByTaskNo((long) taskNo);
if (job == null || job.getInOrOut() == null) return "0";
int val;
try {
val = Integer.parseInt(job.getInOrOut());
} catch (NumberFormatException e) {
return "0"; return "0";
} }
return val >= 20 ? "2" : "1"; return taskNo <= 50000 ? "1" : "2";
} catch (Exception e) { } catch (Exception e) {
return "0"; return "0";
} }

View File

@@ -80,7 +80,7 @@ public class GetDeviceTsjMap {
String code = entry.getKey(); String code = entry.getKey();
DeviceTsj d = entry.getValue(); DeviceTsj d = entry.getValue();
TsjDto dto = new TsjDto(); TsjDto dto = new TsjDto();
dto.setId(String.valueOf(d.getId())); dto.setId("TW001");
dto.setLayer(d.getDqcs() == null ? "" : String.valueOf(d.getDqcs())); dto.setLayer(d.getDqcs() == null ? "" : String.valueOf(d.getDqcs()));
dto.setTaskNo(d.getRwh() == null ? "" : String.valueOf(d.getRwh())); dto.setTaskNo(d.getRwh() == null ? "" : String.valueOf(d.getRwh()));
dto.setZxjd(d.getJdbz() == null ? "" : String.valueOf(d.getJdbz())); dto.setZxjd(d.getJdbz() == null ? "" : String.valueOf(d.getJdbz()));

View File

@@ -96,6 +96,7 @@ public class Wcs2wmsgetEmptyCargoSpace {
dto.setTrayCode(getText(node, "trayCode")); dto.setTrayCode(getText(node, "trayCode"));
dto.setProductCode(getText(node, "productCode")); dto.setProductCode(getText(node, "productCode"));
dto.setProductName(getText(node, "productName")); dto.setProductName(getText(node, "productName"));
dto.setCargoSpaceId(getText(node, "cargoSpaceId"));
return dto; return dto;
} }
@@ -125,5 +126,6 @@ public class Wcs2wmsgetEmptyCargoSpace {
private String trayCode; private String trayCode;
private String productCode; private String productCode;
private String productName; private String productName;
private String cargoSpaceId;
} }
} }

View File

@@ -6,9 +6,9 @@ spring:
druid: druid:
#主数据信息 #主数据信息
master: master:
url: jdbc:sqlserver://127.0.0.1:1433;databaseName=FT546-WCS; url: jdbc:sqlserver://127.0.0.1:1433;databaseName=FT546-wcs;
username: sa username: sa
password: 123456 password: Flrd0914.
# 从库数据源 # 从库数据源
slave: slave:
# 从数据源开关/默认关闭 # 从数据源开关/默认关闭

View File

@@ -34,7 +34,7 @@ server:
# 日志配置 # 日志配置
logging: logging:
level: level:
com.ruoyi: debug com.ruoyi: info
org.springframework: warn org.springframework: warn
# 用户配置 # 用户配置
@@ -64,7 +64,7 @@ spring:
devtools: devtools:
restart: restart:
# 热部署开关 # 热部署开关
enabled: true enabled: false
# redis 配置 # redis 配置
redis: redis:
# 地址 # 地址

View File

@@ -161,4 +161,29 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{guid} #{guid}
</foreach> </foreach>
</delete> </delete>
<select id="selectNotInsite" resultMap="WcsSrgvMapResult">
SELECT
*
FROM
wcs_srgv_map
WHERE
remark = #{cache}
AND plc_layer = #{floor}
<if test="sites != null and sites.size() > 0">
AND site_id NOT IN
<foreach collection="sites" item="site" separator="," open="(" close=")">
#{site}
</foreach>
</if>
<if test="sites == null or sites.size() == 0">
AND 1=1
</if>
</select>
</mapper> </mapper>

View File

@@ -62,6 +62,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where task_code = #{taskCode} where task_code = #{taskCode}
</select> </select>
<select id="selectAgvQueueByStatus" resultMap="AgvQueueResult">
select top(1)* from agv_queue
where status=0
</select>
<insert id="insertAgvQueue" parameterType="AgvQueue"> <insert id="insertAgvQueue" parameterType="AgvQueue">
insert into agv_queue insert into agv_queue
<trim prefix="(" suffix=")" suffixOverrides=","> <trim prefix="(" suffix=")" suffixOverrides=",">

View File

@@ -123,4 +123,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{id} #{id}
</foreach> </foreach>
</delete> </delete>
<update id="updateDeviceCdzSpare" parameterType="DeviceCdz">
update device_cdz set spare1=null where id=#{id}
</update>
</mapper> </mapper>

View File

@@ -25,13 +25,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="theFloor" column="the_floor" /> <result property="theFloor" column="the_floor" />
<result property="productId" column="product_id" /> <result property="productId" column="product_id" />
<result property="productName" column="product_name" /> <result property="productName" column="product_name" />
<result property="trayCode" column="tray_code" />
</resultMap> </resultMap>
<sql id="selectMydoJobVo"> <sql id="selectMydoJobVo">
select job_id, status, task_no, roadway_id, cargo_space_id, target_roadway_id, target_cargo_space_id, priority, execution_phase, in_or_out, create_time, start_time, finish_time, entrance_id, exit_id, warehouse_id, fault_flag,the_floor,product_id,product_name from mydo_job_wcs select job_id, status, task_no, roadway_id, cargo_space_id, target_roadway_id, target_cargo_space_id, priority, execution_phase, in_or_out, create_time, start_time, finish_time, entrance_id, exit_id, warehouse_id, fault_flag,the_floor,product_id,product_name,tray_code from mydo_job_wcs
</sql> </sql>
<sql id="selectMydoJobFinishVo"> <sql id="selectMydoJobFinishVo">
select job_id, status, task_no, roadway_id, cargo_space_id, target_roadway_id, target_cargo_space_id, priority, execution_phase, in_or_out, create_time, start_time, finish_time, entrance_id, exit_id, warehouse_id, fault_flag,the_floor from mydo_job_wcs_finish select job_id, status, task_no, roadway_id, cargo_space_id, target_roadway_id, target_cargo_space_id, priority, execution_phase, in_or_out, create_time, start_time, finish_time, entrance_id, exit_id, warehouse_id, fault_flag,the_floor,product_id,product_name,tray_code from mydo_job_wcs_finish
</sql> </sql>
<select id="selectMydoJobList" parameterType="MydoJob" resultMap="MydoJobResult"> <select id="selectMydoJobList" parameterType="MydoJob" resultMap="MydoJobResult">
@@ -55,6 +56,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="theFloor != null and theFloor != ''"> and the_floor = #{theFloor}</if> <if test="theFloor != null and theFloor != ''"> and the_floor = #{theFloor}</if>
<if test="productId != null and productId != ''"> and product_id = #{productId}</if> <if test="productId != null and productId != ''"> and product_id = #{productId}</if>
<if test="productName != null and productName != ''"> and product_name = #{productName}</if> <if test="productName != null and productName != ''"> and product_name = #{productName}</if>
<if test="trayCode != null and trayCode != ''"> and tray_code = #{trayCode}</if>
</where> </where>
</select> </select>
@@ -118,6 +120,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="warehouseId != null">warehouse_id,</if> <if test="warehouseId != null">warehouse_id,</if>
<if test="faultFlag != null">fault_flag,</if> <if test="faultFlag != null">fault_flag,</if>
<if test="theFloor != null">the_floor,</if> <if test="theFloor != null">the_floor,</if>
<if test="trayCode != null">tray_code,</if>
</trim> </trim>
<trim prefix="values (" suffix=")" suffixOverrides=","> <trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="jobId != null">#{jobId},</if> <if test="jobId != null">#{jobId},</if>
@@ -138,6 +141,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="warehouseId != null">#{warehouseId},</if> <if test="warehouseId != null">#{warehouseId},</if>
<if test="faultFlag != null">#{faultFlag},</if> <if test="faultFlag != null">#{faultFlag},</if>
<if test="theFloor != null">#{theFloor},</if> <if test="theFloor != null">#{theFloor},</if>
<if test="trayCode != null">#{trayCode},</if>
</trim> </trim>
</insert> </insert>
<insert id="insertHistory"> <insert id="insertHistory">
@@ -244,4 +248,67 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
and status = 3 and status = 3
order by priority desc,create_time order by priority desc,create_time
</select> </select>
<select id="selectMydoJobOut" resultMap="MydoJobResult">
WITH floor_group AS (
SELECT
b.cargo_space_id,
b.group_coding_no,
b.the_floor,
b.group_coding,
a.task_no AS task_no,
a.job_id AS job_id,
a.in_or_out, -- 之前新增的字段
a.target_cargo_space_id, -- 新增字段:加入target_cargo_space_id
ROW_NUMBER() OVER (PARTITION BY b.the_floor ORDER BY b.group_coding DESC) AS rn
FROM
mydo_job_wcs a
INNER JOIN bas_cargo_space b
ON a.cargo_space_id = b.cargo_space_id
AND a.the_floor = b.the_floor
WHERE
a.in_or_out >= 20
AND a.status = '1'
GROUP BY
b.group_coding_no,
b.cargo_space_id,
b.the_floor,
b.group_coding,
a.task_no,
a.job_id,
a.create_time,
a.in_or_out, -- 之前新增的分组字段
a.target_cargo_space_id -- 分组字段中新增:必须加入GROUP BY
)
SELECT
cargo_space_id,
group_coding_no,
the_floor,
task_no,
job_id,
in_or_out, -- 之前新增的展示字段
target_cargo_space_id -- 最终查询结果中显示该字段
FROM
floor_group
WHERE
rn &lt;= 1
ORDER BY
group_coding DESC;
</select>
<select id="selectMydoJobByTrayCode" resultMap="MydoJobResult">
<include refid="selectMydoJobVo"/>
where tray_code =#{trayCode}
</select>
<select id="selectExit" parameterType="string" resultType="java.lang.Integer">
select count(1) from mydo_job_wcs where in_or_out>=20 and exit_id = #{exitId}
</select>
<select id="selectMydoJobCount" resultType="java.lang.Integer">
select count(1) from mydo_job_wcs
</select>
</mapper> </mapper>

View File

@@ -121,6 +121,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</trim> </trim>
</insert> </insert>
<select id="selectCount" resultType="java.lang.Integer">
select count(1)
from tsj_device_execution_queue
</select>
<update id="updateTsjDeviceExecutionQueue" parameterType="TsjDeviceExecutionQueue"> <update id="updateTsjDeviceExecutionQueue" parameterType="TsjDeviceExecutionQueue">
update tsj_device_execution_queue update tsj_device_execution_queue
<trim prefix="SET" suffixOverrides=","> <trim prefix="SET" suffixOverrides=",">

View File

@@ -85,7 +85,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectWcsSrgvQueueByFloor" parameterType="String" resultMap="WcsSrgvQueueResult"> <select id="selectWcsSrgvQueueByFloor" parameterType="String" resultMap="WcsSrgvQueueResult">
<include refid="selectWcsSrgvQueueVo"/> <include refid="selectWcsSrgvQueueVo"/>
where default07 =#{theFloor} where default07 =#{theFloor} and default07 !='1'
</select> </select>
<insert id="insertWcsSrgvQueue" parameterType="WcsSrgvQueue"> <insert id="insertWcsSrgvQueue" parameterType="WcsSrgvQueue">
@@ -192,4 +192,40 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</foreach> </foreach>
</delete> </delete>
<select id="selectMinCountJob" parameterType="list" resultType="string">
<choose>
<when test="list == null or list.size() == 0">
SELECT '' AS result_site
</when>
<otherwise>
select top(1) site_id from
(select '050101' as site_id,isnull(count(1),0) as num from wcs_srgv_queue where cargo_place_site ='050101'
union
select '070101' as site_id,isnull(count(1),0) as num from wcs_srgv_queue where cargo_place_site ='070101')r
where r.site_id in
<foreach collection="list" item="site" open="(" separator="," close=")">
#{site}
</foreach>
order by num
</otherwise>
</choose>
</select>
<select id="selectTsj" resultType="java.lang.Integer" >
select count(1) from wcs_srgv_queue where end_site='tsj'
</select>
<select id="selectByCaogoPlaceSite" resultType="java.lang.Integer" parameterType="string">
select count(1) from wcs_srgv_queue where cargo_place_site=#{siteId}
</select>
<select id="selectByEndSite" resultType="java.lang.Integer" >
select count(1) from wcs_srgv_queue where end_site='070101' or end_site ='050101'
</select>
</mapper> </mapper>

View File

@@ -119,6 +119,7 @@ public class SecurityConfig
.antMatchers("/agv/api/**").permitAll() .antMatchers("/agv/api/**").permitAll()
.antMatchers("/device/api/**").permitAll() .antMatchers("/device/api/**").permitAll()
.antMatchers("/wcs2Wms/api/**").permitAll() .antMatchers("/wcs2Wms/api/**").permitAll()
.antMatchers("/agv/api/**").permitAll()
.antMatchers("/test/**").permitAll() .antMatchers("/test/**").permitAll()
.antMatchers("/largeScreen/monitor/**").permitAll() .antMatchers("/largeScreen/monitor/**").permitAll()
// 除上面外的所有请求全部需要鉴权认证 // 除上面外的所有请求全部需要鉴权认证

View File

@@ -157,7 +157,6 @@ export default {
{ key: 'kx', label: '空闲', value: d.kx, dict: 'ssj_kx' }, { key: 'kx', label: '空闲', value: d.kx, dict: 'ssj_kx' },
{ key: 'dw', label: '到位', value: d.dw, dict: 'ssj_dw' }, { key: 'dw', label: '到位', value: d.dw, dict: 'ssj_dw' },
{ key: 'exception', label: '异常', value: d.exception, dict: 'ssj_ex'}, { key: 'exception', label: '异常', value: d.exception, dict: 'ssj_ex'},
] ]
} }
if (dev.kind === 'srgv') { if (dev.kind === 'srgv') {

View File

@@ -9,7 +9,7 @@ const CompressionPlugin = require('compression-webpack-plugin')
const name = process.env.VUE_APP_TITLE || 'FORTUCKY WCS SYSTEM' // 网页标题 const name = process.env.VUE_APP_TITLE || 'FORTUCKY WCS SYSTEM' // 网页标题
const baseUrl = 'http://localhost:8081' // 后端接口地址(你的后端端口是8081) const baseUrl = 'http://192.168.188.236:8081' // 后端接口地址(你的后端端口是8081)
const port = process.env.port || process.env.npm_config_port || 80 // 前端端口 const port = process.env.port || process.env.npm_config_port || 80 // 前端端口