10 Commits

Author SHA1 Message Date
1009473166@qq.com
d98fe2a30c 2026.3.19 晚
新增出库到位自动过账
2026-03-19 18:44:54 +08:00
1009473166@qq.com
af308d7dc9 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	ruoyi-admin/src/main/java/com/ruoyi/api/controller/AgvController.java
2026-03-19 18:20:39 +08:00
张怡蓉
ad9f8d87fd 小车 2026-03-19 15:08:50 +08:00
1009473166@qq.com
fa9386773f 2026.3.18 晚
新增agv获取输送机接口
2026-03-18 20:29:00 +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
45 changed files with 767 additions and 1938 deletions

View File

@@ -37,7 +37,7 @@
<spring-framework.version>5.3.39</spring-framework.version> <spring-framework.version>5.3.39</spring-framework.version>
<hutool.version>5.8.27</hutool.version> <hutool.version>5.8.27</hutool.version>
<lombok.version>1.18.30</lombok.version> <lombok.version>1.18.30</lombok.version>
<HslCommunication.version>2.0.0</HslCommunication.version> <HslCommunication.version>3.7.0</HslCommunication.version>
<mybatis-plus.version>3.5.2</mybatis-plus.version> <mybatis-plus.version>3.5.2</mybatis-plus.version>
</properties> </properties>

View File

@@ -1,21 +0,0 @@
package com.ruoyi;
import com.ruoyi.schedule.ScheduleThread;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class MyStartupRunner implements CommandLineRunner {
@Autowired
private ScheduleThread scheduleThread;
@Override
public void run(String... args) throws Exception {
// 这里编写项目启动后要执行的方法逻辑
//System.out.println("项目启动成功后自动执行此方法");
// scheduleThread.startAllThread();
// scheduleThread.startAllThread2();
}
}

View File

@@ -1,43 +1,31 @@
package com.ruoyi.api.controller; package com.ruoyi.api.controller;
import cn.hutool.json.JSONObject;
import com.mchange.v2.lang.ObjectUtils;
import com.ruoyi.api.domain.agv.agvCallback.AgvCallbackRequest; import com.ruoyi.api.domain.agv.agvCallback.AgvCallbackRequest;
import com.ruoyi.api.domain.agv.agvCallback.AgvCallbackResponse; import com.ruoyi.api.domain.agv.agvCallback.AgvCallbackResponse;
import com.ruoyi.api.service.IApiService; import com.ruoyi.api.service.IApiService;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.queue.agv.service.impl.AgvQueueServiceImpl;
import com.ruoyi.system.domain.AgvContainerTask;
import com.ruoyi.system.mapper.AgvContainerTaskMapper;
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.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
* Agv操作请求 * Agv操作请求
*/ */
@RestController @RestController
@RequestMapping("/api/agv") @RequestMapping("/agv/api")
@Slf4j @Slf4j
public class AgvController extends BaseController { public class AgvController extends BaseController {
@Autowired @Autowired
private IApiService apiService; private IApiService apiService;
@Autowired
private AgvQueueServiceImpl agvQueueService;
@Autowired
private AgvContainerTaskMapper agvContainerTaskMapper;
/** /**
* agv执行状态返回接口 * agv执行状态返回接口
*
* @param request * @param request
* @return * @return
*/ */
@@ -47,112 +35,25 @@ public class AgvController extends BaseController {
} }
/** /**
* agv搬运作业 * agv搬运作业
* * @param param{
* @param param{ startPoint:起始点 * startPoint:起始点
* endPoint:结束点 * endPoint:结束点
* containerCode:容器编号 * containerCode:容器编号
* taskNo:任务号 * taskNo:任务号
* } * }
* @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(){
* 获取AGV任务定时器 apiService.sendAgvTask();
*/
@Scheduled(fixedDelay = 5000)
public void queryAgvMoveJob() {
apiService.sendContarTask();
}
@Scheduled(fixedDelay = 5000)
public void finishAgvMoveJob() {
AgvContainerTask agvContainerTask= agvContainerTaskMapper.selectAgvContainerFinishOne();
if (agvContainerTask!=null){
apiService.finishAgvJob(agvContainerTask.getContainer());
}
}
/**任务下发
*
*/
@Scheduled(fixedDelay = 1000)
public void sendAgvMoveJob() {
AgvContainerTask agvContainerTask = new AgvContainerTask();
agvContainerTask.setStatus("0");
List<AgvContainerTask> agvContainerTasks = agvContainerTaskMapper.selectAgvContainerTaskList(agvContainerTask);
if (agvContainerTasks.size() > 0) {
AgvContainerTask agvContainerTask1 = agvContainerTasks.get(0);
Map<String, String> param = new HashMap<>();
param.put("FromStation", agvContainerTask1.getStartPoint());
param.put("ToStation", agvContainerTask1.getEndPoint());
param.put("Type", agvContainerTask1.getSpare1());
param.put("OrderId", agvContainerTask1.getContainer());
// param.put("TaskGuideId", agvContainerTask1.getTaskNo());
AjaxResult ajaxResult = apiService.sendAgvCar(param);
Integer code = (Integer) ajaxResult.get("code");
if (200 == code) {
agvContainerTask1.setStatus("1");
agvContainerTaskMapper.updateAgvContainerTask(agvContainerTask1);
}
}
}
/***
* 请求取货放货接口
* @param jsonObject
* @return
*/
@RequestMapping("/checkAllow")
public AjaxResult checkAllow(@RequestBody JSONObject jsonObject) {
// 取放货站点
String requestStation = String.valueOf(jsonObject.get("requestStation"));
// 表内主键
String orderId = String.valueOf(jsonObject.get("orderId"));
String Type = String.valueOf(jsonObject.get("type"));
HashMap<String, Object> map = new HashMap<>();
map.put("v_position", requestStation);
map.put("v_orderId", orderId);
map.put("v_type", Type);
agvQueueService.selectKx(map);
Integer vResult = (Integer) map.get("v_result");
if (vResult == 1) {
return new AjaxResult(1, Type.equals("1") ? "允许取货" : "允许放货");
} else {
return new AjaxResult(0, Type.equals("1") ? "不允许取货,请等待" : "不允许放货,请等待");
}
}
/**
* 取货放货完成返回接口
*
* @param jsonObject
* @return
*/
@RequestMapping("/completionSignal")
public AjaxResult completionSignal(@RequestBody JSONObject jsonObject) {
String orderId = String.valueOf(jsonObject.get("orderId"));
String Type = String.valueOf(jsonObject.get("type"));
agvContainerTaskMapper.updateAgvContainerTaskByOrder(orderId);
// agvContainerTaskMapper.insertAgvContainerTaskFinish(orderId);
// agvContainerTaskMapper.deleteAgvContainerTaskByContainer(orderId);
return new AjaxResult(1, "返回成功");
} }

View File

@@ -1,12 +1,10 @@
package com.ruoyi.api.controller; package com.ruoyi.api.controller;
import cn.hutool.json.JSONObject;
import com.ruoyi.api.domain.wcs2wms.JobParam; import com.ruoyi.api.domain.wcs2wms.JobParam;
import com.ruoyi.api.domain.wcs2wms.ReceiveJob; import com.ruoyi.api.domain.wcs2wms.ReceiveJob;
import com.ruoyi.api.service.IApiService; import com.ruoyi.api.service.IApiService;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
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.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
@@ -55,5 +53,4 @@ public class Wcs2WmsController {
} }

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

@@ -12,6 +12,7 @@ import com.ruoyi.api.domain.agv.genAgvSchedulingTask.GenAgvSchedulingTaskRespons
import com.ruoyi.api.domain.wcs2wms.JobParam; import com.ruoyi.api.domain.wcs2wms.JobParam;
import com.ruoyi.api.domain.wcs2wms.ReceiveJob; import com.ruoyi.api.domain.wcs2wms.ReceiveJob;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.device.ssj.domain.DeviceSsj;
import com.ruoyi.job.domain.MydoJob; import com.ruoyi.job.domain.MydoJob;
import com.ruoyi.queue.agv.domain.AgvQueue; import com.ruoyi.queue.agv.domain.AgvQueue;
@@ -34,11 +35,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 +77,9 @@ public interface IApiService
* @param param * @param param
* @return * @return
*/ */
AjaxResult receiveAgvMoveJob(Map<String, String> param); int receiveAgvMoveJob(Map<String, String> param);
void sendAgvTask();
/** /**
* 任务到达拣选口 * 任务到达拣选口
@@ -137,17 +140,9 @@ public interface IApiService
AjaxResult JobFinish(Map<String, Object> param); AjaxResult JobFinish(Map<String, Object> param);
DeviceSsj getDeviceMsg(String taskNo);
DeviceSsj getDeviceMsgSsj(String entranceId);
AjaxResult OutMakeSure(HashMap<String, Object> map); AjaxResult OutMakeSure(HashMap<String, Object> map);
void updateLed(HashMap<String, Object> objectObjectHashMap);
void updateLedError(HashMap<String, Object> objectObjectHashMap);
void sendContarTask();
AjaxResult sendAgvCar(Map<String, String> param);
AjaxResult insertAgvQuene(HashMap<String, Object> objectObjectHashMap);
void finishAgvJob(String container);
} }

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
@@ -75,6 +77,4 @@ public interface IRequestLogService
* @return * @return
*/ */
public RequestLog getRequestLog(String url, String param); public RequestLog getRequestLog(String url, String param);
public RequestLog getRequestLogs(String url, String param, String endPoint);
} }

View File

