Compare commits

...

4 Commits

Author SHA1 Message Date
aikai
2cff1970d7 refactor(infra): 代码生成器模板中引入 MyBatis-Plus
- 在 service 接口中添加了对 MyBatis-Plus IService 接口的继承- 在 service 实现类中引入了 MyBatis-Plus 的 ServiceImpl 基类
-优化了 service 实现类的结构,使其与 MyBatis-Plus 集成
2025-03-31 10:56:59 +08:00
aikai
d96b447a94 修改库位错误码描述 2025-03-31 10:22:17 +08:00
aikai
c7b55614bb Merge branch 'dev' of http://git.znkjfw.com/ak/zn-cloud-wcs into aikai 2025-03-31 10:21:19 +08:00
aikai
4dd58bdfeb 优化用户账号名称校验和错误码 2025-03-31 10:21:12 +08:00
20 changed files with 75 additions and 35 deletions

View File

@ -2,6 +2,7 @@ package ${basePackage}.module.${table.moduleName}.service.${table.businessName};
import java.util.*;
import ${jakartaPackage}.validation.*;
import com.baomidou.mybatisplus.extension.service.IService;
import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*;
import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO;
## 特殊:主子表专属逻辑
@ -16,7 +17,7 @@ import ${PageParamClassName};
*
* @author ${table.author}
*/
public interface ${table.className}Service {
public interface ${table.className}Service extends IService<${table.className}DO> {
/**
* 创建${table.classComment}
@ -144,4 +145,4 @@ public interface ${table.className}Service {
#end
#end
}
}

View File

@ -15,6 +15,7 @@ import ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.bu
import ${PageResultClassName};
import ${PageParamClassName};
import ${BeanUtils};
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import ${basePackage}.module.${table.moduleName}.dal.mysql.${table.businessName}.${table.className}Mapper;
## 特殊:主子表专属逻辑
@ -33,7 +34,8 @@ import static ${basePackage}.module.${table.moduleName}.enums.ErrorCodeConstants
*/
@Service
@Validated
public class ${table.className}ServiceImpl implements ${table.className}Service {
#set($mainMapper = "${table.className}Mapper")
public class ${table.className}ServiceImpl extends ServiceImpl<${mainMapper}, ${table.className}DO> implements ${table.className}Service {
@Resource
private ${table.className}Mapper ${classNameVar}Mapper;
@ -348,4 +350,4 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
}
#end
}
}

View File

@ -24,9 +24,9 @@ public class LoginLogCreateReqDTO {
@Schema(description = "用户类型,参见 UserTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "2" )
@NotNull(message = "用户类型不能为空")
private Integer userType;
@Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudao")
@NotBlank(message = "用户账号不能为空")
@Size(max = 30, message = "用户账号长度不能超过30个字符")
@Schema(description = "用户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudao")
@NotBlank(message = "用户名称不能为空")
@Size(max = 30, message = "用户名称长度不能超过30个字符")
private String username;
@Schema(description = "登录结果,参见 LoginResultEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")

View File

@ -34,7 +34,7 @@ public interface ErrorCodeConstants {
ErrorCode ROLE_ADMIN_CODE_ERROR = new ErrorCode(1_002_002_005, "标识【{}】不能使用");
// ========== 用户模块 1-002-003-000 ==========
ErrorCode USER_USERNAME_EXISTS = new ErrorCode(1_002_003_000, "用户账号已经存在");
ErrorCode USER_USERNAME_EXISTS = new ErrorCode(1_002_003_000, "用户名称已经存在");
ErrorCode USER_MOBILE_EXISTS = new ErrorCode(1_002_003_001, "手机号已经存在");
ErrorCode USER_EMAIL_EXISTS = new ErrorCode(1_002_003_002, "邮箱已经存在");
ErrorCode USER_NOT_EXISTS = new ErrorCode(1_002_003_003, "用户不存在");
@ -228,7 +228,7 @@ public interface ErrorCodeConstants {
ErrorCode AGV_IMAGE_CONVERSION_TO_BASE64_FAILED = new ErrorCode(1_002_038_005, "AGV图片转base64失败");
ErrorCode THE_LINE_LIBRARY_POINTS_ARE_NOT_LOCATED_IN_THE_SAME_AREA = new ErrorCode(1_002_038_006, "线库点位不在同一区域内");
ErrorCode THERE_ARE_ALREADY_STORAGE_LOCATIONS_IN_OTHER_LINE_WAREHOUSES = new ErrorCode(1_002_038_007, "已有库位在其他线库内");
ErrorCode THERE_ARE_ALREADY_STORAGE_LOCATIONS_IN_OTHER_STORAGE_AREAS = new ErrorCode(1_002_038_008, "已有库位在其他库区");
ErrorCode THERE_ARE_ALREADY_STORAGE_LOCATIONS_IN_OTHER_STORAGE_AREAS = new ErrorCode(1_002_038_008, "已有库位在其它区域");
// ========== 机器人自动移库 1-002-039-000 ==========
ErrorCode TASK_AUTO_MOVE_NOT_EXISTS = new ErrorCode(1_002_039_001, "机器人自动移库不存在");

View File

@ -14,10 +14,10 @@ import javax.validation.constraints.Size;
@Data
public class AuthRegisterReqVO {
@Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudao")
@NotBlank(message = "用户账号不能为空")
@Schema(description = "用户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudao")
@NotBlank(message = "用户名称不能为空")
@Pattern(regexp = "^[a-zA-Z0-9]{4,30}$", message = "用户名称由 数字、字母 组成")
@Size(min = 4, max = 30, message = "用户账号长度为 4-30 个字符")
@Size(min = 4, max = 30, message = "用户名称长度为 4-30 个字符")
private String username;
@Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")

View File

@ -36,4 +36,7 @@ public class HouseAreaRespVO {
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "地图库位节点ids")
private List<Long> mapItemIds;
}

View File

@ -18,7 +18,7 @@ public class LoginLogPageReqVO extends PageParam {
@Schema(description = "用户 IP模拟匹配", example = "127.0.0.1")
private String userIp;
@Schema(description = "用户账号,模拟匹配", example = "芋道")
@Schema(description = "用户名称,模拟匹配", example = "芋道")
private String username;
@Schema(description = "操作状态", example = "true")

View File

@ -33,8 +33,8 @@ public class LoginLogRespVO {
@Schema(description = "链路追踪编号", example = "89aca178-a370-411c-ae02-3f0d672be4ab")
private String traceId;
@Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudao")
@ExcelProperty("用户账号")
@Schema(description = "用户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudao")
@ExcelProperty("用户名称")
private String username;
@Schema(description = "登录结果,参见 LoginResultEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")

View File

@ -16,7 +16,7 @@ public class OAuth2UserInfoRespVO {
@Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long id;
@Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
@Schema(description = "用户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
private String username;
@Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")

View File

@ -25,7 +25,7 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 仓库点位地图")
@RestController
@RequestMapping("/system/position-map/")
@RequestMapping("/system/position-map")
@Validated
public class PositionMapController {

View File

@ -51,16 +51,16 @@ public class TenantSaveReqVO {
// ========== 创建需要传递的字段 ==========
@Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudao")
@Schema(description = "用户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudao")
@Pattern(regexp = "^[a-zA-Z0-9]{4,30}$", message = "用户名称由 数字、字母 组成")
@Size(min = 4, max = 30, message = "用户账号长度为 4-30 个字符")
@Size(min = 4, max = 30, message = "用户名称长度为 4-30 个字符")
private String username;
@Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456")
@Length(min = 4, max = 16, message = "密码长度为 4-16 位")
private String password;
@AssertTrue(message = "用户账号、密码不能为空")
@AssertTrue(message = "用户名称、密码不能为空")
@JsonIgnore
public boolean isUsernameValid() {
return id != null // 修改时不需要传递

View File

@ -16,7 +16,7 @@ public class UserProfileRespVO {
@Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long id;
@Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudao")
@Schema(description = "用户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudao")
private String username;
@Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")

View File

@ -19,7 +19,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
@EqualsAndHashCode(callSuper = true)
public class UserPageReqVO extends PageParam {
@Schema(description = "用户账号,模糊匹配", example = "yudao")
@Schema(description = "用户名称,模糊匹配", example = "yudao")
private String username;
@Schema(description = "手机号码,模糊匹配", example = "yudao")

View File

@ -20,7 +20,7 @@ public class UserRespVO{
@ExcelProperty("用户编号")
private Long id;
@Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudao")
@Schema(description = "用户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudao")
@ExcelProperty("用户名称")
private String username;

View File

@ -21,11 +21,11 @@ public class UserSaveReqVO {
@Schema(description = "用户编号", example = "1024")
private Long id;
@Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudao")
@NotBlank(message = "用户账号不能为空")
@Schema(description = "用户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudao")
@NotBlank(message = "用户名称不能为空")
@Pattern(regexp = "^[a-zA-Z0-9]{4,30}$", message = "用户名称由 数字、字母 组成")
@Size(min = 4, max = 30, message = "用户账号长度为 4-30 个字符")
@DiffLogField(name = "用户账号")
@Size(min = 4, max = 30, message = "用户名称长度为 4-30 个字符")
@DiffLogField(name = "用户名称")
private String username;
@Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")

View File

@ -1,12 +1,11 @@
package cn.iocoder.yudao.module.system.dal.dataobject.housearea;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.*;
import lombok.*;
import java.util.List;
/**
* 库区 DO
*
@ -45,4 +44,9 @@ public class HouseAreaDO extends BaseDO {
*/
private String areaMsg;
/**
* 地图库位节点ids
*/
@TableField(exist = false)
private List<Long> mapItemIds;
}

View File

@ -49,7 +49,7 @@ public class LoginLogDO extends BaseDO {
*/
private Integer userType;
/**
* 用户账号
* 用户名称
*
* 冗余因为账号可以变更
*/

View File

@ -34,7 +34,7 @@ public class AdminUserDO extends TenantBaseDO {
@TableId
private Long id;
/**
* 用户账号
* 用户名称
*/
private String username;
/**

View File

@ -28,6 +28,7 @@ import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@ -89,7 +90,20 @@ public class HouseAreaServiceImpl extends ServiceImpl<HouseAreaMapper, HouseArea
@Override
public PageResult<HouseAreaDO> getHouseAreaPage(HouseAreaPageReqVO pageReqVO) {
return houseAreaMapper.selectPage(pageReqVO);
PageResult<HouseAreaDO> houseAreaDOPageResult = houseAreaMapper.selectPage(pageReqVO);
if (CollUtil.isNotEmpty(houseAreaDOPageResult.getList())) {
List<Long> ids = houseAreaDOPageResult.getList().stream().map(HouseAreaDO::getId).collect(Collectors.toList());
List<PositionMapItemDO> list = positionMapItemService.list(new LambdaQueryWrapper<PositionMapItemDO>()
.eq(PositionMapItemDO::getPositionMapId, pageReqVO.getPositionMapId())
.in(PositionMapItemDO::getAreaId, ids));
if (CollUtil.isNotEmpty(list)) {
Map<Long, List<Long>> map = CollectionUtils.convertMultiMap(list, PositionMapItemDO::getAreaId, PositionMapItemDO::getId);
for (HouseAreaDO houseAreaDO : houseAreaDOPageResult.getList()) {
houseAreaDO.setMapItemIds(map.getOrDefault(houseAreaDO.getId(), Collections.emptyList()));
}
}
}
return houseAreaDOPageResult;
}
@Override
@ -98,6 +112,7 @@ public class HouseAreaServiceImpl extends ServiceImpl<HouseAreaMapper, HouseArea
// 判断名称唯一
Long count = houseAreaMapper.selectCount(
new LambdaQueryWrapper<HouseAreaDO>()
.eq(HouseAreaDO::getPositionMapId, createReqVO.getPositionMapId())
.eq(HouseAreaDO::getAreaName, createReqVO.getAreaName())
.ne(ObjectUtil.isNotNull(createReqVO.getId()), HouseAreaDO::getId, createReqVO.getId())
);

View File

@ -27,6 +27,7 @@ import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@ -63,7 +64,20 @@ public class WareHouseLaneServiceImpl extends ServiceImpl<WareHouseLaneMapper, W
@Override
public PageResult<WareHouseLaneDO> getHouseLanePage(WareHouseLanePageReqVO pageReqVO) {
return houseLaneMapper.selectPage(pageReqVO);
PageResult<WareHouseLaneDO> houseLaneDOPageResult = houseLaneMapper.selectPage(pageReqVO);
if (CollUtil.isNotEmpty(houseLaneDOPageResult.getList())) {
List<Long> ids = houseLaneDOPageResult.getList().stream().map(WareHouseLaneDO::getId).collect(Collectors.toList());
List<PositionMapItemDO> list = positionMapItemService.list(new LambdaQueryWrapper<PositionMapItemDO>()
.eq(PositionMapItemDO::getPositionMapId, pageReqVO.getPositionMapId())
.in(PositionMapItemDO::getLaneId, ids));
if (CollUtil.isNotEmpty(list)) {
Map<Long, List<Long>> map = CollectionUtils.convertMultiMap(list, PositionMapItemDO::getLaneId, PositionMapItemDO::getId);
for (WareHouseLaneDO wareHouseLaneDO : houseLaneDOPageResult.getList()) {
wareHouseLaneDO.setMapItemIds(map.getOrDefault(wareHouseLaneDO.getId(), Collections.emptyList()));
}
}
}
return houseLaneDOPageResult;
}
@Override
@ -73,6 +87,7 @@ public class WareHouseLaneServiceImpl extends ServiceImpl<WareHouseLaneMapper, W
Long num = houseLaneMapper.selectCount(
new LambdaQueryWrapper<WareHouseLaneDO>()
.eq(WareHouseLaneDO::getLaneName, createReqVO.getLaneName())
.eq(WareHouseLaneDO::getPositionMapId, createReqVO.getPositionMapId())
.ne(ObjectUtil.isNotNull(createReqVO.getId()), WareHouseLaneDO::getId, createReqVO.getId())
);
if (num > 0) {