Browse Source

Merge remote-tracking branch 'origin/master'

master
修宁 6 months ago
parent
commit
c744ee5f04
  1. 23
      servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java
  2. 1
      servo/src/main/java/com/galaxis/rcs/ptr/AmrMessageHandler.java
  3. 6
      servo/src/main/java/com/galaxis/rcs/ptr/AmrTaskMode.java
  4. 70
      servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java
  5. 2
      servo/src/main/java/com/yvan/workbench/autoconfigure/AppAutoConfiguration.java
  6. 57
      servo/src/main/java/com/yvan/workbench/controller/UserPermissions.java
  7. 33
      servo/src/main/java/com/yvan/workbench/model/request/AddUserReq.java
  8. 33
      servo/src/main/java/com/yvan/workbench/model/request/UpdateUserReq.java
  9. 5
      servo/src/main/resources/application.yml
  10. 10
      servo/src/test/java/com/yvan/workbench/JsTest.java

23
servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java

@ -5,11 +5,9 @@ import com.galaxis.rcs.common.entity.RcsTaskBiz;
import com.galaxis.rcs.common.entity.RcsTaskPlan; import com.galaxis.rcs.common.entity.RcsTaskPlan;
import com.galaxis.rcs.common.enums.PlanTaskStatus; import com.galaxis.rcs.common.enums.PlanTaskStatus;
import com.galaxis.rcs.common.enums.PlanTaskType; import com.galaxis.rcs.common.enums.PlanTaskType;
import com.galaxis.rcs.ptr.ArmMessageType;
import com.google.common.base.Splitter; import com.google.common.base.Splitter;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.yvan.logisticsModel.LogisticsRuntime; import com.yvan.logisticsModel.LogisticsRuntime;
import com.yvan.logisticsModel.PtrAgvDeviceTask;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.clever.core.BannerUtils; import org.clever.core.BannerUtils;
@ -144,6 +142,7 @@ public class PlanTaskSequence {
taskStr = "FINISH"; taskStr = "FINISH";
break; break;
} }
taskStr = taskStr + " STATE:" + task.getPlanTaskStatus();
list.add(taskStr); list.add(taskStr);
} }
@ -157,9 +156,11 @@ public class PlanTaskSequence {
public boolean isAllCompleted() { public boolean isAllCompleted() {
boolean isAllComplete = true; boolean isAllComplete = true;
for (RcsTaskPlan task : taskList) { for (RcsTaskPlan task : taskList) {
if (!PlanTaskStatus.FINISHED.toString().equals(task.getPlanTaskStatus())) { if (PlanTaskType.valueOf(task.getPlanType()) != PlanTaskType.FINISH) {
isAllComplete = false; if (!PlanTaskStatus.FINISHED.toString().equals(task.getPlanTaskStatus())) {
break; isAllComplete = false;
break;
}
} }
} }
return isAllComplete; return isAllComplete;
@ -178,10 +179,22 @@ public class PlanTaskSequence {
public void savePlanTask(RcsTaskPlan planTask) { public void savePlanTask(RcsTaskPlan planTask) {
//TODO: 保存数据库 //TODO: 保存数据库
var jw = new JsonWrapper(planTask); var jw = new JsonWrapper(planTask);
jw.set("isAllCompleted", this.isAllCompleted());
var list = Splitter.on("\n").splitToList(jw.toString()); var list = Splitter.on("\n").splitToList(jw.toString());
String[] ar = new String[list.size()]; String[] ar = new String[list.size()];
list.toArray(ar); list.toArray(ar);
// log.info("3-Received message: " + json); // log.info("3-Received message: " + json);
BannerUtils.printConfig(log, "保存业务任务 planTask", ar); BannerUtils.printConfig(log, "保存业务任务 planTask", ar);
} }
public boolean isEmpty() {
return this.taskList.isEmpty();
}
public int size() {
return this.taskList.size();
}
} }

1
servo/src/main/java/com/galaxis/rcs/ptr/AmrMessageHandler.java

@ -478,6 +478,7 @@ public class AmrMessageHandler {
AmrMessage<AmrTaskStatusMessage<TaskModeChangeData>> taskModeChange = JacksonUtils.parse(json, typeRef20011_1Message); AmrMessage<AmrTaskStatusMessage<TaskModeChangeData>> taskModeChange = JacksonUtils.parse(json, typeRef20011_1Message);
AmrTaskStatusMessage<TaskModeChangeData> modeMessage = taskModeChange.content; AmrTaskStatusMessage<TaskModeChangeData> modeMessage = taskModeChange.content;
agvItem.updateDeviceTaskStatus((int) modeMessage.SeqNo, 0, 0, modeMessage.EventId); agvItem.updateDeviceTaskStatus((int) modeMessage.SeqNo, 0, 0, modeMessage.EventId);
agvItem.updateTaskMode(modeMessage.Info.TaskMode);
break; break;
case 4: case 4:
AmrMessage<AmrTaskStatusMessage<TaskCompletedData>> taskCompleted = JacksonUtils.parse(json, typeRef20011_4Message); AmrMessage<AmrTaskStatusMessage<TaskCompletedData>> taskCompleted = JacksonUtils.parse(json, typeRef20011_4Message);

6
servo/src/main/java/com/galaxis/rcs/ptr/AmrTaskMode.java

@ -44,7 +44,11 @@ public enum AmrTaskMode {
/** /**
* 自定义模式 * 自定义模式
*/ */
AMR_CUSTOMIZE_MODE(8, "自定义模式"); AMR_CUSTOMIZE_MODE(8, "自定义模式"),
/**
* 主程序退出关机或关服务时会进入这个模式
*/
AMR_SHUTDOWN_MODE(8, "主程序退出");
// 枚举值映射 // 枚举值映射
private static final Map<Integer, AmrTaskMode> VALUE_MAP; private static final Map<Integer, AmrTaskMode> VALUE_MAP;

70
servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java

@ -14,10 +14,11 @@ import com.galaxis.rcs.ptr.receiveEntity.base.CurBatteryData;
import com.galaxis.rcs.ptr.sendEntity.RcsConfigMessage; import com.galaxis.rcs.ptr.sendEntity.RcsConfigMessage;
import com.galaxis.rcs.ptr.sendEntity.RcsSRMessage; import com.galaxis.rcs.ptr.sendEntity.RcsSRMessage;
import com.galaxis.rcs.ptr.sendEntity.RcsSetLocationMessage; import com.galaxis.rcs.ptr.sendEntity.RcsSetLocationMessage;
import com.google.common.base.Joiner;
import com.google.common.collect.Queues; import com.google.common.collect.Queues;
import com.yvan.logisticsMonitor.task.PlanTask;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.clever.core.BannerUtils;
import org.clever.core.json.JsonWrapper; import org.clever.core.json.JsonWrapper;
import org.clever.data.redis.Redis; import org.clever.data.redis.Redis;
import org.clever.data.redis.RedisAdmin; import org.clever.data.redis.RedisAdmin;
@ -262,43 +263,58 @@ public abstract class PtrAgvItem extends ExecutorItem {
oldDirection, direction); oldDirection, direction);
} }
boolean needCompute = false;
// 从 runningDeviceTaskList 里面,找到完成到什么阶段 // 从 runningDeviceTaskList 里面,找到完成到什么阶段
// 比如 (1,2) -> (2,2) -> (3,2) , 如果 updatePosition=3,2 ,那么前2个任务都要完成 // 比如 (1,2) -> (2,2) -> (3,2) , 如果 updatePosition=3,2 ,那么前2个任务都要完成
int finishTargetIndex = -1; int finishTargetIndex = -1;
for (int i = 0; i < runningDeviceTaskList.size(); i++) { if (this.runningDeviceTaskList != null && !this.runningDeviceTaskList.isEmpty() &&
PtrAgvDeviceTask task = runningDeviceTaskList.get(i); this.planTaskSequence != null && !this.planTaskSequence.isEmpty()) {
if (task.checkLogicX == logicX && task.checkLogicY == logicY) {
finishTargetIndex = i;
break;
}
}
boolean needCompute = false; for (int i = 0; i < runningDeviceTaskList.size(); i++) {
if (finishTargetIndex > 0) {
needCompute = true;
// 标记前面的任务都完成了
for (int i = 0; i < finishTargetIndex; i++) {
PtrAgvDeviceTask task = runningDeviceTaskList.get(i); PtrAgvDeviceTask task = runningDeviceTaskList.get(i);
if (task.checkLogicX == logicX && task.checkLogicY == logicY) {
task.taskStatus = 4; // 标记为完成 finishTargetIndex = i;
task.taskGroupStatus = 4; // 标记为任务组完成 break;
fireEvent(AgvEventType.DEVICE_TASK_COMPLETE, this, task);
// 更新计划任务
RcsTaskPlan planTask = planTaskSequence.getByPlanTaskId(task.planTaskId);
if (planTask != null) {
planTask.setPlanTaskStatus(PlanTaskStatus.FINISHED.toString());
planTaskSequence.savePlanTask(planTask);
} }
} }
if (planTaskSequence.isAllCompleted()) { if (finishTargetIndex >= 0) {
fireEvent(AgvEventType.PLAN_COMPLETE, this); needCompute = true;
planTaskSequence = null; // 标记前面的任务都完成了
for (int i = 0; i <= finishTargetIndex; i++) {
PtrAgvDeviceTask task = runningDeviceTaskList.get(i);
task.taskStatus = 4; // 标记为完成
task.taskGroupStatus = 4; // 标记为任务组完成
fireEvent(AgvEventType.DEVICE_TASK_COMPLETE, this, task);
// 更新计划任务
RcsTaskPlan planTask = planTaskSequence.getByPlanTaskId(task.planTaskId);
if (planTask != null) {
planTask.setPlanTaskStatus(PlanTaskStatus.FINISHED.toString());
planTaskSequence.savePlanTask(planTask);
}
}
if (planTaskSequence.isAllCompleted()) {
fireEvent(AgvEventType.PLAN_COMPLETE, this);
planTaskSequence = null;
}
} }
} }
BannerUtils.printConfig(log, "updatePosition", new String[]{
"logicX: " + logicX,
"logicY: " + logicY,
"direction: " + direction,
"finishTargetIndex: " + finishTargetIndex,
"runningDeviceSize:" + (this.runningDeviceTaskList == null ? "null" : this.runningDeviceTaskList.size()),
"planTask:" + (this.planTaskSequence == null ? "null" :
("\n" + Joiner.on("\n").join((List) this.planTaskSequence.toPrettyMap().get("items")))
)
});
if (needCompute) { if (needCompute) {
LockSupport.unpark(connectorThread); LockSupport.unpark(connectorThread);
} }

2
servo/src/main/java/com/yvan/workbench/autoconfigure/AppAutoConfiguration.java

@ -18,6 +18,7 @@ import org.clever.core.AppContextHolder;
import org.clever.core.Assert; import org.clever.core.Assert;
import org.clever.core.ResourcePathUtils; import org.clever.core.ResourcePathUtils;
import org.clever.core.json.jackson.JacksonConfig; import org.clever.core.json.jackson.JacksonConfig;
import org.clever.core.mapper.JacksonMapper;
import org.clever.core.reflection.ReflectionsUtils; import org.clever.core.reflection.ReflectionsUtils;
import org.clever.core.task.StartupTaskBootstrap; import org.clever.core.task.StartupTaskBootstrap;
import org.clever.data.jdbc.JdbcBootstrap; import org.clever.data.jdbc.JdbcBootstrap;
@ -300,6 +301,7 @@ public class AppAutoConfiguration {
JavalinConfig javalinConfig = new JavalinConfig(); JavalinConfig javalinConfig = new JavalinConfig();
ApplyWebConfig.applyConfig(appBasicsConfig.getRootPath(), webConfig, javalinConfig); ApplyWebConfig.applyConfig(appBasicsConfig.getRootPath(), webConfig, javalinConfig);
// 修正 ObjectMapper、JsonMapper 属性 // 修正 ObjectMapper、JsonMapper 属性
JacksonMapper.configure(webServerMapper);
JsonMapper jsonMapper = new JavalinJackson(webServerMapper, webConfig.isUseVirtualThreads()); JsonMapper jsonMapper = new JavalinJackson(webServerMapper, webConfig.isUseVirtualThreads());
jackson.apply(webServerMapper); jackson.apply(webServerMapper);
javalinConfig.jsonMapper(jsonMapper); javalinConfig.jsonMapper(jsonMapper);

57
servo/src/main/java/com/yvan/workbench/controller/UserPermissions.java

@ -1,13 +1,31 @@
package com.yvan.workbench.controller; package com.yvan.workbench.controller;
import com.querydsl.sql.SQLQuery; import com.querydsl.sql.SQLQuery;
import com.yvan.workbench.model.request.AddUserReq;
import com.yvan.workbench.model.request.QueryUserReq; import com.yvan.workbench.model.request.QueryUserReq;
import com.yvan.workbench.model.request.UpdateUserReq;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.clever.core.Assert;
import org.clever.core.Conv;
import org.clever.core.id.SnowFlake;
import org.clever.core.mapper.BeanCopyUtils;
import org.clever.core.mapper.JacksonMapper;
import org.clever.core.model.request.QueryByPage; import org.clever.core.model.request.QueryByPage;
import org.clever.core.model.response.R;
import org.clever.data.jdbc.DaoFactory; import org.clever.data.jdbc.DaoFactory;
import org.clever.data.jdbc.QueryDSL; import org.clever.data.jdbc.QueryDSL;
import org.clever.data.jdbc.querydsl.utils.QueryDslUtils; import org.clever.data.jdbc.querydsl.utils.QueryDslUtils;
import org.clever.security.SecurityContextHolder;
import org.clever.security.impl.model.entity.SysUser; import org.clever.security.impl.model.entity.SysUser;
import org.clever.security.model.SecurityContext;
import org.clever.web.mvc.annotation.RequestBody;
import org.clever.web.mvc.annotation.RequestParam;
import org.clever.web.mvc.annotation.Transactional;
import org.clever.web.mvc.annotation.Validated;
import java.util.Map;
import java.util.Objects;
import static org.clever.security.impl.model.query.QSysUser.sysUser; import static org.clever.security.impl.model.query.QSysUser.sysUser;
@ -15,6 +33,7 @@ import static org.clever.security.impl.model.query.QSysUser.sysUser;
* 作者lizw <br/> * 作者lizw <br/>
* 创建时间2025/06/26 16:50 <br/> * 创建时间2025/06/26 16:50 <br/>
*/ */
@Slf4j
public class UserPermissions { public class UserPermissions {
private static final QueryDSL QUERY_DSL = DaoFactory.getQueryDSL(); private static final QueryDSL QUERY_DSL = DaoFactory.getQueryDSL();
@ -27,6 +46,42 @@ public class UserPermissions {
if (req.getIsEnable() != null) { if (req.getIsEnable() != null) {
query.where(sysUser.isEnable.eq(req.getIsEnable())); query.where(sysUser.isEnable.eq(req.getIsEnable()));
} }
return QueryDslUtils.queryByPage(query, queryByPage); Object res = QueryDslUtils.queryByPage(query, queryByPage);
log.info("--> {}", JacksonMapper.getInstance().toJson(res));
return res;
}
@Transactional
public static R<?> addUser(@RequestBody @Validated AddUserReq req) {
SecurityContext securityContext = SecurityContextHolder.getContext();
long count = QUERY_DSL.selectFrom(sysUser).where(sysUser.loginName.eq(req.getLoginName())).fetchCount();
Assert.isTrue(count <= 0, "用户登录名已经存在:" + req.getLoginName());
SysUser user = BeanCopyUtils.mapper(SysUser.class, req);
user.setId(SnowFlake.SNOW_FLAKE.nextId());
user.setCreateBy(securityContext.getUserInfo().getUserId());
QUERY_DSL.insert(sysUser).populate(user).execute();
return R.success();
}
@Transactional
public static R<?> updateUser(@RequestBody @Validated UpdateUserReq req) {
SecurityContext securityContext = SecurityContextHolder.getContext();
SysUser oldUser = QUERY_DSL.selectFrom(sysUser).where(sysUser.loginName.eq(req.getLoginName())).fetchOne();
Assert.notNull(oldUser, "用户不存在:" + req.getLoginName());
SysUser user = BeanCopyUtils.mapper(SysUser.class, req);
user.setUpdateBy(securityContext.getUserInfo().getUserId());
QUERY_DSL.update(sysUser).populate(user).where(sysUser.id.eq(oldUser.getId())).execute();
return R.success();
}
@Transactional
public static R<?> delUser(@RequestParam Map<String, Object> req) {
long id = Conv.asLong(req.get("id"));
Assert.isTrue(
!Objects.equals(id, SecurityContextHolder.getUserInfo().getUserId()),
"不能删除当前登录的用户"
);
QUERY_DSL.delete(sysUser).where(sysUser.id.eq(id)).execute();
return R.success();
} }
} }

33
servo/src/main/java/com/yvan/workbench/model/request/AddUserReq.java

@ -0,0 +1,33 @@
package com.yvan.workbench.model.request;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
* 作者lizw <br/>
* 创建时间2025/06/27 14:10 <br/>
*/
@Data
public class AddUserReq {
/**
* 用户登录名(允许修改)
*/
@NotBlank
private String loginName;
/**
* 登录密码
*/
@NotBlank
private String password;
/**
* 登录名
*/
@NotBlank
private String userName;
/**
* 是否启用: 0:禁用1:启用
*/
@NotNull
private Integer isEnable;
}

33
servo/src/main/java/com/yvan/workbench/model/request/UpdateUserReq.java

@ -0,0 +1,33 @@
package com.yvan.workbench.model.request;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
* 作者lizw <br/>
* 创建时间2025/06/27 15:37 <br/>
*/
@Data
public class UpdateUserReq {
/**
* 用户登录名(允许修改)
*/
@NotBlank
private String loginName;
/**
* 登录密码
*/
@NotBlank
private String password;
/**
* 登录名
*/
@NotBlank
private String userName;
/**
* 是否启用: 0:禁用1:启用
*/
@NotNull
private Integer isEnable;
}

5
servo/src/main/resources/application.yml

@ -141,8 +141,6 @@ web:
read-only: false read-only: false
security: security:
ignore-paths: ignore-paths:
- '/api/**'
- '/ok'
- '/favicon.ico' - '/favicon.ico'
- '/dist/**' - '/dist/**'
- '/static/**' - '/static/**'
@ -163,7 +161,8 @@ web:
- '/**/.git' - '/**/.git'
- '/ok' - '/ok'
ignore-auth-paths: ['/ok'] ignore-auth-paths: ['/ok']
ignore-auth-failed-paths: [ ] ignore-auth-failed-paths:
- '/api/**'
current-user-path: '/api/current_user' current-user-path: '/api/current_user'
login: login:
paths: [ '/api/login' ] paths: [ '/api/login' ]

10
servo/src/test/java/com/yvan/workbench/JsTest.java

@ -2,6 +2,7 @@ package com.yvan.workbench;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.clever.core.mapper.JacksonMapper;
import org.clever.js.api.ScriptEngineInstance; import org.clever.js.api.ScriptEngineInstance;
import org.clever.js.api.ScriptObject; import org.clever.js.api.ScriptObject;
import org.clever.js.api.folder.FileSystemFolder; import org.clever.js.api.folder.FileSystemFolder;
@ -16,6 +17,8 @@ import org.junit.jupiter.api.Test;
import java.io.File; import java.io.File;
import java.time.Duration; import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
@Slf4j @Slf4j
public class JsTest { public class JsTest {
@ -58,4 +61,11 @@ public class JsTest {
pool.close(); pool.close();
factory.close(); factory.close();
} }
@Test
public void test03() {
Map<String, Object> map = new HashMap<>();
map.put("a", 1L);
log.info("--> {}", JacksonMapper.getInstance().toJson(map));
}
} }

Loading…
Cancel
Save