@@ -20,12 +20,12 @@ import com.ruoyi.api.domain.wcs2wms.ReceiveJob;
import com.ruoyi.api.service.IApiService; import com.ruoyi.api.service.IApiService;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.device.ssj.domain.DeviceSsj;
import com.ruoyi.device.ssj.service.IDeviceSsjService;
import com.ruoyi.job.domain.MydoJob; import com.ruoyi.job.domain.MydoJob;
import com.ruoyi.job.service.IMydoJobService; import com.ruoyi.job.service.IMydoJobService;
import com.ruoyi.queue.agv.domain.AgvQueue; import com.ruoyi.queue.agv.domain.AgvQueue;
import com.ruoyi.queue.agv.service.IAgvQueueService; import com.ruoyi.queue.agv.service.IAgvQueueService;
import com.ruoyi.system.domain.AgvContainerTask;
import com.ruoyi.system.service.IAgvContainerTaskService;
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.stereotype.Service; import org.springframework.stereotype.Service;
@@ -54,7 +54,8 @@ public class ApiServiceImpl implements IApiService {
@Autowired @Autowired
private IMydoJobService mydoJobService; private IMydoJobService mydoJobService;
@Autowired @Autowired
private IAgvContainerTaskService agvContainerTaskService; private IDeviceSsjService deviceSsjService;
/** /**
@@ -65,17 +66,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;
} }
} }
@@ -114,18 +120,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());
} }
@@ -141,6 +168,10 @@ public class ApiServiceImpl implements IApiService {
} }
/** /**
* 处理agv状态返回 * 处理agv状态返回
* *
@@ -195,24 +226,26 @@ public class ApiServiceImpl implements IApiService {
public AjaxResult cancelMydoJob(JobParam jobParam) { public AjaxResult cancelMydoJob(JobParam jobParam) {
MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(Convert.toLong(jobParam.getTaskNo())); MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(Convert.toLong(jobParam.getTaskNo()));
if (mydoJob == null) { if(mydoJob==null){
return AjaxResult.error("任务不存在"); return AjaxResult.error("任务不存在");
} }
if ("1".equals(mydoJob.getStatus())) { if("1".equals(mydoJob.getStatus())){
mydoJob.setStatus("5"); mydoJob.setStatus("5");
mydoJobService.insertHistory(mydoJob.getJobId()); mydoJobService.insertHistory(mydoJob.getJobId());
mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId()); mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId());
return AjaxResult.success(); return AjaxResult.success();
} else { }else{
return AjaxResult.error("任务已开始"); return AjaxResult.error("任务已开始");
} }
} }
@Override @Override
public AjaxResult reAssign(JobParam jobParam) { public AjaxResult reAssign(JobParam jobParam) {
RequestLog requestLog = requestLogService.getRequestLog(RE_ASSIGN_URL, "重新分配货位", JSONUtil.toJsonStr(jobParam)); RequestLog requestLog = requestLogService.getRequestLog(RE_ASSIGN_URL, "重新分配货位", JSONUtil.toJsonStr(jobParam));
if ("1".equals(requestLog.getIsSuccessful())) { if ("1".equals(requestLog.getIsSuccessful())){
InterfaceReceive bean = JSONUtil.toBean(requestLog.getResponseBody(), InterfaceReceive.class); InterfaceReceive bean = JSONUtil.toBean(requestLog.getResponseBody(), InterfaceReceive.class);
MydoJob wmsMydoJob = BeanUtil.toBean(bean.getData(), MydoJob.class); MydoJob wmsMydoJob = BeanUtil.toBean(bean.getData(), MydoJob.class);
MydoJob mydoJob = mydoJobService.selectMydoJobByJobId(wmsMydoJob.getJobId()); MydoJob mydoJob = mydoJobService.selectMydoJobByJobId(wmsMydoJob.getJobId());
@@ -226,7 +259,7 @@ public class ApiServiceImpl implements IApiService {
@Override @Override
public AjaxResult reMaterial(JobParam jobParam) { public AjaxResult reMaterial(JobParam jobParam) {
RequestLog requestLog = requestLogService.getRequestLog(RE_MATERIAL_URL, "重新分配物料", JSONUtil.toJsonStr(jobParam)); RequestLog requestLog = requestLogService.getRequestLog(RE_MATERIAL_URL, "重新分配物料", JSONUtil.toJsonStr(jobParam));
if ("1".equals(requestLog.getIsSuccessful())) { if ("1".equals(requestLog.getIsSuccessful())){
return AjaxResult.success(); return AjaxResult.success();
} }
return AjaxResult.error(); return AjaxResult.error();
@@ -239,12 +272,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();
@@ -254,20 +287,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;
} }
/** /**
@@ -314,20 +348,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);
} }
@@ -357,6 +386,7 @@ public class ApiServiceImpl implements IApiService {
} }
@Override @Override
public AjaxResult receiveOutMydoJob(ReceiveJob receiveOutJob) { public AjaxResult receiveOutMydoJob(ReceiveJob receiveOutJob) {
MydoJob mydoJob = new MydoJob(); MydoJob mydoJob = new MydoJob();
@@ -376,7 +406,7 @@ public class ApiServiceImpl implements IApiService {
int i = mydoJobService.insertMydoJob(mydoJob); int i = mydoJobService.insertMydoJob(mydoJob);
if (i > 0) { if (i > 0) {
return AjaxResult.success(); return AjaxResult.success();
} else { }else{
return AjaxResult.error(); return AjaxResult.error();
} }
@@ -398,7 +428,7 @@ public class ApiServiceImpl implements IApiService {
int i = mydoJobService.insertMydoJob(mydoJob); int i = mydoJobService.insertMydoJob(mydoJob);
if (i > 0) { if (i > 0) {
return AjaxResult.success(); return AjaxResult.success();
} else { }else{
return AjaxResult.error(); return AjaxResult.error();
} }
} }
@@ -445,8 +475,25 @@ public class ApiServiceImpl implements IApiService {
} }
@Override @Override
public AjaxResult OutMakeSure(HashMap<String, Object> map) { public DeviceSsj getDeviceMsg(String taskNo) {
RequestLog requestLog = requestLogService.getRequestLog(OUT_MAKE_SURE, "线边直出请求过账", JSONUtil.toJsonStr(map)); MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(taskNo));
DeviceSsj ssj = new DeviceSsj();
ssj.setDeviceCode(mydoJob.getEntranceId());
List<DeviceSsj> deviceSsjs = deviceSsjService.selectDeviceSsjList(ssj);
return deviceSsjs.get(0);
}
@Override
public DeviceSsj getDeviceMsgSsj(String entranceId) {
DeviceSsj ssj = new DeviceSsj();
ssj.setDeviceCode(entranceId);
List<DeviceSsj> deviceSsjs = deviceSsjService.selectDeviceSsjList(ssj);
return deviceSsjs.get(0);
}
@Override
public AjaxResult OutMakeSure(HashMap<String, Object> param) {
RequestLog requestLog = requestLogService.getRequestLog(OUT_MAKE_SURE, "线边直出请求过账", JSONUtil.toJsonStr(param));
if ("1".equals(requestLog.getIsSuccessful())) { if ("1".equals(requestLog.getIsSuccessful())) {
InterfaceReceive bean = JSONUtil.toBean(requestLog.getResponseBody(), InterfaceReceive.class); InterfaceReceive bean = JSONUtil.toBean(requestLog.getResponseBody(), InterfaceReceive.class);
return AjaxResult.success(bean.getData()); return AjaxResult.success(bean.getData());
@@ -454,63 +501,4 @@ public class ApiServiceImpl implements IApiService {
return AjaxResult.error(); return AjaxResult.error();
} }
} }
@Override
public void updateLed(HashMap<String, Object> map) {
RequestLog requestLog = requestLogService.getRequestLog(UPDATE_LED, "出库到位更新LED", JSONUtil.toJsonStr(map));
}
@Override
public void updateLedError(HashMap<String, Object> map) {
RequestLog requestLog = requestLogService.getRequestLog(UPDATE_LED_ERROR, "更新线体报错信息", JSONUtil.toJsonStr(map));
}
@Override
public void sendContarTask() {
RequestLog requestLog = requestLogService.getRequestLog(QUERY_AGV_QUENE, "请求获取AGV执行队列", JSONUtil.toJsonStr(""));
if ("1".equals(requestLog.getIsSuccessful())) {
InterfaceReceive bean = JSONUtil.toBean(requestLog.getResponseBody(), InterfaceReceive.class);
AgvContainerTask bean1 = BeanUtil.toBean(bean.getData(), AgvContainerTask.class);
bean1.setStatus("0");
agvContainerTaskService.insertAgvContainerTask(bean1);
}
}
@Override
public AjaxResult sendAgvCar(Map<String, String> param) {
RequestLog requestLog = requestLogService.getRequestLogs(SEND_AGV_CAR, "下发AGV执行对列", JSONUtil.toJsonStr(param));
if ("1".equals(requestLog.getIsSuccessful())) {
return AjaxResult.success();
}
{
return AjaxResult.error();
}
}
@Override
public AjaxResult insertAgvQuene(HashMap<String, Object> param) {
RequestLog requestLog = requestLogService.getRequestLog(INSERT_AGV_QUENE, "请求自动生成AGV执行队列", JSONUtil.toJsonStr(param));
if ("1".equals(requestLog.getIsSuccessful())) {
return AjaxResult.success();
}
{
return AjaxResult.error();
}
}
@Override
public void finishAgvJob(String container) {
HashMap<Object, Object> objectObjectHashMap = new HashMap<>();
objectObjectHashMap.put("order", container);
RequestLog requestLog = requestLogService.getRequestLog(FINISH_AGV_QUENE, "完成AGV执行队列", JSONUtil.toJsonStr(objectObjectHashMap));
if ("1".equals(requestLog.getIsSuccessful())) {
agvContainerTaskService.deleteAgvContainerTaskByOrderId(container);
}
}
} }

View File

@@ -6,7 +6,7 @@ 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.ContentType; import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse; 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;
@@ -26,7 +26,8 @@ import com.ruoyi.api.service.IRequestLogService;
*/ */
@Service @Service
@Slf4j @Slf4j
public class RequestLogServiceImpl implements IRequestLogService { public class RequestLogServiceImpl implements IRequestLogService
{
@Autowired @Autowired
private RequestLogMapper requestLogMapper; private RequestLogMapper requestLogMapper;
@@ -37,7 +38,8 @@ public class RequestLogServiceImpl implements IRequestLogService {
* @return 接口记录 * @return 接口记录
*/ */
@Override @Override
public RequestLog selectRequestLogByRequestId(Long requestId) { public RequestLog selectRequestLogByRequestId(Long requestId)
{
return requestLogMapper.selectRequestLogByRequestId(requestId); return requestLogMapper.selectRequestLogByRequestId(requestId);
} }
@@ -48,7 +50,8 @@ public class RequestLogServiceImpl implements IRequestLogService {
* @return 接口记录 * @return 接口记录
*/ */
@Override @Override
public List<RequestLog> selectRequestLogList(RequestLog requestLog) { public List<RequestLog> selectRequestLogList(RequestLog requestLog)
{
return requestLogMapper.selectRequestLogList(requestLog); return requestLogMapper.selectRequestLogList(requestLog);
} }
@@ -59,10 +62,11 @@ public class RequestLogServiceImpl implements IRequestLogService {
* @return 结果 * @return 结果
*/ */
@Override @Override
public int insertRequestLog(RequestLog requestLog) { public int insertRequestLog(RequestLog requestLog)
if ("1".equals(requestLog.getIsSuccessful())) { {
if ("1".equals(requestLog.getIsSuccessful())){
return requestLogMapper.insertRequestLog(requestLog); return requestLogMapper.insertRequestLog(requestLog);
} else { }else {
//log.error("请求失败:" + requestLog.getErrorDetails()); //log.error("请求失败:" + requestLog.getErrorDetails());
return 0; return 0;
} }
@@ -75,7 +79,8 @@ public class RequestLogServiceImpl implements IRequestLogService {
* @return 结果 * @return 结果
*/ */
@Override @Override
public int updateRequestLog(RequestLog requestLog) { public int updateRequestLog(RequestLog requestLog)
{
return requestLogMapper.updateRequestLog(requestLog); return requestLogMapper.updateRequestLog(requestLog);
} }
@@ -86,7 +91,8 @@ public class RequestLogServiceImpl implements IRequestLogService {
* @return 结果 * @return 结果
*/ */
@Override @Override
public int deleteRequestLogByRequestIds(Long[] requestIds) { public int deleteRequestLogByRequestIds(Long[] requestIds)
{
return requestLogMapper.deleteRequestLogByRequestIds(requestIds); return requestLogMapper.deleteRequestLogByRequestIds(requestIds);
} }
@@ -97,7 +103,8 @@ public class RequestLogServiceImpl implements IRequestLogService {
* @return 结果 * @return 结果
*/ */
@Override @Override
public int deleteRequestLogByRequestId(Long requestId) { public int deleteRequestLogByRequestId(Long requestId)
{
return requestLogMapper.deleteRequestLogByRequestId(requestId); return requestLogMapper.deleteRequestLogByRequestId(requestId);
} }
@@ -110,7 +117,7 @@ public class RequestLogServiceImpl implements IRequestLogService {
* @return requestLog * @return requestLog
*/ */
@Override @Override
public RequestLog getRequestLog(String url, String endPoint, String param) { public RequestLog getRequestLog(String url, String endPoint,String param) {
RequestLog requestLog = new RequestLog(); RequestLog requestLog = new RequestLog();
Date requestTime = new Date(); Date requestTime = new Date();
requestLog.setRequestTime(DateUtil.format(requestTime, "yyyy-MM-dd HH:mm:ss")); requestLog.setRequestTime(DateUtil.format(requestTime, "yyyy-MM-dd HH:mm:ss"));
@@ -123,17 +130,16 @@ public class RequestLogServiceImpl implements IRequestLogService {
requestLog.setRequestUrl(url); requestLog.setRequestUrl(url);
try { try {
String resStr = HttpUtil.post(url, param); String resStr = HttpUtil.post(url, param);
requestLog.setResponseBody(resStr); requestLog.setResponseBody(resStr);
InterfaceReceive bean = JSONUtil.toBean(resStr, InterfaceReceive.class); InterfaceReceive bean = JSONUtil.toBean(resStr, InterfaceReceive.class);
Date responseTime = new Date(); Date responseTime =new Date();
if (bean.getCode() == 200) { if (bean.getCode() == 200) {
requestLog.setResponseTime(DateUtil.format(responseTime, "yyyy-MM-dd HH:mm:ss")); requestLog.setResponseTime(DateUtil.format(responseTime, "yyyy-MM-dd HH:mm:ss"));
requestLog.setResponseStatus("1"); requestLog.setResponseStatus("1");
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");
@@ -149,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;
}
/** /**
* 插入请求日志 * 插入请求日志
* *
@@ -168,46 +224,4 @@ public class RequestLogServiceImpl implements IRequestLogService {
requestLog.setDuration(Convert.toStr(DateUtil.between(requestTime, requestTime, DateUnit.MS))); requestLog.setDuration(Convert.toStr(DateUtil.between(requestTime, requestTime, DateUnit.MS)));
return requestLog; return requestLog;
} }
@Override
public RequestLog getRequestLogs(String url, String param, String endPoint) {
RequestLog requestLog = new RequestLog();
Date requestTime = new Date();
requestLog.setRequestTime(DateUtil.format(requestTime, "yyyy-MM-dd HH:mm:ss"));
requestLog.setSourceSystem("wcs");
requestLog.setTargetSystem("wms");
requestLog.setEndpoint(param);
requestLog.setRequestMethod("post");
requestLog.setRequestHeaders(null);
requestLog.setRequestBody(endPoint);
requestLog.setRequestUrl(url);
try {
// 链式创建POST请求,获取完整响应对象
HttpResponse response = HttpUtil.createPost(url)
.body(endPoint, "application/json") // 传入表单参数
.execute();
String body = response.body();
int status = response.getStatus();
InterfaceReceive bean = JSONUtil.toBean(body, InterfaceReceive.class);
Date responseTime = new Date();
if (status == 200) {
requestLog.setResponseTime(DateUtil.format(responseTime, "yyyy-MM-dd HH:mm:ss"));
requestLog.setResponseStatus("1");
requestLog.setDuration(Convert.toStr(DateUtil.between(requestTime, responseTime, DateUnit.MS)));
requestLog.setIsSuccessful("1");
} else {
requestLog.setResponseStatus("0");
requestLog.setErrorDetails(bean.getMsg());
requestLog.setIsSuccessful("0");
}
} catch (Exception e) {
requestLog.setErrorDetails(e.getMessage());
requestLog.setIsSuccessful("0");
requestLog.setResponseStatus("0");
} finally {
insertRequestLog(requestLog);
}
return requestLog;
}
} }

View File

@@ -141,7 +141,7 @@ 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) {
//根据小车当前点位去除已走路径 除了当前点和上一个点之外都解锁 //根据小车当前点位去除已走路径
DeviceSrgv otherCarCurrStatus = deviceSrgvService.selectDeviceSrgvByGuid(wcsSrgvQueue.getAgvId()); DeviceSrgv otherCarCurrStatus = deviceSrgvService.selectDeviceSrgvByGuid(wcsSrgvQueue.getAgvId());
String currSite = otherCarCurrStatus.getCurrSite(); String currSite = otherCarCurrStatus.getCurrSite();
List<String> allSiteList = Arrays.asList(wcsSrgvQueue.getPathInfo().split(",")); List<String> allSiteList = Arrays.asList(wcsSrgvQueue.getPathInfo().split(","));

View File

@@ -1,10 +1,13 @@
package com.ruoyi.common; package com.ruoyi.common;
import org.springframework.security.access.method.P;
public class Constant { 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://192.168.188.251:9501/"; 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 WMS_BASE_PDA_URL = "http://localhost:8080/pda/"; public static final String WMS_BASE_PDA_URL = "http://localhost:8080/pda/";
public static final String JOB_FINISH_URL = WMS_BASE_URL+"jobFinish"; public static final String JOB_FINISH_URL = WMS_BASE_URL+"jobFinish";
@@ -17,13 +20,10 @@ public class Constant {
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 OUT_MAKE_SURE=WMS_BASE_PDA_URL+"outMakeSure"; public static final String OUT_MAKE_SURE=WMS_BASE_PDA_URL+"outMakeSure";
public static final String UPDATE_LED=WMS_BASE_URL+"updateLed";
public static final String QUERY_AGV_QUENE=WMS_BASE_URL+"queryAgvQuene";
public static final String FINISH_AGV_QUENE=WMS_BASE_URL+"finishAgvQuene";
public static final String SEND_AGV_CAR=RCS_BASE_URL+"api/app/agvs-task";
public static final String INSERT_AGV_QUENE=WMS_BASE_URL+"insertAgvQuene";
public static final String UPDATE_LED_ERROR=WMS_BASE_URL+"updateLedError";
public static final String WAREHOUSE_01 = "01"; public static final String WAREHOUSE_01 = "01";
public static final String WAREHOUSE_02 = "02"; public static final String WAREHOUSE_02 = "02";

View File

@@ -83,8 +83,6 @@ public class DeviceSsj extends BaseEntity
@Excel(name="输送线模式 1-入库 2-出库") @Excel(name="输送线模式 1-入库 2-出库")
private int model; private int model;
// 报警信息
private int errorCode;

View File

@@ -2,7 +2,6 @@ package com.ruoyi.job.controller;
import java.util.List; import java.util.List;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
@@ -30,7 +29,8 @@ import com.ruoyi.common.core.page.TableDataInfo;
*/ */
@RestController @RestController
@RequestMapping("/job/mydoJob") @RequestMapping("/job/mydoJob")
public class MydoJobController extends BaseController { public class MydoJobController extends BaseController
{
@Autowired @Autowired
private IMydoJobService mydoJobService; private IMydoJobService mydoJobService;
@@ -39,7 +39,8 @@ public class MydoJobController extends BaseController {
*/ */
@PreAuthorize("@ss.hasPermi('job:mydoJob:list')") @PreAuthorize("@ss.hasPermi('job:mydoJob:list')")
@GetMapping("/list") @GetMapping("/list")
public TableDataInfo list(MydoJob mydoJob) { public TableDataInfo list(MydoJob mydoJob)
{
startPage(); startPage();
List<MydoJob> list = mydoJobService.selectMydoJobList(mydoJob); List<MydoJob> list = mydoJobService.selectMydoJobList(mydoJob);
return getDataTable(list); return getDataTable(list);
@@ -50,11 +51,10 @@ public class MydoJobController extends BaseController {
*/ */
@PreAuthorize("@ss.hasPermi('job:mydoJob:list')") @PreAuthorize("@ss.hasPermi('job:mydoJob:list')")
@GetMapping("/listFinish") @GetMapping("/listFinish")
public TableDataInfo listFinish(MydoJob mydoJob) { public TableDataInfo listFinish(MydoJob mydoJob)
{
startPage(); startPage();
// mydoJob.setStatus("3");
List<MydoJob> list = mydoJobService.selectMydoJobFinishList(mydoJob); List<MydoJob> list = mydoJobService.selectMydoJobFinishList(mydoJob);
return getDataTable(list); return getDataTable(list);
} }
@@ -64,15 +64,9 @@ public class MydoJobController extends BaseController {
@PreAuthorize("@ss.hasPermi('job:mydoJob:export')") @PreAuthorize("@ss.hasPermi('job:mydoJob:export')")
@Log(title = "作业信息", businessType = BusinessType.EXPORT) @Log(title = "作业信息", businessType = BusinessType.EXPORT)
@PostMapping("/export") @PostMapping("/export")
public void export(HttpServletResponse response, MydoJob mydoJob) { public void export(HttpServletResponse response, MydoJob mydoJob)
List<MydoJob> list = null; {
if (mydoJob.getStatus().equals("3")) { List<MydoJob> list = mydoJobService.selectMydoJobList(mydoJob);
list = mydoJobService.selectMydoJobList(mydoJob);
} else {
list = mydoJobService.selectMydoJobFinishList(mydoJob);
}
ExcelUtil<MydoJob> util = new ExcelUtil<MydoJob>(MydoJob.class); ExcelUtil<MydoJob> util = new ExcelUtil<MydoJob>(MydoJob.class);
util.exportExcel(response, list, "作业信息数据"); util.exportExcel(response, list, "作业信息数据");
} }
@@ -82,7 +76,8 @@ public class MydoJobController extends BaseController {
*/ */
@PreAuthorize("@ss.hasPermi('job:mydoJob:query')") @PreAuthorize("@ss.hasPermi('job:mydoJob:query')")
@GetMapping(value = "/{jobId}") @GetMapping(value = "/{jobId}")
public AjaxResult getInfo(@PathVariable("jobId") String jobId) { public AjaxResult getInfo(@PathVariable("jobId") String jobId)
{
return success(mydoJobService.selectMydoJobByJobId(jobId)); return success(mydoJobService.selectMydoJobByJobId(jobId));
} }
@@ -92,7 +87,8 @@ public class MydoJobController extends BaseController {
@PreAuthorize("@ss.hasPermi('job:mydoJob:add')") @PreAuthorize("@ss.hasPermi('job:mydoJob:add')")
@Log(title = "作业信息", businessType = BusinessType.INSERT) @Log(title = "作业信息", businessType = BusinessType.INSERT)
@PostMapping @PostMapping
public AjaxResult add(@RequestBody MydoJob mydoJob) { public AjaxResult add(@RequestBody MydoJob mydoJob)
{
return toAjax(mydoJobService.insertMydoJob(mydoJob)); return toAjax(mydoJobService.insertMydoJob(mydoJob));
} }
@@ -102,7 +98,8 @@ public class MydoJobController extends BaseController {
@PreAuthorize("@ss.hasPermi('job:mydoJob:edit')") @PreAuthorize("@ss.hasPermi('job:mydoJob:edit')")
@Log(title = "作业信息", businessType = BusinessType.UPDATE) @Log(title = "作业信息", businessType = BusinessType.UPDATE)
@PutMapping @PutMapping
public AjaxResult edit(@RequestBody MydoJob mydoJob) { public AjaxResult edit(@RequestBody MydoJob mydoJob)
{
return toAjax(mydoJobService.updateMydoJob(mydoJob)); return toAjax(mydoJobService.updateMydoJob(mydoJob));
} }
@@ -111,8 +108,9 @@ public class MydoJobController extends BaseController {
*/ */
@PreAuthorize("@ss.hasPermi('job:mydoJob:remove')") @PreAuthorize("@ss.hasPermi('job:mydoJob:remove')")
@Log(title = "作业信息", businessType = BusinessType.DELETE) @Log(title = "作业信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{jobIds}") @DeleteMapping("/{jobIds}")
public AjaxResult remove(@PathVariable String[] jobIds) { public AjaxResult remove(@PathVariable String[] jobIds)
{
return toAjax(mydoJobService.deleteMydoJobByJobIds(jobIds)); return toAjax(mydoJobService.deleteMydoJobByJobIds(jobIds));
} }
@@ -120,7 +118,8 @@ public class MydoJobController extends BaseController {
@PreAuthorize("@ss.hasPermi('job:mydoJob:manualCallback')") @PreAuthorize("@ss.hasPermi('job:mydoJob:manualCallback')")
@Log(title = "作业信息", businessType = BusinessType.UPDATE) @Log(title = "作业信息", businessType = BusinessType.UPDATE)
@GetMapping("/manualCallback/{jobId}") @GetMapping("/manualCallback/{jobId}")
public AjaxResult manualCallback(@PathVariable("jobId") String jobId) { public AjaxResult manualCallback(@PathVariable("jobId") String jobId)
{
return mydoJobService.manualCallback(jobId); return mydoJobService.manualCallback(jobId);
} }
} }

View File

@@ -24,11 +24,10 @@ public class MydoJob extends BaseEntity
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** 任务ID */ /** 任务ID */
@Excel(name = "任务ID")
private String jobId; private String jobId;
/** 任务状态 */ /** 任务状态 */
@Excel(name = "任务状态",dictType = "job_status") @Excel(name = "任务状态")
private String status; private String status;
/** 任务号 */ /** 任务号 */
@@ -36,7 +35,7 @@ public class MydoJob extends BaseEntity
private String taskNo; private String taskNo;
/** 巷道ID */ /** 巷道ID */
// @Excel(name = "巷道ID") @Excel(name = "巷道ID")
private String roadwayId; private String roadwayId;
/** 货位ID */ /** 货位ID */
@@ -56,11 +55,11 @@ public class MydoJob extends BaseEntity
private Long priority; private Long priority;
/** 执行阶段 */ /** 执行阶段 */
// @Excel(name = "执行阶段") @Excel(name = "执行阶段")
private String executionPhase; private String executionPhase;
/** 任务类型 */ /** 任务类型 */
@Excel(name = "任务类型",dictType = "job_type") @Excel(name = "任务类型")
private String inOrOut; private String inOrOut;
/** 开始时间 */ /** 开始时间 */
@@ -84,9 +83,9 @@ public class MydoJob extends BaseEntity
private String warehouseId; private String warehouseId;
/** 重分标志 */ /** 重分标志 */
// @Excel(name = "重分标志") @Excel(name = "重分标志")
private String faultFlag; private String faultFlag;
@Excel(name = "托盘条码")
private String trayCode; private String trayCode;
private String inOut; private String inOut;

View File

@@ -89,18 +89,4 @@ public interface MydoJobMapper
Integer selectExit(String ssj); Integer selectExit(String ssj);
Integer selectMydoJobCount(); Integer selectMydoJobCount();
Integer selectMydoJobIn();
Integer selectMydoJobCountOut();
Integer selectByJobOut(Integer currFloor);
Integer selectByJobOutIsOne(Integer currFloor);
Integer selectMydoJobExit(String exit);
Integer selectTheFloorYk(String theFloor);
void deleteMydoJobByTaskNos(List<String> validTaskNos);
} }

View File

@@ -88,16 +88,4 @@ public interface IMydoJobService
Integer selectExit(String ssj); Integer selectExit(String ssj);
Integer selectMydoJobCount(); Integer selectMydoJobCount();
Integer selectMydoJobIn();
Integer selectMydoJobCountOut();
Integer selectByJobOut(Integer currFloor);
Integer selectByJobOutIsOne(Integer currFloor);
Integer selectMydoJobExit(String exit);
Integer selectTheFloorYk(String theFloor);
} }

View File

@@ -193,35 +193,4 @@ public class MydoJobServiceImpl implements IMydoJobService
public Integer selectMydoJobCount() { public Integer selectMydoJobCount() {
return mydoJobMapper.selectMydoJobCount(); return mydoJobMapper.selectMydoJobCount();
} }
@Override
public Integer selectMydoJobIn() {
return mydoJobMapper.selectMydoJobIn();
}
@Override
public Integer selectMydoJobCountOut() {
return mydoJobMapper.selectMydoJobCountOut();
}
@Override
public Integer selectByJobOut(Integer currFloor) {
return mydoJobMapper.selectByJobOut(currFloor);
}
@Override
public Integer selectByJobOutIsOne(Integer currFloor) {
return mydoJobMapper.selectByJobOutIsOne(currFloor);
}
@Override
public Integer selectMydoJobExit(String exit) {
return mydoJobMapper.selectMydoJobExit(exit);
}
@Override
public Integer selectTheFloorYk(String theFloor) {
return mydoJobMapper.selectTheFloorYk(theFloor);
}
} }

View File

@@ -1,6 +1,5 @@
package com.ruoyi.queue.agv.mapper; package com.ruoyi.queue.agv.mapper;
import java.util.HashMap;
import java.util.List; import java.util.List;
import com.ruoyi.queue.agv.domain.AgvQueue; import com.ruoyi.queue.agv.domain.AgvQueue;
@@ -67,7 +66,7 @@ public interface AgvQueueMapper
*/ */
AgvQueue selectAgvQueueByTaskCode(String taskCode); AgvQueue selectAgvQueueByTaskCode(String taskCode);
void insertHistory(String reqCode); AgvQueue selectAgvQueueByStatus();
void selectKx(HashMap<String, Object> map); void insertHistory(String reqCode);
} }

View File

@@ -1,6 +1,5 @@
package com.ruoyi.queue.agv.service; package com.ruoyi.queue.agv.service;
import java.util.HashMap;
import java.util.List; import java.util.List;
import com.ruoyi.queue.agv.domain.AgvQueue; import com.ruoyi.queue.agv.domain.AgvQueue;
@@ -67,11 +66,11 @@ public interface IAgvQueueService
*/ */
AgvQueue selectAgvQueueByTaskCode(String taskCode); AgvQueue selectAgvQueueByTaskCode(String taskCode);
AgvQueue selectAgvQueueByStatus();
/** /**
* 插入agv完成历史 * 插入agv完成历史
* @param reqCode * @param reqCode
*/ */
void insertHistory(String reqCode); void insertHistory(String reqCode);
void selectKx(HashMap<String, Object> map);
} }

View File

@@ -1,6 +1,5 @@
package com.ruoyi.queue.agv.service.impl; package com.ruoyi.queue.agv.service.impl;
import java.util.HashMap;
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;
@@ -98,12 +97,12 @@ public class AgvQueueServiceImpl implements IAgvQueueService
} }
@Override @Override
public void insertHistory(String reqCode) { public AgvQueue selectAgvQueueByStatus() {
agvQueueMapper.insertHistory(reqCode); return agvQueueMapper.selectAgvQueueByStatus();
} }
@Override @Override
public void selectKx(HashMap<String, Object> map) { public void insertHistory(String reqCode) {
agvQueueMapper.selectKx(map); agvQueueMapper.insertHistory(reqCode);
} }
} }

View File

@@ -10,11 +10,10 @@ import org.apache.ibatis.annotations.Param;
* @author ruoyi * @author ruoyi
* @date 2025-11-21 * @date 2025-11-21
*/ */
public interface WcsSrgvQueueMapper public interface WcsSrgvQueueMapper {
{
/** /**
* 查询四向小车任务队列 * 查询四向小车任务队列
* *
* @param guid 四向小车任务队列主键 * @param guid 四向小车任务队列主键
* @return 四向小车任务队列 * @return 四向小车任务队列
*/ */
@@ -29,12 +28,9 @@ public interface WcsSrgvQueueMapper
public WcsSrgvQueue selectWcsSrgvQueueByFloor(String theFloor); public WcsSrgvQueue selectWcsSrgvQueueByFloor(String theFloor);
/** /**
* 查询四向小车任务队列列表 * 查询四向小车任务队列列表
* *
* @param wcsSrgvQueue 四向小车任务队列 * @param wcsSrgvQueue 四向小车任务队列
* @return 四向小车任务队列集合 * @return 四向小车任务队列集合
*/ */
@@ -42,7 +38,7 @@ public interface WcsSrgvQueueMapper
/** /**
* 新增四向小车任务队列 * 新增四向小车任务队列
* *
* @param wcsSrgvQueue 四向小车任务队列 * @param wcsSrgvQueue 四向小车任务队列
* @return 结果 * @return 结果
*/ */
@@ -50,7 +46,7 @@ public interface WcsSrgvQueueMapper
/** /**
* 修改四向小车任务队列 * 修改四向小车任务队列
* *
* @param wcsSrgvQueue 四向小车任务队列 * @param wcsSrgvQueue 四向小车任务队列
* @return 结果 * @return 结果
*/ */
@@ -58,7 +54,7 @@ public interface WcsSrgvQueueMapper
/** /**
* 删除四向小车任务队列 * 删除四向小车任务队列
* *
* @param guid 四向小车任务队列主键 * @param guid 四向小车任务队列主键
* @return 结果 * @return 结果
*/ */
@@ -66,7 +62,7 @@ public interface WcsSrgvQueueMapper
/** /**
* 批量删除四向小车任务队列 * 批量删除四向小车任务队列
* *
* @param guids 需要删除的数据主键集合 * @param guids 需要删除的数据主键集合
* @return 结果 * @return 结果
*/ */
@@ -80,5 +76,4 @@ public interface WcsSrgvQueueMapper
Integer selectByEndSite(); Integer selectByEndSite();
List<String> selectTaskNosByGuids(String[] guids);
} }

View File

@@ -1,12 +1,10 @@
package com.ruoyi.queue.srgv.service.impl; package com.ruoyi.queue.srgv.service.impl;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ObjUtil;
import com.ruoyi.job.mapper.MydoJobMapper;
import com.ruoyi.queue.srgv.domain.WcsSrgvQueueFinish; import com.ruoyi.queue.srgv.domain.WcsSrgvQueueFinish;
import com.ruoyi.queue.srgv.mapper.WcsSrgvQueueFinishMapper; import com.ruoyi.queue.srgv.mapper.WcsSrgvQueueFinishMapper;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -28,8 +26,7 @@ public class WcsSrgvQueueServiceImpl implements IWcsSrgvQueueService
private WcsSrgvQueueMapper wcsSrgvQueueMapper; private WcsSrgvQueueMapper wcsSrgvQueueMapper;
@Autowired @Autowired
private WcsSrgvQueueFinishMapper wcsSrgvQueueFinishMapper; private WcsSrgvQueueFinishMapper wcsSrgvQueueFinishMapper;
@Autowired
private MydoJobMapper mydoJobMapper;
/** /**
* 查询四向小车任务队列 * 查询四向小车任务队列
* *
@@ -103,29 +100,9 @@ public class WcsSrgvQueueServiceImpl implements IWcsSrgvQueueService
@Override @Override
public int deleteWcsSrgvQueueByGuids(String[] guids) public int deleteWcsSrgvQueueByGuids(String[] guids)
{ {
if (guids == null || guids.length == 0) {
return 0;
}
List<String> taskNos = wcsSrgvQueueMapper.selectTaskNosByGuids(guids);
deleteMydoJobsByTaskNos(taskNos);
return wcsSrgvQueueMapper.deleteWcsSrgvQueueByGuids(guids); return wcsSrgvQueueMapper.deleteWcsSrgvQueueByGuids(guids);
} }
private void deleteMydoJobsByTaskNos(List<String> taskNos) {
if (taskNos == null || taskNos.isEmpty()) {
return;
}
List<String> validTaskNos = new ArrayList<>();
for (String taskNo : taskNos) {
if (taskNo != null && !"".equals(taskNo)) {
validTaskNos.add(taskNo);
}
}
if (!validTaskNos.isEmpty()) {
mydoJobMapper.deleteMydoJobByTaskNos(validTaskNos);
}
}
/** /**
* 删除四向小车任务队列信息 * 删除四向小车任务队列信息
* *
@@ -154,6 +131,7 @@ public class WcsSrgvQueueServiceImpl implements IWcsSrgvQueueService
return wcsSrgvQueueMapper.selectByCaogoPlaceSite(siteId); return wcsSrgvQueueMapper.selectByCaogoPlaceSite(siteId);
} }
@Override @Override
public Integer selectByEndSite() { public Integer selectByEndSite() {
return wcsSrgvQueueMapper.selectByEndSite(); return wcsSrgvQueueMapper.selectByEndSite();

View File

@@ -73,8 +73,6 @@ public class PlcCdzRead implements Runnable {
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));
}else {
log.error(read2.Message);
} }
} }
@@ -118,8 +116,8 @@ public class PlcCdzRead implements Runnable {
} }
void closeServer() { void closeServer() {
if (siemensS7Net != null) { if (readWriteNet != null) {
siemensS7Net.ConnectClose(); readWriteNet.ConnectClose();
} }
setIsConnect(false); setIsConnect(false);
} }

View File

@@ -123,8 +123,8 @@ public class PlcDdjRead implements Runnable {
} }
void closeServer() { void closeServer() {
if (siemensS7Net != null) { if (readWriteNet != null) {
siemensS7Net.ConnectClose(); readWriteNet.ConnectClose();
} }
setIsConnect(false); setIsConnect(false);
} }

View File

@@ -78,39 +78,29 @@ public class PlcSrgvRead implements Runnable {
OperateResultExOne<byte[]> read1 = modbusTcpNet.Read("4068", (short) 15);//2400-2414 OperateResultExOne<byte[]> read1 = modbusTcpNet.Read("4068", (short) 15);//2400-2414
if (read1.IsSuccess) { if (read1.IsSuccess) {
setValueByByte1(read1.Content, deviceSrgv); setValueByByte1(read1.Content, deviceSrgv);
}else {
log.error(read1.Message);
} }
OperateResultExOne<byte[]> read5 = modbusTcpNet.Read("4081", (short) 2);//2400-2414 OperateResultExOne<byte[]> read5 = modbusTcpNet.Read("4081", (short) 2);//2400-2414
if (read5.IsSuccess) { if (read5.IsSuccess) {
setValueByByte5(read1.Content, deviceSrgv); setValueByByte5(read1.Content, deviceSrgv);
}else {
log.error(read1.Message);
} }
//读取二段任务 小车是否接收完成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) {
setValueByByte3(read3.Content, deviceSrgv); setValueByByte3(read3.Content, deviceSrgv);
}else {
log.error(read1.Message);
} }
//读取双字 //读取双字
OperateResultExOne<byte[]> read2 = modbusTcpNet.Read("4060", (short) 8);// 4800-4807任务号、原点、目标点、当前 OperateResultExOne<byte[]> read2 = modbusTcpNet.Read("4060", (short) 8);// 4800-4807任务号、原点、目标点、当前
if (read2.IsSuccess) { if (read2.IsSuccess) {
setValueByByte2(read2.Content, deviceSrgv); setValueByByte2(read2.Content, deviceSrgv);
}else {
log.error(read1.Message);
} }
// //读取双字,路径 // //读取双字,路径
OperateResultExOne<byte[]> read4 = modbusTcpNet.Read("6000", (short) 800);// 5000-5799 路径 400个 OperateResultExOne<byte[]> read4 = modbusTcpNet.Read("6000", (short) 800);// 5000-5799 路径 400个
if (read4.IsSuccess) { if (read4.IsSuccess) {
setValueByByte4(read4.Content, deviceSrgv); setValueByByte4(read4.Content, deviceSrgv);
}else {
log.error(read1.Message);
} }
} }
@@ -244,8 +234,8 @@ public class PlcSrgvRead implements Runnable {
} }
void closeServer() { void closeServer() {
if (modbusTcpNet != null) { if (readWriteNet != null) {
modbusTcpNet.ConnectClose(); readWriteNet.ConnectClose();
} }
setIsConnect(false); setIsConnect(false);
} }

View File

@@ -97,7 +97,6 @@ public class PlcSsjRead implements Runnable {
ddsx1 = SoftBasic.ByteToHexString(read2.Content); ddsx1 = SoftBasic.ByteToHexString(read2.Content);
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.setErrorCode(ParseUtil.optInt(8,ddsx1));
ssjDevice.setTaskNo(ParseUtil.optDInt(0, ddsx1)); ssjDevice.setTaskNo(ParseUtil.optDInt(0, ddsx1));
} }
@@ -136,8 +135,6 @@ public class PlcSsjRead implements Runnable {
ssjDevice.setDw(ParseUtil.optInt(6, ddsx1)); ssjDevice.setDw(ParseUtil.optInt(6, ddsx1));
// ssjDevice.setTrayCode(ParseUtil.optString(14, 12, ddsx1)); // ssjDevice.setTrayCode(ParseUtil.optString(14, 12, ddsx1));
// ssjDevice.setModel(ParseUtil.optInt(28, ddsx1)); // ssjDevice.setModel(ParseUtil.optInt(28, ddsx1));
}else {
log.error(read2.Message);
} }
} }
@@ -158,8 +155,6 @@ 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));
}else {
log.error(read2.Message);
} }
} }
@@ -197,8 +192,6 @@ public class PlcSsjRead implements Runnable {
//去除bytes中 //去除bytes中
ssjDevice.setTrayCode(ParseUtil.filterAndConvert(trayCodeRead.Content)); ssjDevice.setTrayCode(ParseUtil.filterAndConvert(trayCodeRead.Content));
} }
}else {
log.error(read2.Message);
} }
} }
@@ -242,8 +235,8 @@ public class PlcSsjRead implements Runnable {
} }
void closeServer() { void closeServer() {
if (siemensS7Net != null) { if (readWriteNet != null) {
siemensS7Net.ConnectClose(); readWriteNet.ConnectClose();
} }
setIsConnect(false); setIsConnect(false);
} }

View File

@@ -126,8 +126,8 @@ public class PlcTsjRead implements Runnable {
} }
void closeServer() { void closeServer() {
if (siemensS7Net != null) { if (readWriteNet != null) {
siemensS7Net.ConnectClose(); readWriteNet.ConnectClose();
} }
setIsConnect(false); setIsConnect(false);
} }

View File

@@ -23,9 +23,6 @@ import com.ruoyi.schedule.plcRead.ssj.PlcSsjRead;
import com.ruoyi.schedule.plcRead.util.Tools; import com.ruoyi.schedule.plcRead.util.Tools;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
@@ -70,19 +67,6 @@ public class CdzThread implements Runnable {
} }
} }
public static boolean isMoreThan30Min(String timeStr, String pattern) {
// 1. 创建格式化器
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
// 2. 解析字符串为时间对象
LocalDateTime targetTime = LocalDateTime.parse(timeStr, formatter);
// 3. 获取当前系统时间
LocalDateTime now = LocalDateTime.now();
// 4. 计算两个时间相差的总分钟(可正可负)
long diffMinutes = ChronoUnit.MINUTES.between(targetTime, now);
// 取绝对值:不管是过去/未来时间,只要间隔超30分钟就满足
long absDiff = Math.abs(diffMinutes);
return absDiff > 30;
}
void dispatch() { void dispatch() {
Integer count = mydoJobService.selectMydoJobCount(); Integer count = mydoJobService.selectMydoJobCount();
@@ -95,7 +79,7 @@ public class CdzThread implements Runnable {
if (deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() != 3 && deviceSrgv.getChargeFlag() != 2) { 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 && isMoreThan30Min(deviceSrgv.getLastTime(),"yyyy-MM-dd HH:mm:ss")) { } else if (deviceSrgv.getBattery() <= MIDDLE_BETTERY && count == 0) {
middleBatterySRgv.add(deviceSrgv); middleBatterySRgv.add(deviceSrgv);
} }
} }
@@ -152,11 +136,11 @@ public class CdzThread implements Runnable {
} }
//生成断电任务 有任务且电量大于50 //生成断电任务 有任务且电量大于50
List<DeviceCdz> deviceCdzdd = deviceCdzService.selectDeviceCdzHasSRgvList(); List<DeviceCdz> deviceCdzdd = deviceCdzService.selectDeviceCdzHasSRgvList();
for (DeviceCdz deviceCdz : deviceCdzdd) { for (DeviceCdz deviceCdz : deviceCdzdd) {
DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()); DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1());
//(deviceSrgv.getBattery() >= JOB_BETTERY && count > 0) || if (((deviceSrgv.getBattery() >= JOB_BETTERY && count > 0) || deviceSrgv.getBattery() >= MAX_BETTERY)
if (( deviceSrgv.getBattery() >= MAX_BETTERY)
&& deviceSrgv.getWorkMode() == 5 && deviceSrgv.getWorkMode() == 5
&& deviceSrgv.getChargeFlag() == 2 && deviceCdz.getStatus() == 1) { && deviceSrgv.getChargeFlag() == 2 && deviceCdz.getStatus() == 1) {
createChargingOutJob(PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()), deviceCdz); createChargingOutJob(PlcSrgvRead.deviceSrgvMap.get(deviceCdz.getSpare1()), deviceCdz);

View File

@@ -115,7 +115,8 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
createCarOutQueue(); createCarOutQueue();
// 充电任务队列 // 充电任务队列
inCharging(deviceSrgv); inCharging(deviceSrgv);
// 充电完成调离
// outCharging(deviceSrgv);
} else { } else {
log.error("小车设备为空"); log.error("小车设备为空");
@@ -190,10 +191,10 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
wcsSrgvQueue.setEndSite("tsj"); wcsSrgvQueue.setEndSite("tsj");
wcsSrgvQueue.setDefault02("8"); wcsSrgvQueue.setDefault02("8");
// Integer count = wcsSagvQueueMapper.selectTsj(); Integer count = wcsSagvQueueMapper.selectTsj();
// if (count > 0) { if (count > 0) {
// return; return;
// } }
} }
// TODO 如果小车的当前点和小车的充电点位置一样,直接生成已经下发的队列 等着充电就可以 // TODO 如果小车的当前点和小车的充电点位置一样,直接生成已经下发的队列 等着充电就可以
// if (deviceSrgv.getCurrSite().equals(chargingSite)) { // if (deviceSrgv.getCurrSite().equals(chargingSite)) {
@@ -229,19 +230,14 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
* 生成出库小车队列 * 生成出库小车队列
*/ */
private void createCarOutQueue() { private void createCarOutQueue() {
List<MydoJob> mydoJobs = mydoJobService.selectMydoJobOut(); List<MydoJob> mydoJobs = mydoJobService.selectMydoJobOut();
if (!mydoJobs.isEmpty()) { if (!mydoJobs.isEmpty()) {
for (MydoJob mydoJob1 : mydoJobs) { for (MydoJob mydoJob1 : mydoJobs) {
// 根据 当前层的 出库任务查询是否存在当前层的移库任务,如果有直接return;
// String theFloor = mydoJob1.getTheFloor();
// Integer count= mydoJobService.selectTheFloorYk(theFloor);
// if (count>0){
// return;
// }
WcsSrgvQueue wcsSrgvQueue1 = wcsSagvQueueMapper.selectWcsSrgvQueueByTaskNo(mydoJob1.getTaskNo()); WcsSrgvQueue wcsSrgvQueue1 = wcsSagvQueueMapper.selectWcsSrgvQueueByTaskNo(mydoJob1.getTaskNo());
if (wcsSrgvQueue1 == null) { if (wcsSrgvQueue1 == null) {
ConcurrentHashMap<String, DeviceSrgv> deviceSrgvMap = PlcSrgvRead.deviceSrgvMap; ConcurrentHashMap<String, DeviceSrgv> deviceSrgvMap = PlcSrgvRead.deviceSrgvMap;
List<DeviceSrgv> deviceSrgvList = deviceSrgvMap.values().stream() List<DeviceSrgv> deviceSrgvList = deviceSrgvMap.values().stream()
.filter(deviceSrgv -> deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() == 1) .filter(deviceSrgv -> deviceSrgv.getWorkMode() == 5 && deviceSrgv.getStatus() == 1)
@@ -251,7 +247,18 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
.collect(Collectors.toList()); .collect(Collectors.toList());
if (!deviceSrgvList.isEmpty()) { if (!deviceSrgvList.isEmpty()) {
DeviceSrgv deviceSrgv = null; DeviceSrgv deviceSrgv = null;
/*for (DeviceSrgv deviceSrgv1 : deviceSrgvList) {
//优先出库层,如果没有优先邻近层
if (deviceSrgv1.getCurrFloor().toString().equals(mydoJob1.getTheFloor())) {
deviceSrgv = deviceSrgv1;
break;
} else if (deviceSrgv == null || (Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - deviceSrgv1.getCurrFloor())) < (Math.abs(Integer.parseInt(mydoJob1.getTheFloor()) - deviceSrgv.getCurrFloor()))) {
WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString());
if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) {
deviceSrgv = deviceSrgv1;
}
}
}*/
WcsSrgvMap wcsSrgvMap = new WcsSrgvMap(); WcsSrgvMap wcsSrgvMap = new WcsSrgvMap();
wcsSrgvMap.setCargoSpaceId(mydoJob1.getCargoSpaceId()); wcsSrgvMap.setCargoSpaceId(mydoJob1.getCargoSpaceId());
List<WcsSrgvMap> wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap); List<WcsSrgvMap> wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap);
@@ -259,6 +266,25 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
String cargoPickSite = wcsSrgvMaps.get(0).getSiteId(); String cargoPickSite = wcsSrgvMaps.get(0).getSiteId();
//先找流程相等的小车 //先找流程相等的小车
List<DeviceSrgv> currentFloorCarList = deviceSrgvList.stream().filter(x -> x.getCurrFloor().toString().equals(mydoJob1.getTheFloor())).collect(Collectors.toList()); List<DeviceSrgv> currentFloorCarList = deviceSrgvList.stream().filter(x -> x.getCurrFloor().toString().equals(mydoJob1.getTheFloor())).collect(Collectors.toList());
// int z = 100000;
// for (DeviceSrgv srgv : currentFloorCarList) {
// // 坐标截取和转换(保留你的原有逻辑)
// Integer startX = Convert.toInt(StrUtil.sub(srgv.getCurrSite(), 0, 2));
// Integer endX = Convert.toInt(StrUtil.sub(cargoPickSite, 0, 2));
// Integer startY = Convert.toInt(StrUtil.sub(srgv.getCurrSite(), 2, 4));
// Integer endY = Convert.toInt(StrUtil.sub(cargoPickSite, 2, 4));
//
// // 计算当前小车到取货点的曼哈顿距离 TODO 先算Y 再算X 如果Y相等再算X
//// int tempZ = Math.abs(startX - endX) + Math.abs(startY - endY);
// int tempZ = Math.abs(startY - endY) != 0 ? Math.abs(startY - endY) : Math.abs(startX - endX);
//
// // 核心修正:只要当前tempZ比记录的最小z更小,就更新z和对应的小车
// if (tempZ < z) {
// z = tempZ; // 把z更新为当前更小的距离
// deviceSrgv = srgv; // 记录这个更近的小车
// log.info("楼层相等,找到更近小车 距离{} srgv:{}", tempZ, srgv);
// }
// }
int minYDistance = 100000; // 记录最小的Y轴距离 int minYDistance = 100000; // 记录最小的Y轴距离
@@ -283,7 +309,8 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
minXDistance = currentXDistance; minXDistance = currentXDistance;
bestSrgv = srgv; bestSrgv = srgv;
log.info("楼层相等,找到更近小车(Y轴更优) Y距离{} X距离{} srgv:{}", currentYDistance, currentXDistance, srgv); log.info("楼层相等,找到更近小车(Y轴更优) Y距离{} X距离{} srgv:{}", currentYDistance, currentXDistance, srgv);
} else if (currentYDistance == minYDistance) { }
if (currentYDistance == minYDistance) {
// 情况2:Y轴距离相同,比较X轴距离 // 情况2:Y轴距离相同,比较X轴距离
if (currentXDistance < minXDistance) { if (currentXDistance < minXDistance) {
minXDistance = currentXDistance; minXDistance = currentXDistance;
@@ -302,7 +329,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString()); WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString());
if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) { if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) {
deviceSrgv = deviceSrgv1; // 更新为更小楼层的小车 deviceSrgv = deviceSrgv1; // 更新为更小楼层的小车
log.info("楼层不相等:{}", deviceSrgv); log.info("楼层bu相等:{}", deviceSrgv);
} }
} }
@@ -342,8 +369,13 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
//终点是提升机 //终点是提升机
endSite = "tsj"; endSite = "tsj";
} }
String ssj1 = null; // if (endSite.equals("tsj")) {
String ssj2 = null; // Integer count = wcsSagvQueueMapper.selectTsj();
// if (count > 0) {
// return;
// }
// }
mydoJob1.setExitId(null); mydoJob1.setExitId(null);
WcsSrgvMap wcsSrgvMap1 = new WcsSrgvMap(); WcsSrgvMap wcsSrgvMap1 = new WcsSrgvMap();
String cargoPlaceSite = ""; String cargoPlaceSite = "";
@@ -358,50 +390,21 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
String ssj = ""; String ssj = "";
if (deviceSsj1.getName().equals("TD1001")) { if (deviceSsj1.getName().equals("TD1001")) {
s = "050101"; s = "050101";
ssj1 = "L1004"; ssj = "L1004";
} else { } else {
s = "070101"; s = "070101";
ssj2 = "L1005"; ssj = "L1005";
}
Integer count = mydoJobService.selectExit(ssj);
if (count >= 0 && count <= 1) {
mydoJob1.setExitId(ssj);
mydoJobService.updateMydoJob(mydoJob1);
outModelSSJ.add(s);
break;
} }
} }
} }
} }
Integer count1 = 0;
Integer count2 = 0;
if (ssj1 != null) {
count1 = mydoJobService.selectExit(ssj1);
}
if (ssj2 != null) {
count2 = mydoJobService.selectExit(ssj2);
}
if (ssj1 != null && ssj2 != null) {
if (count1 < count2) {
mydoJob1.setExitId(ssj1);
mydoJob1.setStartTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
mydoJobService.updateMydoJob(mydoJob1);
outModelSSJ.add("050101");
} else {
mydoJob1.setExitId(ssj2);
mydoJob1.setStartTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
mydoJobService.updateMydoJob(mydoJob1);
outModelSSJ.add("070101");
}
}
if (ssj1 != null && ssj2 == null) {
mydoJob1.setExitId(ssj1);
mydoJob1.setStartTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
mydoJobService.updateMydoJob(mydoJob1);
outModelSSJ.add("050101");
}
if (ssj1 == null && ssj2 != null) {
mydoJob1.setExitId(ssj2);
mydoJob1.setStartTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
mydoJobService.updateMydoJob(mydoJob1);
outModelSSJ.add("070101");
}
cargoPlaceSite = wcsSagvQueueMapper.selectMinCountJob(outModelSSJ); cargoPlaceSite = wcsSagvQueueMapper.selectMinCountJob(outModelSSJ);
if (Objects.equals(cargoPlaceSite, "")) { if (Objects.equals(cargoPlaceSite, "")) {
return; return;
@@ -420,13 +423,37 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
if (!sameSiteDevices.isEmpty() && !Objects.equals(sameSiteDevices.get(0).getDeviceId(), deviceSrgv.getDeviceId())) { if (!sameSiteDevices.isEmpty() && !Objects.equals(sameSiteDevices.get(0).getDeviceId(), deviceSrgv.getDeviceId())) {
WcsSrgvMap wcsSrgvMap3 = new WcsSrgvMap(); WcsSrgvMap wcsSrgvMap3 = new WcsSrgvMap();
wcsSrgvMap3.setRemark("cache"); wcsSrgvMap3.setRemark("cache");
// List<WcsSrgvMap> wcsSrgvMaps3 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap3);
} // for (WcsSrgvMap wcsSrgvMap4 : wcsSrgvMaps3) {
// //deviceSrgvMap中所有对象的currSite都不等于wcsSrgvMap4的siteId的对象
// 强复合作业控制,如果车在取货放货点,判断是否有要入库的作业,有的话则直接退出,让小车开始进入库的 // if (deviceSrgvMap.values().stream().noneMatch(d -> d.getCurrSite().equals(wcsSrgvMap4.getSiteId()))) {
Integer InJobCount = mydoJobService.selectMydoJobIn(); // //生成小车到缓存点队列
if (deviceSrgv != null && (deviceSrgv.getCurrSite().equals("070101") || deviceSrgv.getCurrSite().equals("050101")) && InJobCount > 0) { // WcsSrgvQueue wcsSrgvQueue5 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(sameSiteDevices.get(0).getDeviceId().toString());
return; // WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue();
// wcsSrgvQueue.setCargoPlaceSite(wcsSrgvMap4.getSiteId());
// List<WcsSrgvQueue> wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueue);
// if (wcsSrgvQueue5 == null && wcsSrgvQueues.isEmpty()) {
// WcsSrgvQueue wcsSrgvQueue3 = new WcsSrgvQueue();
// wcsSrgvQueue3.setGuid(UUID.randomUUID().toString());
// wcsSrgvQueue3.setTaskNo("11111");
// wcsSrgvQueue3.setTaskType("1");
// wcsSrgvQueue3.setPriority(Long.parseLong("2"));
// wcsSrgvQueue3.setCargo("1");
// wcsSrgvQueue3.setIssued(issued);
// wcsSrgvQueue3.setExecutionStatus(executionStatus);
// wcsSrgvQueue3.setCargoPickSite(cargoPickSite);
// wcsSrgvQueue3.setCargoPlaceSite(wcsSrgvMap4.getSiteId());
// wcsSrgvQueue3.setStartSite(sameSiteDevices.get(0).getCurrSite());
// wcsSrgvQueue3.setEndSite(wcsSrgvMap4.getSiteId());
// wcsSrgvQueue3.setTheFloor(sameSiteDevices.get(0).getCurrFloor().toString());
// wcsSrgvQueue3.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
// wcsSrgvQueue3.setAgvId(sameSiteDevices.get(0).getDeviceId().toString());
// wcsSrgvQueue3.setDefault02("4");
// wcsSrgvQueue3.setDefault07(sameSiteDevices.get(0).getCurrFloor().toString());
// wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue3);
// }
// }
// }
} }
@@ -470,6 +497,8 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
} }
} }
} }
} }
} }
@@ -511,21 +540,16 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
return; return;
} }
List<WcsSrgvMap> wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap); List<WcsSrgvMap> wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap);
//取货地址 //取货地址
String cargoPickSite = wcsSrgvMaps.get(0).getSiteId(); String cargoPickSite = wcsSrgvMaps.get(0).getSiteId();
//先找层数相等的小车 //先找层数相等的小车
List<DeviceSrgv> currentFloorCarList = deviceSrgvList.stream().filter(x -> x.getCurrFloor().toString().equals(mydoJob1.getTheFloor())).collect(Collectors.toList()); List<DeviceSrgv> currentFloorCarList = deviceSrgvList.stream().filter(x -> x.getCurrFloor().toString().equals(mydoJob1.getTheFloor())).collect(Collectors.toList());
int minYDistance = 100000; // 记录最小的Y轴距离 int minYDistance = 100000; // 记录最小的Y轴距离
int minXDistance = 100000; // 记录最小的X轴距离 int minXDistance = 100000; // 记录最小的X轴距离
DeviceSrgv bestSrgv = null; // 最终选中的最优小车 DeviceSrgv bestSrgv = null; // 最终选中的最优小车
Integer count = wcsSagvQueueMapper.selectByCaogoPlaceSite("070101");
Integer counts = wcsSagvQueueMapper.selectByCaogoPlaceSite("050101");
// 暂时不加限制
// if (currentFloorCarList.size() == 0 && (counts > 0 || count > 0)) {
// return;
// }
// 先找目标层小车
for (DeviceSrgv srgv : currentFloorCarList) { for (DeviceSrgv srgv : currentFloorCarList) {
// 坐标截取和转换(保留原有逻辑) // 坐标截取和转换(保留原有逻辑)
Integer startX = Convert.toInt(StrUtil.sub(srgv.getCurrSite(), 0, 2)); Integer startX = Convert.toInt(StrUtil.sub(srgv.getCurrSite(), 0, 2));
@@ -538,17 +562,19 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
int currentXDistance = Math.abs(startX - endX); int currentXDistance = Math.abs(startX - endX);
// 2. 核心逻辑:优先按Y轴排序,Y轴相同再按X轴排序 // 2. 核心逻辑:优先按Y轴排序,Y轴相同再按X轴排序
// 用 if-else if 合并,互斥判断
if (currentYDistance < minYDistance) { if (currentYDistance < minYDistance) {
// Y更近 // 情况1:当前Y轴距离更小,直接更新最优解
minYDistance = currentYDistance; minYDistance = currentYDistance;
minXDistance = currentXDistance; minXDistance = currentXDistance;
bestSrgv = srgv; bestSrgv = srgv;
} else if (currentYDistance == minYDistance) { log.info("楼层相等,找到更近小车(Y轴更优) Y距离{} X距离{} srgv:{}", currentYDistance, currentXDistance, srgv);
// Y相同,比X }
if (currentYDistance == minYDistance) {
// 情况2:Y轴距离相同,比较X轴距离
if (currentXDistance < minXDistance) { if (currentXDistance < minXDistance) {
minXDistance = currentXDistance; minXDistance = currentXDistance;
bestSrgv = srgv; bestSrgv = srgv;
log.info("楼层相等,找到更近小车(X轴更优) Y距离{} X距离{} srgv:{}", currentYDistance, currentXDistance, srgv);
} }
} }
} }
@@ -556,82 +582,32 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
// 最终选中的小车赋值给deviceSrgv(保持原有变量名兼容) // 最终选中的小车赋值给deviceSrgv(保持原有变量名兼容)
deviceSrgv = bestSrgv; deviceSrgv = bestSrgv;
if (deviceSrgv == null) { if (deviceSrgv == null) {
//如果没找到目标层小车 先找一层的车 //如果未选择到小车,找目标层小车
for (DeviceSrgv deviceSrgv1 : deviceSrgvList) { for (DeviceSrgv deviceSrgv1 : deviceSrgvList) {
if (deviceSrgv1.getCurrFloor().toString().equals("1")) { if (!deviceSrgv1.getCurrFloor().toString().equals(mydoJob1.getTheFloor())) {
WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString()); WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString());
if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) { if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) {
Integer startX = Convert.toInt(StrUtil.sub(deviceSrgv1.getCurrSite(), 0, 2)); deviceSrgv = deviceSrgv1; // 更新为更小楼层的小车
Integer endX = Convert.toInt(StrUtil.sub(cargoPickSite, 0, 2)); log.info("楼层bu相等:{}", deviceSrgv);
Integer startY = Convert.toInt(StrUtil.sub(deviceSrgv1.getCurrSite(), 2, 4));
Integer endY = Convert.toInt(StrUtil.sub(cargoPickSite, 2, 4));
// 1. 计算当前小车到目标点的Y轴、X轴绝对距离
int currentYDistance = Math.abs(startY - endY);
int currentXDistance = Math.abs(startX - endX);
// 2. 核心逻辑:优先按Y轴排序,Y轴相同再按X轴排序
// 用 if-else if 合并,互斥判断
if (currentYDistance < minYDistance) {
// Y更近
minYDistance = currentYDistance;
minXDistance = currentXDistance;
deviceSrgv = deviceSrgv1;
} else if (currentYDistance == minYDistance) {
// Y相同,比X
if (currentXDistance < minXDistance) {
minXDistance = currentXDistance;
deviceSrgv = deviceSrgv1;
}
}
}
// 一层的车没有 再找不等于作业层的车
} else if (!deviceSrgv1.getCurrFloor().toString().equals(mydoJob1.getTheFloor())) {
WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString());
if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) {
Integer startX = Convert.toInt(StrUtil.sub(deviceSrgv1.getCurrSite(), 0, 2));
Integer endX = Convert.toInt(StrUtil.sub(cargoPickSite, 0, 2));
Integer startY = Convert.toInt(StrUtil.sub(deviceSrgv1.getCurrSite(), 2, 4));
Integer endY = Convert.toInt(StrUtil.sub(cargoPickSite, 2, 4));
// 1. 计算当前小车到目标点的Y轴、X轴绝对距离
int currentYDistance = Math.abs(startY - endY);
int currentXDistance = Math.abs(startX - endX);
// 2. 核心逻辑:优先按Y轴排序,Y轴相同再按X轴排序
// 用 if-else if 合并,互斥判断
if (currentYDistance < minYDistance) {
// Y更近
minYDistance = currentYDistance;
minXDistance = currentXDistance;
deviceSrgv = deviceSrgv1;
} else if (currentYDistance == minYDistance) {
// Y相同,比X
if (currentXDistance < minXDistance) {
minXDistance = currentXDistance;
deviceSrgv = deviceSrgv1;
}
}
} }
} }
} }
} }
// // 如果目标层小车也没有 找其他层小车
if (deviceSrgv != null) { // if (deviceSrgv==null){
Integer currFloor = deviceSrgv.getCurrFloor(); // for (DeviceSrgv deviceSrgv1 : deviceSrgvList) {
String currSite = deviceSrgv.getCurrSite(); // if (!deviceSrgv1.getCurrFloor().toString().equals(mydoJob1.getTheFloor())) {
Integer i = mydoJobService.selectByJobOut(currFloor); // WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv1.getDeviceId().toString());
Integer a = mydoJobService.selectByJobOutIsOne(currFloor); // if (deviceSrgv1.getStatus() == 1 && wcsSrgvQueue2 == null) {
if (i > 0 && currFloor > 1) { // deviceSrgv = deviceSrgv1; // 更新为更小楼层的小车
return; // log.info("楼层bu相等:{}", deviceSrgv);
} //
// 车在一层 并且一层的出库任务还有,并且车的当前点位不在取货放货点 // }
if (currFloor == 1 && a > 0 && !deviceSrgv.getCurrSite().equals("070101") && !deviceSrgv.getCurrSite().equals("050101")) { // }
return; // }
} //
} // }
if (deviceSrgv != null) { if (deviceSrgv != null) {
WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv.getDeviceId().toString()); WcsSrgvQueue wcsSrgvQueue2 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(deviceSrgv.getDeviceId().toString());
@@ -658,8 +634,61 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
// 小车不在1楼 // 小车不在1楼
endSite = "tsj"; endSite = "tsj";
} }
// if (endSite.equals("tsj")) {
// Integer count = wcsSagvQueueMapper.selectTsj();
// if (count > 0) {
// return;
// }
// }
//筛选出deviceSrgvMap中deviceSrgv.getWorkMode() == 4并且deviceSrgv.getStatus() == 1并且deviceSrgv.getCurrSite() == cargoPickSite得对象,并排除掉其中deviceId与deviceSrgv.getDeviceId()相同的对象
// 如果当前有其他小车也要去入库点取货 TODO 判断的是如果当前车要去取货点,但是取货点有车的的情况
// List<DeviceSrgv> sameSiteDevices = deviceSrgvMap.values().stream()
// .filter(d -> d.getWorkMode() == 5
// && d.getStatus() == 1
// && d.getCurrSite().equals(cargoPickSite))
// .collect(Collectors.toList());
// 和当前小车不是一个 那么就生成一个去离母通道最近的点
// if (!sameSiteDevices.isEmpty() && !Objects.equals(sameSiteDevices.get(0).getDeviceId(), deviceSrgv.getDeviceId())) {
// WcsSrgvMap wcsSrgvMap3 = new WcsSrgvMap();
// wcsSrgvMap3.setSiteId("07070"+sameSiteDevices.get(0).getCurrFloor());
// List<WcsSrgvMap> wcsSrgvMaps3 = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap3);
// for (WcsSrgvMap wcsSrgvMap4 : wcsSrgvMaps3) {
//
// if (deviceSrgvMap.values().stream().noneMatch(d -> d.getCurrSite().equals(wcsSrgvMap4.getSiteId()))) {
// WcsSrgvQueue wcsSrgvQueue5 = wcsSagvQueueMapper.selectWcsSrgvQueueByAgvId(sameSiteDevices.get(0).getDeviceId().toString());
// WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue();
// wcsSrgvQueue.setCargoPlaceSite(wcsSrgvMap4.getSiteId());
// List<WcsSrgvQueue> wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueue);
// if (wcsSrgvQueue5 == null && wcsSrgvQueues.isEmpty()) {
// //生成占位小车到缓存点队列
// WcsSrgvQueue wcsSrgvQueue3 = new WcsSrgvQueue();
// wcsSrgvQueue3.setGuid(UUID.randomUUID().toString());
// wcsSrgvQueue3.setTaskNo(String.valueOf(taskCache));
// wcsSrgvQueue3.setTaskType("1");
// wcsSrgvQueue3.setPriority(Long.parseLong("2"));
// wcsSrgvQueue3.setCargo("1");
// wcsSrgvQueue3.setIssued(issued);
// wcsSrgvQueue3.setExecutionStatus(executionStatus);
// wcsSrgvQueue3.setCargoPickSite(cargoPickSite);
// wcsSrgvQueue3.setCargoPlaceSite(wcsSrgvMap4.getSiteId());
// wcsSrgvQueue3.setStartSite(sameSiteDevices.get(0).getCurrSite());
// wcsSrgvQueue3.setEndSite(wcsSrgvMap4.getSiteId());
// wcsSrgvQueue3.setTheFloor(sameSiteDevices.get(0).getCurrFloor().toString());
// wcsSrgvQueue3.setCreateDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
// wcsSrgvQueue3.setAgvId(sameSiteDevices.get(0).getDeviceId().toString());
// wcsSrgvQueue3.setDefault02("4");
// wcsSrgvQueue3.setDefault07(sameSiteDevices.get(0).getCurrFloor().toString());
// wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue3);
// taskCache++;
// return;
// }
// }
//
// }
// }
//生成小车取货队列 //生成小车取货队列
WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue(); WcsSrgvQueue wcsSrgvQueue = new WcsSrgvQueue();
@@ -687,15 +716,15 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
} }
wcsSrgvQueue.setDefault07("1"); wcsSrgvQueue.setDefault07("1");
wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue); wcsSagvQueueMapper.insertWcsSrgvQueue(wcsSrgvQueue);
mydoJob1.setStartTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
mydoJobService.updateMydoJob(mydoJob1);
} }
} }
} }
} }
} }
} }
} }
/** /**
@@ -732,134 +761,6 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
} }
/**
* 公共方法:生成小车避让任务
*/
private void buildAvoidTask(String agvId, DeviceSrgv device, Integer floor) {
ConcurrentHashMap<String, DeviceSrgv> deviceSrgvMap = PlcSrgvRead.deviceSrgvMap;
List<DeviceSrgv> deviceSrgvs = deviceSrgvMap.values().stream()
.filter(d -> d.getWorkMode() == 5
&& d.getStatus() == 1
&& d.getCurrFloor().equals(floor))
.collect(Collectors.toList());
ArrayList<String> sites = new ArrayList<>();
for (DeviceSrgv d : deviceSrgvs) {
sites.add(d.getCurrSite());
}
List<WcsSrgvMap> cacheMaps = wcsSrgvMapService.selectNotInsite("cache", floor, sites);
if (CollUtil.isEmpty(cacheMaps)) {
log.warn("楼层 {} 无可用避让缓存点,无法生成避让任务", floor);
return;
}
// 生成阻挡车的避让任务
WcsSrgvQueue taskB = new WcsSrgvQueue();
taskB.setGuid(UUID.randomUUID().toString());
taskB.setTaskNo(String.valueOf(taskCache));
taskB.setAgvId(agvId);
taskB.setTaskType("4"); // 避让任务
taskB.setDefault02("4"); // 业务类型标识为点到点
taskB.setPriority(9L); // 高优先级
taskB.setIssued("0"); // 未下发
taskB.setExecutionStatus("1");
taskB.setStartSite(device.getCurrSite());
taskB.setCargoPickSite(device.getCurrSite());
// 选择避让缓存点
if (cacheMaps.size() > 1) {
Integer count = wcsSagvQueueMapper.selectByCaogoPlaceSite(cacheMaps.get(0).getSiteId());
if (count > 0) {
taskB.setCargoPlaceSite(cacheMaps.get(1).getSiteId());
taskB.setEndSite(cacheMaps.get(1).getSiteId());
} else {
taskB.setCargoPlaceSite(cacheMaps.get(0).getSiteId());
taskB.setEndSite(cacheMaps.get(0).getSiteId());
}
} else {
taskB.setCargoPlaceSite(cacheMaps.get(0).getSiteId());
taskB.setEndSite(cacheMaps.get(0).getSiteId());
}
taskB.setTheFloor(floor.toString());
taskB.setDefault07(floor.toString());
taskB.setCreateDate(DateUtil.now());
wcsSagvQueueMapper.insertWcsSrgvQueue(taskB);
taskCache++;
}
/**
* 处理通道占用避让:目标通道有其他车则生成避让任务
*
* @param currDevice 当前调度小车
* @param floor 当前楼层
* @param shortestPath 最短路径
* @return true=已触发避让,当前车需等待;false=通道无占用,正常走后续逻辑
*/
private boolean handleChannelAvoid(DeviceSrgv currDevice, Integer floor, List<int[]> shortestPath) {
// 1. 取路径终点坐标
int[] lastPoint = shortestPath.get(shortestPath.size() - 1);
int x = lastPoint[0];
int y = lastPoint[1];
// 2. 根据坐标查询站点及所属通道
WcsSrgvMap queryMap = new WcsSrgvMap();
queryMap.setX(x);
queryMap.setY(y);
queryMap.setZ(floor);
List<WcsSrgvMap> siteList = wcsSrgvMapService.selectWcsSrgvMapList(queryMap);
if (CollUtil.isEmpty(siteList)) {
return false;
}
// 目标通道ID
String targetChannelId = siteList.get(0).getSpaceArea();
if (StrUtil.isBlank(targetChannelId)) {
return false;
}
// 3. 筛选:同楼层、同通道、非当前车、空闲可调度的小车
List<Map.Entry<String, DeviceSrgv>> channelCarList = PlcSrgvRead.deviceSrgvMap.entrySet().stream()
.filter(entry -> entry.getValue() != null)
// 同楼层
.filter(entry -> floor.equals(entry.getValue().getCurrFloor()))
// 不是当前调度的车
.filter(entry -> !Objects.equals(Convert.toStr(currDevice.getDeviceId()), entry.getKey()))
// 空闲可调度状态(和原有避让状态保持一致)
.filter(entry -> entry.getValue().getWorkMode() == 5
&& entry.getValue().getStatus() == 1)
// 车辆当前站点属于目标通道
.filter(entry -> {
String currSite = entry.getValue().getCurrSite();
WcsSrgvMap siteParam = new WcsSrgvMap();
siteParam.setSiteId(currSite);
siteParam.setZ(floor);
List<WcsSrgvMap> siteInfos = wcsSrgvMapService.selectWcsSrgvMapList(siteParam);
return CollUtil.isNotEmpty(siteInfos)
&& targetChannelId.equals(siteInfos.get(0).getSpaceArea());
})
.collect(Collectors.toList());
// 4. 通道内无其他车,无需避让
if (CollUtil.isEmpty(channelCarList)) {
return false;
}
// 5. 取通道内第一台占用车,生成避让任务
Map.Entry<String, DeviceSrgv> blockCar = channelCarList.get(0);
String blockAgvId = blockCar.getKey();
DeviceSrgv blockDevice = blockCar.getValue();
// 查询阻挡车是否已有任务,无任务才生成避让
WcsSrgvQueue checkQueue = new WcsSrgvQueue();
checkQueue.setAgvId(blockAgvId);
List<WcsSrgvQueue> existQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(checkQueue);
if (CollUtil.isEmpty(existQueues)) {
buildAvoidTask(blockAgvId, blockDevice, floor);
log.info("通道 {} 内存在小车 {},已生成通道避让任务", targetChannelId, blockAgvId);
}
// 触发避让,当前小车等待
return true;
}
/** /**
* 小车发送点对点任务 * 小车发送点对点任务
*/ */
@@ -904,51 +805,15 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
//处理地图 //处理地图
int[][] emptyMap = roadCacheService.handleMap(arrByRoadSite, deviceSrgv, floor); int[][] emptyMap = roadCacheService.handleMap(arrByRoadSite, deviceSrgv, floor);
//计算最短路径 //计算最短路径
List<int[]> shortestPath = PathFinder.findShortestPath(emptyMap, arrByRoadSite.get(startSite).getX(), arrByRoadSite.get(startSite).getY(), arrByRoadSite.get(endSite).getX(), arrByRoadSite.get(endSite).getY()); List<int[]> shortestPath = PathFinder.findShortestPath(emptyMap, arrByRoadSite.get(startSite).getX(), arrByRoadSite.get(startSite).getY(), arrByRoadSite.get(endSite).getX(), arrByRoadSite.get(endSite).getY());
// TODO 小车避让 目前只针对同层最多两台车 并且点位设置到了050201 判断地图中取的路径 不能直达说明有车阻挡 直接返回-1 用-1判断小车阻挡调离小车 // TODO 小车避让 目前只针对同层最多两台车 并且点位设置到了050201 判断地图中取的路径 不能直达说明有车阻挡 直接返回-1 用-1判断小车阻挡调离小车
if (shortestPath.size() > 0) { if (shortestPath.size() > 0) {
// ===================== 新增:通道占用避让判断 开始 =====================
boolean channelNeedAvoid = handleChannelAvoid(deviceSrgv, floor, shortestPath);
if (channelNeedAvoid) {
return false;
}
// ===================== 新增:通道占用避让判断 结束 =====================
if (shortestPath.size() == 1 && shortestPath.get(0)[0] == -1) { if (shortestPath.size() == 1 && shortestPath.get(0)[0] == -1) {
// 如果阻挡了 则找一个出库缓存点 让车先过去
// 执行队列不是空的 且在一层 并且车在提升机里面 要去的目标点也是队列的目标点,则直接让车先去缓存出库点
if (floor == 1 && "090501".equals(wcsSrgvQueue.getStartSite()) && wcsSrgvQueue.getEndSite().equals(wcsSrgvQueue.getCargoPlaceSite()) && "2".equals(wcsSrgvQueue.getDefault02())) {
WcsSrgvMap wcsSrgvMapParam = new WcsSrgvMap();
wcsSrgvMapParam.setRemark("outCache");
List<WcsSrgvMap> wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMapParam);
List<String> cacheSite = wcsSrgvMaps.stream().sorted(Comparator.comparing(WcsSrgvMap::getSiteId)).map(WcsSrgvMap::getSiteId).collect(Collectors.toList());
List<String> currentSRgvSite = new ArrayList<>();
for (String srgvCode : PlcSrgvRead.deviceSrgvMap.keySet()) {
currentSRgvSite.add(PlcSrgvRead.deviceSrgvMap.get(srgvCode).getCurrSite());
}
cacheSite.removeAll(currentSRgvSite);
if (CollUtil.isNotEmpty(cacheSite)) {
for (String cache : cacheSite) {
WcsSrgvQueue wcsSrgvQueueParam = new WcsSrgvQueue();
wcsSrgvQueueParam.setEndSite(cache);
List<WcsSrgvQueue> wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueueParam);
if (CollUtil.isEmpty(wcsSrgvQueues)) {
wcsSrgvQueue.setEndSite(cacheSite.get(0));
wcsSrgvQueue.setDefault02("7");
wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue);
shortestPath = null;
break;
}
}
}
}
return false; return false;
} }
// 空车避让
String endBlockAgv = null; String endBlockAgv = null;
DeviceSrgv endBlockDevice = null; DeviceSrgv endBlockDevice = null;
if (arrByRoadSite != null && !arrByRoadSite.isEmpty()) { if (arrByRoadSite != null && !arrByRoadSite.isEmpty()) {
@@ -996,7 +861,6 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
WcsSrgvQueue wcsSrgvQueueBR = new WcsSrgvQueue(); WcsSrgvQueue wcsSrgvQueueBR = new WcsSrgvQueue();
wcsSrgvQueueBR.setAgvId(endBlockAgv); wcsSrgvQueueBR.setAgvId(endBlockAgv);
List<WcsSrgvQueue> wcsSrgvQueueBRS = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueueBR); List<WcsSrgvQueue> wcsSrgvQueueBRS = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueueBR);
// 如果车无执行队列,可以直接生成避让执行队列
if (endBlockDevice != null && wcsSrgvQueueBRS.isEmpty()) { if (endBlockDevice != null && wcsSrgvQueueBRS.isEmpty()) {
// 选择当前层最近且可达的缓存点(避让点) // 选择当前层最近且可达的缓存点(避让点)
ConcurrentHashMap<String, DeviceSrgv> deviceSrgvMap = PlcSrgvRead.deviceSrgvMap; ConcurrentHashMap<String, DeviceSrgv> deviceSrgvMap = PlcSrgvRead.deviceSrgvMap;
@@ -1056,65 +920,63 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
//判断是否能规划出最短路径 //判断是否能规划出最短路径
// if (shortestPath == null || shortestPath.isEmpty()) { if (shortestPath == null || shortestPath.isEmpty()) {
// //判断是否是1层 空车取货 或者 满车放货 //判断是否是1层 空车取货 或者 满车放货
// if (floor == 1) { if (floor == 1) {
//
// if ("2".equals(wcsSrgvQueue.getDefault02()) && "090501".equals(wcsSrgvQueue.getStartSite()) && wcsSrgvQueue.getEndSite().equals(wcsSrgvQueue.getCargoPlaceSite())) { if ("2".equals(wcsSrgvQueue.getDefault02()) && "tsj".equals(wcsSrgvQueue.getStartSite()) && wcsSrgvQueue.getEndSite().equals(wcsSrgvQueue.getCargoPlaceSite())) {
// //1层满车放货 //1层满车放货
// //修改终点到出库缓存点 //修改终点到出库缓存点
// WcsSrgvMap wcsSrgvMapParam = new WcsSrgvMap(); WcsSrgvMap wcsSrgvMapParam = new WcsSrgvMap();
// wcsSrgvMapParam.setRemark("outCache"); wcsSrgvMapParam.setRemark("outCache");
// List<WcsSrgvMap> wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMapParam); List<WcsSrgvMap> wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMapParam);
// List<String> cacheSite = wcsSrgvMaps.stream().map(WcsSrgvMap::getSiteId).collect(Collectors.toList()); List<String> cacheSite = wcsSrgvMaps.stream().map(WcsSrgvMap::getSiteId).collect(Collectors.toList());
// List<String> currentSRgvSite = new ArrayList<>(); List<String> currentSRgvSite = new ArrayList<>();
// for (String srgvCode : PlcSrgvRead.deviceSrgvMap.keySet()) { for (String srgvCode : PlcSrgvRead.deviceSrgvMap.keySet()) {
// currentSRgvSite.add(PlcSrgvRead.deviceSrgvMap.get(srgvCode).getCurrSite()); currentSRgvSite.add(PlcSrgvRead.deviceSrgvMap.get(srgvCode).getCurrSite());
// } }
// cacheSite.removeAll(currentSRgvSite); cacheSite.removeAll(currentSRgvSite);
// if (CollUtil.isNotEmpty(cacheSite)) { if (CollUtil.isNotEmpty(cacheSite)) {
// for (String cache : cacheSite) { for (String cache : cacheSite) {
// WcsSrgvQueue wcsSrgvQueueParam = new WcsSrgvQueue(); WcsSrgvQueue wcsSrgvQueueParam = new WcsSrgvQueue();
// wcsSrgvQueueParam.setEndSite(cache); wcsSrgvQueueParam.setEndSite(cache);
// List<WcsSrgvQueue> wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueueParam);
// List<WcsSrgvQueue> wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueueParam); if (CollUtil.isEmpty(wcsSrgvQueues)) {
// if (CollUtil.isEmpty(wcsSrgvQueues)) { wcsSrgvQueue.setEndSite(cacheSite.get(0));
// wcsSrgvQueue.setEndSite(cacheSite.get(0)); wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue);
// wcsSrgvQueue.setDefault02("7"); break;
// wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue); }
// break; }
// } }
// } }
// } if ("4".equals(wcsSrgvQueue.getDefault02()) && "tsj".equals(wcsSrgvQueue.getStartSite()) && wcsSrgvQueue.getEndSite().equals(wcsSrgvQueue.getCargoPickSite())) {
// } //1层空车取货
// if ("4".equals(wcsSrgvQueue.getDefault02()) && "tsj".equals(wcsSrgvQueue.getStartSite()) && wcsSrgvQueue.getEndSite().equals(wcsSrgvQueue.getCargoPickSite())) { //修改终点到避让点
// //1层空车取货 WcsSrgvMap wcsSrgvMapParam = new WcsSrgvMap();
// //修改终点到避让点 wcsSrgvMapParam.setRemark("cache");
// WcsSrgvMap wcsSrgvMapParam = new WcsSrgvMap(); List<WcsSrgvMap> wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMapParam);
// wcsSrgvMapParam.setRemark("cache"); List<String> cacheSite = wcsSrgvMaps.stream().map(WcsSrgvMap::getSiteId).collect(Collectors.toList());
// List<WcsSrgvMap> wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMapParam); List<String> currentSRgvSite = new ArrayList<>();
// List<String> cacheSite = wcsSrgvMaps.stream().map(WcsSrgvMap::getSiteId).collect(Collectors.toList()); for (String srgvCode : PlcSrgvRead.deviceSrgvMap.keySet()) {
// List<String> currentSRgvSite = new ArrayList<>(); currentSRgvSite.add(PlcSrgvRead.deviceSrgvMap.get(srgvCode).getCurrSite());
// for (String srgvCode : PlcSrgvRead.deviceSrgvMap.keySet()) { }
// currentSRgvSite.add(PlcSrgvRead.deviceSrgvMap.get(srgvCode).getCurrSite()); cacheSite.removeAll(currentSRgvSite);
// } if (CollUtil.isNotEmpty(cacheSite)) {
// cacheSite.removeAll(currentSRgvSite); for (String cache : cacheSite) {
// if (CollUtil.isNotEmpty(cacheSite)) { WcsSrgvQueue wcsSrgvQueueParam = new WcsSrgvQueue();
// for (String cache : cacheSite) { wcsSrgvQueueParam.setEndSite(cache);
// WcsSrgvQueue wcsSrgvQueueParam = new WcsSrgvQueue(); List<WcsSrgvQueue> wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueueParam);
// wcsSrgvQueueParam.setEndSite(cache); if (CollUtil.isEmpty(wcsSrgvQueues)) {
// List<WcsSrgvQueue> wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueueParam); wcsSrgvQueue.setEndSite(cacheSite.get(0));
// if (CollUtil.isEmpty(wcsSrgvQueues)) { wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue);
// wcsSrgvQueue.setEndSite(cacheSite.get(0)); break;
// wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue); }
// break; }
// } }
// } }
// } }
// } return false;
// } }
// return false;
// }
//获取拐点路径 //获取拐点路径
@@ -1256,6 +1118,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
} }
// TODO 这段下发有问题 // TODO 这段下发有问题
if (wcsSrgvQueue.getDefault08().equals("2") && deviceSrgv.getSpare5().equals("1")) { if (wcsSrgvQueue.getDefault08().equals("2") && deviceSrgv.getSpare5().equals("1")) {
sendDataList = new ArrayList<>(); sendDataList = new ArrayList<>();
SendData2 path = new SendData2(); SendData2 path = new SendData2();
path.setAddress("4404");//地址 path.setAddress("4404");//地址
@@ -1496,8 +1359,7 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
* @return * @return
*/ */
private void finishTaskByQueue(String currSite, WcsSrgvQueue wcsSrgvQueue) { private void finishTaskByQueue(String currSite, WcsSrgvQueue wcsSrgvQueue) {
//更新小车待机时间
deviceSrgvService.updateLastTimeByAgvId(wcsSrgvQueue.getAgvId());
String groupCodingNo = basCargoSpaceService.selecGroupCodingBySite(currSite); String groupCodingNo = basCargoSpaceService.selecGroupCodingBySite(currSite);
String siteId = basCargoSpaceService.selectMaxSiteIdByNo(groupCodingNo); String siteId = basCargoSpaceService.selectMaxSiteIdByNo(groupCodingNo);
List<String> sites = new ArrayList<>(); List<String> sites = new ArrayList<>();
@@ -1515,34 +1377,26 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
String cargoPickSite = wcsSrgvQueue.getCargoPickSite(); String cargoPickSite = wcsSrgvQueue.getCargoPickSite();
String cargoPlaceSite = wcsSrgvQueue.getCargoPlaceSite(); String cargoPlaceSite = wcsSrgvQueue.getCargoPlaceSite();
WcsSrgvMap wcsSrgvMap = new WcsSrgvMap(); WcsSrgvMap wcsSrgvMap = new WcsSrgvMap();
wcsSrgvMap.setRemark("outCache"); wcsSrgvMap.setRemark("outCache");
List<WcsSrgvMap> wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap); List<WcsSrgvMap> wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMap);
// 处理出库缓存点任务 让070301 的先走 走了之后再执行090301的任务 再070301 走完之前不能执行090301的任务 //当前路径地图map中如果存在小车的站点,返回true
if (wcsSrgvMaps.stream().anyMatch(wcsSrgvMap1 -> wcsSrgvMap1.getSiteId().equals(currSite)) && wcsSrgvQueue.getDefault02().equals("7")) { if (wcsSrgvMaps.stream().anyMatch(wcsSrgvMap1 -> wcsSrgvMap1.getSiteId().equals(currSite))) {
WcsSrgvQueue wcsSrgvQueue1 = new WcsSrgvQueue(); //生成小车从避让点到放货/取货位置,如果是空车就到取货位置,如果是满车就到放货位置
wcsSrgvQueue1.setEndSite("070301"); // wcsSrgvQueue.setExecutionStatus("4");
List<WcsSrgvQueue> wcsSrgvQueues = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueue1); // wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo());
// wcsSrgvQueue.setIssued("0");
WcsSrgvQueue wcsSrgvQueue2 = new WcsSrgvQueue(); // wcsSrgvQueue.setExecutionStatus("1");
wcsSrgvQueue2.setStartSite("070301"); // wcsSrgvQueue.setStartSite(currSite);
List<WcsSrgvQueue> wcsSrgvQueueOut = wcsSagvQueueMapper.selectWcsSrgvQueueList(wcsSrgvQueue2); // if ("1".equals(taskType)) {
// 如果当前站点为090301 判断是否有070301的任务要来 如果要来就等着 等到070301的任务先走了再让小车开始动 // wcsSrgvQueue.setEndSite(cargoPickSite);
if (currSite.equals("090301") && CollUtil.isNotEmpty(wcsSrgvQueues) && CollUtil.isNotEmpty(wcsSrgvQueueOut)) { // } else if ("2".equals(taskType)) {
return; // wcsSrgvQueue.setEndSite(cargoPlaceSite);
} // }
MydoJob mydoJobyk = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo())); // wcsSrgvQueue.setTheFloor("1");
if (!mydoJobyk.getInOrOut().equals("30")) { // wcsSrgvQueue.setDefault07("1");
wcsSrgvQueue.setEndSite(wcsSrgvQueue.getCargoPlaceSite()); // wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue);
wcsSrgvQueue.setDefault02("2"); // return;
wcsSrgvQueue.setIssued("0");
wcsSrgvQueue.setExecutionStatus("1");
wcsSrgvQueue.setTaskType("2");
wcsSrgvQueue.setStartSite(currSite);
wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo());
wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue);
return;
}
} }
//空车任务 且当前车的位置和取货位置相同 //空车任务 且当前车的位置和取货位置相同
if ("1".equals(taskType) && (cargoPickSite.equals(currSite) || (wcsSrgvQueue.getDefault06() != null && wcsSrgvQueue.getDefault06().equals(currSite)) || sites.contains(currSite))) { if ("1".equals(taskType) && (cargoPickSite.equals(currSite) || (wcsSrgvQueue.getDefault06() != null && wcsSrgvQueue.getDefault06().equals(currSite)) || sites.contains(currSite))) {
@@ -1596,9 +1450,6 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
//请求wms生成库存 插入回传表 //请求wms生成库存 插入回传表
MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo())); MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo()));
if (mydoJob != null) { if (mydoJob != null) {
mydoJob.setFinishTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
mydoJob.setStatus("4");
mydoJobService.updateMydoJob(mydoJob);
JobCallBack jobCallBack = new JobCallBack(); JobCallBack jobCallBack = new JobCallBack();
jobCallBack.setType(wcsSrgvQueue.getDefault02()); jobCallBack.setType(wcsSrgvQueue.getDefault02());
jobCallBack.setMydojobId(mydoJob.getJobId()); jobCallBack.setMydojobId(mydoJob.getJobId());
@@ -1608,18 +1459,12 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
jobCallBackService.insertJobCallBack(jobCallBack); jobCallBackService.insertJobCallBack(jobCallBack);
mydoJobService.insertHistory(mydoJob.getJobId()); mydoJobService.insertHistory(mydoJob.getJobId());
mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId()); mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId());
wcsSrgvQueue.setExecutionStatus("4");
wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo());
wcsSagvQueueMapper.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid());
} }
break; break;
case "2": case "2":
MydoJob mydoJobOut = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo())); MydoJob mydoJobOut = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo()));
if (mydoJobOut != null && (cargoPlaceSite.equals(currSite))) { if (mydoJobOut != null && (cargoPlaceSite.equals(currSite))) {
mydoJobOut.setFinishTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
mydoJobOut.setStatus("4");
mydoJobService.updateMydoJob(mydoJobOut);
log.info("1471 taskNo:[{}],currSite:[{}],cargoPlaceSite:[{}]", wcsSrgvQueue.getTaskNo(), currSite, cargoPlaceSite); log.info("1471 taskNo:[{}],currSite:[{}],cargoPlaceSite:[{}]", wcsSrgvQueue.getTaskNo(), currSite, cargoPlaceSite);
JobCallBack jobCallBack = new JobCallBack(); JobCallBack jobCallBack = new JobCallBack();
jobCallBack.setType(wcsSrgvQueue.getDefault02()); jobCallBack.setType(wcsSrgvQueue.getDefault02());
@@ -1628,63 +1473,15 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
jobCallBack.setTaskNo(Convert.toLong(mydoJobOut.getTaskNo())); jobCallBack.setTaskNo(Convert.toLong(mydoJobOut.getTaskNo()));
jobCallBack.setCreateTime(new Date()); jobCallBack.setCreateTime(new Date());
jobCallBackService.insertJobCallBack(jobCallBack); jobCallBackService.insertJobCallBack(jobCallBack);
// 不是线边整托线边直出的删除作业
if (!mydoJobOut.getInOrOut().equals("22")) { if (!mydoJobOut.getInOrOut().equals("22")) {
mydoJobService.insertHistory(mydoJobOut.getJobId()); mydoJobService.insertHistory(mydoJobOut.getJobId());
mydoJobService.deleteMydoJobByJobId(mydoJobOut.getJobId()); mydoJobService.deleteMydoJobByJobId(mydoJobOut.getJobId());
} }
//
wcsSrgvQueue.setExecutionStatus("4");
wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo());
wcsSagvQueueMapper.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid());
} }
if (mydoJobOut != null && wcsSrgvQueue.getDefault06() != null && !wcsSrgvQueue.getDefault06().equals("") && siteId != null && !wcsSrgvQueue.getCargoPlaceSite().equals(siteId) && siteId.equals(wcsSrgvQueue.getDefault06())) {
String endSite = "";
String xfType = "";
WcsSrgvMap wcsSrgvMapq = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPickSite);
WcsSrgvMap wcsSrgvMapf = wcsSrgvMapService.selectWcsSrgvMapBySiteId(cargoPlaceSite);
// 取货点地图和放货点地图不为空
if (wcsSrgvMapq != null && wcsSrgvMapf != null) {
if (Objects.equals(wcsSrgvMapq.getTheLayer(), wcsSrgvMapf.getTheLayer())) {
//如果是同层,终点为放货点
endSite = cargoPlaceSite;
} else {
//不同层,终点为提升机
endSite = "tsj";
}
if ("L1004".equals(wcsSrgvMapq.getRemark()) || "L1005".equals(wcsSrgvMapq.getRemark())) {
xfType = "1";//入库
} else {
if ("L1004".equals(wcsSrgvMapf.getRemark()) || "L1005".equals(wcsSrgvMapf.getRemark())) {
xfType = "2";//出库
} else {
xfType = "7";//移库
}
}
// 更新目标点,修改执行队列
wcsSrgvQueue.setEndSite(endSite);
wcsSrgvQueue.setDefault02(xfType);
wcsSrgvQueue.setTheFloor(wcsSrgvMapq.getTheLayer().toString());
wcsSrgvQueue.setDefault07(wcsSrgvMapf.getTheLayer().toString());
wcsSrgvQueue.setIssued("0");
wcsSrgvQueue.setDefault06(null);
wcsSrgvQueue.setExecutionStatus("1");
wcsSrgvQueue.setTaskType("2");
}
wcsSrgvQueue.setStartSite(currSite);
wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo());
wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue);
}
case "7"://移库,变动库存 case "7"://移库,变动库存
MydoJob mydoJobyk = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo())); MydoJob mydoJobyk = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(wcsSrgvQueue.getTaskNo()));
if (mydoJobyk != null && mydoJobyk.getInOrOut().equals("30")) { if (mydoJobyk != null) {
mydoJobyk.setFinishTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
mydoJobyk.setStatus("4");
mydoJobService.updateMydoJob(mydoJobyk);
JobCallBack jobCallBack = new JobCallBack(); JobCallBack jobCallBack = new JobCallBack();
jobCallBack.setType(wcsSrgvQueue.getDefault02()); jobCallBack.setType(wcsSrgvQueue.getDefault02());
jobCallBack.setMydojobId(mydoJobyk.getJobId()); jobCallBack.setMydojobId(mydoJobyk.getJobId());
@@ -1694,17 +1491,15 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
jobCallBackService.insertJobCallBack(jobCallBack); jobCallBackService.insertJobCallBack(jobCallBack);
mydoJobService.insertHistory(mydoJobyk.getJobId()); mydoJobService.insertHistory(mydoJobyk.getJobId());
mydoJobService.deleteMydoJobByJobId(mydoJobyk.getJobId()); mydoJobService.deleteMydoJobByJobId(mydoJobyk.getJobId());
wcsSrgvQueue.setExecutionStatus("4");
wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo());
wcsSagvQueueMapper.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid());
} }
break;
default: default:
break; break;
} }
//删除队列,插入历史表 //删除队列,插入历史表
wcsSrgvQueue.setExecutionStatus("4");
wcsSagvQueueMapper.insertHistory(wcsSrgvQueue.getTaskNo());
wcsSagvQueueMapper.deleteWcsSrgvQueueByGuid(wcsSrgvQueue.getGuid());
// 充电任务 并且小车也是充电任务 // 充电任务 并且小车也是充电任务
} else if ("3".equals(taskType) && wcsSrgvQueue.getDefault02().equals("3")) { } else if ("3".equals(taskType) && wcsSrgvQueue.getDefault02().equals("3")) {
@@ -1743,7 +1538,8 @@ public class BaseSRgvThread implements Runnable, SRgvThreadInterface {
wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue); wcsSagvQueueMapper.updateWcsSrgvQueue(wcsSrgvQueue);
} }
//更新小车待机时间
// deviceSrgvService.updateLastTimeByAgvId(wcsSrgvQueue.getAgvId());
} }
} }

