This commit is contained in:
1009473166@qq.com
2026-07-31 10:33:15 +08:00
parent cbc76be62f
commit b206402e13
59 changed files with 2181 additions and 950 deletions

View File

@@ -1,26 +0,0 @@
package com.ruoyi;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
* 启动程序
*
* @author ruoyi
*/
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
@EnableScheduling
@EnableAsync
public class RuoYiApplication
{
public static void main(String[] args)
{
// System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(RuoYiApplication.class, args);
System.out.println("(♥◠‿◠)ノ゙ 福来瑞达WCS系统启动成功 ლ(´ڡ`ლ)゙ ");
}
}

View File

@@ -1,30 +1,43 @@
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.AgvCallbackResponse;
import com.ruoyi.api.service.IApiService;
import com.ruoyi.common.core.controller.BaseController;
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 org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Agv操作请求
*/
@RestController
@RequestMapping("/agv/api")
@RequestMapping("/api/agv")
@Slf4j
public class AgvController extends BaseController {
@Autowired
private IApiService apiService;
@Autowired
private AgvQueueServiceImpl agvQueueService;
@Autowired
private AgvContainerTaskMapper agvContainerTaskMapper;
/**
* agv执行状态返回接口
*
* @param request
* @return
*/
@@ -34,15 +47,14 @@ public class AgvController extends BaseController {
}
/**
* agv搬运作业
* @param param{
* startPoint:起始点
* endPoint:结束点
* containerCode:容器编号
* taskNo:任务号
* }
*
* @param param{ startPoint:起始点
* endPoint:结束点
* containerCode:容器编号
* taskNo:任务号
* }
* @return
*/
@PostMapping("/receiveAgvMoveJob")
@@ -50,4 +62,98 @@ public class AgvController extends BaseController {
return apiService.receiveAgvMoveJob(param);
}
/**
* 获取AGV任务定时器
*/
@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,10 +1,12 @@
package com.ruoyi.api.controller;
import cn.hutool.json.JSONObject;
import com.ruoyi.api.domain.wcs2wms.JobParam;
import com.ruoyi.api.domain.wcs2wms.ReceiveJob;
import com.ruoyi.api.service.IApiService;
import com.ruoyi.common.core.domain.AjaxResult;
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.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -53,4 +55,5 @@ public class Wcs2WmsController {
}

View File

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

View File

@@ -121,6 +121,10 @@ public interface IApiService
*/
public AjaxResult createInMydoJob(Map<String, Object> param);
public AjaxResult sendCargoSpace(Map<String, Object> param);
public AjaxResult selectMydoJobByNoTrayCode(Map<String, Object> param);
AjaxResult receiveOutMydoJob(ReceiveJob receiveOutJob);
@@ -132,4 +136,18 @@ public interface IApiService
AjaxResult allotSpace(JobParam jobParam);
AjaxResult JobFinish(Map<String, Object> param);
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

@@ -75,4 +75,6 @@ public interface IRequestLogService
* @return
*/
public RequestLog getRequestLog(String url, String param);
public RequestLog getRequestLogs(String url, String param, String endPoint);
}

View File

