feat: 子卷送到待检区任务

This commit is contained in:
2026-08-13 15:04:14 +08:00
parent e20c0f2168
commit 6db59d422d
13 changed files with 148 additions and 33 deletions

View File

@@ -11,6 +11,7 @@
4. **验证先于完成** — 声称完成前必须运行验证命令
5. **代码开发规则** — 遵守 `.Codex/skills/nl-java-style/SKILL.md` 技能的规范要求
6. 不需要频繁提交代码,除非用户说允许测试,否则优先不做测试
7. 如果用户说不需要使用 superpowers-zh 技能,就不需要使用 superpowers-zh 下的所有技能。
## 可用 Skills

View File

@@ -11,6 +11,7 @@
4. **验证先于完成** — 声称完成前必须运行验证命令
5. **代码开发规则** — 遵守 `.claude/skills/nl-java-style/SKILL.md` 技能的规范要求
6. 不需要频繁提交代码,除非用户说允许测试,否则优先不做测试
7. 如果用户说不需要使用 superpowers-zh 技能,就不需要使用 superpowers-zh 下的所有技能。
## 可用 Skills

View File

@@ -15,7 +15,8 @@ import java.util.Arrays;
public enum UserTypeEnum implements ArrayValuable<Integer> {
MEMBER(1, "会员"), // 面向 c 端,普通用户
ADMIN(2, "管理员"); // 面向 b 端,管理后台
ADMIN(2, "管理员"), // 面向 b 端,管理后台
;
public static final Integer[] ARRAYS = Arrays.stream(values()).map(UserTypeEnum::getValue).toArray(Integer[]::new);

View File

@@ -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);
}
// 当前登录用户不为空,更新人为空,则当前登录用户为更新人
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);
}
}
}

View File

@@ -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());

View File

@@ -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;
}
}

View File

@@ -19,6 +19,19 @@ import java.util.List;
@Mapper
public interface PackagePointMapper extends BaseMapperX<PackagePointDO> {
/**
* 根据点位编码查询点位
*
* @param pointCode 点位编码
* @param flag 是否仅查询启用点位
* @return 点位信息
*/
default PackagePointDO selectByPointCode(String pointCode, boolean flag) {
return selectOne(new LambdaQueryWrapperX<PackagePointDO>()
.eq(PackagePointDO::getPointCode, pointCode)
.eq(flag, PackagePointDO::getIsUsed, true));
}
/**
* 查询可用点位
*

View File

@@ -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);

View File

@@ -59,4 +59,17 @@ public interface PackagePointService {
*/
PageResult<PackagePointDO> getPackagePointPage(PackagePointPageReqVO pageReqVO);
/**
* 根据点位编码获取点位信息
* @param pointCode 点位编码
* @param flag 是否判断禁用
* @return
*/
PackagePointDO getPackagePointByCode(String pointCode, boolean flag);
/**
* 批量更新
* @param points
*/
void updatePackagePoints(List<PackagePointDO> points);
}

View File

@@ -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<PackagePointDO> points) {
packagePointMapper.updateBatch(points);
}
}

View File

@@ -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());
}
}

View File

@@ -4,24 +4,7 @@
<select id="selectAvailablePointList"
resultType="cn.code.nl.module.lms.dal.dataobject.packagepoint.PackagePointDO">
SELECT point_id,
point_code,
point_name,
point_type,
container_name,
point_status,
vehicle_code,
block,
point_location,
sort_seq,
is_used,
remark,
plan,
row_num,
col_num,
depth,
wait_point_type,
lock_status
SELECT *
FROM lms_package_point
WHERE point_type = #{pointType}
AND point_status = #{pointStatus}

View File

@@ -76,8 +76,9 @@ public class TransportTaskServiceImpl implements TransportTaskService {
@Override
@LogRecord(type = TASK_INFO,
operator = "2",
subType = TASK_INFO_OPERATE_TYPE,
bizNo = "{{_ret}}",
bizNo = "{{#_ret}}",
success = TASK_INFO_CREATE_BY_RPC)
public Long createTransportTaskByRpc(TransportTaskCreateReqDTO reqDTO) {
TransportTaskDO task = BeanUtils.toBean(reqDTO, TransportTaskDO.class);