View File

@@ -46,13 +46,6 @@ public class SsjThread implements Runnable {
ssjCodes2.add("L1004"); ssjCodes2.add("L1004");
ssjCodes2.add("L1005"); ssjCodes2.add("L1005");
ssjCodeList.put("road", ssjCodes2); ssjCodeList.put("road", ssjCodes2);
ArrayList<String> ssjCodes4 = new ArrayList<>();
ssjCodes4.add("L1006");
ssjCodes4.add("L1003");
ssjCodeList.put("error", ssjCodes4);
mydoJobService = SpringUtils.getBean(IMydoJobService.class); mydoJobService = SpringUtils.getBean(IMydoJobService.class);
jobCallBackService = SpringUtils.getBean(IJobCallBackService.class); jobCallBackService = SpringUtils.getBean(IJobCallBackService.class);
apiService = SpringUtils.getBean(IApiService.class); apiService = SpringUtils.getBean(IApiService.class);
@@ -104,69 +97,25 @@ public class SsjThread implements Runnable {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
} }
} }
case "error":
for (String ssjCode : ssjCodeList.get("error")) {
try {
if (PlcSsjRead.deviceSsjMap.containsKey(ssjCode)) {
inDispatchError(PlcSsjRead.deviceSsjMap.get(ssjCode));
} else {
log.error("设备不存在 ssjCode{}", ssjCode);
}
} catch (RuntimeException e) {
log.error(e.getMessage(), e);
}
}
} }
} }
} }
} }
private void inDispatchError(DeviceSsj deviceSsj) {
if (deviceSsj.getErrorCode() > 0) {
if (deviceSsj.getDeviceCode().equals("L1003")) {
String code = "TD1001";
String errorCode = String.valueOf(deviceSsj.getErrorCode());
HashMap<String, Object> objectObjectHashMap = new HashMap<>();
objectObjectHashMap.put("deviceCode", code);
objectObjectHashMap.put("errorCode", errorCode);
apiService.updateLedError(objectObjectHashMap);
}
if (deviceSsj.getDeviceCode().equals("L1006")) {
String code = "TD1008";
String errorCode = String.valueOf(deviceSsj.getErrorCode());
HashMap<String, Object> objectObjectHashMap = new HashMap<>();
objectObjectHashMap.put("deviceCode", code);
objectObjectHashMap.put("errorCode", errorCode);
apiService.updateLedError(objectObjectHashMap);
}
}
}
void inDispatch(DeviceSsj deviceSsj) { void inDispatch(DeviceSsj deviceSsj) {
//出库到位 //出库到位
if (deviceSsj.getDw() == 1 && deviceSsj.getTaskNo() > 0) { if (deviceSsj.getDw() == 1 && deviceSsj.getTaskNo() > 0) {
HashMap<String, Object> objectObjectHashMap = new HashMap<>();
objectObjectHashMap.put("deviceCode", deviceSsj.getDeviceCode());
objectObjectHashMap.put("taskNo", deviceSsj.getTaskNo());
apiService.updateLed(objectObjectHashMap);
MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(Convert.toLong(deviceSsj.getTaskNo())); MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(Convert.toLong(deviceSsj.getTaskNo()));
if (mydoJob != null && mydoJob.getInOrOut().equals("22")) { if (mydoJob != null && mydoJob.getInOrOut().equals("22")) {
// 新增agv执行队列,以及调用wms后台任务过账 // 新增agv执行队列,以及调用wms后台任务过账
AjaxResult ajaxResult1 = apiService.insertAgvQuene(objectObjectHashMap); HashMap<String, Object> map = new HashMap<>();
if (ajaxResult1.get("code").equals("200")) { map.put("trayCode", mydoJob.getTrayCode());
HashMap<String, Object> map = new HashMap<>(); //拉取
map.put("trayCode", mydoJob.getTrayCode()); AjaxResult ajaxResult = apiService.OutMakeSure(map);
//拉取 if (ajaxResult.get("code").equals("200")) {
AjaxResult ajaxResult = apiService.OutMakeSure(map); mydoJobService.insertHistory(mydoJob.getJobId());
if (ajaxResult.get("code").equals("200")) { mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId());
mydoJobService.insertHistory(mydoJob.getJobId());
mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId());
}
} }
} }
} }
@@ -176,22 +125,14 @@ public class SsjThread implements Runnable {
if (deviceSsj.getRkqq() == 1 && StrUtil.isNotBlank(deviceSsj.getTrayCode().trim())) { if (deviceSsj.getRkqq() == 1 && StrUtil.isNotBlank(deviceSsj.getTrayCode().trim())) {
String trayCode = deviceSsj.getTrayCode().trim(); String trayCode = deviceSsj.getTrayCode().trim();
MydoJob getMydoJob = mydoJobService.selectMydoJobByTrayCode(trayCode); MydoJob getMydoJob = mydoJobService.selectMydoJobByTrayCode(trayCode);
if (getMydoJob == null && deviceSsj.getTaskNo() < 1000) { if (getMydoJob != null && deviceSsj.getTaskNo() < 1000) {
String exit = ""; int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), getMydoJob.getTaskNo(), 1, 1);
if (deviceSsj.getDeviceCode().equals("GS1002")) { if (i == 1) {
exit = "L1004"; getMydoJob.setStatus("3");
} mydoJobService.updateMydoJob(getMydoJob);
if (deviceSsj.getDeviceCode().equals("GS1007")) { log.info(deviceSsj.getDeviceCode() + "输送机下发任务号成功:{}", getMydoJob.getTaskNo());
exit = "L1005";
}
Integer count = mydoJobService.selectMydoJobExit(exit);
if (count > 0) {
int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), "0", 2, 2);
if (i == 1) {
log.info(deviceSsj.getDeviceCode() + "有相应入口的出库作业,下发退回,去向2 条码" + deviceSsj.getTrayCode());
return;
}
} }
} else {
//todo 查是否为入库模式,不是退回,是否超重 //todo 查是否为入库模式,不是退回,是否超重
HashMap<String, Object> map = new HashMap<>(); HashMap<String, Object> map = new HashMap<>();
map.put("trayCode", deviceSsj.getTrayCode()); map.put("trayCode", deviceSsj.getTrayCode());
@@ -241,28 +182,27 @@ public class SsjThread implements Runnable {
if (deviceSsj.getDw() == 1 && deviceSsj.getTaskNo() > 1000) { if (deviceSsj.getDw() == 1 && deviceSsj.getTaskNo() > 1000) {
MydoJob mydoJob1 = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(deviceSsj.getTaskNo())); MydoJob mydoJob1 = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(deviceSsj.getTaskNo()));
if (mydoJob1 != null && mydoJob1.getCargoSpaceId() != null) { if (mydoJob1.getCargoSpaceId() != null) {
return; return;
} }
if (mydoJob1 != null && Integer.parseInt(mydoJob1.getInOrOut()) < 20) {
HashMap<String, Object> map = new HashMap<>(); HashMap<String, Object> map = new HashMap<>();
map.put("taskNo", deviceSsj.getTaskNo()); map.put("taskNo", deviceSsj.getTaskNo());
map.put("deviceCode", deviceSsj.getDeviceCode()); //拉取
//拉取 AjaxResult ajaxResult = apiService.sendCargoSpace(map);
AjaxResult ajaxResult = apiService.sendCargoSpace(map); if (ajaxResult.isSuccess()) {
if (ajaxResult.isSuccess()) { MydoJob data = BeanUtil.toBean(ajaxResult.get("data"), MydoJob.class);
MydoJob data = BeanUtil.toBean(ajaxResult.get("data"), MydoJob.class); String cargoSpaceId = data.getCargoSpaceId();
String cargoSpaceId = data.getCargoSpaceId(); String theFloor = data.getClassId();
String theFloor = data.getClassId(); MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo((long) deviceSsj.getTaskNo());
MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo((long) deviceSsj.getTaskNo()); if (mydoJob != null) {
if (mydoJob != null && cargoSpaceId != null && !cargoSpaceId.equals("")) { mydoJob.setTheFloor(theFloor);
mydoJob.setTheFloor(theFloor); mydoJob.setCargoSpaceId(cargoSpaceId);
mydoJob.setCargoSpaceId(cargoSpaceId); mydoJob.setExecutionPhase("2");
mydoJob.setExecutionPhase("2"); mydoJobService.updateMydoJob(mydoJob);
mydoJobService.updateMydoJob(mydoJob);
}
} }
} }
} }
} }
} }