@@ -24,6 +24,8 @@ import com.ruoyi.job.domain.MydoJob;
import com.ruoyi.job.service.IMydoJobService;
import com.ruoyi.queue.agv.domain.AgvQueue;
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 org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -51,7 +53,8 @@ public class ApiServiceImpl implements IApiService {
private IAgvQueueService agvQueueService;
@Autowired
private IMydoJobService mydoJobService;
@Autowired
private IAgvContainerTaskService agvContainerTaskService;
/**
@@ -138,10 +141,6 @@ public class ApiServiceImpl implements IApiService {
}
/**
* 处理agv状态返回
*
@@ -196,26 +195,24 @@ public class ApiServiceImpl implements IApiService {
public AjaxResult cancelMydoJob(JobParam jobParam) {
MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo(Convert.toLong(jobParam.getTaskNo()));
if(mydoJob==null){
if (mydoJob == null) {
return AjaxResult.error("任务不存在");
}
if("1".equals(mydoJob.getStatus())){
if ("1".equals(mydoJob.getStatus())) {
mydoJob.setStatus("5");
mydoJobService.insertHistory(mydoJob.getJobId());
mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId());
return AjaxResult.success();
}else{
} else {
return AjaxResult.error("任务已开始");
}
}
@Override
public AjaxResult reAssign(JobParam 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);
MydoJob wmsMydoJob = BeanUtil.toBean(bean.getData(), MydoJob.class);
MydoJob mydoJob = mydoJobService.selectMydoJobByJobId(wmsMydoJob.getJobId());
@@ -229,7 +226,7 @@ public class ApiServiceImpl implements IApiService {
@Override
public AjaxResult reMaterial(JobParam 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.error();
@@ -347,12 +344,26 @@ public class ApiServiceImpl implements IApiService {
}
@Override
public AjaxResult sendCargoSpace(Map<String, Object> param) {
// 访问请求路径,生成入库作业 ,如果生成返回信息
RequestLog requestLog = requestLogService.getRequestLog(SEND_CARGOSPACE, "请求分配货位", JSONUtil.toJsonStr(param));
if ("1".equals(requestLog.getIsSuccessful())) {
InterfaceReceive bean = JSONUtil.toBean(requestLog.getResponseBody(), InterfaceReceive.class);
return AjaxResult.success(bean.getData());
} else {
return AjaxResult.error();
}
}
@Override
public AjaxResult receiveOutMydoJob(ReceiveJob receiveOutJob) {
MydoJob mydoJob = new MydoJob();
mydoJob.setJobId(receiveOutJob.getJobId());
mydoJob.setTaskNo(receiveOutJob.getTaskNo());
mydoJob.setCargoSpaceId(receiveOutJob.getCargoSpaceId());
mydoJob.setTargetCargoSpaceId(receiveOutJob.getTargetCargoSpaceId());
mydoJob.setExitId(receiveOutJob.getExitId());
mydoJob.setInOrOut(receiveOutJob.getInOrOut());
mydoJob.setStatus("1");
@@ -360,10 +371,12 @@ public class ApiServiceImpl implements IApiService {
mydoJob.setRoadwayId(receiveOutJob.getRoadwayId());
mydoJob.setCreateTime(DateUtils.getNowDate());
mydoJob.setExecutionPhase("0");
mydoJob.setTheFloor(receiveOutJob.getClassId());
mydoJob.setPriority(receiveOutJob.getPriority());
int i = mydoJobService.insertMydoJob(mydoJob);
if (i > 0) {
return AjaxResult.success();
}else{
} else {
return AjaxResult.error();
}
@@ -385,7 +398,7 @@ public class ApiServiceImpl implements IApiService {
int i = mydoJobService.insertMydoJob(mydoJob);
if (i > 0) {
return AjaxResult.success();
}else{
} else {
return AjaxResult.error();
}
}
@@ -430,4 +443,74 @@ public class ApiServiceImpl implements IApiService {
}
@Override
public AjaxResult OutMakeSure(HashMap<String, Object> map) {
RequestLog requestLog = requestLogService.getRequestLog(OUT_MAKE_SURE, "线边直出请求过账", JSONUtil.toJsonStr(map));
if ("1".equals(requestLog.getIsSuccessful())) {
InterfaceReceive bean = JSONUtil.toBean(requestLog.getResponseBody(), InterfaceReceive.class);
return AjaxResult.success(bean.getData());
} else {
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,6 +6,8 @@ import java.util.List;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.http.ContentType;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.ruoyi.api.domain.InterfaceReceive;
@@ -24,8 +26,7 @@ import com.ruoyi.api.service.IRequestLogService;
*/
@Service
@Slf4j
public class RequestLogServiceImpl implements IRequestLogService
{
public class RequestLogServiceImpl implements IRequestLogService {
@Autowired
private RequestLogMapper requestLogMapper;
@@ -36,8 +37,7 @@ public class RequestLogServiceImpl implements IRequestLogService
* @return 接口记录
*/
@Override
public RequestLog selectRequestLogByRequestId(Long requestId)
{
public RequestLog selectRequestLogByRequestId(Long requestId) {
return requestLogMapper.selectRequestLogByRequestId(requestId);
}
@@ -48,8 +48,7 @@ public class RequestLogServiceImpl implements IRequestLogService
* @return 接口记录
*/
@Override
public List<RequestLog> selectRequestLogList(RequestLog requestLog)
{
public List<RequestLog> selectRequestLogList(RequestLog requestLog) {
return requestLogMapper.selectRequestLogList(requestLog);
}
@@ -60,11 +59,10 @@ public class RequestLogServiceImpl implements IRequestLogService
* @return 结果
*/
@Override
public int insertRequestLog(RequestLog requestLog)
{
if ("1".equals(requestLog.getIsSuccessful())){
public int insertRequestLog(RequestLog requestLog) {
if ("1".equals(requestLog.getIsSuccessful())) {
return requestLogMapper.insertRequestLog(requestLog);
}else {
} else {
//log.error("请求失败:" + requestLog.getErrorDetails());
return 0;
}
@@ -77,8 +75,7 @@ public class RequestLogServiceImpl implements IRequestLogService
* @return 结果
*/
@Override
public int updateRequestLog(RequestLog requestLog)
{
public int updateRequestLog(RequestLog requestLog) {
return requestLogMapper.updateRequestLog(requestLog);
}
@@ -89,8 +86,7 @@ public class RequestLogServiceImpl implements IRequestLogService
* @return 结果
*/
@Override
public int deleteRequestLogByRequestIds(Long[] requestIds)
{
public int deleteRequestLogByRequestIds(Long[] requestIds) {
return requestLogMapper.deleteRequestLogByRequestIds(requestIds);
}
@@ -101,8 +97,7 @@ public class RequestLogServiceImpl implements IRequestLogService
* @return 结果
*/
@Override
public int deleteRequestLogByRequestId(Long requestId)
{
public int deleteRequestLogByRequestId(Long requestId) {
return requestLogMapper.deleteRequestLogByRequestId(requestId);
}
@@ -115,7 +110,7 @@ public class RequestLogServiceImpl implements IRequestLogService
* @return requestLog
*/
@Override
public RequestLog getRequestLog(String url, String endPoint,String param) {
public RequestLog getRequestLog(String url, String endPoint, String param) {
RequestLog requestLog = new RequestLog();
Date requestTime = new Date();
requestLog.setRequestTime(DateUtil.format(requestTime, "yyyy-MM-dd HH:mm:ss"));
@@ -128,15 +123,17 @@ public class RequestLogServiceImpl implements IRequestLogService
requestLog.setRequestUrl(url);
try {
String resStr = HttpUtil.post(url, param);
requestLog.setResponseBody(resStr);
InterfaceReceive bean = JSONUtil.toBean(resStr, InterfaceReceive.class);
Date responseTime =new Date();
Date responseTime = new Date();
if (bean.getCode() == 200) {
requestLog.setResponseTime(DateUtil.format(responseTime, "yyyy-MM-dd HH:mm:ss"));
requestLog.setResponseStatus("1");
requestLog.setDuration(Convert.toStr(DateUtil.between(requestTime, responseTime, DateUnit.MS)));
requestLog.setIsSuccessful("1");
}else {
} else {
requestLog.setResponseStatus("0");
requestLog.setErrorDetails(bean.getMsg());
requestLog.setIsSuccessful("0");
@@ -171,4 +168,46 @@ public class RequestLogServiceImpl implements IRequestLogService
requestLog.setDuration(Convert.toStr(DateUtil.between(requestTime, requestTime, DateUnit.MS)));
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

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

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,8 @@
package com.ruoyi.bas.srgvmap.service.impl;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.bas.srgvmap.mapper.WcsSrgvMapMapper;
@@ -9,25 +11,23 @@ import com.ruoyi.bas.srgvmap.service.IWcsSrgvMapService;
/**
* 小车点位地图表Service业务层处理
*
*
* @author ruoyi
* @date 2025-11-21
*/
@Service
public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService
{
public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService {
@Autowired
private WcsSrgvMapMapper wcsSrgvMapMapper;
/**
* 查询小车点位地图表
*
*
* @param guid 小车点位地图表主键
* @return 小车点位地图表
*/
@Override
public WcsSrgvMap selectWcsSrgvMapByGuid(String guid)
{
public WcsSrgvMap selectWcsSrgvMapByGuid(String guid) {
return wcsSrgvMapMapper.selectWcsSrgvMapByGuid(guid);
}
@@ -38,61 +38,61 @@ public class WcsSrgvMapServiceImpl implements IWcsSrgvMapService
/**
* 查询小车点位地图表列表
*
*
* @param wcsSrgvMap 小车点位地图表
* @return 小车点位地图表
*/
@Override
public List<WcsSrgvMap> selectWcsSrgvMapList(WcsSrgvMap wcsSrgvMap)
{
public List<WcsSrgvMap> selectWcsSrgvMapList(WcsSrgvMap wcsSrgvMap) {
return wcsSrgvMapMapper.selectWcsSrgvMapList(wcsSrgvMap);
}
/**
* 新增小车点位地图表
*
*
* @param wcsSrgvMap 小车点位地图表
* @return 结果
*/
@Override
public int insertWcsSrgvMap(WcsSrgvMap wcsSrgvMap)
{
public int insertWcsSrgvMap(WcsSrgvMap wcsSrgvMap) {
return wcsSrgvMapMapper.insertWcsSrgvMap(wcsSrgvMap);
}
/**
* 修改小车点位地图表
*
*
* @param wcsSrgvMap 小车点位地图表
* @return 结果
*/
@Override
public int updateWcsSrgvMap(WcsSrgvMap wcsSrgvMap)
{
public int updateWcsSrgvMap(WcsSrgvMap wcsSrgvMap) {
return wcsSrgvMapMapper.updateWcsSrgvMap(wcsSrgvMap);
}
/**
* 批量删除小车点位地图表
*
*
* @param guids 需要删除的小车点位地图表主键
* @return 结果
*/
@Override
public int deleteWcsSrgvMapByGuids(String[] guids)
{
public int deleteWcsSrgvMapByGuids(String[] guids) {
return wcsSrgvMapMapper.deleteWcsSrgvMapByGuids(guids);
}
/**
* 删除小车点位地图表信息
*
*
* @param guid 小车点位地图表主键
* @return 结果
*/
@Override
public int deleteWcsSrgvMapByGuid(String guid)
{
public int deleteWcsSrgvMapByGuid(String guid) {
return wcsSrgvMapMapper.deleteWcsSrgvMapByGuid(guid);
}
@Override
public List<WcsSrgvMap> selectNotInsite(String cache, Integer floor, ArrayList<String> sites) {
return wcsSrgvMapMapper.selectNotInsite(cache, floor, sites);
}
}

View File

@@ -4,20 +4,26 @@ package com.ruoyi.common;
public class Constant {
public static final String WMS_BASE_URL = "http://localhost:8080/api2wms/";
public static final String RCS_BASE_URL = "http://127.0.0.1:8081/rcms-dps/rest/";
public static final String RCS_BASE_URL = "http://192.168.188.251:9501/";
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 CONTINUE_TASK_URL = RCS_BASE_URL+"continueTask";
public static final String CANCEL_TASK_URL = RCS_BASE_URL+"queryAgvStatus";;
public static final String GEN_AGV_SCHEDULING_TASK = RCS_BASE_URL+"genAgvSchedulingTask";;
public static final String CREATE_IN_MYDO_JOB_URL = WMS_BASE_URL+"requestEnterByTrayCode";
public static final String SEND_CARGOSPACE = WMS_BASE_URL+"sendCargoSpace";
public static final String REQUEST_MYDO_JOB_URL = WMS_BASE_URL+"requestByNoTrayCode";
public static final String RE_ASSIGN_URL = WMS_BASE_URL+"reAssign";
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 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_02 = "02";

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -81,4 +81,22 @@ public interface MydoJobMapper
List<MydoJob> selectMydoJobFinishList(MydoJob mydoJob);
MydoJob selectRunningMydoJobByExitList(@Param("exitList") List<String> exitList);
List<MydoJob> selectMydoJobOut();
MydoJob selectMydoJobByTrayCode(String trayCode);
Integer selectExit(String ssj);
Integer selectMydoJobCount();
Integer selectMydoJobIn();
Integer selectMydoJobCountOut();
Integer selectByJobOut(Integer currFloor);
Integer selectByJobOutIsOne(Integer currFloor);
Integer selectMydoJobExit(String exit);
}

View File

@@ -80,4 +80,22 @@ public interface IMydoJobService
MydoJob selectRunningMydoJobByExitList(List<String> strings);
AjaxResult manualCallback(String jobId);
List<MydoJob> selectMydoJobOut();
MydoJob selectMydoJobByTrayCode(String trayCode);
Integer selectExit(String ssj);
Integer selectMydoJobCount();
Integer selectMydoJobIn();
Integer selectMydoJobCountOut();
Integer selectByJobOut(Integer currFloor);
Integer selectByJobOutIsOne(Integer currFloor);
Integer selectMydoJobExit(String exit);
}

View File

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

View File

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

View File

@@ -1,5 +1,6 @@
package com.ruoyi.queue.agv.service;
import java.util.HashMap;
import java.util.List;
import com.ruoyi.queue.agv.domain.AgvQueue;
@@ -71,4 +72,6 @@ public interface IAgvQueueService
* @param reqCode
*/
void insertHistory(String reqCode);
void selectKx(HashMap<String, Object> map);
}

View File

@@ -1,5 +1,6 @@
package com.ruoyi.queue.agv.service.impl;
import java.util.HashMap;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -100,4 +101,9 @@ public class AgvQueueServiceImpl implements IAgvQueueService
public void insertHistory(String reqCode) {
agvQueueMapper.insertHistory(reqCode);
}
@Override
public void selectKx(HashMap<String, Object> map) {
agvQueueMapper.selectKx(map);
}
}

View File

@@ -2,6 +2,7 @@ package com.ruoyi.queue.srgv.mapper;
import java.util.List;
import com.ruoyi.queue.srgv.domain.WcsSrgvQueue;
import org.apache.ibatis.annotations.Param;
/**
* 四向小车任务队列Mapper接口
@@ -70,4 +71,12 @@ public interface WcsSrgvQueueMapper
* @return 结果
*/
public int deleteWcsSrgvQueueByGuids(String[] guids);
String selectMinCountJob(@Param("list") List<String> outModelSSJ);
Integer selectTsj();
Integer selectByCaogoPlaceSite(String siteId);
Integer selectByEndSite();
}

View File

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

View File

@@ -12,6 +12,7 @@ import org.springframework.stereotype.Service;
import com.ruoyi.queue.srgv.mapper.WcsSrgvQueueMapper;
import com.ruoyi.queue.srgv.domain.WcsSrgvQueue;
import com.ruoyi.queue.srgv.service.IWcsSrgvQueueService;
import org.springframework.transaction.annotation.Transactional;
/**
* 四向小车任务队列Service业务层处理
@@ -98,9 +99,15 @@ public class WcsSrgvQueueServiceImpl implements IWcsSrgvQueueService
* @return 结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public int deleteWcsSrgvQueueByGuids(String[] guids)
{
return wcsSrgvQueueMapper.deleteWcsSrgvQueueByGuids(guids);
int rows = 0;
for (String guid : guids)
{
rows += deleteWcsSrgvQueueByGuid(guid);
}
return rows;
}
/**
@@ -110,11 +117,42 @@ public class WcsSrgvQueueServiceImpl implements IWcsSrgvQueueService
* @return 结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public int deleteWcsSrgvQueueByGuid(String guid)
{
WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueMapper.selectWcsSrgvQueueByGuid(guid);
if (ObjUtil.isNotNull(wcsSrgvQueue))
{
WcsSrgvQueueFinish wcsSrgvQueueFinish = new WcsSrgvQueueFinish();
BeanUtil.copyProperties(wcsSrgvQueue, wcsSrgvQueueFinish);
wcsSrgvQueueFinish.setFinishDate(DateUtil.formatDateTime(DateUtil.date()));
wcsSrgvQueueFinishMapper.insertWcsSrgvQueueFinish(wcsSrgvQueueFinish);
}
return wcsSrgvQueueMapper.deleteWcsSrgvQueueByGuid(guid);
}
@Override
public String selectMinCountJob( List<String> outModelSSJ) {
return wcsSrgvQueueMapper.selectMinCountJob(outModelSSJ) ;
}
@Override
public Integer selectTsj() {
return wcsSrgvQueueMapper.selectTsj();
}
@Override
public Integer selectByCaogoPlaceSite(String siteId) {
return wcsSrgvQueueMapper.selectByCaogoPlaceSite(siteId);
}
@Override
public Integer selectByEndSite() {
return wcsSrgvQueueMapper.selectByEndSite();
}
@Override
public WcsSrgvQueue insertHistory(String taskNo) {
WcsSrgvQueue wcsSrgvQueue = wcsSrgvQueueMapper.selectWcsSrgvQueueByTaskNo(taskNo);

View File

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

View File

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

View File

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

View File

@@ -67,12 +67,14 @@ public class PlcCdzRead implements Runnable {
}
private void plcRead(DeviceCdz deviceCdz) {
OperateResultExOne<byte[]> read2 = readWriteNet.Read(deviceCdz.getPlcDbReadAddress(), Short.parseShort("4"));
OperateResultExOne<byte[]> read2 = readWriteNet.Read(deviceCdz.getPlcDbReadAddress(), Short.parseShort("2"));
String ddsx1 = "0";
if (read2.IsSuccess) {
ddsx1 = SoftBasic.ByteToHexString(read2.Content);
deviceCdz.setStatus(ParseUtil.optInt(0, ddsx1));
deviceCdz.setModel(ParseUtil.optInt(2, ddsx1));
// deviceCdz.setModel(ParseUtil.optInt(2, ddsx1));
}else {
log.error(read2.Message);
}
}
@@ -116,8 +118,8 @@ public class PlcCdzRead implements Runnable {
}
void closeServer() {
if (readWriteNet != null) {
readWriteNet.ConnectClose();
if (siemensS7Net != null) {
siemensS7Net.ConnectClose();
}
setIsConnect(false);
}

View File

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

View File

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

View File

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

View File

@@ -1,239 +0,0 @@
package com.ruoyi.schedule.plcRead.ssj;
import HslCommunication.BasicFramework.SoftBasic;
import HslCommunication.Core.Net.IReadWriteNet;
import HslCommunication.Core.Types.OperateResult;
import HslCommunication.Core.Types.OperateResultExOne;
import HslCommunication.Profinet.Siemens.SiemensPLCS;
import HslCommunication.Profinet.Siemens.SiemensS7Net;
import com.ruoyi.common.domain.SendData;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.device.ddj.domain.MsgDdj;
import com.ruoyi.device.ssj.domain.DeviceSsj;
import com.ruoyi.common.domain.HslRead;
import com.ruoyi.common.domain.PlcConnectInfo;
import com.ruoyi.device.ssj.service.impl.DeviceSsjServiceImpl;
import com.ruoyi.schedule.plcRead.util.ParseUtil;
import com.ruoyi.schedule.plcRead.util.Tools;
import lombok.extern.slf4j.Slf4j;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
public class PlcSsjRead implements Runnable {
public static ConcurrentHashMap<String, DeviceSsj> deviceSsjMap;
public volatile boolean isRun = true;
public SiemensS7Net siemensS7Net = null;
public static IReadWriteNet readWriteNet = null;
private final String ip;
private final int port;
private boolean success = false;
public PlcSsjRead(ConcurrentHashMap<String, DeviceSsj> deviceSsjMap, PlcConnectInfo plcConnectInfo) {
PlcSsjRead.deviceSsjMap = deviceSsjMap;
this.ip = plcConnectInfo.getIp();
this.port = plcConnectInfo.getPort();
}
public static int WriteToSSJ(String address, byte[] data) {
int a = 0;
if (readWriteNet != null) {
a = HslRead.WriteResultRender(readWriteNet.Write(address, data), address);
}
return a;
}
@Override
public void run() {
while (isRun) {
try {
//todo 要读重量
if (IsConnect()) {
for (String ssjCode : deviceSsjMap.keySet()) {
DeviceSsj ssjDevice = deviceSsjMap.get(ssjCode);
switch (ssjDevice.getType()) {
case "1":
// 地堆输送机
readPlcRoadWaySsj(ssjDevice);
break;
case "3":
// 链条输送机
readPlcInOutSsj(ssjDevice);
break;
case "2":
// 线体到位输送机
readPlcOtherSsj(ssjDevice);
break;
}
}
} else {
reConnect();
}
Thread.sleep(1000);
} catch (InterruptedException e) {
// 捕获中断异常,退出循环
Thread.currentThread().interrupt(); // 重新设置中断标志
return;
} catch (Exception e) {
log.info("********IP:" + this.ip + " port:" + this.port + "读取数据异常 " + e.getMessage());
}
}
}
/**
* 其他输送机
*
* @param ssjDevice
*/
private void readPlcOtherSsj(DeviceSsj ssjDevice) {
OperateResultExOne<byte[]> read2 = readWriteNet.Read(ssjDevice.getPlcDbReadAddress(), Short.parseShort("10"));
String ddsx1 = "0";
if (read2.IsSuccess) {
ddsx1 = SoftBasic.ByteToHexString(read2.Content);
ssjDevice.setKx(ParseUtil.optInt(4, ddsx1));
ssjDevice.setDw(ParseUtil.optInt(6, ddsx1));
ssjDevice.setTaskNo(ParseUtil.optDInt(0, ddsx1));
}
}
/**
* 巷道输送机
*
* @param ssjDevice
*/
private void readPlcRoadWaySsj(DeviceSsj ssjDevice) {
OperateResultExOne<byte[]> read2 = readWriteNet.Read(ssjDevice.getPlcDbReadAddress(), Short.parseShort("10"));
String ddsx1 = "0";
if (read2.IsSuccess) {
ddsx1 = SoftBasic.ByteToHexString(read2.Content);
// ssjDevice.setRkqq(ParseUtil.optInt(0, ddsx1));
ssjDevice.setTaskNo(ParseUtil.optDInt(0, ddsx1));
ssjDevice.setKx(ParseUtil.optInt(4, ddsx1));
ssjDevice.setDw(ParseUtil.optInt(6, ddsx1));
// ssjDevice.setTrayCode(ParseUtil.optString(14, 12, ddsx1));
// ssjDevice.setModel(ParseUtil.optInt(28, ddsx1));
}
}
/**
* 入出库输送机
*
* @param ssjDevice
*/
private void readPlcInOutSsj(DeviceSsj ssjDevice) {
OperateResultExOne<byte[]> read2 = readWriteNet.Read(ssjDevice.getPlcDbReadAddress(), Short.parseShort("22"));
String ddsx1 = "0";
if (read2.IsSuccess) {
ddsx1 = SoftBasic.ByteToHexString(read2.Content);
ssjDevice.setTaskNo(ParseUtil.optDInt(2, ddsx1));
ssjDevice.setRkqq(ParseUtil.optInt(0, ddsx1));
ssjDevice.setTrayCode(ParseUtil.optString(8, 8, ddsx1));
// ssjDevice.setKx(ParseUtil.optInt(4, ddsx1));
// ssjDevice.setDw(ParseUtil.optInt(6, ddsx1));
}
}
/**
* 产线输送机
*
* @param ssjDevice
*/
private void readPlcLineSsj(DeviceSsj ssjDevice) {
OperateResultExOne<byte[]> read2 = readWriteNet.Read(ssjDevice.getPlcDbReadAddress(), Short.parseShort("220"));
String ddsx1 = "0";
if (read2.IsSuccess) {
ddsx1 = SoftBasic.ByteToHexString(read2.Content);
ssjDevice.setKx(ParseUtil.optInt(0, ddsx1));
ssjDevice.setDw(ParseUtil.optInt(2, ddsx1));
ssjDevice.setRkqq(ParseUtil.optInt(4, ddsx1));
ssjDevice.setTraySize(ParseUtil.optInt(6, ddsx1));
ssjDevice.setTaskNo(ParseUtil.optDInt(8, ddsx1));
String trayCodeReadAddress = "";
switch (ssjDevice.getDeviceCode()) {
case "G1005":
trayCodeReadAddress = "DB502.0";
break;
case "L2012":
trayCodeReadAddress = "DB503.0";
break;
case "L2013":
trayCodeReadAddress = "DB504.0";
break;
}
OperateResultExOne<byte[]> trayCodeRead = readWriteNet.Read(trayCodeReadAddress, Short.parseShort("220"));
if (trayCodeRead.IsSuccess) {
byte[] content = trayCodeRead.Content;
//去除bytes中
ssjDevice.setTrayCode(ParseUtil.filterAndConvert(trayCodeRead.Content));
}
}
}
void ConnectServer() {
siemensS7Net = new SiemensS7Net(SiemensPLCS.S1500);
try {
siemensS7Net.setIpAddress(this.ip);
siemensS7Net.setPort(this.port);
siemensS7Net.setRack((byte) 0);
siemensS7Net.setSlot((byte) 1);
OperateResult connect = siemensS7Net.ConnectServer();
if (connect.IsSuccess) {
setIsConnect(true);
readWriteNet = siemensS7Net;
}
} catch (Exception ex) {
log.info("********IP:" + this.ip + " port:" + this.port + "连接失败 " + ex.getMessage());
}
}
public void setIsConnect(boolean bflag) {
if (!success) {
success = bflag;
}
}
public boolean IsConnect() {
if (success) {
return success;
}
return false;
}
void reConnect() {
closeServer();
ConnectServer();
log.info("重新连接 SSJ-PLC");
}
void closeServer() {
if (readWriteNet != null) {
readWriteNet.ConnectClose();
}
setIsConnect(false);
}
public static int writeToSsj(String address, String taskNo, int qx, int completed) {
int jym = Tools.getJYM(Integer.parseInt(taskNo), qx, completed);
SendData taskNoSendData = new SendData(Tools.DINT, taskNo);
SendData qxSendData = new SendData(Tools.INT, qx);
SendData completedSendData = new SendData(Tools.INT, completed);
SendData jymSendData = new SendData(Tools.DINT, jym);
byte[] bytes = Tools.sendData(taskNoSendData, qxSendData, completedSendData, jymSendData);
return PlcSsjRead.WriteToSSJ(address, bytes);
}
}

View File

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

View File

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

View File

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

View File

@@ -46,6 +46,13 @@ public class SsjThread implements Runnable {
ssjCodes2.add("L1004");
ssjCodes2.add("L1005");
ssjCodeList.put("road", ssjCodes2);
ArrayList<String> ssjCodes4 = new ArrayList<>();
ssjCodes4.add("L1006");
ssjCodes4.add("L1003");
ssjCodeList.put("error", ssjCodes4);
mydoJobService = SpringUtils.getBean(IMydoJobService.class);
jobCallBackService = SpringUtils.getBean(IJobCallBackService.class);
apiService = SpringUtils.getBean(IApiService.class);
@@ -97,73 +104,142 @@ public class SsjThread implements Runnable {
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) {
//出库到位
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()));
if (mydoJob != null) {
log.info("设备:{} 位置:{} 任务号:{} 出库到位", "输送线", deviceSsj.getDeviceCode(), mydoJob.getTaskNo());
mydoJobService.insertHistory(mydoJob.getJobId());
mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId());
JobCallBack jobCallBack = new JobCallBack();
jobCallBack.setType("2");
jobCallBack.setMydojobId(mydoJob.getJobId());
jobCallBack.setStatus("0");
jobCallBack.setTaskNo(Convert.toLong(mydoJob.getTaskNo()));
jobCallBack.setCreateTime(new Date());
jobCallBackService.insertJobCallBack(jobCallBack);
if (mydoJob != null && mydoJob.getInOrOut().equals("22")) {
// 新增agv执行队列,以及调用wms后台任务过账
AjaxResult ajaxResult1 = apiService.insertAgvQuene(objectObjectHashMap);
if (ajaxResult1.get("code").equals("200")) {
HashMap<String, Object> map = new HashMap<>();
map.put("trayCode", mydoJob.getTrayCode());
//拉取
AjaxResult ajaxResult = apiService.OutMakeSure(map);
if (ajaxResult.get("code").equals("200")) {
mydoJobService.insertHistory(mydoJob.getJobId());
mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId());
}
}
}
}
}
void inDispatch1(DeviceSsj deviceSsj) {
if (deviceSsj.getRkqq() == 1 && StrUtil.isNotBlank(deviceSsj.getTrayCode())) {
//todo 查是否为入库模式,不是退回,是否超重
HashMap<String, Object> map = new HashMap<>();
map.put("trayCode", deviceSsj.getTrayCode());
//拉取
AjaxResult ajaxResult = apiService.createInMydoJob(map);
if (ajaxResult.isSuccess()) {
//拿到正常作业,插到wcs作业表,下发给输送机任务号,覆盖任务号
MydoJob mydoJob = BeanUtil.toBean(ajaxResult.get("data"), MydoJob.class);
mydoJob.setStatus("1");
mydoJob.setExecutionPhase("1");
mydoJob.setCreateTime(new Date());
if ("GS1002".equals(deviceSsj.getDeviceCode())) {
mydoJob.setEntranceId("L1004");
} else {
mydoJob.setEntranceId("L1005");
}
// 插入入库作业,并且根据作业直接下发 ,下发完毕直接修改执行阶段
MydoJob mydoJob1 = new MydoJob();
mydoJob1.setTaskNo(mydoJob.getTaskNo());
List<MydoJob> mydoJobs = mydoJobService.selectMydoJobList(mydoJob1);
if (mydoJobs.size() > 0) {
return;
}
mydoJobService.insertMydoJob(mydoJob);
int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), mydoJob.getTaskNo(), 1, 1);
if (deviceSsj.getRkqq() == 1 && StrUtil.isNotBlank(deviceSsj.getTrayCode().trim())) {
String trayCode = deviceSsj.getTrayCode().trim();
MydoJob getMydoJob = mydoJobService.selectMydoJobByTrayCode(trayCode);
if (getMydoJob != null && deviceSsj.getTaskNo() < 1000) {
int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), getMydoJob.getTaskNo(), 1, 1);
if (i == 1) {
mydoJob.setStatus("3");
mydoJobService.updateMydoJob(mydoJob);
log.info(deviceSsj.getDeviceCode() + "输送机下发任务号成功:{}", mydoJob.getTaskNo());
getMydoJob.setStatus("3");
mydoJobService.updateMydoJob(getMydoJob);
log.info(deviceSsj.getDeviceCode() + "输送机下发任务号成功:{}", getMydoJob.getTaskNo());
}
} else {
int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), "0", 2, 2);
if (i == 1) {
log.info(deviceSsj.getDeviceCode() + "未查到该托盘码作业,下发退回,去向2");
String exit = "";
if (deviceSsj.getDeviceCode().equals("GS1002")) {
exit = "L1004";
}
if (deviceSsj.getDeviceCode().equals("GS1007")) {
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;
}
}
//todo 查是否为入库模式,不是退回,是否超重
HashMap<String, Object> map = new HashMap<>();
map.put("trayCode", deviceSsj.getTrayCode());
//拉取
AjaxResult ajaxResult = apiService.createInMydoJob(map);
if (ajaxResult.isSuccess()) {
//拿到正常作业,插到wcs作业表,下发给输送机任务号,覆盖任务号
MydoJob mydoJob = BeanUtil.toBean(ajaxResult.get("data"), MydoJob.class);
mydoJob.setStatus("1");
mydoJob.setExecutionPhase("1");
mydoJob.setCreateTime(new Date());
mydoJob.setTheFloor(mydoJob.getClassId());
mydoJob.setTrayCode(trayCode);
if ("GS1002".equals(deviceSsj.getDeviceCode())) {
mydoJob.setEntranceId("L1004");
} else {
mydoJob.setEntranceId("L1005");
}
// 插入入库作业,并且根据作业直接下发 ,下发完毕直接修改执行阶段
MydoJob mydoJob1 = new MydoJob();
mydoJob1.setTaskNo(mydoJob.getTaskNo());
mydoJob1.setTrayCode(mydoJob.getTrayCode());
List<MydoJob> mydoJobs = mydoJobService.selectMydoJobList(mydoJob1);
if (mydoJobs.size() > 0) {
return;
}
mydoJobService.insertMydoJob(mydoJob);
int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), mydoJob.getTaskNo(), 1, 1);
if (i == 1) {
mydoJob.setStatus("3");
mydoJobService.updateMydoJob(mydoJob);
log.info(deviceSsj.getDeviceCode() + "输送机下发任务号成功:{}", mydoJob.getTaskNo());
}
} else {
int i = writeToSsj(deviceSsj.getPlcDbWriteAddress(), "0", 2, 2);
if (i == 1) {
log.info(deviceSsj.getDeviceCode() + "未查到该托盘码作业,下发退回,去向2 条码" + deviceSsj.getTrayCode());
}
}
}
}
}
@@ -171,10 +247,28 @@ public class SsjThread implements Runnable {
void inDispatch2(DeviceSsj deviceSsj) {
if (deviceSsj.getDw() == 1 && deviceSsj.getTaskNo() > 1000) {
MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo((long) deviceSsj.getTaskNo());
if (mydoJob != null) {
mydoJob.setExecutionPhase("2");
mydoJobService.updateMydoJob(mydoJob);
MydoJob mydoJob1 = mydoJobService.selectMydoJobByTaskNo(Long.valueOf(deviceSsj.getTaskNo()));
if (mydoJob1 != null && mydoJob1.getCargoSpaceId() != null) {
return;
}
if (mydoJob1 != null && Integer.parseInt(mydoJob1.getInOrOut()) < 20) {
HashMap<String, Object> map = new HashMap<>();
map.put("taskNo", deviceSsj.getTaskNo());
map.put("deviceCode", deviceSsj.getDeviceCode());
//拉取
AjaxResult ajaxResult = apiService.sendCargoSpace(map);
if (ajaxResult.isSuccess()) {
MydoJob data = BeanUtil.toBean(ajaxResult.get("data"), MydoJob.class);
String cargoSpaceId = data.getCargoSpaceId();
String theFloor = data.getClassId();
MydoJob mydoJob = mydoJobService.selectMydoJobByTaskNo((long) deviceSsj.getTaskNo());
if (mydoJob != null && cargoSpaceId != null && !cargoSpaceId.equals("")) {
mydoJob.setTheFloor(theFloor);
mydoJob.setCargoSpaceId(cargoSpaceId);
mydoJob.setExecutionPhase("2");
mydoJobService.updateMydoJob(mydoJob);
}
}
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -144,4 +144,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{reqCode}
</foreach>
</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>

View File

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

View File

@@ -227,6 +227,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</delete>
<update id="updateLastTimeByAgvId" parameterType="String">
update device_srgv set last_time =getdate() where agv_id=#{agvId}
update device_srgv set last_time =getdate() where device_id=#{deviceId}
</update>
</mapper>

View File

@@ -25,13 +25,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="theFloor" column="the_floor" />
<result property="productId" column="product_id" />
<result property="productName" column="product_name" />
<result property="trayCode" column="tray_code" />
</resultMap>
<sql id="selectMydoJobVo">
select job_id, status, task_no, roadway_id, cargo_space_id, target_roadway_id, target_cargo_space_id, priority, execution_phase, in_or_out, create_time, start_time, finish_time, entrance_id, exit_id, warehouse_id, fault_flag,the_floor,product_id,product_name from mydo_job_wcs
select job_id, status, task_no, roadway_id, cargo_space_id, target_roadway_id, target_cargo_space_id, priority, execution_phase, in_or_out, create_time, start_time, finish_time, entrance_id, exit_id, warehouse_id, fault_flag,the_floor,product_id,product_name,tray_code from mydo_job_wcs
</sql>
<sql id="selectMydoJobFinishVo">
select job_id, status, task_no, roadway_id, cargo_space_id, target_roadway_id, target_cargo_space_id, priority, execution_phase, in_or_out, create_time, start_time, finish_time, entrance_id, exit_id, warehouse_id, fault_flag,the_floor from mydo_job_wcs_finish
select job_id, status, task_no, roadway_id, cargo_space_id, target_roadway_id, target_cargo_space_id, priority, execution_phase, in_or_out, create_time, start_time, finish_time, entrance_id, exit_id, warehouse_id, fault_flag,the_floor,product_id,product_name,tray_code from mydo_job_wcs_finish
</sql>
<select id="selectMydoJobList" parameterType="MydoJob" resultMap="MydoJobResult">
@@ -46,8 +47,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="priority != null "> and priority = #{priority}</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="startTime != null and startTime != ''"> and start_time = #{startTime}</if>
<if test="finishTime != null and finishTime != ''"> and finish_time = #{finishTime}</if>
<if test="startTime != null and startTime != ''"> and finish_time &gt;= #{startTime}</if>
<if test="finishTime != null and finishTime != ''"> and finish_time &lt;= #{finishTime}</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="warehouseId != null and warehouseId != ''"> and warehouse_id = #{warehouseId}</if>
@@ -55,6 +56,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="theFloor != null and theFloor != ''"> and the_floor = #{theFloor}</if>
<if test="productId != null and productId != ''"> and product_id = #{productId}</if>
<if test="productName != null and productName != ''"> and product_name = #{productName}</if>
<if test="trayCode != null and trayCode != ''"> and tray_code = #{trayCode}</if>
</where>
</select>
@@ -118,6 +120,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="warehouseId != null">warehouse_id,</if>
<if test="faultFlag != null">fault_flag,</if>
<if test="theFloor != null">the_floor,</if>
<if test="trayCode != null">tray_code,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="jobId != null">#{jobId},</if>
@@ -138,6 +141,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="warehouseId != null">#{warehouseId},</if>
<if test="faultFlag != null">#{faultFlag},</if>
<if test="theFloor != null">#{theFloor},</if>
<if test="trayCode != null">#{trayCode},</if>
</trim>
</insert>
<insert id="insertHistory">
@@ -225,8 +229,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="priority != null "> and priority = #{priority}</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="startTime != null and startTime != ''"> and start_time = #{startTime}</if>
<if test="finishTime != null and finishTime != ''"> and finish_time = #{finishTime}</if>
<if test="startTime != null and startTime != ''"> and finish_time &gt;= #{startTime}</if>
<if test="finishTime != null and finishTime != ''"> and finish_time &lt;= #{finishTime}</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="warehouseId != null and warehouseId != ''"> and warehouse_id = #{warehouseId}</if>
@@ -244,4 +248,80 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
and status = 3
order by priority desc,create_time
</select>
<select id="selectMydoJobOut" resultMap="MydoJobResult">
WITH floor_group AS (
SELECT
b.cargo_space_id,
b.group_coding_no,
b.the_floor,
b.group_coding,
a.task_no,
a.job_id,
a.in_or_out,
a.target_cargo_space_id,
ROW_NUMBER() OVER (
PARTITION BY b.the_floor, b.group_coding_no
ORDER BY a.create_time ASC
) AS rn
FROM mydo_job_wcs a
INNER JOIN bas_cargo_space b
ON a.cargo_space_id = b.cargo_space_id
AND a.the_floor = b.the_floor
WHERE a.in_or_out >= 20
)
SELECT
cargo_space_id,
group_coding_no,
the_floor,
group_coding,
task_no,
job_id,
in_or_out,
target_cargo_space_id
FROM floor_group
WHERE rn = 1 -- ✅ 每次每层每个通道只取 1 条
ORDER BY group_coding DESC;
</select>
<select id="selectMydoJobByTrayCode" resultMap="MydoJobResult">
<include refid="selectMydoJobVo"/>
where tray_code =#{trayCode}
</select>
<select id="selectExit" parameterType="string" resultType="java.lang.Integer">
select count(1) from mydo_job_wcs where in_or_out>=20 and exit_id = #{exitId}
</select>
<select id="selectMydoJobCount" resultType="java.lang.Integer">
select count(1) from mydo_job_wcs
</select>
<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>
</mapper>

View File

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

View File

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