opt:修改首页信息推送,头部状态推送为WebSocket。

This commit is contained in:
2024-04-16 13:29:43 +08:00
parent 0c6e652c89
commit 56cc4a2b6f
16 changed files with 467 additions and 157 deletions

View File

@@ -50,6 +50,7 @@ public enum EnMsgEnum {
ModifyProfile("Cannot Modify Other User's Profile", "ModifyProfile"),
IncorrectPassword("Incorrect Password", "IncorrectPassword"),
RoleCannotEmpty("Role Name Cannot Be Empty", "RoleCannotEmpty"),
CannotCanceled("Only Tasks That Have Not Been Executed Can Be Canceled", "CannotCanceled"),
UserCannotEmpty("User Cannot Be Empty", "UserCannotEmpty"),
DeletedNoPermission("Deleted Or No Permission, Operation Failed", "DeletedNoPermission"),
InfoNotExist("The Information Does Not Exist", "InfoNotExist"),

View File

@@ -14,26 +14,23 @@ import java.util.Optional;
*/
public enum VehicleOperateEnum{
// 1-关机、2-显示屏控制、3-TCS控制、4-RC控制、5-Joy控制
OFF("关机", "1"),
SCREEN("显示屏控制", "2"),
TCS("TCS控制", "3"),
SCHE("SCHE控制", "4"),
RC("RC控制", "5"),
JOY("Joy控制", "6"),
QUITNOW("退出", "7"),
REBORNINIT("软启动", "8"),
STARTCHECK("跳过起点", "9"),
REBOOT("重启", "10"),
FULL("全屏", "11"),
SKIPPLATE("跳过检测", "12"),
OTHER("其他", "13");
private final String name;
private final String code;
OFF(1,"关机", "1"),
SCREEN(2,"显示屏控制", "2"),
TCS(3,"TCS控制", "3"),
SCHE(4,"SCHE控制", "4"),
RC(5,"RC控制", "5"),
JOY(6,"Joy控制", "6"),
QUITNOW(7,"退出", "7"),
REBORNINIT(8,"软启动", "8"),
STARTCHECK(9,"跳过起点", "9"),
REBOOT(10,"重启", "10"),
FULL(11,"全屏", "11"),
SKIPPLATE(12,"跳过检测", "12"),
OTHER(13,"其他", "13");
VehicleOperateEnum(String name, String code) {
this.name = name;
this.code = code;
}
private int index;
private String name;
private String code;
public String getName() {
return name;
@@ -43,6 +40,12 @@ public enum VehicleOperateEnum{
return code;
}
VehicleOperateEnum(int index,String name, String code) {
this.index = index;
this.name = name;
this.code = code;
}
public static VehicleOperateEnum getType(String type) {
Optional<VehicleOperateEnum> first = Arrays.stream(VehicleOperateEnum.values()).filter(a -> a.getCode().equals(type)).findFirst();
return first.orElse(VehicleOperateEnum.OTHER);

View File

@@ -38,6 +38,7 @@ public enum ZhMsgEnum {
ModifyProfile("不能修改他人资料", "ModifyProfile"),
IncorrectPassword("密码错误", "IncorrectPassword"),
RoleCannotEmpty("角色名字不能为空", "RoleCannotEmpty"),
CannotCanceled("只能取消未执行的任务", "CannotCanceled"),
UserCannotEmpty("用户不能为空", "UserCannotEmpty"),
DeletedNoPermission("被删除或无权限,操作失败", "DeletedNoPermission"),
InfoNotExist("该信息不存在", "InfoNotExist"),

View File

@@ -2,12 +2,14 @@ package org.nl.agv.rest;
import cn.dev33.satoken.annotation.SaIgnore;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.agv.service.HomeService;
import org.nl.common.anno.Log;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;

View File

@@ -15,6 +15,7 @@
*/
package org.nl.agv.service.impl;
import cn.hutool.core.date.StopWatch;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import cn.hutool.core.date.DateUtil;
@@ -22,6 +23,7 @@ import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import com.mchange.lang.LongUtils;
import edu.wpi.rail.jrosbridge.services.ServiceResponse;
import lombok.RequiredArgsConstructor;
import com.alibaba.fastjson.JSONObject;
@@ -32,23 +34,28 @@ import org.nl.agv.enu.*;
import org.nl.agv.service.HomeService;
import org.nl.agv.unit.RosUtil;
import org.nl.agv.unit.sendToAgvUtil;
import org.nl.agv.websocket.SendHomeWebSocketServer;
import org.nl.common.utils.LangUtils;
import org.nl.common.utils.SecurityUtils;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.system.util.CodeUtil;
import org.nl.modules.wql.core.bean.WQLObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.ThreadPoolExecutor;
import static org.nl.common.utils.LangUtils.getLanguage;
@@ -61,19 +68,38 @@ import static org.nl.common.utils.LangUtils.getLanguage;
@Service
@RequiredArgsConstructor
public class HomeServiceImpl implements HomeService {
@Resource
private TaskScheduler scheduler;
@Resource
@Qualifier("threadPool")
private ThreadPoolExecutor pool;
@Value("${spring.profiles.active}")
private String isProd;
@Value("${timer.syncAgvInfo}")
private long syncAgvInfo;
@Value("${timer.sendHomeInfo}")
private long sendHomeInfo;
@Value("${timer.handleTask}")
private long handleTask;
@Value("${timer.deleteTask}")
private long deleteTask;
//定时器查询调试信息放入json其他地方直接调用
public static JSONObject debugInfoJson = new JSONObject();
//特定场景调试信息放入json其他地方直接调用
public static JSONObject debugInfoJsonQuick = new JSONObject();
public HomeServiceImpl(ThreadPoolExecutor pool) {
this.pool = pool;
}
@Value("${spring.profiles.active}")
private String isProd;
/**
* 优化获取主页及状态栏信息
@@ -94,14 +120,14 @@ public class HomeServiceImpl implements HomeService {
// }
// }, pool);
//执行任务操作
CompletableFuture.runAsync(() -> {
try {
handleTaskStatus();
} catch (Exception e) {
//记录异常日志
log.error("queryHomePage-执行任务操作失败:{}", e.getMessage());
}
}, pool);
// CompletableFuture.runAsync(() -> {
// try {
// handleTaskStatus();
// } catch (Exception e) {
// //记录异常日志
// log.error("queryHomePage-执行任务操作失败:{}", e.getMessage());
// }
// }, pool);
List<JSONObject> allTasks = WQLObject.getWQLObject("ST_TASK_INFO").query("is_delete= 0").getResultJSONArray(0).toJavaList(JSONObject.class);
// 执行中任务
Optional<JSONObject> taskingOptional = allTasks.stream().filter(task -> TaskStatusEnum.RUNNING.getCode().equals(task.getString("task_status")) && !TaskTypeEnum.REST.getCode().equals(task.getString("task_type"))).findFirst();
@@ -266,7 +292,6 @@ public class HomeServiceImpl implements HomeService {
@Override
public Map<String, Object> clickSave(Map<String, String> jsonObject) {
try {
WQLObject taskTable = WQLObject.getWQLObject("ST_TASK_INFO");
String button_code = jsonObject.get("button_code");
@@ -407,6 +432,7 @@ public class HomeServiceImpl implements HomeService {
}
/**
* 全局显示状态
*/
@@ -421,14 +447,15 @@ public class HomeServiceImpl implements HomeService {
String en_automatic_status_name = "";
String zh_automatic_status_name = "";
String electric = "50";
CompletableFuture.runAsync(() -> {
try {
handleTaskStatus();
} catch (Exception e) {
e.printStackTrace();
//记录异常日志
}
}, pool);
// CompletableFuture.runAsync(() -> {
// try {
// handleTaskStatus();
// } catch (Exception e) {
// e.printStackTrace();
// //记录异常日志
// }
// }, pool);
//qeryDebuggerInfo();
electric = debugInfoJson.getString("PWR_Percent");
//车辆运行还是待机是PathFollow_Enable 1为运行 0为待机
if (StrUtil.equals(debugInfoJson.getString("PathFollow_Enable"), "1")) {
@@ -474,7 +501,7 @@ public class HomeServiceImpl implements HomeService {
if ("prod".equals(isProd)) {
result = HttpUtil.get(urlInfo.get("javaUrl"));
} else {
result = "{\"Msg_DisplayState\":{\"AGV_ID\":255,\"Auto_In_Line_State\":0,\"Bosch_Car_Global_Theta\":-90.19221757272916,\"Bosch_Car_Global_rx\":-1.0619603784858553,\"Bosch_Car_Global_ry\":0.0020978358374357303,\"Bosch_Loc_State\":-2,\"Bosch_No_Rec_State\":0,\"Bosch_raw_age\":0.01389455795288086,\"Bosch_raw_epoch\":1,\"Bosch_raw_locState\":-2,\"Bosch_raw_qw\":0.9999999908132869,\"Bosch_raw_qx\":0.0,\"Bosch_raw_qy\":0.0,\"Bosch_raw_qz\":0.00013554861104682667,\"Bosch_raw_timestamp\":1695633231.1093392,\"Bosch_raw_uniqueId\":0,\"Bosch_raw_x\":0.0008994877773440588,\"Bosch_raw_x_odo\":0.0008994877773440588,\"Bosch_raw_y\":0.0006906610801896382,\"Bosch_raw_y_odo\":0.0006906610801896382,\"Bosch_raw_yaw\":0.00027109722292381746,\"Bosch_raw_yaw_odo\":0.0006906610801896382,\"Bosch_raw_z\":0.0,\"CAD_Or_TCS_Ctrl\":0,\"Car_Global_Theta\":-90.19221757272916,\"Car_Global_rx\":-1.0619603784858553,\"Car_Global_ry\":0.0020978358374357303,\"CurNodeID\":11,\"Cur_Stop_Info1_Authorized_Pass\":1,\"Cur_Stop_Info1_High_Precious_Enable\":1,\"Cur_Stop_Info1_Reached_Stop\":0,\"Cur_Stop_Info1_Set_Patht\":0.0,\"Cur_Stop_Info1_Set_Pathx\":0.0,\"Cur_Stop_Info1_Set_Pathy\":0.0,\"Cur_Stop_Info1_Single_Request_Sch\":0,\"Cur_Stop_Info1_Single_Stop_Sch\":0,\"Cur_Stop_Info1_StopEndNode\":0,\"Cur_Stop_Info1_StopStartNode\":0,\"Cur_Stop_Info1_Stop_Endt\":0.0,\"Cur_Stop_Info1_Stop_Endx\":0.0,\"Cur_Stop_Info1_Stop_Endy\":0.0,\"Cur_Stop_Info1_Stop_Num\":0,\"Cur_Stop_Info2_Authorized_Pass\":1,\"Cur_Stop_Info2_High_Precious_Enable\":1,\"Cur_Stop_Info2_Reached_Stop\":0,\"Cur_Stop_Info2_Set_Patht\":0.0,\"Cur_Stop_Info2_Set_Pathx\":0.0,\"Cur_Stop_Info2_Set_Pathy\":0.0,\"Cur_Stop_Info2_Single_Request_Sch\":0,\"Cur_Stop_Info2_Single_Stop_Sch\":0,\"Cur_Stop_Info2_StopEndNode\":0,\"Cur_Stop_Info2_StopStartNode\":0,\"Cur_Stop_Info2_Stop_Endt\":0.0,\"Cur_Stop_Info2_Stop_Endx\":0.0,\"Cur_Stop_Info2_Stop_Endy\":0.0,\"Cur_Stop_Info2_Stop_Num\":0,\"Curtis_Warning_Code_Pump\":0,\"Curtis_Warning_Code_Speed\":82,\"Curtis_Warning_Code_Steer\":0,\"EndNode\":0,\"Env_CustomName\":\"NobleLift\",\"Env_HMIUseJavaApp\":\"true\",\"Env_LearnEnable\":\"true\",\"Env_Lu_ROS_IP2\":\"\",\"Env_SoftwareVersion\":\"[Version]Magic4.1[Info]2023_09_21_20_41_37_Lu_ROS_magic4_waypointab_v31\",\"Env_VehicleType\":\"PS10LMT_HuaHai\",\"Get_Nav350_Curr_Layer\":0,\"Language\":1022739087,\"LastAltitudeExpectValue_mm\":0,\"LastGantryXExpectValue_mm\":0,\"LastGantryYExpectValue_mm\":0,\"Lateral_Deviation_m\":0.0,\"License_Info\":\"EC060800FFFBEBBF 6B7685747EBC EC060800FFFBEBBF 6B7685747EBC 2021/8/26 13:46:47 2021/8/26 13:46:47 1 UserClass5 Magic4_1\",\"LindeAgwSteerCenterPivotPlateAng\":0,\"LindeAgwSteerErrorFlag\":0,\"LindeAgwSteerModeSelectorState\":0,\"LindeAgwTracLiftErrorFlag\":0,\"LindeAgwTracLiftModeSelectorState\":0,\"LindeDriveErrCode1\":0,\"LindeDriveErrCode2\":0,\"LindeDriveErrCode3\":0,\"LindeDriveErrCode4\":0,\"LindeLiftErrCode1\":0,\"LindeLiftErrCode2\":0,\"LindeLiftErrCode3\":0,\"LindeLiftErrCode4\":0,\"LindeSteerErrCode1\":0,\"LindeSteerErrCode2\":0,\"LindeSteerErrCode3\":0,\"LindeSteerErrCode4\":0,\"Login_Info\":\"\",\"Min_Dist\":0.0,\"MissionCompleteAltitude_mm_RemoteOrHMI_FB\":0,\"MissionCompleteGantryX_mm_RemoteOrHMI_FB\":0,\"MissionCompleteGantryY_mm_RemoteOrHMI_FB\":0,\"Navi_Method\":3,\"ObstacleDetectState\":0,\"ObstacleTouchState\":0,\"Out_Of_Path_Times\":0,\"PFC_Sch\":0,\"PFC_State\":\"[PathFollow_Control_Handle_WLANJSON][PathFollow_Schedule_WLANJSON=0]\\n\",\"PLC_Warning_Code\":0,\"PWR_Percent\":29,\"PWR_Warn\":0,\"PathFollow_Enable\":0,\"PathFollow_Expect_AltitudeCtrlEnable\":0,\"PathFollow_Expect_GantryXCtrlEnable\":0,\"PathFollow_Expect_GantryYCtrlEnable\":0,\"Plate_Check_Err_Code\":0,\"ReachState\":0,\"RealAutoChargeState\":0,\"Ref_std_rt\":0.0,\"Ref_std_rx\":0.0,\"Ref_std_ry\":0.0,\"Remote_Or_HMI_Ctrl\":1,\"SVreal_angle\":0.0,\"Sche_JSON_Sche_Enable\":1,\"Speedm_Tmp\":0.0,\"StartNode\":0,\"Sub_Warning_Code0\":0,\"Sys_Mode\":4,\"Task_Sch\":0,\"Task_State\":\"\",\"Update_Sch\":1,\"Update_State\":\"\",\"VehicleCtrlExpThrottle\":0,\"VehicleCtrlRealAltitude_mm\":998,\"VehicleCtrlRealCustomStateByte0\":0,\"VehicleCtrlRealCustomStateByte1\":0,\"VehicleCtrlRealCustomStateByte2\":0,\"VehicleCtrlRealCustomStateByte3\":0,\"VehicleCtrlRealGantryX_mm\":0,\"VehicleCtrlRealGantryY_mm\":0,\"VehicleCtrlRealJoyEnable\":0,\"VehicleCtrlRealRCEnable\":0,\"VehicleCtrl_CAN_Err_Info\":0,\"Vertical_Deviation_deg\":0.0,\"Warning_Code\":754529,\"header\":{\"frame_id\":\"\",\"seq\":1904,\"stamp\":{\"nsec\":160948865,\"sec\":1695633231}}}}";
result = "{\"Msg_DisplayState\":{\"AGV_ID\":255,\"Auto_In_Line_State\":0,\"Bosch_Car_Global_Theta\":-90.19221757272916,\"Bosch_Car_Global_rx\":-1.0619603784858553,\"Bosch_Car_Global_ry\":0.0020978358374357303,\"Bosch_Loc_State\":-2,\"Bosch_No_Rec_State\":0,\"Bosch_raw_age\":0.01389455795288086,\"Bosch_raw_epoch\":1,\"Bosch_raw_locState\":-2,\"Bosch_raw_qw\":0.9999999908132869,\"Bosch_raw_qx\":0.0,\"Bosch_raw_qy\":0.0,\"Bosch_raw_qz\":0.00013554861104682667,\"Bosch_raw_timestamp\":1695633231.1093392,\"Bosch_raw_uniqueId\":0,\"Bosch_raw_x\":0.0008994877773440588,\"Bosch_raw_x_odo\":0.0008994877773440588,\"Bosch_raw_y\":0.0006906610801896382,\"Bosch_raw_y_odo\":0.0006906610801896382,\"Bosch_raw_yaw\":0.00027109722292381746,\"Bosch_raw_yaw_odo\":0.0006906610801896382,\"Bosch_raw_z\":0.0,\"CAD_Or_TCS_Ctrl\":0,\"Car_Global_Theta\":-90.19221757272916,\"Car_Global_rx\":-1.0619603784858553,\"Car_Global_ry\":0.0020978358374357303,\"CurNodeID\":11,\"Cur_Stop_Info1_Authorized_Pass\":1,\"Cur_Stop_Info1_High_Precious_Enable\":1,\"Cur_Stop_Info1_Reached_Stop\":0,\"Cur_Stop_Info1_Set_Patht\":0.0,\"Cur_Stop_Info1_Set_Pathx\":0.0,\"Cur_Stop_Info1_Set_Pathy\":0.0,\"Cur_Stop_Info1_Single_Request_Sch\":0,\"Cur_Stop_Info1_Single_Stop_Sch\":0,\"Cur_Stop_Info1_StopEndNode\":0,\"Cur_Stop_Info1_StopStartNode\":0,\"Cur_Stop_Info1_Stop_Endt\":0.0,\"Cur_Stop_Info1_Stop_Endx\":0.0,\"Cur_Stop_Info1_Stop_Endy\":0.0,\"Cur_Stop_Info1_Stop_Num\":0,\"Cur_Stop_Info2_Authorized_Pass\":1,\"Cur_Stop_Info2_High_Precious_Enable\":1,\"Cur_Stop_Info2_Reached_Stop\":0,\"Cur_Stop_Info2_Set_Patht\":0.0,\"Cur_Stop_Info2_Set_Pathx\":0.0,\"Cur_Stop_Info2_Set_Pathy\":0.0,\"Cur_Stop_Info2_Single_Request_Sch\":0,\"Cur_Stop_Info2_Single_Stop_Sch\":0,\"Cur_Stop_Info2_StopEndNode\":0,\"Cur_Stop_Info2_StopStartNode\":0,\"Cur_Stop_Info2_Stop_Endt\":0.0,\"Cur_Stop_Info2_Stop_Endx\":0.0,\"Cur_Stop_Info2_Stop_Endy\":0.0,\"Cur_Stop_Info2_Stop_Num\":0,\"Curtis_Warning_Code_Pump\":0,\"Curtis_Warning_Code_Speed\":82,\"Curtis_Warning_Code_Steer\":0,\"EndNode\":0,\"Env_CustomName\":\"NobleLift\",\"Env_HMIUseJavaApp\":\"true\",\"Env_LearnEnable\":\"true\",\"Env_Lu_ROS_IP2\":\"\",\"Env_SoftwareVersion\":\"[Version]Magic4.1[Info]2023_09_21_20_41_37_Lu_ROS_magic4_waypointab_v31\",\"Env_VehicleType\":\" PS10LMT\",\"Get_Nav350_Curr_Layer\":0,\"Language\":1022739087,\"LastAltitudeExpectValue_mm\":0,\"LastGantryXExpectValue_mm\":0,\"LastGantryYExpectValue_mm\":0,\"Lateral_Deviation_m\":0.0,\"License_Info\":\"EC060800FFFBEBBF 6B7685747EBC EC060800FFFBEBBF 6B7685747EBC 2021/8/26 13:46:47 2021/8/26 13:46:47 1 UserClass5 Magic4_1\",\"LindeAgwSteerCenterPivotPlateAng\":0,\"LindeAgwSteerErrorFlag\":0,\"LindeAgwSteerModeSelectorState\":0,\"LindeAgwTracLiftErrorFlag\":0,\"LindeAgwTracLiftModeSelectorState\":0,\"LindeDriveErrCode1\":0,\"LindeDriveErrCode2\":0,\"LindeDriveErrCode3\":0,\"LindeDriveErrCode4\":0,\"LindeLiftErrCode1\":0,\"LindeLiftErrCode2\":0,\"LindeLiftErrCode3\":0,\"LindeLiftErrCode4\":0,\"LindeSteerErrCode1\":0,\"LindeSteerErrCode2\":0,\"LindeSteerErrCode3\":0,\"LindeSteerErrCode4\":0,\"Login_Info\":\"\",\"Min_Dist\":0.0,\"MissionCompleteAltitude_mm_RemoteOrHMI_FB\":0,\"MissionCompleteGantryX_mm_RemoteOrHMI_FB\":0,\"MissionCompleteGantryY_mm_RemoteOrHMI_FB\":0,\"Navi_Method\":3,\"ObstacleDetectState\":0,\"ObstacleTouchState\":0,\"Out_Of_Path_Times\":0,\"PFC_Sch\":0,\"PFC_State\":\"[PathFollow_Control_Handle_WLANJSON][PathFollow_Schedule_WLANJSON=0]\\n\",\"PLC_Warning_Code\":0,\"PWR_Percent\":99,\"PWR_Warn\":0,\"PathFollow_Enable\":0,\"PathFollow_Expect_AltitudeCtrlEnable\":0,\"PathFollow_Expect_GantryXCtrlEnable\":0,\"PathFollow_Expect_GantryYCtrlEnable\":0,\"Plate_Check_Err_Code\":0,\"ReachState\":0,\"RealAutoChargeState\":0,\"Ref_std_rt\":0.0,\"Ref_std_rx\":0.0,\"Ref_std_ry\":0.0,\"Remote_Or_HMI_Ctrl\":1,\"SVreal_angle\":0.0,\"Sche_JSON_Sche_Enable\":1,\"Speedm_Tmp\":0.0,\"StartNode\":0,\"Sub_Warning_Code0\":0,\"Sys_Mode\":4,\"Task_Sch\":0,\"Task_State\":\"\",\"Update_Sch\":1,\"Update_State\":\"\",\"VehicleCtrlExpThrottle\":0,\"VehicleCtrlRealAltitude_mm\":998,\"VehicleCtrlRealCustomStateByte0\":0,\"VehicleCtrlRealCustomStateByte1\":0,\"VehicleCtrlRealCustomStateByte2\":0,\"VehicleCtrlRealCustomStateByte3\":0,\"VehicleCtrlRealGantryX_mm\":0,\"VehicleCtrlRealGantryY_mm\":0,\"VehicleCtrlRealJoyEnable\":0,\"VehicleCtrlRealRCEnable\":0,\"VehicleCtrl_CAN_Err_Info\":0,\"Vertical_Deviation_deg\":0.0,\"Warning_Code\":754529,\"header\":{\"frame_id\":\"\",\"seq\":1904,\"stamp\":{\"nsec\":160948865,\"sec\":1695633231}}}}";
}
//String result = HttpUtil.get(urlInfo.get("javaUrl"));
JSONObject json = JSONObject.parseObject(result);
@@ -545,7 +572,7 @@ public class HomeServiceImpl implements HomeService {
if ("prod".equals(isProd)) {
result = HttpUtil.get(urlInfo.get("javaUrl"));
} else {
result = "{\"Msg_DisplayState\":{\"AGV_ID\":255,\"Auto_In_Line_State\":0,\"Bosch_Car_Global_Theta\":-90.19221757272916,\"Bosch_Car_Global_rx\":-1.0619603784858553,\"Bosch_Car_Global_ry\":0.0020978358374357303,\"Bosch_Loc_State\":-2,\"Bosch_No_Rec_State\":0,\"Bosch_raw_age\":0.01389455795288086,\"Bosch_raw_epoch\":1,\"Bosch_raw_locState\":-2,\"Bosch_raw_qw\":0.9999999908132869,\"Bosch_raw_qx\":0.0,\"Bosch_raw_qy\":0.0,\"Bosch_raw_qz\":0.00013554861104682667,\"Bosch_raw_timestamp\":1695633231.1093392,\"Bosch_raw_uniqueId\":0,\"Bosch_raw_x\":0.0008994877773440588,\"Bosch_raw_x_odo\":0.0008994877773440588,\"Bosch_raw_y\":0.0006906610801896382,\"Bosch_raw_y_odo\":0.0006906610801896382,\"Bosch_raw_yaw\":0.00027109722292381746,\"Bosch_raw_yaw_odo\":0.0006906610801896382,\"Bosch_raw_z\":0.0,\"CAD_Or_TCS_Ctrl\":0,\"Car_Global_Theta\":-90.19221757272916,\"Car_Global_rx\":-1.0619603784858553,\"Car_Global_ry\":0.0020978358374357303,\"CurNodeID\":11,\"Cur_Stop_Info1_Authorized_Pass\":1,\"Cur_Stop_Info1_High_Precious_Enable\":1,\"Cur_Stop_Info1_Reached_Stop\":0,\"Cur_Stop_Info1_Set_Patht\":0.0,\"Cur_Stop_Info1_Set_Pathx\":0.0,\"Cur_Stop_Info1_Set_Pathy\":0.0,\"Cur_Stop_Info1_Single_Request_Sch\":0,\"Cur_Stop_Info1_Single_Stop_Sch\":0,\"Cur_Stop_Info1_StopEndNode\":0,\"Cur_Stop_Info1_StopStartNode\":0,\"Cur_Stop_Info1_Stop_Endt\":0.0,\"Cur_Stop_Info1_Stop_Endx\":0.0,\"Cur_Stop_Info1_Stop_Endy\":0.0,\"Cur_Stop_Info1_Stop_Num\":0,\"Cur_Stop_Info2_Authorized_Pass\":1,\"Cur_Stop_Info2_High_Precious_Enable\":1,\"Cur_Stop_Info2_Reached_Stop\":0,\"Cur_Stop_Info2_Set_Patht\":0.0,\"Cur_Stop_Info2_Set_Pathx\":0.0,\"Cur_Stop_Info2_Set_Pathy\":0.0,\"Cur_Stop_Info2_Single_Request_Sch\":0,\"Cur_Stop_Info2_Single_Stop_Sch\":0,\"Cur_Stop_Info2_StopEndNode\":0,\"Cur_Stop_Info2_StopStartNode\":0,\"Cur_Stop_Info2_Stop_Endt\":0.0,\"Cur_Stop_Info2_Stop_Endx\":0.0,\"Cur_Stop_Info2_Stop_Endy\":0.0,\"Cur_Stop_Info2_Stop_Num\":0,\"Curtis_Warning_Code_Pump\":0,\"Curtis_Warning_Code_Speed\":82,\"Curtis_Warning_Code_Steer\":0,\"EndNode\":0,\"Env_CustomName\":\"NobleLift\",\"Env_HMIUseJavaApp\":\"true\",\"Env_LearnEnable\":\"true\",\"Env_Lu_ROS_IP2\":\"\",\"Env_SoftwareVersion\":\"[Version]Magic4.1[Info]2023_09_21_20_41_37_Lu_ROS_magic4_waypointab_v31\",\"Env_VehicleType\":\"PS10LMT_HuaHai\",\"Get_Nav350_Curr_Layer\":0,\"Language\":1022739087,\"LastAltitudeExpectValue_mm\":0,\"LastGantryXExpectValue_mm\":0,\"LastGantryYExpectValue_mm\":0,\"Lateral_Deviation_m\":0.0,\"License_Info\":\"EC060800FFFBEBBF 6B7685747EBC EC060800FFFBEBBF 6B7685747EBC 2021/8/26 13:46:47 2021/8/26 13:46:47 1 UserClass5 Magic4_1\",\"LindeAgwSteerCenterPivotPlateAng\":0,\"LindeAgwSteerErrorFlag\":0,\"LindeAgwSteerModeSelectorState\":0,\"LindeAgwTracLiftErrorFlag\":0,\"LindeAgwTracLiftModeSelectorState\":0,\"LindeDriveErrCode1\":0,\"LindeDriveErrCode2\":0,\"LindeDriveErrCode3\":0,\"LindeDriveErrCode4\":0,\"LindeLiftErrCode1\":0,\"LindeLiftErrCode2\":0,\"LindeLiftErrCode3\":0,\"LindeLiftErrCode4\":0,\"LindeSteerErrCode1\":0,\"LindeSteerErrCode2\":0,\"LindeSteerErrCode3\":0,\"LindeSteerErrCode4\":0,\"Login_Info\":\"\",\"Min_Dist\":0.0,\"MissionCompleteAltitude_mm_RemoteOrHMI_FB\":0,\"MissionCompleteGantryX_mm_RemoteOrHMI_FB\":0,\"MissionCompleteGantryY_mm_RemoteOrHMI_FB\":0,\"Navi_Method\":3,\"ObstacleDetectState\":0,\"ObstacleTouchState\":0,\"Out_Of_Path_Times\":0,\"PFC_Sch\":0,\"PFC_State\":\"[PathFollow_Control_Handle_WLANJSON][PathFollow_Schedule_WLANJSON=0]\\n\",\"PLC_Warning_Code\":0,\"PWR_Percent\":29,\"PWR_Warn\":0,\"PathFollow_Enable\":0,\"PathFollow_Expect_AltitudeCtrlEnable\":0,\"PathFollow_Expect_GantryXCtrlEnable\":0,\"PathFollow_Expect_GantryYCtrlEnable\":0,\"Plate_Check_Err_Code\":0,\"ReachState\":0,\"RealAutoChargeState\":0,\"Ref_std_rt\":0.0,\"Ref_std_rx\":0.0,\"Ref_std_ry\":0.0,\"Remote_Or_HMI_Ctrl\":1,\"SVreal_angle\":0.0,\"Sche_JSON_Sche_Enable\":0,\"Speedm_Tmp\":0.0,\"StartNode\":0,\"Sub_Warning_Code0\":0,\"Sys_Mode\":4,\"Task_Sch\":0,\"Task_State\":\"\",\"Update_Sch\":1,\"Update_State\":\"\",\"VehicleCtrlExpThrottle\":0,\"VehicleCtrlRealAltitude_mm\":998,\"VehicleCtrlRealCustomStateByte0\":0,\"VehicleCtrlRealCustomStateByte1\":0,\"VehicleCtrlRealCustomStateByte2\":0,\"VehicleCtrlRealCustomStateByte3\":0,\"VehicleCtrlRealGantryX_mm\":0,\"VehicleCtrlRealGantryY_mm\":0,\"VehicleCtrlRealJoyEnable\":0,\"VehicleCtrlRealRCEnable\":0,\"VehicleCtrl_CAN_Err_Info\":0,\"Vertical_Deviation_deg\":0.0,\"Warning_Code\":754529,\"header\":{\"frame_id\":\"\",\"seq\":1904,\"stamp\":{\"nsec\":160948865,\"sec\":1695633231}}}}";
result = "{\"Msg_DisplayState\":{\"AGV_ID\":255,\"Auto_In_Line_State\":0,\"Bosch_Car_Global_Theta\":-90.19221757272916,\"Bosch_Car_Global_rx\":-1.0619603784858553,\"Bosch_Car_Global_ry\":0.0020978358374357303,\"Bosch_Loc_State\":-2,\"Bosch_No_Rec_State\":0,\"Bosch_raw_age\":0.01389455795288086,\"Bosch_raw_epoch\":1,\"Bosch_raw_locState\":-2,\"Bosch_raw_qw\":0.9999999908132869,\"Bosch_raw_qx\":0.0,\"Bosch_raw_qy\":0.0,\"Bosch_raw_qz\":0.00013554861104682667,\"Bosch_raw_timestamp\":1695633231.1093392,\"Bosch_raw_uniqueId\":0,\"Bosch_raw_x\":0.0008994877773440588,\"Bosch_raw_x_odo\":0.0008994877773440588,\"Bosch_raw_y\":0.0006906610801896382,\"Bosch_raw_y_odo\":0.0006906610801896382,\"Bosch_raw_yaw\":0.00027109722292381746,\"Bosch_raw_yaw_odo\":0.0006906610801896382,\"Bosch_raw_z\":0.0,\"CAD_Or_TCS_Ctrl\":0,\"Car_Global_Theta\":-90.19221757272916,\"Car_Global_rx\":-1.0619603784858553,\"Car_Global_ry\":0.0020978358374357303,\"CurNodeID\":11,\"Cur_Stop_Info1_Authorized_Pass\":1,\"Cur_Stop_Info1_High_Precious_Enable\":1,\"Cur_Stop_Info1_Reached_Stop\":0,\"Cur_Stop_Info1_Set_Patht\":0.0,\"Cur_Stop_Info1_Set_Pathx\":0.0,\"Cur_Stop_Info1_Set_Pathy\":0.0,\"Cur_Stop_Info1_Single_Request_Sch\":0,\"Cur_Stop_Info1_Single_Stop_Sch\":0,\"Cur_Stop_Info1_StopEndNode\":0,\"Cur_Stop_Info1_StopStartNode\":0,\"Cur_Stop_Info1_Stop_Endt\":0.0,\"Cur_Stop_Info1_Stop_Endx\":0.0,\"Cur_Stop_Info1_Stop_Endy\":0.0,\"Cur_Stop_Info1_Stop_Num\":0,\"Cur_Stop_Info2_Authorized_Pass\":1,\"Cur_Stop_Info2_High_Precious_Enable\":1,\"Cur_Stop_Info2_Reached_Stop\":0,\"Cur_Stop_Info2_Set_Patht\":0.0,\"Cur_Stop_Info2_Set_Pathx\":0.0,\"Cur_Stop_Info2_Set_Pathy\":0.0,\"Cur_Stop_Info2_Single_Request_Sch\":0,\"Cur_Stop_Info2_Single_Stop_Sch\":0,\"Cur_Stop_Info2_StopEndNode\":0,\"Cur_Stop_Info2_StopStartNode\":0,\"Cur_Stop_Info2_Stop_Endt\":0.0,\"Cur_Stop_Info2_Stop_Endx\":0.0,\"Cur_Stop_Info2_Stop_Endy\":0.0,\"Cur_Stop_Info2_Stop_Num\":0,\"Curtis_Warning_Code_Pump\":0,\"Curtis_Warning_Code_Speed\":82,\"Curtis_Warning_Code_Steer\":0,\"EndNode\":0,\"Env_CustomName\":\"NobleLift\",\"Env_HMIUseJavaApp\":\"true\",\"Env_LearnEnable\":\"true\",\"Env_Lu_ROS_IP2\":\"\",\"Env_SoftwareVersion\":\"[Version]Magic4.1[Info]2023_09_21_20_41_37_Lu_ROS_magic4_waypointab_v31\",\"Env_VehicleType\":\" PS10LMT\",\"Get_Nav350_Curr_Layer\":0,\"Language\":1022739087,\"LastAltitudeExpectValue_mm\":0,\"LastGantryXExpectValue_mm\":0,\"LastGantryYExpectValue_mm\":0,\"Lateral_Deviation_m\":0.0,\"License_Info\":\"EC060800FFFBEBBF 6B7685747EBC EC060800FFFBEBBF 6B7685747EBC 2021/8/26 13:46:47 2021/8/26 13:46:47 1 UserClass5 Magic4_1\",\"LindeAgwSteerCenterPivotPlateAng\":0,\"LindeAgwSteerErrorFlag\":0,\"LindeAgwSteerModeSelectorState\":0,\"LindeAgwTracLiftErrorFlag\":0,\"LindeAgwTracLiftModeSelectorState\":0,\"LindeDriveErrCode1\":0,\"LindeDriveErrCode2\":0,\"LindeDriveErrCode3\":0,\"LindeDriveErrCode4\":0,\"LindeLiftErrCode1\":0,\"LindeLiftErrCode2\":0,\"LindeLiftErrCode3\":0,\"LindeLiftErrCode4\":0,\"LindeSteerErrCode1\":0,\"LindeSteerErrCode2\":0,\"LindeSteerErrCode3\":0,\"LindeSteerErrCode4\":0,\"Login_Info\":\"\",\"Min_Dist\":0.0,\"MissionCompleteAltitude_mm_RemoteOrHMI_FB\":0,\"MissionCompleteGantryX_mm_RemoteOrHMI_FB\":0,\"MissionCompleteGantryY_mm_RemoteOrHMI_FB\":0,\"Navi_Method\":3,\"ObstacleDetectState\":0,\"ObstacleTouchState\":0,\"Out_Of_Path_Times\":0,\"PFC_Sch\":0,\"PFC_State\":\"[PathFollow_Control_Handle_WLANJSON][PathFollow_Schedule_WLANJSON=0]\\n\",\"PLC_Warning_Code\":0,\"PWR_Percent\":99,\"PWR_Warn\":0,\"PathFollow_Enable\":0,\"PathFollow_Expect_AltitudeCtrlEnable\":0,\"PathFollow_Expect_GantryXCtrlEnable\":0,\"PathFollow_Expect_GantryYCtrlEnable\":0,\"Plate_Check_Err_Code\":0,\"ReachState\":0,\"RealAutoChargeState\":0,\"Ref_std_rt\":0.0,\"Ref_std_rx\":0.0,\"Ref_std_ry\":0.0,\"Remote_Or_HMI_Ctrl\":1,\"SVreal_angle\":0.0,\"Sche_JSON_Sche_Enable\":0,\"Speedm_Tmp\":0.0,\"StartNode\":0,\"Sub_Warning_Code0\":0,\"Sys_Mode\":4,\"Task_Sch\":0,\"Task_State\":\"\",\"Update_Sch\":1,\"Update_State\":\"\",\"VehicleCtrlExpThrottle\":0,\"VehicleCtrlRealAltitude_mm\":998,\"VehicleCtrlRealCustomStateByte0\":0,\"VehicleCtrlRealCustomStateByte1\":0,\"VehicleCtrlRealCustomStateByte2\":0,\"VehicleCtrlRealCustomStateByte3\":0,\"VehicleCtrlRealGantryX_mm\":0,\"VehicleCtrlRealGantryY_mm\":0,\"VehicleCtrlRealJoyEnable\":0,\"VehicleCtrlRealRCEnable\":0,\"VehicleCtrl_CAN_Err_Info\":0,\"Vertical_Deviation_deg\":0.0,\"Warning_Code\":754529,\"header\":{\"frame_id\":\"\",\"seq\":1904,\"stamp\":{\"nsec\":160948865,\"sec\":1695633231}}}}";
}
// String result = HttpUtil.get(urlInfo.get("javaUrl"));
JSONObject json = JSONObject.parseObject(result);
@@ -555,65 +582,6 @@ public class HomeServiceImpl implements HomeService {
}
@Transactional(rollbackFor = Exception.class)
public void handleTaskStatus() {
JSONObject taskjo = WQLObject.getWQLObject("ST_TASK_INFO").query("is_delete='0'and task_status='01'").uniqueResult(0);
qeryDebuggerInfo();
//叉腿高度
String legHeight;
//小车停止,且已到达目标点位
if (ObjectUtil.isNotEmpty(taskjo) && StrUtil.equals("0", debugInfoJson.getString("PathFollow_Enable")) && debugInfoJson.getString("CurNodeID").equals(taskjo.getString("next_point_code"))) {
//普通任务
if (TaskTypeEnum.COMMON.getCode().equals(taskjo.getString("task_type"))) {
updateTaskStatus(taskjo, TaskStatusEnum.END);
} else if (TaskTypeEnum.TAKE.getCode().equals(taskjo.getString("task_type")) || TaskTypeEnum.PUT.getCode().equals(taskjo.getString("task_type"))) {
//取货
if (TaskTypeEnum.TAKE.getCode().equals(taskjo.getString("task_type"))) {
//已到达目标点
if (StringUtils.isBlank(taskjo.getString("step"))) {
//取货
ServiceResponse send = sendToAgvUtil.send("HMIStepOrRTPathFollow:0;2;0#");
JSONObject resjo = JSONObject.parseObject(send.toString());
String resultflag = resjo.getString("result");
if (StrUtil.equals("0", resultflag)) {
//叉腿已抬升
taskjo.put("step", "0");
updateTaskStatus(taskjo, null);
} else {
log.error("handleTaskStatus-叉抬升失败:{}",TaskSendBackStatusEnum.getName(resultflag));
}
}
qeryDebuggerInfoQuick();
//叉腿高度
legHeight = debugInfoJsonQuick.getString("MissionCompleteAltitude_mm_RemoteOrHMI_FB") == null ? "0" : debugInfoJsonQuick.getString("MissionCompleteAltitude_mm_RemoteOrHMI_FB");
//叉腿抬高动作已下发且高度为10或20且待机发送返程任务
if (((Integer.parseInt(legHeight) == 20)) && StrUtil.equals("0", debugInfoJsonQuick.getString("PathFollow_Enable")) && "0".equals(taskjo.getString("step"))) {
createReturnTask(taskjo);
}
} else {
if (StringUtils.isBlank(taskjo.getString("step"))) {
//放货
ServiceResponse send = sendToAgvUtil.send("HMIStepOrRTPathFollow:0;1;0#");
JSONObject resjo = JSONObject.parseObject(send.toString());
String resultflag = resjo.getString("result");
if (StrUtil.equals("0", resultflag)) {
//叉腿已下降
taskjo.put("step", "0");
updateTaskStatus(taskjo, null);
} else {
log.error("handleTaskStatus-叉腿下降失败:{}",TaskSendBackStatusEnum.getName(resultflag));
}
}
qeryDebuggerInfoQuick();
legHeight = debugInfoJsonQuick.getString("MissionCompleteAltitude_mm_RemoteOrHMI_FB") == null ? "0" : debugInfoJsonQuick.getString("MissionCompleteAltitude_mm_RemoteOrHMI_FB");
//叉腿抬高动作已下发且高度为10或20且待机发送返程任务
if (((Integer.parseInt(legHeight) == 10)) && StrUtil.equals("0", debugInfoJsonQuick.getString("PathFollow_Enable")) && "0".equals(taskjo.getString("step"))) {
createReturnTask(taskjo);
}
}
}
}
}
private void createReturnTask(JSONObject taskjo) {
String a = "HMIStepOrRTPathFollow:0;" + taskjo.getString("next_point_code2") + ";1#";
@@ -626,7 +594,7 @@ public class HomeServiceImpl implements HomeService {
taskjo.put("is_manualfinished", "1");
updateTaskStatus(taskjo, TaskStatusEnum.END);
} else {
log.error("handleTaskStatus-createReturnTask-返程指令执行失败:{}",TaskSendBackStatusEnum.getName(resultflag));
log.error("handleTaskStatus-createReturnTask-返程指令执行失败:{}", TaskSendBackStatusEnum.getName(resultflag));
}
}
@@ -663,20 +631,134 @@ public class HomeServiceImpl implements HomeService {
}
}
@PostConstruct
public void scheduleTask() {
scheduler.scheduleAtFixedRate(this::sendHomeInfoTask, sendHomeInfo);
scheduler.scheduleAtFixedRate(this::queryAgvInfo, syncAgvInfo);
scheduler.scheduleAtFixedRate(this::handleTaskStatusTask, handleTask);
scheduler.scheduleAtFixedRate(this::autoDeleteTask, deleteTask);
}
/**
* 处理任务状态
* 首页及头部信息推送
*/
@Async("taskExecutor")
@Scheduled(cron = "0/10 * * * * *")
@Transactional(rollbackFor = Exception.class)
public void handleTaskStatuss() {
public void sendHomeInfoTask() {
//StopWatch stopWatch = new StopWatch();
//stopWatch.start();
//handleTaskStatus();
CopyOnWriteArraySet<SendHomeWebSocketServer> webSocketSet =
SendHomeWebSocketServer.getWebSocketSet();
if (webSocketSet.size() > 0) {
webSocketSet.forEach(c -> {
Map<String, Object> homeInfoMap = new HashMap<>();
homeInfoMap.put("head", this.queryHead());
homeInfoMap.put("home", this.queryHomePage(null));
c.sendDataToClient(homeInfoMap);
});
}
//stopWatch.stop();
//System.out.println("花费时间------------------------------------------------------------------------------------------*************************************************************************************************= totalTime = " + stopWatch.getTotalTimeMillis());
//System.out.println("1task-首页及头部信息推送-sendHomeInfoTask-花费时间----------------------------------------------------------------****************************************************************= totalTime = " + stopWatch.getTotalTimeMillis());
}
/**
* 查询小车状态
*/
@Async("taskExecutor")
public void queryAgvInfo() {
//StopWatch stopWatch = new StopWatch();
//stopWatch.start();
qeryDebuggerInfo();
//stopWatch.stop();
//System.out.println("2task-查询agv信息-queryAgvInfo-花费时间----------------------------------------------------------------****************************************************************= totalTime = " + stopWatch.getTotalTimeMillis());
}
/**
* 处理自动取放货状态
*/
@Async("taskExecutor")
@Transactional(rollbackFor = Exception.class)
public void handleTaskStatusTask() {
//更新小车状态参数
//qeryDebuggerInfo();
//叉腿高度
String legHeight;
//StopWatch stopWatch = new StopWatch();
//stopWatch.start();
JSONObject taskjo = WQLObject.getWQLObject("ST_TASK_INFO").query("is_delete='0'and task_status='01'").uniqueResult(0);
//小车停止,且已到达目标点位
if (ObjectUtil.isNotEmpty(taskjo) && StrUtil.equals("0", debugInfoJson.getString("PathFollow_Enable")) && debugInfoJson.getString("CurNodeID").equals(taskjo.getString("next_point_code"))) {
//普通任务
if (TaskTypeEnum.COMMON.getCode().equals(taskjo.getString("task_type"))) {
updateTaskStatus(taskjo, TaskStatusEnum.END);
} else if (TaskTypeEnum.TAKE.getCode().equals(taskjo.getString("task_type")) || TaskTypeEnum.PUT.getCode().equals(taskjo.getString("task_type"))) {
//取货
if (TaskTypeEnum.TAKE.getCode().equals(taskjo.getString("task_type"))) {
//已到达目标点
if (StringUtils.isBlank(taskjo.getString("step"))) {
//取货
ServiceResponse send = sendToAgvUtil.send("HMIStepOrRTPathFollow:0;2;0#");
JSONObject resjo = JSONObject.parseObject(send.toString());
String resultflag = resjo.getString("result");
if (StrUtil.equals("0", resultflag)) {
//叉腿已抬升
taskjo.put("step", "0");
updateTaskStatus(taskjo, null);
} else {
log.error("handleTaskStatus-叉抬升失败:{}", TaskSendBackStatusEnum.getName(resultflag));
}
}
qeryDebuggerInfoQuick();
//叉腿高度
legHeight = debugInfoJsonQuick.getString("MissionCompleteAltitude_mm_RemoteOrHMI_FB") == null ? "0" : debugInfoJsonQuick.getString("MissionCompleteAltitude_mm_RemoteOrHMI_FB");
//叉腿抬高动作已下发且高度为10或20且待机发送返程任务
if (((Integer.parseInt(legHeight) == 20)) && StrUtil.equals("0", debugInfoJsonQuick.getString("PathFollow_Enable")) && "0".equals(taskjo.getString("step"))) {
createReturnTask(taskjo);
}
} else {
if (StringUtils.isBlank(taskjo.getString("step"))) {
//放货
ServiceResponse send = sendToAgvUtil.send("HMIStepOrRTPathFollow:0;1;0#");
JSONObject resjo = JSONObject.parseObject(send.toString());
String resultflag = resjo.getString("result");
if (StrUtil.equals("0", resultflag)) {
//叉腿已下降
taskjo.put("step", "0");
updateTaskStatus(taskjo, null);
} else {
log.error("handleTaskStatus-叉腿下降失败:{}", TaskSendBackStatusEnum.getName(resultflag));
}
}
qeryDebuggerInfoQuick();
legHeight = debugInfoJsonQuick.getString("MissionCompleteAltitude_mm_RemoteOrHMI_FB") == null ? "0" : debugInfoJsonQuick.getString("MissionCompleteAltitude_mm_RemoteOrHMI_FB");
//叉腿抬高动作已下发且高度为10或20且待机发送返程任务
if (((Integer.parseInt(legHeight) == 10)) && StrUtil.equals("0", debugInfoJsonQuick.getString("PathFollow_Enable")) && "0".equals(taskjo.getString("step"))) {
createReturnTask(taskjo);
}
}
}
}
//stopWatch.stop();
//System.out.println("3task-处理任务状态-handleTaskStatusTask-花费时间----------------------------------------------------------------****************************************************************= totalTime = " + stopWatch.getTotalTimeMillis());
}
/**
* 定时清空过期任务
*/
@Async("taskExecutor")
public void autoDeleteTask() {
//StopWatch stopWatch = new StopWatch();
//stopWatch.start();
WQLObject taskTable = WQLObject.getWQLObject("ST_TASK_INFO");
String sqlWhere = "TASK_CODE NOT IN ( SELECT TASK_CODE FROM ( SELECT TASK_CODE FROM ST_TASK_INFO WHERE TASK_STATUS = '02' ORDER BY CREATE_TIME LIMIT 300 ) AS RECENT_TASKS ) AND TASK_STATUS = '02'";
taskTable.delete(sqlWhere);
//stopWatch.stop();
//System.out.println("4task-删除任务-autoDeleteTask-花费时间----------------------------------------------------------------****************************************************************= totalTime = " + stopWatch.getTotalTimeMillis());
}
// public Map<String, Object> queryHomePage1(Map<String, String> jsonObject) {
// String button_code = "";
// String button_name = "";

View File

@@ -15,6 +15,7 @@
*/
package org.nl.agv.service.impl;
import cn.hutool.core.date.StopWatch;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import cn.hutool.core.date.DateUtil;
@@ -26,6 +27,7 @@ import lombok.RequiredArgsConstructor;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.nl.agv.enu.TaskStatusEnum;
import org.nl.agv.enu.TaskTypeEnum;
import org.nl.agv.service.TaskService;
import org.nl.agv.unit.sendToAgvUtil;
@@ -35,10 +37,14 @@ import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.system.util.CodeUtil;
import org.nl.modules.wql.WQL;
import org.nl.modules.wql.core.bean.WQLObject;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
import static org.nl.agv.service.impl.HomeServiceImpl.debugInfoJson;
import static org.nl.common.utils.LangUtils.getLanguage;
@@ -252,6 +258,7 @@ public class TaskServiceServiceImpl implements TaskService {
return returnjo;
}
@Override
public Map<String, Object> deleteTask(Map<String, String> jsonObject) {
String task_num = jsonObject.get("task_num");
@@ -273,16 +280,26 @@ public class TaskServiceServiceImpl implements TaskService {
@Override
public Map<String, Object> updateTask(Map<String, String> jsonObject) {
JSONObject returnjo = new JSONObject();
JSONArray jsonArray = JSONArray.parseArray(JSON.toJSONString(jsonObject.get("param")));
WQLObject taskTable = WQLObject.getWQLObject("ST_TASK_INFO");
//更新之前删除之前的所有未完成任务
JSONArray taskrows = taskTable.query("task_status='00' or task_status='01'").getResultJSONArray(0);
for (int i = 0; i < taskrows.size(); i++) {
JSONObject taskrow = taskrows.getJSONObject(i);
taskrow.put("is_delete", "1");
taskTable.update(taskrow);
JSONArray taskrows = taskTable.query("is_delete='0' and task_status<>'02'").getResultJSONArray(0);
Set<String> commonTaskCodes = jsonArray.stream()
.map(item -> ((JSONObject) item).getString("task_code"))
.collect(Collectors.toSet());
JSONArray selectedTasks = taskrows.stream()
.filter(item -> commonTaskCodes.contains(((JSONObject) item).getString("task_code")))
.collect(Collectors.toCollection(JSONArray::new));
String taskCodesAsString = taskrows.stream()
.filter(item -> !commonTaskCodes.contains(((JSONObject) item).getString("task_code")))
.map(item -> "'" + ((JSONObject) item).getString("task_code") + "'")
.collect(Collectors.joining(", "));
// 物理删除
if (StringUtils.isNotBlank(taskCodesAsString)) {
String sqlWhere = "task_code in (" + taskCodesAsString + ")";
taskTable.delete(sqlWhere);
}
for (int i = 0; i < jsonArray.size(); i++) {
for (int i = 0; i < selectedTasks.size(); i++) {
JSONObject taskjo = jsonArray.getJSONObject(i);
String taskNum = taskjo.getString("task_code");
JSONObject taskrow = taskTable.query("task_code='" + taskNum + "'").uniqueResult(0);
@@ -291,7 +308,6 @@ public class TaskServiceServiceImpl implements TaskService {
taskrow.put("update_by", SecurityUtils.getCurrentNickName());
taskTable.update(taskrow);
}
JSONObject returnjo = new JSONObject();
returnjo.put("code", "1");
returnjo.put("desc", LangUtils.getMsgLanguage("UpdateSuccess", null));
return returnjo;

View File

@@ -1,4 +1,3 @@
package org.nl.common.websocket;
/*
* Copyright 2019-2020 Zheng Jie
*
@@ -14,18 +13,27 @@ package org.nl.common.websocket;
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.nl.agv.websocket;
/**
* @author ZhangHouYing
* @date 2019-08-10 9:56
*/
public enum MsgType {
/** 连接 */
/**
* 连接
*/
CONNECT,
/** 关闭 */
/**
* 关闭
*/
CLOSE,
/** 信息 */
/**
* 信息
*/
INFO,
/** 错误 */
/**
* 错误
*/
ERROR
}

View File

@@ -0,0 +1,128 @@
/*
* Copyright 2019-2020 Zheng Jie
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.nl.agv.websocket;
import cn.hutool.core.map.MapUtil;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArraySet;
/*
* @author ZZQ
* @Date 2024/1/8 17:03
*/
@ServerEndpoint("/webSocket/SendHomeInfo/{sid}")
@Slf4j
@Component
public class SendHomeWebSocketServer {
/**
* concurrent包的线程安全Set用来存放每个客户端对应的MyWebSocket对象。
*/
private static CopyOnWriteArraySet<SendHomeWebSocketServer> webSocketSet = new CopyOnWriteArraySet<>();
/**静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。*/
private static int onlineCount = 0;
/**与某个客户端的连接会话,需要通过它来给客户端发送数据*/
private Session session;
/**
* 与某个客户端的连接会话,需要通过它来给客户端发送数据
*/
/**
* 接收sid
*/
private String sid = "";
/**
* 连接建立成功调用的方法
*/
@OnOpen
public void onOpen(Session session, @PathParam("sid") String sid) {
this.session = session;
//如果存在就先删除一个,防止重复推送消息
webSocketSet.removeIf(webSocket -> webSocket.sid.equals(sid));
webSocketSet.add(this);
this.sid = sid;
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose() {
webSocketSet.remove(this);
}
/**
* 收到客户端消息后调用的方法
*
* @param message 客户端发送过来的消息
*/
@OnMessage
public void onMessage(String message, Session session) {
System.out.println(webSocketSet.size() + "_接收到消息_" + session.getId());
}
@OnError
public void onError(Session session, Throwable error) {
log.error("发生错误");
webSocketSet.remove(session);
error.printStackTrace();
}
public Session getSession() {
Integer d = 1;
return session;
}
// 发送消息,在定时任务中会调用此方法
public void sendMessage(String message) throws IOException {
this.session.getBasicRemote().sendText(message);
}
public void sendDataToClient(Map<String, Object> data) {
try {
if (this.session != null&& MapUtil.isNotEmpty(data)) {
this.session.getBasicRemote().sendText(JSON.toJSONString(data));
}
} catch (IOException e) {
log.error("发送消息给客户端失败", e);
}
}
public static synchronized int getOnlineCount() {
return onlineCount;
}
public static CopyOnWriteArraySet<SendHomeWebSocketServer> getWebSocketSet() {
return webSocketSet;
}
public void setSession(Session session) {
this.session = session;
}
}

View File

@@ -0,0 +1,33 @@
/*
* Copyright 2019-2020 Zheng Jie
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.nl.agv.websocket;
import lombok.Data;
/**
* @author ZhangHouYing
* @date 2019-08-10 9:55
*/
@Data
public class SocketMsg {
private Object msg;
private MsgType msgType;
public SocketMsg(Object msg, MsgType msgType) {
this.msg = msg;
this.msgType = msgType;
}
}

View File

@@ -0,0 +1,42 @@
package org.nl.modules.mnt.websocket;
import cn.hutool.core.map.MapUtil;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.nl.agv.service.HomeService;
import org.nl.agv.service.impl.HomeServiceImpl;
import org.nl.agv.websocket.SendHomeWebSocketServer;
import org.nl.config.SpringContextHolder;
import org.nl.system.service.param.impl.SysParamServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import javax.websocket.*;
@Component
@Slf4j
@EnableScheduling
public class WebSocketDataSender {
//@Scheduled(fixedRate = 2000)
public void sendDatabaseDataToClients() {
HomeServiceImpl homeService = new HomeServiceImpl();
CopyOnWriteArraySet<SendHomeWebSocketServer> webSocketSet =
SendHomeWebSocketServer.getWebSocketSet();
Map<String, Object> data1 = homeService.queryHead();
if (webSocketSet.size() > 0) {
Map<String, Object> data = homeService.queryHead();
webSocketSet.forEach(c -> {
c.sendDataToClient(data);
});
}
System.out.println("_发送到消息_11");
}
}

View File

@@ -13,7 +13,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.nl.common.websocket;
package org.nl.agv.websocket;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@@ -24,6 +25,7 @@ import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Objects;
import java.util.concurrent.CopyOnWriteArraySet;
/**
* @author ZhangHouYing
* @date 2019-08-10 15:46
@@ -46,21 +48,22 @@ public class WebSocketServer {
/**
* 接收sid
*/
private String sid="";
private String sid = "";
/**
* 连接建立成功调用的方法
* */
*/
@OnOpen
public void onOpen(Session session,@PathParam("sid") String sid) {
public void onOpen(Session session, @PathParam("sid") String sid) {
this.session = session;
//如果存在就先删除一个防止重复推送消息
for (WebSocketServer webSocket:webSocketSet) {
for (WebSocketServer webSocket : webSocketSet) {
if (webSocket.sid.equals(sid)) {
webSocketSet.remove(webSocket);
}
}
webSocketSet.add(this);
this.sid=sid;
this.sid = sid;
}
/**
@@ -73,16 +76,18 @@ public class WebSocketServer {
/**
* 收到客户端消息后调用的方法
* @param message 客户端发送过来的消息*/
*
* @param message 客户端发送过来的消息
*/
@OnMessage
public void onMessage(String message, Session session) {
log.info("收到来"+sid+"的信息:"+message);
// log.info("收到来"+sid+"的信息:"+message);
//群发消息
for (WebSocketServer item : webSocketSet) {
try {
item.sendMessage(message);
} catch (IOException e) {
log.error(e.getMessage(),e);
log.error(e.getMessage(), e);
}
}
}
@@ -92,6 +97,7 @@ public class WebSocketServer {
log.error("发生错误");
error.printStackTrace();
}
/**
* 实现服务器主动推送
*/
@@ -102,19 +108,20 @@ public class WebSocketServer {
/**
* 群发自定义消息
* */
public static void sendInfo(SocketMsg socketMsg,@PathParam("sid") String sid) throws IOException {
*/
public static void sendInfo(SocketMsg socketMsg, @PathParam("sid") String sid) throws IOException {
String message = JSONObject.toJSONString(socketMsg);
log.info("推送消息到"+sid+",推送内容:"+message);
// log.info("推送消息到"+sid+",推送内容:"+message);
for (WebSocketServer item : webSocketSet) {
try {
//这里可以设定只推送给这个sid的为null则全部推送
if(sid==null) {
if (sid == null) {
item.sendMessage(message);
}else if(item.sid.equals(sid)){
} else if (item.sid.equals(sid)) {
item.sendMessage(message);
}
} catch (IOException ignored) { }
} catch (IOException ignored) {
}
}
}

View File

@@ -1,18 +0,0 @@
package org.nl.common.websocket;
import lombok.Data;
/**
* @author ZhangHouYing
* @date 2019-08-10 9:55
*/
@Data
public class SocketMsg {
private Object msg;
private MsgType msgType;
public SocketMsg(Object msg, MsgType msgType) {
this.msg = msg;
this.msgType = msgType;
}
}

View File

@@ -8,9 +8,9 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.websocket.MsgType;
import org.nl.common.websocket.SocketMsg;
import org.nl.common.websocket.WebSocketServer;
import org.nl.agv.websocket.MsgType;
import org.nl.agv.websocket.SocketMsg;
import org.nl.agv.websocket.WebSocketServer;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.wql.WQL;
import org.nl.modules.wql.core.bean.WQLObject;

View File

@@ -30,7 +30,7 @@ public class QueryInfoSchedule{
* @date 2023/10/17
*/
//@Async("taskExecutor")
//@Scheduled(cron = "0/10 * * * * *")
//@Scheduled(cron = "0/1 * * * * *")
public void queryAgvInfo() {
StopWatch stopWatch = new StopWatch();
stopWatch.start();

View File

@@ -198,4 +198,4 @@ jetcache:
uri:
- redis://127.0.0.1:6379
es:
index: mes_log
index: mes_log

View File

@@ -97,3 +97,8 @@ mybatis-plus:
db-config:
id-type: INPUT
banner: false
timer:
syncAgvInfo: 1000
sendHomeInfo: 1000
handleTask: 1000
deleteTask: 86400000