View File

@@ -26,7 +26,9 @@ import com.ruoyi.schedule.plcRead.tsj.PlcTsjRead;
import com.ruoyi.schedule.plcRead.util.Tools; import com.ruoyi.schedule.plcRead.util.Tools;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.*; import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Slf4j @Slf4j
@@ -39,7 +41,7 @@ public class TsjThread implements Runnable {
private IWcsSrgvQueueService wcsSrgvQueueService; private IWcsSrgvQueueService wcsSrgvQueueService;
private IMydoJobService mydoJobService; private IMydoJobService mydoJobService;
private IWcsSrgvMapService wcsSrgvMapService; private IWcsSrgvMapService wcsSrgvMapService;
public IWcsSrgvQueueService wcsSagvQueueMapper;
public void init() { public void init() {
tsjDeviceExecutionQueueService = SpringUtils.getBean(ITsjDeviceExecutionQueueService.class); tsjDeviceExecutionQueueService = SpringUtils.getBean(ITsjDeviceExecutionQueueService.class);
@@ -48,7 +50,6 @@ public class TsjThread implements Runnable {
wcsSrgvQueueService = SpringUtils.getBean(IWcsSrgvQueueService.class); wcsSrgvQueueService = SpringUtils.getBean(IWcsSrgvQueueService.class);
wcsSrgvMapService = SpringUtils.getBean(IWcsSrgvMapService.class); wcsSrgvMapService = SpringUtils.getBean(IWcsSrgvMapService.class);
} }
@Override @Override
@@ -103,10 +104,6 @@ public class TsjThread implements Runnable {
if (czfs == 2 && sbzt == 2 && jdbz == 2 && rwh > 500) { if (czfs == 2 && sbzt == 2 && jdbz == 2 && rwh > 500) {
createSRgvQueueTsjQd(rwh, tsj); createSRgvQueueTsjQd(rwh, tsj);
} }
// 提升机放货途中 取消当前小车的路径
if (czfs == 2 && sbzt == 2 && jdbz == 3 && rwh > 500) {
removePathCar(rwh, tsj);
}
/* /*
* 2、任务完成 * 2、任务完成
@@ -129,15 +126,6 @@ public class TsjThread implements Runnable {
} }
private void removePathCar(Long rwh, DeviceTsj tsj) {
WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueService.selectWcsSrgvQueueByTaskNo(String.valueOf(rwh));
DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(wcsSrgvQueue.getAgvId());
if (!deviceSrgv.getCurrSite().equals("07050"+wcsSrgvQueue.getTheFloor()) && tsj.getHczt() == 1 && !wcsSrgvQueue.getPathInfo().isEmpty() && java.util.Arrays.asList(wcsSrgvQueue.getPathInfo().trim().replaceAll(",$", "").split(",")).contains("07050"+wcsSrgvQueue.getTheFloor())&&wcsSrgvQueue.getEndSite().equals("tsj")) {
wcsSrgvQueue.setPathInfo("");
wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue);
}
}
// 下发提升机启动 // 下发提升机启动
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()) {
@@ -198,42 +186,9 @@ public class TsjThread implements Runnable {
break; break;
case "2": case "2":
//出库 //出库
// startSite="tsj";
startSite = "09050" + tsj.getDqcs(); startSite = "09050" + tsj.getDqcs();
// 如果提升机当前层等于1 并且是出库任务,更新出库点位为出库缓存点 endSite = wcsSrgvQueue.getCargoPlaceSite();
// Integer i = mydoJobService.selectMydoJobCountOut();
if (tsj.getDqcs() == 1 && "2".equals(wcsSrgvQueue.getDefault02())) {
WcsSrgvMap wcsSrgvMapParam = new WcsSrgvMap();
wcsSrgvMapParam.setRemark("outCache");
List<WcsSrgvMap> wcsSrgvMaps = wcsSrgvMapService.selectWcsSrgvMapList(wcsSrgvMapParam);
List<String> cacheSite = wcsSrgvMaps.stream().sorted(Comparator.comparing(WcsSrgvMap::getSiteId)).map(WcsSrgvMap::getSiteId).collect(Collectors.toList());
List<String> currentSRgvSite = new ArrayList<>();
// 判断是否有车是在一样的位置
for (String srgvCode : PlcSrgvRead.deviceSrgvMap.keySet()) {
currentSRgvSite.add(PlcSrgvRead.deviceSrgvMap.get(srgvCode).getCurrSite());
}
cacheSite.removeAll(currentSRgvSite);
if (CollUtil.isNotEmpty(cacheSite)) {
for (String cache : cacheSite) {
WcsSrgvQueue wcsSrgvQueueParam = new WcsSrgvQueue();
wcsSrgvQueueParam.setEndSite(cache);
// 判断是否有车要去这个缓存点 没有就更新
List<WcsSrgvQueue> wcsSrgvQueues1 = wcsSrgvQueueService.selectWcsSrgvQueueList(wcsSrgvQueueParam);
// WcsSrgvQueue wcsSrgvQueueParam1 = new WcsSrgvQueue();
// wcsSrgvQueueParam1.setStartSite(cache);
// // 并且从缓存点走的
// List<WcsSrgvQueue> wcsSrgvQueues2 = wcsSrgvQueueService.selectWcsSrgvQueueList(wcsSrgvQueueParam1);
if (CollUtil.isEmpty(wcsSrgvQueues1)) {
wcsSrgvQueue.setStartSite(startSite);
wcsSrgvQueue.setEndSite(cacheSite.get(0));
wcsSrgvQueue.setDefault02("7");
wcsSrgvQueueService.updateWcsSrgvQueue(wcsSrgvQueue);
return;
}
}
}
} else {
endSite = wcsSrgvQueue.getCargoPlaceSite();
}
break; break;
case "3": case "3":
break; break;
@@ -263,7 +218,7 @@ public class TsjThread implements Runnable {
List<DeviceSrgv> collect = PlcSrgvRead.deviceSrgvMap.values().stream().filter(d -> List<DeviceSrgv> collect = PlcSrgvRead.deviceSrgvMap.values().stream().filter(d ->
d.getCurrSite().equals(cargoPickSite)) d.getCurrSite().equals(cargoPickSite))
.collect(Collectors.toList()); .collect(Collectors.toList());
if ((count > 0 || !collect.isEmpty()) && tsj.getDqcs() == 1) { if (count > 0 || !collect.isEmpty()) {
wcsSrgvQueue.setEndSite("070301"); wcsSrgvQueue.setEndSite("070301");
} else { } else {
wcsSrgvQueue.setEndSite(cargoPickSite); wcsSrgvQueue.setEndSite(cargoPickSite);
@@ -312,8 +267,7 @@ public class TsjThread implements Runnable {
for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) { for (String sRgv : PlcSrgvRead.deviceSrgvMap.keySet()) {
DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(sRgv); DeviceSrgv deviceSrgv = PlcSrgvRead.deviceSrgvMap.get(sRgv);
Integer count = tsjDeviceExecutionQueueService.selectCount(); Integer count = tsjDeviceExecutionQueueService.selectCount();
WcsSrgvQueue wcsSrgvQueue1 = wcsSrgvQueueService.selectWcsSrgvQueueByTaskNo(String.valueOf(deviceSrgv.getTaskNo())); if (deviceSrgv.getSpare2().equals("1") && deviceSrgv.getTaskNo() > 0 && count == 0) {
if (deviceSrgv.getSpare2().equals("1") && deviceSrgv.getTaskNo() > 0 && count == 0 && wcsSrgvQueue1.getEndSite().equals("tsj")) {
//请求进入输送机 //请求进入输送机
WcsSrgvQueue sRgvQueueParam = new WcsSrgvQueue(); WcsSrgvQueue sRgvQueueParam = new WcsSrgvQueue();
sRgvQueueParam.setAgvId(Convert.toStr(deviceSrgv.getDeviceId())); sRgvQueueParam.setAgvId(Convert.toStr(deviceSrgv.getDeviceId()));

View File

@@ -1,104 +0,0 @@
package com.ruoyi.system.controller;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.AgvContainerTask;
import com.ruoyi.system.service.IAgvContainerTaskService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* agv料架搬运任务Controller
*
* @author ruoyi
* @date 2026-05-15
*/
@RestController
@RequestMapping("/system/task")
public class AgvContainerTaskController extends BaseController
{
@Autowired
private IAgvContainerTaskService agvContainerTaskService;
/**
* 查询agv料架搬运任务列表
*/
@PreAuthorize("@ss.hasPermi('system:task:list')")
@GetMapping("/list")
public TableDataInfo list(AgvContainerTask agvContainerTask)
{
startPage();
List<AgvContainerTask> list = agvContainerTaskService.selectAgvContainerTaskList(agvContainerTask);
return getDataTable(list);
}
/**
* 导出agv料架搬运任务列表
*/
@PreAuthorize("@ss.hasPermi('system:task:export')")
@Log(title = "agv料架搬运任务", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, AgvContainerTask agvContainerTask)
{
List<AgvContainerTask> list = agvContainerTaskService.selectAgvContainerTaskList(agvContainerTask);
ExcelUtil<AgvContainerTask> util = new ExcelUtil<AgvContainerTask>(AgvContainerTask.class);
util.exportExcel(response, list, "agv料架搬运任务数据");
}
/**
* 获取agv料架搬运任务详细信息
*/
@PreAuthorize("@ss.hasPermi('system:task:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
return success(agvContainerTaskService.selectAgvContainerTaskById(id));
}
/**
* 新增agv料架搬运任务
*/
@PreAuthorize("@ss.hasPermi('system:task:add')")
@Log(title = "agv料架搬运任务", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody AgvContainerTask agvContainerTask)
{
return toAjax(agvContainerTaskService.insertAgvContainerTask(agvContainerTask));
}
/**
* 修改agv料架搬运任务
*/
@PreAuthorize("@ss.hasPermi('system:task:edit')")
@Log(title = "agv料架搬运任务", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody AgvContainerTask agvContainerTask)
{
return toAjax(agvContainerTaskService.updateAgvContainerTask(agvContainerTask));
}
/**
* 删除agv料架搬运任务
*/
@PreAuthorize("@ss.hasPermi('system:task:remove')")
@Log(title = "agv料架搬运任务", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids)
{
return toAjax(agvContainerTaskService.deleteAgvContainerTaskByIds(ids));
}
}

View File

@@ -1,173 +0,0 @@
package com.ruoyi.system.domain;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* agv料架搬运任务对象 agv_container_task
*
* @author ruoyi
* @date 2026-05-15
*/
public class AgvContainerTask extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** $column.columnComment */
private Long id;
/** 作业编码 */
@Excel(name = "作业编码")
private String container;
/** 起点 */
@Excel(name = "起点")
private String startPoint;
/** 终点 */
@Excel(name = "终点")
private String endPoint;
/** 开始时间 */
@Excel(name = "开始时间")
private String startTime;
/** 结束时间 */
@Excel(name = "结束时间")
private String finishTime;
/** 任务号 */
@Excel(name = "任务号")
private String taskNo;
/** 任务状态 0-创建 1-执行中 2-完成 */
@Excel(name = "任务状态 0-创建 1-执行中 2-完成")
private String status;
/** 任务类型 */
@Excel(name = "任务类型")
private String spare1;
/** 托盘码 */
@Excel(name = "托盘码")
private String spare2;
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setContainer(String container)
{
this.container = container;
}
public String getContainer()
{
return container;
}
public void setStartPoint(String startPoint)
{
this.startPoint = startPoint;
}
public String getStartPoint()
{
return startPoint;
}
public void setEndPoint(String endPoint)
{
this.endPoint = endPoint;
}
public String getEndPoint()
{
return endPoint;
}
public void setStartTime(String startTime)
{
this.startTime = startTime;
}
public String getStartTime()
{
return startTime;
}
public void setFinishTime(String finishTime)
{
this.finishTime = finishTime;
}
public String getFinishTime()
{
return finishTime;
}
public void setTaskNo(String taskNo)
{
this.taskNo = taskNo;
}
public String getTaskNo()
{
return taskNo;
}
public void setStatus(String status)
{
this.status = status;
}
public String getStatus()
{
return status;
}
public void setSpare1(String spare1)
{
this.spare1 = spare1;
}
public String getSpare1()
{
return spare1;
}
public void setSpare2(String spare2)
{
this.spare2 = spare2;
}
public String getSpare2()
{
return spare2;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("container", getContainer())
.append("startPoint", getStartPoint())
.append("endPoint", getEndPoint())
.append("createTime", getCreateTime())
.append("startTime", getStartTime())
.append("finishTime", getFinishTime())
.append("taskNo", getTaskNo())
.append("status", getStatus())
.append("spare1", getSpare1())
.append("spare2", getSpare2())
.toString();
}
}

View File

@@ -1,68 +0,0 @@
package com.ruoyi.system.mapper;
import java.util.List;
import com.ruoyi.system.domain.AgvContainerTask;
/**
* agv料架搬运任务Mapper接口
*
* @author ruoyi
* @date 2026-05-15
*/
public interface AgvContainerTaskMapper
{
/**
* 查询agv料架搬运任务
*
* @param id agv料架搬运任务主键
* @return agv料架搬运任务
*/
public AgvContainerTask selectAgvContainerTaskById(Long id);
/**
* 查询agv料架搬运任务列表
*
* @param agvContainerTask agv料架搬运任务
* @return agv料架搬运任务集合
*/
public List<AgvContainerTask> selectAgvContainerTaskList(AgvContainerTask agvContainerTask);
/**
* 新增agv料架搬运任务
*
* @param agvContainerTask agv料架搬运任务
* @return 结果
*/
public int insertAgvContainerTask(AgvContainerTask agvContainerTask);
/**
* 修改agv料架搬运任务
*
* @param agvContainerTask agv料架搬运任务
* @return 结果
*/
public int updateAgvContainerTask(AgvContainerTask agvContainerTask);
/**
* 删除agv料架搬运任务
*
* @param id agv料架搬运任务主键
* @return 结果
*/
public int deleteAgvContainerTaskById(Long id);
public int deleteAgvContainerTaskByContainer(String orderId);
/**
* 批量删除agv料架搬运任务
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteAgvContainerTaskByIds(Long[] ids);
void insertAgvContainerTaskFinish(String orderId);
void updateAgvContainerTaskByOrder(String orderId);
AgvContainerTask selectAgvContainerFinishOne();
}

View File

@@ -1,63 +0,0 @@
package com.ruoyi.system.service;
import java.util.List;
import com.ruoyi.system.domain.AgvContainerTask;
/**
* agv料架搬运任务Service接口
*
* @author ruoyi
* @date 2026-05-15
*/
public interface IAgvContainerTaskService
{
/**
* 查询agv料架搬运任务
*
* @param id agv料架搬运任务主键
* @return agv料架搬运任务
*/
public AgvContainerTask selectAgvContainerTaskById(Long id);
/**
* 查询agv料架搬运任务列表
*
* @param agvContainerTask agv料架搬运任务
* @return agv料架搬运任务集合
*/
public List<AgvContainerTask> selectAgvContainerTaskList(AgvContainerTask agvContainerTask);
/**
* 新增agv料架搬运任务
*
* @param agvContainerTask agv料架搬运任务
* @return 结果
*/
public int insertAgvContainerTask(AgvContainerTask agvContainerTask);
/**
* 修改agv料架搬运任务
*
* @param agvContainerTask agv料架搬运任务
* @return 结果
*/
public int updateAgvContainerTask(AgvContainerTask agvContainerTask);
/**
* 批量删除agv料架搬运任务
*
* @param ids 需要删除的agv料架搬运任务主键集合
* @return 结果
*/
public int deleteAgvContainerTaskByIds(Long[] ids);
/**
* 删除agv料架搬运任务信息
*
* @param id agv料架搬运任务主键
* @return 结果
*/
public int deleteAgvContainerTaskById(Long id);
void deleteAgvContainerTaskByOrderId(String container);
}

View File

@@ -1,100 +0,0 @@
package com.ruoyi.system.service.impl;
import java.util.List;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.AgvContainerTaskMapper;
import com.ruoyi.system.domain.AgvContainerTask;
import com.ruoyi.system.service.IAgvContainerTaskService;
/**
* agv料架搬运任务Service业务层处理
*
* @author ruoyi
* @date 2026-05-15
*/
@Service
public class AgvContainerTaskServiceImpl implements IAgvContainerTaskService
{
@Autowired
private AgvContainerTaskMapper agvContainerTaskMapper;
/**
* 查询agv料架搬运任务
*
* @param id agv料架搬运任务主键
* @return agv料架搬运任务
*/
@Override
public AgvContainerTask selectAgvContainerTaskById(Long id)
{
return agvContainerTaskMapper.selectAgvContainerTaskById(id);
}
/**
* 查询agv料架搬运任务列表
*
* @param agvContainerTask agv料架搬运任务
* @return agv料架搬运任务
*/
@Override
public List<AgvContainerTask> selectAgvContainerTaskList(AgvContainerTask agvContainerTask)
{
return agvContainerTaskMapper.selectAgvContainerTaskList(agvContainerTask);
}
/**
* 新增agv料架搬运任务
*
* @param agvContainerTask agv料架搬运任务
* @return 结果
*/
@Override
public int insertAgvContainerTask(AgvContainerTask agvContainerTask)
{
agvContainerTask.setCreateTime(DateUtils.getNowDate());
return agvContainerTaskMapper.insertAgvContainerTask(agvContainerTask);
}
/**
* 修改agv料架搬运任务
*
* @param agvContainerTask agv料架搬运任务
* @return 结果
*/
@Override
public int updateAgvContainerTask(AgvContainerTask agvContainerTask)
{
return agvContainerTaskMapper.updateAgvContainerTask(agvContainerTask);
}
/**
* 批量删除agv料架搬运任务
*
* @param ids 需要删除的agv料架搬运任务主键
* @return 结果
*/
@Override
public int deleteAgvContainerTaskByIds(Long[] ids)
{
return agvContainerTaskMapper.deleteAgvContainerTaskByIds(ids);
}
/**
* 删除agv料架搬运任务信息
*
* @param id agv料架搬运任务主键
* @return 结果
*/
@Override
public int deleteAgvContainerTaskById(Long id)
{
return agvContainerTaskMapper.deleteAgvContainerTaskById(id);
}
@Override
public void deleteAgvContainerTaskByOrderId(String container) {
agvContainerTaskMapper.deleteAgvContainerTaskByContainer(container);
}
}

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=",">
@@ -144,13 +149,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{reqCode} #{reqCode}
</foreach> </foreach>
</delete> </delete>
<select id="selectKx" parameterType="java.util.Map" statementType="CALLABLE">
{call proc_select_kx(#{v_position,mode=IN,jdbcType=VARCHAR},
#{v_orderId,mode=IN,jdbcType=VARCHAR},
#{v_type,mode=IN,jdbcType=VARCHAR},
#{v_result,mode=OUT,jdbcType=INTEGER},
#{v_result_msg,mode=OUT,jdbcType=VARCHAR})}
</select>
</mapper> </mapper>

View File

@@ -182,7 +182,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<trim prefix="SET" suffixOverrides=","> <trim prefix="SET" suffixOverrides=",">
<if test="setFloor != null">set_floor = #{setFloor},</if> <if test="setFloor != null">set_floor = #{setFloor},</if>
<if test="powerTime != null">power_time = #{powerTime},</if> <if test="powerTime != null">power_time = #{powerTime},</if>
<if test="lastTime != null">last_time = #{lastTime},</if>
<if test="agvStatus != null">agv_status = #{agvStatus},</if> <if test="agvStatus != null">agv_status = #{agvStatus},</if>
<if test="taskNo != null">task_no = #{taskNo},</if> <if test="taskNo != null">task_no = #{taskNo},</if>
<if test="srcSite != null">src_site = #{srcSite},</if> <if test="srcSite != null">src_site = #{srcSite},</if>
@@ -227,6 +227,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</delete> </delete>
<update id="updateLastTimeByAgvId" parameterType="String"> <update id="updateLastTimeByAgvId" parameterType="String">
update device_srgv set last_time =convert(varchar,getdate(),120) where guid=#{agvId} update device_srgv set last_time =getdate() where agv_id=#{agvId}
</update> </update>
</mapper> </mapper>

View File

@@ -47,8 +47,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="priority != null "> and priority = #{priority}</if> <if test="priority != null "> and priority = #{priority}</if>
<if test="executionPhase != null and executionPhase != ''"> and execution_phase = #{executionPhase}</if> <if test="executionPhase != null and executionPhase != ''"> and execution_phase = #{executionPhase}</if>
<if test="inOrOut != null and inOrOut != ''"> and in_or_out = #{inOrOut}</if> <if test="inOrOut != null and inOrOut != ''"> and in_or_out = #{inOrOut}</if>
<if test="startTime != null and startTime != ''"> and finish_time &gt;= #{startTime}</if> <if test="startTime != null and startTime != ''"> and start_time = #{startTime}</if>
<if test="finishTime != null and finishTime != ''"> and finish_time &lt;= #{finishTime}</if> <if test="finishTime != null and finishTime != ''"> and finish_time = #{finishTime}</if>
<if test="entranceId != null and entranceId != ''"> and entrance_id = #{entranceId}</if> <if test="entranceId != null and entranceId != ''"> and entrance_id = #{entranceId}</if>
<if test="exitId != null and exitId != ''"> and exit_id = #{exitId}</if> <if test="exitId != null and exitId != ''"> and exit_id = #{exitId}</if>
<if test="warehouseId != null and warehouseId != ''"> and warehouse_id = #{warehouseId}</if> <if test="warehouseId != null and warehouseId != ''"> and warehouse_id = #{warehouseId}</if>
@@ -229,8 +229,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="priority != null "> and priority = #{priority}</if> <if test="priority != null "> and priority = #{priority}</if>
<if test="executionPhase != null and executionPhase != ''"> and execution_phase = #{executionPhase}</if> <if test="executionPhase != null and executionPhase != ''"> and execution_phase = #{executionPhase}</if>
<if test="inOrOut != null and inOrOut != ''"> and in_or_out = #{inOrOut}</if> <if test="inOrOut != null and inOrOut != ''"> and in_or_out = #{inOrOut}</if>
<if test="startTime != null and startTime != ''"> and finish_time &gt;= #{startTime}</if> <if test="startTime != null and startTime != ''"> and start_time = #{startTime}</if>
<if test="finishTime != null and finishTime != ''"> and finish_time &lt;= #{finishTime}</if> <if test="finishTime != null and finishTime != ''"> and finish_time = #{finishTime}</if>
<if test="entranceId != null and entranceId != ''"> and entrance_id = #{entranceId}</if> <if test="entranceId != null and entranceId != ''"> and entrance_id = #{entranceId}</if>
<if test="exitId != null and exitId != ''"> and exit_id = #{exitId}</if> <if test="exitId != null and exitId != ''"> and exit_id = #{exitId}</if>
<if test="warehouseId != null and warehouseId != ''"> and warehouse_id = #{warehouseId}</if> <if test="warehouseId != null and warehouseId != ''"> and warehouse_id = #{warehouseId}</if>
@@ -251,40 +251,50 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectMydoJobOut" resultMap="MydoJobResult"> <select id="selectMydoJobOut" resultMap="MydoJobResult">
WITH floor_group AS ( WITH floor_group AS (
SELECT SELECT
b.cargo_space_id, b.cargo_space_id,
b.group_coding_no, b.group_coding_no,
b.the_floor, b.the_floor,
b.group_coding, b.group_coding,
a.task_no, a.task_no AS task_no,
a.job_id, a.job_id AS job_id,
a.in_or_out, a.in_or_out, -- 之前新增的字段
a.target_cargo_space_id, a.target_cargo_space_id, -- 新增字段:加入target_cargo_space_id
ROW_NUMBER() OVER ( ROW_NUMBER() OVER (PARTITION BY b.the_floor ORDER BY b.group_coding DESC) AS rn
PARTITION BY b.the_floor, b.group_coding_no FROM
ORDER BY b.group_coding DESC, mydo_job_wcs a
CASE WHEN a.in_or_out = 30 THEN 0 ELSE 1 END, INNER JOIN bas_cargo_space b
a.create_time ASC, ON a.cargo_space_id = b.cargo_space_id
a.job_id ASC AND a.the_floor = b.the_floor
) AS rn WHERE
FROM mydo_job_wcs a a.in_or_out >= 20
INNER JOIN bas_cargo_space b AND a.status = '1'
ON a.cargo_space_id = b.cargo_space_id GROUP BY
AND a.the_floor = b.the_floor b.group_coding_no,
WHERE a.in_or_out >= 20 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 SELECT
cargo_space_id, cargo_space_id,
group_coding_no, group_coding_no,
the_floor, the_floor,
group_coding, task_no,
task_no, job_id,
job_id, in_or_out, -- 之前新增的展示字段
in_or_out, target_cargo_space_id -- 最终查询结果中显示该字段
target_cargo_space_id FROM
FROM floor_group floor_group
WHERE rn = 1 -- ✅ 每次每层每个通道只取 1 条 WHERE
ORDER BY group_coding DESC; rn &lt;= 1
ORDER BY
group_coding DESC;
</select> </select>
<select id="selectMydoJobByTrayCode" resultMap="MydoJobResult"> <select id="selectMydoJobByTrayCode" resultMap="MydoJobResult">
<include refid="selectMydoJobVo"/> <include refid="selectMydoJobVo"/>
@@ -300,37 +310,5 @@ select count(1) from mydo_job_wcs where in_or_out>=20 and exit_id = #{exitId}
select count(1) from mydo_job_wcs select count(1) from mydo_job_wcs
</select> </select>
<select id="selectMydoJobIn" resultType="java.lang.Integer">
select count(1) from mydo_job_wcs where in_or_out &lt;20 and cargo_space_id is null and status='3' and execution_phase='1'
</select>
<select id="selectMydoJobCountOut" resultType="java.lang.Integer">
select count(1) from mydo_job_wcs where in_or_out>20
</select>
<select id="selectByJobOut" parameterType="java.lang.Integer" resultType="java.lang.Integer">
select count(1)
from mydo_job_wcs
where in_or_out > 20
and status = '1'
</select>
<select id="selectByJobOutIsOne" parameterType="java.lang.Integer" resultType="java.lang.Integer">
select count(1) from mydo_job_wcs where in_or_out>20 and status='1' and the_floor=1
</select>
<select id="selectMydoJobExit" parameterType="string" resultType="integer">
select count(1) from mydo_job_wcs where in_or_out>20 and exit_id=#{exit}
</select>
<select id="selectTheFloorYk" parameterType="string" resultType="java.lang.Integer">
select count(1) from mydo_job_wcs where the_floor=#{theFloor} and in_or_out=30
</select>
<delete id="deleteMydoJobByTaskNos">
delete from mydo_job_wcs where task_no in
<foreach item="taskNo" collection="taskNos" open="(" separator="," close=")">
#{taskNo}
</foreach>
</delete>
</mapper> </mapper>

View File

@@ -227,10 +227,5 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select> </select>
<select id="selectTaskNosByGuids" parameterType="String" resultType="string">
select task_no from wcs_srgv_queue where guid in
<foreach item="guid" collection="array" open="(" separator="," close=")">
#{guid}
</foreach>
</select>
</mapper> </mapper>

View File

@@ -1,116 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.AgvContainerTaskMapper">
<resultMap type="AgvContainerTask" id="AgvContainerTaskResult">
<result property="id" column="id" />
<result property="container" column="container" />
<result property="startPoint" column="start_point" />
<result property="endPoint" column="end_point" />
<result property="createTime" column="create_time" />
<result property="startTime" column="start_time" />
<result property="finishTime" column="finish_time" />
<result property="taskNo" column="task_no" />
<result property="status" column="status" />
<result property="spare1" column="spare1" />
<result property="spare2" column="spare2" />
</resultMap>
<sql id="selectAgvContainerTaskVo">
select id, container, start_point, end_point, create_time, start_time, finish_time, task_no, status, spare1, spare2 from agv_container_task
</sql>
<select id="selectAgvContainerTaskList" parameterType="AgvContainerTask" resultMap="AgvContainerTaskResult">
<include refid="selectAgvContainerTaskVo"/>
<where>
<if test="container != null and container != ''"> and container = #{container}</if>
<if test="startPoint != null and startPoint != ''"> and start_point = #{startPoint}</if>
<if test="endPoint != null and endPoint != ''"> and end_point = #{endPoint}</if>
<if test="startTime != null and startTime != ''"> and start_time = #{startTime}</if>
<if test="finishTime != null and finishTime != ''"> and finish_time = #{finishTime}</if>
<if test="taskNo != null and taskNo != ''"> and task_no = #{taskNo}</if>
<if test="status != null and status != ''"> and status = #{status}</if>
<if test="spare1 != null and spare1 != ''"> and spare1 = #{spare1}</if>
<if test="spare2 != null and spare2 != ''"> and spare2 = #{spare2}</if>
</where>
</select>
<select id="selectAgvContainerTaskById" parameterType="Long" resultMap="AgvContainerTaskResult">
<include refid="selectAgvContainerTaskVo"/>
where id = #{id}
</select>
<insert id="insertAgvContainerTask" parameterType="AgvContainerTask" useGeneratedKeys="true" keyProperty="id">
insert into agv_container_task
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="container != null">container,</if>
<if test="startPoint != null">start_point,</if>
<if test="endPoint != null">end_point,</if>
<if test="createTime != null">create_time,</if>
<if test="startTime != null">start_time,</if>
<if test="finishTime != null">finish_time,</if>
<if test="taskNo != null">task_no,</if>
<if test="status != null">status,</if>
<if test="spare1 != null">spare1,</if>
<if test="spare2 != null">spare2,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="container != null">#{container},</if>
<if test="startPoint != null">#{startPoint},</if>
<if test="endPoint != null">#{endPoint},</if>
<if test="createTime != null">#{createTime},</if>
<if test="startTime != null">#{startTime},</if>
<if test="finishTime != null">#{finishTime},</if>
<if test="taskNo != null">#{taskNo},</if>
<if test="status != null">#{status},</if>
<if test="spare1 != null">#{spare1},</if>
<if test="spare2 != null">#{spare2},</if>
</trim>
</insert>
<update id="updateAgvContainerTask" parameterType="AgvContainerTask">
update agv_container_task
<trim prefix="SET" suffixOverrides=",">
<if test="container != null">container = #{container},</if>
<if test="startPoint != null">start_point = #{startPoint},</if>
<if test="endPoint != null">end_point = #{endPoint},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="startTime != null">start_time = #{startTime},</if>
<if test="finishTime != null">finish_time = #{finishTime},</if>
<if test="taskNo != null">task_no = #{taskNo},</if>
<if test="status != null">status = #{status},</if>
<if test="spare1 != null">spare1 = #{spare1},</if>
<if test="spare2 != null">spare2 = #{spare2},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteAgvContainerTaskById" parameterType="Long">
delete from agv_container_task where id = #{id}
</delete>
<delete id="deleteAgvContainerTaskByContainer" parameterType="string">
delete from agv_container_task where container = #{container}
</delete>
<delete id="deleteAgvContainerTaskByIds" parameterType="String">
delete from agv_container_task where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
<select id="insertAgvContainerTaskFinish" parameterType="string">
insert into agv_container_task_finish select * from agv_container_task where container=#{orderId}
</select>
<update id="updateAgvContainerTaskByOrder" parameterType="string">
update agv_container_task set status='2' where container=#{orderId}
</update>
<select id="selectAgvContainerFinishOne" resultMap="AgvContainerTaskResult">
select top 1 * from agv_container_task where status='2'
</select>
</mapper>

View File

@@ -26,7 +26,9 @@ public class AjaxResult extends HashMap<String, Object>
/** /**
* 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。 * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。
*/ */
public AjaxResult()
{
}
/** /**
* 初始化一个新创建的 AjaxResult 对象 * 初始化一个新创建的 AjaxResult 对象

View File

@@ -116,9 +116,10 @@ public class SecurityConfig
.antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
.antMatchers("/swagger-ui.html", "/changeLanguage", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**", "/pda/**").permitAll() .antMatchers("/swagger-ui.html", "/changeLanguage", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**", "/pda/**").permitAll()
.antMatchers("/device/operation/**").permitAll() .antMatchers("/device/operation/**").permitAll()
.antMatchers("/api/agv/**").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 // 前端端口