diff --git a/AGENTS.md b/AGENTS.md index d5300e63..1f47b3c4 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -11,6 +11,7 @@ 4. **验证先于完成** — 声称完成前必须运行验证命令 5. **代码开发规则** — 遵守 `.Codex/skills/nl-java-style/SKILL.md` 技能的规范要求 6. 不需要频繁提交代码,除非用户说允许测试,否则优先不做测试 +7. 如果用户说不需要使用 superpowers-zh 技能,就不需要使用 superpowers-zh 下的所有技能。 ## 可用 Skills diff --git a/CLAUDE.md b/CLAUDE.md index 80313aeb..93386177 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -11,6 +11,7 @@ 4. **验证先于完成** — 声称完成前必须运行验证命令 5. **代码开发规则** — 遵守 `.claude/skills/nl-java-style/SKILL.md` 技能的规范要求 6. 不需要频繁提交代码,除非用户说允许测试,否则优先不做测试 +7. 如果用户说不需要使用 superpowers-zh 技能,就不需要使用 superpowers-zh 下的所有技能。 ## 可用 Skills diff --git a/nl-framework/nl-common/src/main/java/cn/code/nl/framework/common/enums/UserTypeEnum.java b/nl-framework/nl-common/src/main/java/cn/code/nl/framework/common/enums/UserTypeEnum.java index c0e07b3e..b7823208 100644 --- a/nl-framework/nl-common/src/main/java/cn/code/nl/framework/common/enums/UserTypeEnum.java +++ b/nl-framework/nl-common/src/main/java/cn/code/nl/framework/common/enums/UserTypeEnum.java @@ -15,7 +15,8 @@ import java.util.Arrays; public enum UserTypeEnum implements ArrayValuable { MEMBER(1, "会员"), // 面向 c 端,普通用户 - ADMIN(2, "管理员"); // 面向 b 端,管理后台 + ADMIN(2, "管理员"), // 面向 b 端,管理后台 + ; public static final Integer[] ARRAYS = Arrays.stream(values()).map(UserTypeEnum::getValue).toArray(Integer[]::new); diff --git a/nl-framework/nl-spring-boot-starter-mybatis/src/main/java/cn/code/nl/framework/mybatis/core/handler/DefaultDBFieldHandler.java b/nl-framework/nl-spring-boot-starter-mybatis/src/main/java/cn/code/nl/framework/mybatis/core/handler/DefaultDBFieldHandler.java index 36379827..bff0a228 100644 --- a/nl-framework/nl-spring-boot-starter-mybatis/src/main/java/cn/code/nl/framework/mybatis/core/handler/DefaultDBFieldHandler.java +++ b/nl-framework/nl-spring-boot-starter-mybatis/src/main/java/cn/code/nl/framework/mybatis/core/handler/DefaultDBFieldHandler.java @@ -2,6 +2,7 @@ package cn.code.nl.framework.mybatis.core.handler; import cn.code.nl.framework.mybatis.core.dataobject.BaseDO; import cn.code.nl.framework.security.core.util.SecurityFrameworkUtils; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; @@ -37,27 +38,33 @@ public class DefaultDBFieldHandler implements MetaObjectHandler { // 当前登录用户不为空,创建人为空,则当前登录用户为创建人 if (Objects.nonNull(userId) && Objects.isNull(baseDO.getCreator())) { baseDO.setCreator(userId.toString()); + } else { + baseDO.setCreator("0"); } // 当前登录用户不为空,更新人为空,则当前登录用户为更新人 if (Objects.nonNull(userId) && Objects.isNull(baseDO.getUpdater())) { baseDO.setUpdater(userId.toString()); + } else { + baseDO.setUpdater("0"); } } } @Override public void updateFill(MetaObject metaObject) { - // 更新时间为空,则以当前时间为更新时间 - Object modifyTime = getFieldValByName("updateTime", metaObject); - if (Objects.isNull(modifyTime)) { - setFieldValByName("updateTime", LocalDateTime.now(), metaObject); - } + // 以当前时间为更新时间 + setFieldValByName("updateTime", LocalDateTime.now(), metaObject); // 当前登录用户不为空,更新人为空,则当前登录用户为更新人 - Object modifier = getFieldValByName("updater", metaObject); - Long userId = SecurityFrameworkUtils.getLoginUserId(); - if (Objects.nonNull(userId) && Objects.isNull(modifier)) { - setFieldValByName("updater", userId.toString(), metaObject); + Object updater = getFieldValByName("updater", metaObject); + Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); + + if (Objects.nonNull(loginUserId)) { + // 优先使用当前登录用户 + setFieldValByName("updater", loginUserId.toString(), metaObject); + } else if (ObjectUtil.isEmpty(updater)) { + // 没有登录用户,并且实体也未设置更新人时,使用系统默认值 + setFieldValByName("updater", "0", metaObject); } } } diff --git a/nl-framework/nl-spring-boot-starter-security/src/main/java/cn/code/nl/framework/operatelog/core/service/LogRecordServiceImpl.java b/nl-framework/nl-spring-boot-starter-security/src/main/java/cn/code/nl/framework/operatelog/core/service/LogRecordServiceImpl.java index 48d596ea..9531df25 100644 --- a/nl-framework/nl-spring-boot-starter-security/src/main/java/cn/code/nl/framework/operatelog/core/service/LogRecordServiceImpl.java +++ b/nl-framework/nl-spring-boot-starter-security/src/main/java/cn/code/nl/framework/operatelog/core/service/LogRecordServiceImpl.java @@ -1,11 +1,13 @@ package cn.code.nl.framework.operatelog.core.service; import cn.code.nl.framework.common.biz.system.logger.OperateLogCommonApi; +import cn.code.nl.framework.common.enums.UserTypeEnum; import cn.code.nl.framework.common.util.monitor.TracerUtils; import cn.code.nl.framework.common.util.servlet.ServletUtils; import cn.code.nl.framework.security.core.LoginUser; import cn.code.nl.framework.security.core.util.SecurityFrameworkUtils; import cn.code.nl.framework.common.biz.system.logger.dto.OperateLogCreateReqDTO; +import cn.hutool.core.util.ObjectUtil; import com.mzt.logapi.beans.LogRecord; import com.mzt.logapi.service.ILogRecordService; import jakarta.annotation.Resource; @@ -34,7 +36,7 @@ public class LogRecordServiceImpl implements ILogRecordService { try { reqDTO.setTraceId(TracerUtils.getTraceId()); // 补充用户信息 - fillUserFields(reqDTO); + fillUserFields(reqDTO, logRecord); // 补全模块信息 fillModuleFields(reqDTO, logRecord); // 补全请求信息 @@ -48,10 +50,14 @@ public class LogRecordServiceImpl implements ILogRecordService { } } - private static void fillUserFields(OperateLogCreateReqDTO reqDTO) { + private static void fillUserFields(OperateLogCreateReqDTO reqDTO, LogRecord logRecord) { // 使用 SecurityFrameworkUtils。因为要考虑,rpc、mq、job,它其实不是 web; LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); if (loginUser == null) { + if (ObjectUtil.isNotEmpty(logRecord.getOperator())) { + reqDTO.setUserId(Long.valueOf(logRecord.getOperator())); + reqDTO.setUserType(UserTypeEnum.ADMIN.getValue()); + } return; } reqDTO.setUserId(loginUser.getId()); diff --git a/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/PackageTaskTypeEnum.java b/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/PackageTaskTypeEnum.java new file mode 100644 index 00000000..89d26d5c --- /dev/null +++ b/nl-module-lms/nl-module-lms-api/src/main/java/cn/code/nl/module/lms/enums/PackageTaskTypeEnum.java @@ -0,0 +1,41 @@ +package cn.code.nl.module.lms.enums; + +import lombok.Getter; + +/** + * + * @Author: liyongde + * @Date: 2026/8/13 10:17 + */ +@Getter +public enum PackageTaskTypeEnum { + SUB_ROLL_DOWN_AGV("010601", "子卷->待检AGV任务"), + ; + /** + * 字典键值 + */ + private final String code; + /** + * 字典标签 + */ + private final String desc; + + PackageTaskTypeEnum(String code, String desc) { + this.code = code; + this.desc = desc; + } + + /** + * 根据code获取对应枚举 + * @param code 编码 + * @return 匹配的枚举,未找到返回null + */ + public static PackageTaskTypeEnum getByCode(String code) { + for (PackageTaskTypeEnum typeEnum : values()) { + if (typeEnum.getCode().equals(code)) { + return typeEnum; + } + } + return null; + } +} diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/packagepoint/PackagePointMapper.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/packagepoint/PackagePointMapper.java index d7fbec45..8e58d2f4 100644 --- a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/packagepoint/PackagePointMapper.java +++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/dal/mysql/packagepoint/PackagePointMapper.java @@ -19,6 +19,19 @@ import java.util.List; @Mapper public interface PackagePointMapper extends BaseMapperX { + /** + * 根据点位编码查询点位 + * + * @param pointCode 点位编码 + * @param flag 是否仅查询启用点位 + * @return 点位信息 + */ + default PackagePointDO selectByPointCode(String pointCode, boolean flag) { + return selectOne(new LambdaQueryWrapperX() + .eq(PackagePointDO::getPointCode, pointCode) + .eq(flag, PackagePointDO::getIsUsed, true)); + } + /** * 查询可用点位 * diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackageBoxBusinessServiceImpl.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackageBoxBusinessServiceImpl.java index 4d56f4ee..5ffde31f 100644 --- a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackageBoxBusinessServiceImpl.java +++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackageBoxBusinessServiceImpl.java @@ -4,6 +4,7 @@ import cn.code.nl.module.lms.dal.dataobject.packagepoint.PackagePointDO; import cn.code.nl.module.lms.dal.mysql.packagepoint.PackagePointMapper; import cn.code.nl.module.lms.enums.BoxPointStatusEnum; import cn.code.nl.module.lms.enums.BoxPointTypeEnum; +import cn.code.nl.module.lms.enums.PackageTaskTypeEnum; import cn.code.nl.module.task.api.TransportTaskApi; import cn.code.nl.module.task.dto.TransportTaskCreateReqDTO; import cn.code.nl.module.task.enums.TaskOwnerServiceEnum; @@ -95,6 +96,7 @@ public class PackageBoxBusinessServiceImpl implements PackageBoxBusinessService task.setOwnerService(TaskOwnerServiceEnum.LMS.name()); task.setBizType(SUB_ROLL_DOWN_BIZ_TYPE); task.setBizId(sourcePoint.getContainerName()); + task.setTaskType(PackageTaskTypeEnum.SUB_ROLL_DOWN_AGV.getCode()); task.setHandleCode(SUB_ROLL_DOWN_HANDLE_CODE); task.setAcsTaskType(ACS_MOVE_TASK_TYPE); task.setAgvSystemType(AGV_SYSTEM_TYPE); diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackagePointService.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackagePointService.java index 7cfa7138..a96ed07c 100644 --- a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackagePointService.java +++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackagePointService.java @@ -59,4 +59,17 @@ public interface PackagePointService { */ PageResult getPackagePointPage(PackagePointPageReqVO pageReqVO); + /** + * 根据点位编码获取点位信息 + * @param pointCode 点位编码 + * @param flag 是否判断禁用 + * @return + */ + PackagePointDO getPackagePointByCode(String pointCode, boolean flag); + + /** + * 批量更新 + * @param points + */ + void updatePackagePoints(List points); } diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackagePointServiceImpl.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackagePointServiceImpl.java index c0e6a0d7..863d162a 100644 --- a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackagePointServiceImpl.java +++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/service/packagepoint/PackagePointServiceImpl.java @@ -77,4 +77,14 @@ public class PackagePointServiceImpl implements PackagePointService { return packagePointMapper.selectPage(pageReqVO); } + @Override + public PackagePointDO getPackagePointByCode(String pointCode, boolean flag) { + return packagePointMapper.selectByPointCode(pointCode, flag); + } + + @Override + public void updatePackagePoints(List points) { + packagePointMapper.updateBatch(points); + } + } diff --git a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/tasks/box/SubRollDownAgvTask.java b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/tasks/box/SubRollDownAgvTask.java index 9709c16e..ed72faf1 100644 --- a/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/tasks/box/SubRollDownAgvTask.java +++ b/nl-module-lms/nl-module-lms-server/src/main/java/cn/code/nl/module/lms/tasks/box/SubRollDownAgvTask.java @@ -2,9 +2,17 @@ package cn.code.nl.module.lms.tasks.box; import cn.code.nl.framework.execute.core.AbstractTask; import cn.code.nl.framework.execute.core.dto.TaskExecuteDTO; +import cn.code.nl.module.lms.dal.dataobject.packagepoint.PackagePointDO; +import cn.code.nl.module.lms.dal.mysql.packagepoint.PackagePointMapper; +import cn.code.nl.module.lms.enums.BoxPointStatusEnum; +import cn.code.nl.module.task.api.TransportTaskApi; +import cn.code.nl.module.task.dto.TaskInfoDTO; +import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import java.util.List; + /** * 子卷下线AGV任务 * @Author: liyongde @@ -13,18 +21,46 @@ import org.springframework.stereotype.Component; @Slf4j @Component("subRollDownAgvTask") public class SubRollDownAgvTask extends AbstractTask { + + @Resource + private TransportTaskApi transportTaskApi; + + @Resource + private PackagePointMapper packagePointMapper; + @Override public void doHandleFinish(TaskExecuteDTO taskExecuteDTO) { - + TaskInfoDTO taskInfoDTO = transportTaskApi.getTaskById(taskExecuteDTO.getTaskId()).getCheckedData(); + PackagePointDO endPoint = packagePointMapper.selectByPointCode(taskInfoDTO.getPointCode2(), false); + endPoint.setVehicleCode(taskInfoDTO.getVehicleCode()); + endPoint.setContainerName(taskInfoDTO.getMaterialCode()); + endPoint.setPointStatus(BoxPointStatusEnum.HAS_SUB_ROLL.getCode()); + endPoint.setLockStatus("0"); + packagePointMapper.updateById(endPoint); + log.info("任务{}执行完成,子卷已存入点位{}", taskExecuteDTO.getTaskId(), taskInfoDTO.getPointCode2()); } @Override public void doHandleCancel(TaskExecuteDTO taskExecuteDTO) { - + TaskInfoDTO taskInfoDTO = transportTaskApi.getTaskById(taskExecuteDTO.getTaskId()).getCheckedData(); + PackagePointDO startPoint = packagePointMapper.selectByPointCode(taskInfoDTO.getPointCode1(), false); + PackagePointDO endPoint = packagePointMapper.selectByPointCode(taskInfoDTO.getPointCode2(), false); + // 解锁 + startPoint.setLockStatus("0"); + endPoint.setLockStatus("0"); + packagePointMapper.updateBatch(List.of(startPoint, endPoint)); } @Override public void doHandlePicked(TaskExecuteDTO taskExecuteDTO) { // 取货完成,释放点位 + TaskInfoDTO taskInfoDTO = transportTaskApi.getTaskById(taskExecuteDTO.getTaskId()).getCheckedData(); + PackagePointDO startPoint = packagePointMapper.selectByPointCode(taskInfoDTO.getPointCode1(), false); + startPoint.setLockStatus("0"); + startPoint.setPointStatus(BoxPointStatusEnum.EMPTY.getCode()); + startPoint.setVehicleCode(""); + startPoint.setContainerName(""); + packagePointMapper.updateById(startPoint); + log.info("任务{}执行取货完成", taskExecuteDTO.getTaskId()); } } diff --git a/nl-module-lms/nl-module-lms-server/src/main/resources/mapper/packagepoint/PackagePointMapper.xml b/nl-module-lms/nl-module-lms-server/src/main/resources/mapper/packagepoint/PackagePointMapper.xml index 6812d1a6..a5d4f711 100644 --- a/nl-module-lms/nl-module-lms-server/src/main/resources/mapper/packagepoint/PackagePointMapper.xml +++ b/nl-module-lms/nl-module-lms-server/src/main/resources/mapper/packagepoint/PackagePointMapper.xml @@ -4,24 +4,7 @@