feat: 子卷送到待检区任务
This commit is contained in:
@@ -11,6 +11,7 @@
|
|||||||
4. **验证先于完成** — 声称完成前必须运行验证命令
|
4. **验证先于完成** — 声称完成前必须运行验证命令
|
||||||
5. **代码开发规则** — 遵守 `.Codex/skills/nl-java-style/SKILL.md` 技能的规范要求
|
5. **代码开发规则** — 遵守 `.Codex/skills/nl-java-style/SKILL.md` 技能的规范要求
|
||||||
6. 不需要频繁提交代码,除非用户说允许测试,否则优先不做测试
|
6. 不需要频繁提交代码,除非用户说允许测试,否则优先不做测试
|
||||||
|
7. 如果用户说不需要使用 superpowers-zh 技能,就不需要使用 superpowers-zh 下的所有技能。
|
||||||
|
|
||||||
## 可用 Skills
|
## 可用 Skills
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
4. **验证先于完成** — 声称完成前必须运行验证命令
|
4. **验证先于完成** — 声称完成前必须运行验证命令
|
||||||
5. **代码开发规则** — 遵守 `.claude/skills/nl-java-style/SKILL.md` 技能的规范要求
|
5. **代码开发规则** — 遵守 `.claude/skills/nl-java-style/SKILL.md` 技能的规范要求
|
||||||
6. 不需要频繁提交代码,除非用户说允许测试,否则优先不做测试
|
6. 不需要频繁提交代码,除非用户说允许测试,否则优先不做测试
|
||||||
|
7. 如果用户说不需要使用 superpowers-zh 技能,就不需要使用 superpowers-zh 下的所有技能。
|
||||||
|
|
||||||
## 可用 Skills
|
## 可用 Skills
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,8 @@ import java.util.Arrays;
|
|||||||
public enum UserTypeEnum implements ArrayValuable<Integer> {
|
public enum UserTypeEnum implements ArrayValuable<Integer> {
|
||||||
|
|
||||||
MEMBER(1, "会员"), // 面向 c 端,普通用户
|
MEMBER(1, "会员"), // 面向 c 端,普通用户
|
||||||
ADMIN(2, "管理员"); // 面向 b 端,管理后台
|
ADMIN(2, "管理员"), // 面向 b 端,管理后台
|
||||||
|
;
|
||||||
|
|
||||||
public static final Integer[] ARRAYS = Arrays.stream(values()).map(UserTypeEnum::getValue).toArray(Integer[]::new);
|
public static final Integer[] ARRAYS = Arrays.stream(values()).map(UserTypeEnum::getValue).toArray(Integer[]::new);
|
||||||
|
|
||||||
|
|||||||
@@ -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.mybatis.core.dataobject.BaseDO;
|
||||||
import cn.code.nl.framework.security.core.util.SecurityFrameworkUtils;
|
import cn.code.nl.framework.security.core.util.SecurityFrameworkUtils;
|
||||||
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
|
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
|
||||||
import org.apache.ibatis.reflection.MetaObject;
|
import org.apache.ibatis.reflection.MetaObject;
|
||||||
|
|
||||||
@@ -37,27 +38,33 @@ public class DefaultDBFieldHandler implements MetaObjectHandler {
|
|||||||
// 当前登录用户不为空,创建人为空,则当前登录用户为创建人
|
// 当前登录用户不为空,创建人为空,则当前登录用户为创建人
|
||||||
if (Objects.nonNull(userId) && Objects.isNull(baseDO.getCreator())) {
|
if (Objects.nonNull(userId) && Objects.isNull(baseDO.getCreator())) {
|
||||||
baseDO.setCreator(userId.toString());
|
baseDO.setCreator(userId.toString());
|
||||||
|
} else {
|
||||||
|
baseDO.setCreator("0");
|
||||||
}
|
}
|
||||||
// 当前登录用户不为空,更新人为空,则当前登录用户为更新人
|
// 当前登录用户不为空,更新人为空,则当前登录用户为更新人
|
||||||
if (Objects.nonNull(userId) && Objects.isNull(baseDO.getUpdater())) {
|
if (Objects.nonNull(userId) && Objects.isNull(baseDO.getUpdater())) {
|
||||||
baseDO.setUpdater(userId.toString());
|
baseDO.setUpdater(userId.toString());
|
||||||
|
} else {
|
||||||
|
baseDO.setUpdater("0");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateFill(MetaObject metaObject) {
|
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);
|
Object updater = getFieldValByName("updater", metaObject);
|
||||||
Long userId = SecurityFrameworkUtils.getLoginUserId();
|
Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
|
||||||
if (Objects.nonNull(userId) && Objects.isNull(modifier)) {
|
|
||||||
setFieldValByName("updater", userId.toString(), metaObject);
|
if (Objects.nonNull(loginUserId)) {
|
||||||
|
// 优先使用当前登录用户
|
||||||
|
setFieldValByName("updater", loginUserId.toString(), metaObject);
|
||||||
|
} else if (ObjectUtil.isEmpty(updater)) {
|
||||||
|
// 没有登录用户,并且实体也未设置更新人时,使用系统默认值
|
||||||
|
setFieldValByName("updater", "0", metaObject);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
package cn.code.nl.framework.operatelog.core.service;
|
package cn.code.nl.framework.operatelog.core.service;
|
||||||
|
|
||||||
import cn.code.nl.framework.common.biz.system.logger.OperateLogCommonApi;
|
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.monitor.TracerUtils;
|
||||||
import cn.code.nl.framework.common.util.servlet.ServletUtils;
|
import cn.code.nl.framework.common.util.servlet.ServletUtils;
|
||||||
import cn.code.nl.framework.security.core.LoginUser;
|
import cn.code.nl.framework.security.core.LoginUser;
|
||||||
import cn.code.nl.framework.security.core.util.SecurityFrameworkUtils;
|
import cn.code.nl.framework.security.core.util.SecurityFrameworkUtils;
|
||||||
import cn.code.nl.framework.common.biz.system.logger.dto.OperateLogCreateReqDTO;
|
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.beans.LogRecord;
|
||||||
import com.mzt.logapi.service.ILogRecordService;
|
import com.mzt.logapi.service.ILogRecordService;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
@@ -34,7 +36,7 @@ public class LogRecordServiceImpl implements ILogRecordService {
|
|||||||
try {
|
try {
|
||||||
reqDTO.setTraceId(TracerUtils.getTraceId());
|
reqDTO.setTraceId(TracerUtils.getTraceId());
|
||||||
// 补充用户信息
|
// 补充用户信息
|
||||||
fillUserFields(reqDTO);
|
fillUserFields(reqDTO, logRecord);
|
||||||
// 补全模块信息
|
// 补全模块信息
|
||||||
fillModuleFields(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;
|
// 使用 SecurityFrameworkUtils。因为要考虑,rpc、mq、job,它其实不是 web;
|
||||||
LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
|
LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
|
||||||
if (loginUser == null) {
|
if (loginUser == null) {
|
||||||
|
if (ObjectUtil.isNotEmpty(logRecord.getOperator())) {
|
||||||
|
reqDTO.setUserId(Long.valueOf(logRecord.getOperator()));
|
||||||
|
reqDTO.setUserType(UserTypeEnum.ADMIN.getValue());
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
reqDTO.setUserId(loginUser.getId());
|
reqDTO.setUserId(loginUser.getId());
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,6 +19,19 @@ import java.util.List;
|
|||||||
@Mapper
|
@Mapper
|
||||||
public interface PackagePointMapper extends BaseMapperX<PackagePointDO> {
|
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));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询可用点位
|
* 查询可用点位
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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.dal.mysql.packagepoint.PackagePointMapper;
|
||||||
import cn.code.nl.module.lms.enums.BoxPointStatusEnum;
|
import cn.code.nl.module.lms.enums.BoxPointStatusEnum;
|
||||||
import cn.code.nl.module.lms.enums.BoxPointTypeEnum;
|
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.api.TransportTaskApi;
|
||||||
import cn.code.nl.module.task.dto.TransportTaskCreateReqDTO;
|
import cn.code.nl.module.task.dto.TransportTaskCreateReqDTO;
|
||||||
import cn.code.nl.module.task.enums.TaskOwnerServiceEnum;
|
import cn.code.nl.module.task.enums.TaskOwnerServiceEnum;
|
||||||
@@ -95,6 +96,7 @@ public class PackageBoxBusinessServiceImpl implements PackageBoxBusinessService
|
|||||||
task.setOwnerService(TaskOwnerServiceEnum.LMS.name());
|
task.setOwnerService(TaskOwnerServiceEnum.LMS.name());
|
||||||
task.setBizType(SUB_ROLL_DOWN_BIZ_TYPE);
|
task.setBizType(SUB_ROLL_DOWN_BIZ_TYPE);
|
||||||
task.setBizId(sourcePoint.getContainerName());
|
task.setBizId(sourcePoint.getContainerName());
|
||||||
|
task.setTaskType(PackageTaskTypeEnum.SUB_ROLL_DOWN_AGV.getCode());
|
||||||
task.setHandleCode(SUB_ROLL_DOWN_HANDLE_CODE);
|
task.setHandleCode(SUB_ROLL_DOWN_HANDLE_CODE);
|
||||||
task.setAcsTaskType(ACS_MOVE_TASK_TYPE);
|
task.setAcsTaskType(ACS_MOVE_TASK_TYPE);
|
||||||
task.setAgvSystemType(AGV_SYSTEM_TYPE);
|
task.setAgvSystemType(AGV_SYSTEM_TYPE);
|
||||||
|
|||||||
@@ -59,4 +59,17 @@ public interface PackagePointService {
|
|||||||
*/
|
*/
|
||||||
PageResult<PackagePointDO> getPackagePointPage(PackagePointPageReqVO pageReqVO);
|
PageResult<PackagePointDO> getPackagePointPage(PackagePointPageReqVO pageReqVO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据点位编码获取点位信息
|
||||||
|
* @param pointCode 点位编码
|
||||||
|
* @param flag 是否判断禁用
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
PackagePointDO getPackagePointByCode(String pointCode, boolean flag);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量更新
|
||||||
|
* @param points
|
||||||
|
*/
|
||||||
|
void updatePackagePoints(List<PackagePointDO> points);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,4 +77,14 @@ public class PackagePointServiceImpl implements PackagePointService {
|
|||||||
return packagePointMapper.selectPage(pageReqVO);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.AbstractTask;
|
||||||
import cn.code.nl.framework.execute.core.dto.TaskExecuteDTO;
|
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 lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 子卷下线AGV任务
|
* 子卷下线AGV任务
|
||||||
* @Author: liyongde
|
* @Author: liyongde
|
||||||
@@ -13,18 +21,46 @@ import org.springframework.stereotype.Component;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
@Component("subRollDownAgvTask")
|
@Component("subRollDownAgvTask")
|
||||||
public class SubRollDownAgvTask extends AbstractTask {
|
public class SubRollDownAgvTask extends AbstractTask {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private TransportTaskApi transportTaskApi;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private PackagePointMapper packagePointMapper;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void doHandleFinish(TaskExecuteDTO taskExecuteDTO) {
|
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
|
@Override
|
||||||
public void doHandleCancel(TaskExecuteDTO taskExecuteDTO) {
|
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
|
@Override
|
||||||
public void doHandlePicked(TaskExecuteDTO taskExecuteDTO) {
|
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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,24 +4,7 @@
|
|||||||
|
|
||||||
<select id="selectAvailablePointList"
|
<select id="selectAvailablePointList"
|
||||||
resultType="cn.code.nl.module.lms.dal.dataobject.packagepoint.PackagePointDO">
|
resultType="cn.code.nl.module.lms.dal.dataobject.packagepoint.PackagePointDO">
|
||||||
SELECT point_id,
|
SELECT *
|
||||||
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
|
|
||||||
FROM lms_package_point
|
FROM lms_package_point
|
||||||
WHERE point_type = #{pointType}
|
WHERE point_type = #{pointType}
|
||||||
AND point_status = #{pointStatus}
|
AND point_status = #{pointStatus}
|
||||||
|
|||||||
@@ -76,8 +76,9 @@ public class TransportTaskServiceImpl implements TransportTaskService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@LogRecord(type = TASK_INFO,
|
@LogRecord(type = TASK_INFO,
|
||||||
|
operator = "2",
|
||||||
subType = TASK_INFO_OPERATE_TYPE,
|
subType = TASK_INFO_OPERATE_TYPE,
|
||||||
bizNo = "{{_ret}}",
|
bizNo = "{{#_ret}}",
|
||||||
success = TASK_INFO_CREATE_BY_RPC)
|
success = TASK_INFO_CREATE_BY_RPC)
|
||||||
public Long createTransportTaskByRpc(TransportTaskCreateReqDTO reqDTO) {
|
public Long createTransportTaskByRpc(TransportTaskCreateReqDTO reqDTO) {
|
||||||
TransportTaskDO task = BeanUtils.toBean(reqDTO, TransportTaskDO.class);
|
TransportTaskDO task = BeanUtils.toBean(reqDTO, TransportTaskDO.class);
|
||||||
|
|||||||
Reference in New Issue
Block a user