diff --git a/src/main/java/com/project/base/config/InsertBatchOnDuplicateKeyUpdate.java b/src/main/java/com/project/base/config/InsertBatchOnDuplicateKeyUpdate.java index 97f07bb..0484fe1 100644 --- a/src/main/java/com/project/base/config/InsertBatchOnDuplicateKeyUpdate.java +++ b/src/main/java/com/project/base/config/InsertBatchOnDuplicateKeyUpdate.java @@ -28,23 +28,39 @@ public class InsertBatchOnDuplicateKeyUpdate extends AbstractMethod { .map(TableFieldInfo::getColumn) .collect(Collectors.joining(",")) + ")"; - // 2. 准备 VALUES 部分 (修复重点!) + // 2. 准备 VALUES 部分 (处理逻辑删除位) String valuesScript = "(#{item." + tableInfo.getKeyProperty() + "}," + tableInfo.getFieldList().stream() .map(i -> { - // 【核心修复】检查该字段是否有 TypeHandler (如 JacksonTypeHandler) + // A. 如果是逻辑删除字段:处理“没传就默认 0” + if (i.isLogicDelete()) { + // 使用 IFNULL 保证如果 Java 对象里 deleted 是 null,数据库填入 0 + return "IFNULL(#{item." + i.getProperty() + "}, 0)"; + } + + // B. 处理 TypeHandler (如之前处理的 JSON 字段) if (i.getTypeHandler() != null) { - // 生成格式如:#{item.depIdPath,typeHandler=com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler} return "#{item." + i.getProperty() + ",typeHandler=" + i.getTypeHandler().getName() + "}"; } + + // C. 普通字段 return "#{item." + i.getProperty() + "}"; }) .collect(Collectors.joining(",")) + ")"; // 3. 准备 ON DUPLICATE KEY UPDATE 部分 String updateScript = tableInfo.getFieldList().stream() + // 排除主键和创建时间 .filter(i -> !i.getColumn().equals("create_time")) - .map(i -> i.getColumn() + " = VALUES(" + i.getColumn() + ")") + .map(i -> { + // 如果是逻辑删除位,在更新时强制置为 0(即复活数据) + // 理由:全量同步中,只要数据还在钉钉列表里,就说明该部门/人员是活跃的 + if (i.isLogicDelete()) { + return i.getColumn() + " = 0"; + } + // 其他字段正常更新 + return i.getColumn() + " = VALUES(" + i.getColumn() + ")"; + }) .collect(Collectors.joining(",")) + ", update_time = NOW()"; String sql = String.format("", diff --git a/src/main/java/com/project/base/config/MybatisPlusConfig.java b/src/main/java/com/project/base/config/MybatisPlusConfig.java index f2218d6..c0b5d9e 100644 --- a/src/main/java/com/project/base/config/MybatisPlusConfig.java +++ b/src/main/java/com/project/base/config/MybatisPlusConfig.java @@ -1,8 +1,12 @@ package com.project.base.config; +import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.core.injector.AbstractMethod; import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.List; @@ -16,5 +20,12 @@ public class MybatisPlusConfig extends DefaultSqlInjector { methodList.add(new InsertBatchOnDuplicateKeyUpdate()); // 确保这里添加了你的自定义方法 return methodList; } - + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + // 向拦截器链中添加分页拦截器 + // DbType.MYSQL 必须设置,否则插件可能无法正确分页 + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + return interceptor; + } } \ No newline at end of file diff --git a/src/main/java/com/project/base/domain/advice/GlobalExceptionHandlerAdvice.java b/src/main/java/com/project/base/domain/advice/GlobalExceptionHandlerAdvice.java index d44a7cc..e7793e9 100644 --- a/src/main/java/com/project/base/domain/advice/GlobalExceptionHandlerAdvice.java +++ b/src/main/java/com/project/base/domain/advice/GlobalExceptionHandlerAdvice.java @@ -9,6 +9,7 @@ import com.project.base.domain.result.ResultCodeEnum; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.validation.BindException; +import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; @@ -69,6 +70,15 @@ public class GlobalExceptionHandlerAdvice { return Result.fail(ResultCodeEnum.getResultCodeEnumByCode(e.getCode()) , e.getMessage()); } + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + @ResponseBody + @ResponseStatus(HttpStatus.OK) + public Result error(HttpRequestMethodNotSupportedException e) { + e.printStackTrace(); + log.error("全局异常捕获:" + e); + return Result.fail(ResultCodeEnum.REQUEST_METHOD_NOT_SUPPORTED); + } + @ExceptionHandler(ResourceNotExistException.class) @ResponseBody diff --git a/src/main/java/com/project/base/domain/dto/BaseDTO.java b/src/main/java/com/project/base/domain/dto/BaseDTO.java index 68ce355..8b9023d 100644 --- a/src/main/java/com/project/base/domain/dto/BaseDTO.java +++ b/src/main/java/com/project/base/domain/dto/BaseDTO.java @@ -24,7 +24,6 @@ public class BaseDTO { public T toEntity(Supplier supplier) { - // 这里的 supplier.get() 等价于执行了 new UserEntity() T entity = supplier.get(); BeanUtil.copyProperties(this, entity); return entity; diff --git a/src/main/java/com/project/base/domain/entity/BaseEntity.java b/src/main/java/com/project/base/domain/entity/BaseEntity.java index 80974db..895bbb4 100644 --- a/src/main/java/com/project/base/domain/entity/BaseEntity.java +++ b/src/main/java/com/project/base/domain/entity/BaseEntity.java @@ -1,5 +1,6 @@ package com.project.base.domain.entity; +import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.annotation.*; import com.project.base.domain.enums.StatusEnum; import jakarta.persistence.Column; @@ -10,6 +11,7 @@ import org.hibernate.annotations.Comment; import java.io.Serializable; import java.util.Date; +import java.util.function.Supplier; @MappedSuperclass @Data @@ -47,4 +49,11 @@ public class BaseEntity implements Serializable { @Column(name = "deleted") private Boolean deleted = StatusEnum.Normal.getValue(); + + + public T toDTO(Supplier supplier) { + T dto = supplier.get(); + BeanUtil.copyProperties(this, dto); + return dto; + } } \ No newline at end of file diff --git a/src/main/java/com/project/base/domain/param/BaseParam.java b/src/main/java/com/project/base/domain/param/BaseParam.java new file mode 100644 index 0000000..72b42d3 --- /dev/null +++ b/src/main/java/com/project/base/domain/param/BaseParam.java @@ -0,0 +1,10 @@ +package com.project.base.domain.param; + + +import lombok.Data; + +@Data +public class BaseParam { + private Integer current = 1; + private Integer size = 10; +} diff --git a/src/main/java/com/project/base/domain/result/PageResult.java b/src/main/java/com/project/base/domain/result/PageResult.java new file mode 100644 index 0000000..1892c67 --- /dev/null +++ b/src/main/java/com/project/base/domain/result/PageResult.java @@ -0,0 +1,23 @@ +package com.project.base.domain.result; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import lombok.Data; +import java.io.Serializable; +import java.util.List; + +@Data +public class PageResult implements Serializable { + private List content; // 数据列表 + private long total; // 总条数 + private long size; // 每页条数 + private long current; // 当前页码 (从1开始) + private long pages; // 总页数 + + public PageResult(IPage mpPage) { + this.content = mpPage.getRecords(); + this.total = mpPage.getTotal(); + this.size = mpPage.getSize(); + this.current = mpPage.getCurrent(); + this.pages = mpPage.getPages(); + } +} \ No newline at end of file diff --git a/src/main/java/com/project/base/domain/result/Result.java b/src/main/java/com/project/base/domain/result/Result.java index 9f3e9a0..728b441 100644 --- a/src/main/java/com/project/base/domain/result/Result.java +++ b/src/main/java/com/project/base/domain/result/Result.java @@ -1,5 +1,6 @@ package com.project.base.domain.result; +import com.baomidou.mybatisplus.core.metadata.IPage; import lombok.Getter; import lombok.Setter; @@ -20,6 +21,8 @@ public class Result implements Serializable { private T data; + + public static Result success(T data) { Result result = new Result(); result.setCode(ResultCodeEnum.SUCCESS.getCode()); @@ -60,4 +63,8 @@ public class Result implements Serializable { return res; } + public static Result> page(IPage mpPage) { + return success(new PageResult<>(mpPage)); + } + } diff --git a/src/main/java/com/project/base/domain/result/ResultCodeEnum.java b/src/main/java/com/project/base/domain/result/ResultCodeEnum.java index 8305765..94f46bf 100644 --- a/src/main/java/com/project/base/domain/result/ResultCodeEnum.java +++ b/src/main/java/com/project/base/domain/result/ResultCodeEnum.java @@ -14,6 +14,8 @@ public enum ResultCodeEnum { USER_NOT_FIND(false , 40103 , "用户身份信息缺失") , PERMISSION_DENIED(false , 40301 , "操作权限不足"), RESOURCE_NOT_EXIST(false , 40401 , "请求的资源不存在") , + REQUEST_METHOD_NOT_SUPPORTED(false , 40501 , "错误的请求方式") , + INTERNAL_SYSTEM_ERROR(false , 50001 , "系统内部错误,请稍后重试"), EXTERNAL_CALL_ERROR(false , 50002 , "外部服务调用失败"), BUSINESS_ERROR(false , 60001 , "业务错误"), diff --git a/src/main/java/com/project/base/domain/utils/PageConverter.java b/src/main/java/com/project/base/domain/utils/PageConverter.java new file mode 100644 index 0000000..a0ce060 --- /dev/null +++ b/src/main/java/com/project/base/domain/utils/PageConverter.java @@ -0,0 +1,14 @@ +package com.project.base.domain.utils; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.project.base.domain.param.BaseParam; + +public class PageConverter { + + /** + * 将任意 BaseParam 子类转换为 MyBatis-Plus 的 Page 对象 + */ + public static Page toMpPage(BaseParam param) { + return new Page<>(param.getCurrent(), param.getSize()); + } +} \ No newline at end of file diff --git a/src/main/java/com/project/ding/application/UserApplicationService.java b/src/main/java/com/project/ding/application/UserApplicationService.java new file mode 100644 index 0000000..8006fc3 --- /dev/null +++ b/src/main/java/com/project/ding/application/UserApplicationService.java @@ -0,0 +1,18 @@ +package com.project.ding.application; + +import com.project.base.domain.result.PageResult; +import com.project.base.domain.result.Result; +import com.project.ding.domain.dto.UserDTO; +import com.project.ding.domain.param.UserParam; + +public interface UserApplicationService { + + Result> search(UserParam param) throws Exception; + + Result getDetail(Long id) throws Exception; + + + + Result getLastSyncTime() throws Exception; + +} diff --git a/src/main/java/com/project/ding/application/impl/UserApplicationServiceImpl.java b/src/main/java/com/project/ding/application/impl/UserApplicationServiceImpl.java new file mode 100644 index 0000000..ce4fde7 --- /dev/null +++ b/src/main/java/com/project/ding/application/impl/UserApplicationServiceImpl.java @@ -0,0 +1,37 @@ +package com.project.ding.application.impl; + +import com.project.base.domain.result.PageResult; +import com.project.base.domain.result.Result; +import com.project.ding.application.UserApplicationService; +import com.project.ding.domain.dto.UserDTO; +import com.project.ding.domain.param.UserParam; +import com.project.ding.domain.service.GetLastSyncTimeSyncLogDomainService; +import com.project.ding.domain.service.SearchUserDomainService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.stereotype.Service; + +@Service +public class UserApplicationServiceImpl implements UserApplicationService { + @Autowired + private SearchUserDomainService searchUserDomainService; + + @Autowired + private GetLastSyncTimeSyncLogDomainService getLastSyncTimeSyncLogDomainService; + + @Override + public Result> search(UserParam param) throws Exception { + return searchUserDomainService.search(param); + } + + @Override + public Result getDetail(Long id) throws Exception { + return searchUserDomainService.getDetail(id); + } + + @Override + public Result getLastSyncTime() throws Exception { + return getLastSyncTimeSyncLogDomainService.getLastSyncTime(); + } +} + diff --git a/src/main/java/com/project/ding/controller/UserController.java b/src/main/java/com/project/ding/controller/UserController.java new file mode 100644 index 0000000..769fd55 --- /dev/null +++ b/src/main/java/com/project/ding/controller/UserController.java @@ -0,0 +1,36 @@ +package com.project.ding.controller; + + +import com.project.base.domain.result.PageResult; +import com.project.base.domain.result.Result; +import com.project.ding.application.UserApplicationService; +import com.project.ding.domain.dto.UserDTO; +import com.project.ding.domain.param.UserParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Slf4j +@RequestMapping("/dingUser") +public class UserController { + @Autowired + private UserApplicationService userApplicationService; + + @GetMapping("/search") + public Result> search(UserParam param) throws Exception { + return userApplicationService.search(param); + } + + @GetMapping("/getLastSyncTime") + public Result getLastSyncTime() throws Exception { + return userApplicationService.getLastSyncTime(); + } + + @GetMapping("/getDetail") + public Result getDetail(Long id) throws Exception { + return userApplicationService.getDetail(id); + } +} diff --git a/src/main/java/com/project/ding/domain/dto/UserDTO.java b/src/main/java/com/project/ding/domain/dto/UserDTO.java index 16979d7..f49fb48 100644 --- a/src/main/java/com/project/ding/domain/dto/UserDTO.java +++ b/src/main/java/com/project/ding/domain/dto/UserDTO.java @@ -1,6 +1,7 @@ package com.project.ding.domain.dto; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.DesensitizedUtil; import com.fasterxml.jackson.annotation.JsonFormat; import com.project.base.domain.dto.BaseDTO; import io.vavr.control.Try; @@ -63,4 +64,10 @@ public class UserDTO extends BaseDTO { .collect(Collectors.joining(","))); return userDTO; } + + public UserDTO desensitize() { + this.mobile = DesensitizedUtil.mobilePhone(this.getMobile()); + this.setName(DesensitizedUtil.chineseName(this.getMobile())); + return this; + } } diff --git a/src/main/java/com/project/ding/domain/entity/DepartmentEntity.java b/src/main/java/com/project/ding/domain/entity/DepartmentEntity.java index 39b9e63..4af423a 100644 --- a/src/main/java/com/project/ding/domain/entity/DepartmentEntity.java +++ b/src/main/java/com/project/ding/domain/entity/DepartmentEntity.java @@ -35,7 +35,7 @@ public class DepartmentEntity extends BaseEntity { private Long parentId; - @TableField(typeHandler = JacksonTypeHandler.class) + @TableField(value = "dept_id_path" , typeHandler = JacksonTypeHandler.class) @Column(name = "dept_id_path", columnDefinition = "json comment '部门ID全路径'") @JdbcTypeCode(SqlTypes.JSON) private List deptIdPath; diff --git a/src/main/java/com/project/ding/domain/entity/SyncLogEntity.java b/src/main/java/com/project/ding/domain/entity/SyncLogEntity.java index 6f13bee..cb4664e 100644 --- a/src/main/java/com/project/ding/domain/entity/SyncLogEntity.java +++ b/src/main/java/com/project/ding/domain/entity/SyncLogEntity.java @@ -1,5 +1,6 @@ package com.project.ding.domain.entity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.project.base.domain.entity.BaseEntity; import jakarta.persistence.Column; @@ -21,10 +22,13 @@ public class SyncLogEntity extends BaseEntity { @Comment("同步开始时间") @Column(name = "start_time") + @TableField("start_time") private Date startTime; @Comment("同步结束时间") @Column(name = "end_time") + @TableField("end_time") + private Date endTime; @Column(name = "status") @@ -32,6 +36,7 @@ public class SyncLogEntity extends BaseEntity { private Integer status; // 0-进行中, 1-成功, 2-失败 @Column(name = "error_msg" , columnDefinition="TEXT comment '错误信息'") + @TableField("error_msg") private String errorMsg; } diff --git a/src/main/java/com/project/ding/domain/entity/UserEntity.java b/src/main/java/com/project/ding/domain/entity/UserEntity.java index ae5b829..8f838d3 100644 --- a/src/main/java/com/project/ding/domain/entity/UserEntity.java +++ b/src/main/java/com/project/ding/domain/entity/UserEntity.java @@ -29,6 +29,7 @@ public class UserEntity extends BaseEntity { private Long id; @Column(name = "union_id" , columnDefinition="varchar(255) comment '企业架构内唯一标识'") + @TableField("union_id") private String unionId; @Column(name = "name" , columnDefinition="varchar(255) comment '员工姓名'") @@ -41,6 +42,7 @@ public class UserEntity extends BaseEntity { private String mobile; @Column(name = "job_number" , columnDefinition="varchar(255) comment '员工工号'") + @TableField("job_number" ) private String jobNumber; @Column(name = "title" , columnDefinition="varchar(50) comment '职位'") @@ -52,11 +54,12 @@ public class UserEntity extends BaseEntity { /** * 存储为 JSON 数组: [1, 10, 101] */ - @TableField(typeHandler = JacksonTypeHandler.class) + @TableField(value = "dept_id_list" , typeHandler = JacksonTypeHandler.class) @Column(name = "dept_id_list", columnDefinition = "json comment '部门ID列表'") @JdbcTypeCode(SqlTypes.JSON) private List deptIdList; + @TableField("hired_date") @Column(name = "hired_date") @Comment("入职时间") private Date hiredDate; diff --git a/src/main/java/com/project/ding/domain/param/UserParam.java b/src/main/java/com/project/ding/domain/param/UserParam.java new file mode 100644 index 0000000..0cbfbf9 --- /dev/null +++ b/src/main/java/com/project/ding/domain/param/UserParam.java @@ -0,0 +1,12 @@ +package com.project.ding.domain.param; + + +import com.project.base.domain.param.BaseParam; +import lombok.Data; + +@Data +public class UserParam extends BaseParam{ + private String name; + + private Long searchDeptId; +} diff --git a/src/main/java/com/project/ding/domain/service/GetLastSyncTimeSyncLogDomainService.java b/src/main/java/com/project/ding/domain/service/GetLastSyncTimeSyncLogDomainService.java new file mode 100644 index 0000000..301144c --- /dev/null +++ b/src/main/java/com/project/ding/domain/service/GetLastSyncTimeSyncLogDomainService.java @@ -0,0 +1,7 @@ +package com.project.ding.domain.service; + +import com.project.base.domain.result.Result; + +public interface GetLastSyncTimeSyncLogDomainService { + Result getLastSyncTime() throws Exception; +} diff --git a/src/main/java/com/project/ding/domain/service/SearchUserDomainService.java b/src/main/java/com/project/ding/domain/service/SearchUserDomainService.java new file mode 100644 index 0000000..bfe6c7c --- /dev/null +++ b/src/main/java/com/project/ding/domain/service/SearchUserDomainService.java @@ -0,0 +1,13 @@ +package com.project.ding.domain.service; + +import com.project.base.domain.result.PageResult; +import com.project.base.domain.result.Result; +import com.project.ding.domain.dto.UserDTO; +import com.project.ding.domain.param.UserParam; + +public interface SearchUserDomainService { + + Result> search(UserParam param) throws Exception; + + Result getDetail(Long id) throws Exception; +} diff --git a/src/main/java/com/project/ding/domain/service/impl/GetLastSyncTimeSyncLogDomainServiceImpl.java b/src/main/java/com/project/ding/domain/service/impl/GetLastSyncTimeSyncLogDomainServiceImpl.java new file mode 100644 index 0000000..7aca253 --- /dev/null +++ b/src/main/java/com/project/ding/domain/service/impl/GetLastSyncTimeSyncLogDomainServiceImpl.java @@ -0,0 +1,32 @@ +package com.project.ding.domain.service.impl; + +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.project.base.domain.result.Result; +import com.project.ding.domain.entity.SyncLogEntity; +import com.project.ding.domain.service.GetLastSyncTimeSyncLogDomainService; +import com.project.ding.mapper.SyncLogMapper; +import io.vavr.control.Try; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class GetLastSyncTimeSyncLogDomainServiceImpl implements GetLastSyncTimeSyncLogDomainService { + + @Autowired + private SyncLogMapper syncLogMapper; + private final static String timeFormatStr = "yyyy-MM-dd HH:mm:ss"; + @Override + public Result getLastSyncTime() throws Exception { + // 1. 查询最后一条成功的记录 + SyncLogEntity lastLog = syncLogMapper.selectOne( + new LambdaQueryWrapper() + .eq(SyncLogEntity::getStatus, 1) // 1-成功 + .orderByDesc(SyncLogEntity::getId) + .last("LIMIT 1") + ); + return Result.success(Try.of(() -> + DateUtil.format(lastLog.getEndTime() , timeFormatStr)) + .getOrElse("")); + } +} diff --git a/src/main/java/com/project/ding/domain/service/impl/SearchUserDomainServiceImpl.java b/src/main/java/com/project/ding/domain/service/impl/SearchUserDomainServiceImpl.java new file mode 100644 index 0000000..bb3911f --- /dev/null +++ b/src/main/java/com/project/ding/domain/service/impl/SearchUserDomainServiceImpl.java @@ -0,0 +1,59 @@ +package com.project.ding.domain.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.project.base.domain.result.PageResult; +import com.project.base.domain.result.Result; +import com.project.base.domain.utils.PageConverter; +import com.project.ding.domain.dto.UserDTO; +import com.project.ding.domain.entity.UserEntity; +import com.project.ding.domain.param.UserParam; +import com.project.ding.domain.service.SearchUserDomainService; +import com.project.ding.mapper.UserMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Objects; + +@Service +public class SearchUserDomainServiceImpl implements SearchUserDomainService { + + @Autowired + private UserMapper userMapper; + + @Override + public Result> search(UserParam param) throws Exception { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (StrUtil.isNotBlank(param.getName())) { + queryWrapper.like(UserEntity::getName , param.getName()); + } + + if (Objects.nonNull(param.getSearchDeptId())) { + queryWrapper.apply("{0} MEMBER OF(dept_id_list)", param.getSearchDeptId()); + } + + queryWrapper.orderByDesc(UserEntity::getDeptIdStr); + IPage userEntityPage = userMapper.selectPage( + PageConverter.toMpPage(param), + queryWrapper); + IPage userDtoPage = userEntityPage.convert(entity -> buildDTO(entity) + .desensitize()); + + return Result.page(userDtoPage); + } + + private UserDTO buildDTO(UserEntity entity) { + UserDTO dto = entity.toDTO(UserDTO::new); + // todo 构建考试信息 + + + return entity.toDTO(UserDTO::new); + } + + @Override + public Result getDetail(Long id) throws Exception { + UserEntity entity = userMapper.selectById(id); + return Result.success(buildDTO(entity)); + } +} diff --git a/src/main/java/com/project/information/application/BusinessGroupApplicationService.java b/src/main/java/com/project/information/application/BusinessGroupApplicationService.java new file mode 100644 index 0000000..6065877 --- /dev/null +++ b/src/main/java/com/project/information/application/BusinessGroupApplicationService.java @@ -0,0 +1,13 @@ +package com.project.information.application; + +import com.project.base.domain.result.Result; +import com.project.information.domain.dto.BusinessGroupDTO; +import com.project.information.domain.param.BusinessGroupParam; + +import java.util.List; + +public interface BusinessGroupApplicationService { + Result> list(BusinessGroupParam param) throws Exception; + + Result> batchSave(String batchSaveStr) throws Exception; +} diff --git a/src/main/java/com/project/information/application/impl/BusinessGroupApplicationServiceImpl.java b/src/main/java/com/project/information/application/impl/BusinessGroupApplicationServiceImpl.java new file mode 100644 index 0000000..2157e93 --- /dev/null +++ b/src/main/java/com/project/information/application/impl/BusinessGroupApplicationServiceImpl.java @@ -0,0 +1,31 @@ +package com.project.information.application.impl; + +import com.project.base.domain.result.Result; +import com.project.information.application.BusinessGroupApplicationService; +import com.project.information.domain.dto.BusinessGroupDTO; +import com.project.information.domain.param.BusinessGroupParam; +import com.project.information.domain.service.BatchSaveBusinessGroupDomainService; +import com.project.information.domain.service.SearchBusinessGroupDomainService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class BusinessGroupApplicationServiceImpl implements BusinessGroupApplicationService { + @Autowired + private SearchBusinessGroupDomainService searchBusinessGroupDomainService; + + @Autowired + private BatchSaveBusinessGroupDomainService batchSaveBusinessGroupDomainService; + + @Override + public Result> list(BusinessGroupParam param) throws Exception { + return searchBusinessGroupDomainService.list(param); + } + + @Override + public Result> batchSave(String batchSaveStr) throws Exception { + return batchSaveBusinessGroupDomainService.batchSave(batchSaveStr); + } +} diff --git a/src/main/java/com/project/information/controller/BusinessGroupController.java b/src/main/java/com/project/information/controller/BusinessGroupController.java new file mode 100644 index 0000000..372bf8b --- /dev/null +++ b/src/main/java/com/project/information/controller/BusinessGroupController.java @@ -0,0 +1,33 @@ +package com.project.information.controller; + + +import com.project.base.domain.result.Result; +import com.project.information.application.BusinessGroupApplicationService; +import com.project.information.domain.dto.BusinessGroupDTO; +import com.project.information.domain.param.BusinessGroupParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@Slf4j +@RequestMapping("/businessGroup") +public class BusinessGroupController { + @Autowired + private BusinessGroupApplicationService businessGroupApplicationService; + + @GetMapping("/list") + public Result> list(BusinessGroupParam param) throws Exception { + return businessGroupApplicationService.list(param); + } + + @PostMapping("/batchSave") + public Result> batchSave(String batchSaveStr) throws Exception { + return businessGroupApplicationService.batchSave(batchSaveStr); + } +} diff --git a/src/main/java/com/project/information/domain/dto/BusinessGroupDTO.java b/src/main/java/com/project/information/domain/dto/BusinessGroupDTO.java new file mode 100644 index 0000000..f2bd3fb --- /dev/null +++ b/src/main/java/com/project/information/domain/dto/BusinessGroupDTO.java @@ -0,0 +1,10 @@ +package com.project.information.domain.dto; + +import com.project.base.domain.dto.BaseDTO; +import lombok.Data; + +@Data +public class BusinessGroupDTO extends BaseDTO { + private String name; + private String sort; +} diff --git a/src/main/java/com/project/information/domain/dto/InformationDTO.java b/src/main/java/com/project/information/domain/dto/InformationDTO.java new file mode 100644 index 0000000..9290fa8 --- /dev/null +++ b/src/main/java/com/project/information/domain/dto/InformationDTO.java @@ -0,0 +1,14 @@ +package com.project.information.domain.dto; + +import com.project.base.domain.dto.BaseDTO; +import lombok.Data; + +@Data +public class InformationDTO extends BaseDTO { + private Long subLineId; + private String subLineName; + private String name; + private String filePath; + private Integer parseStatus; + +} diff --git a/src/main/java/com/project/information/domain/dto/ProductLineDTO.java b/src/main/java/com/project/information/domain/dto/ProductLineDTO.java new file mode 100644 index 0000000..a9acfd1 --- /dev/null +++ b/src/main/java/com/project/information/domain/dto/ProductLineDTO.java @@ -0,0 +1,14 @@ +package com.project.information.domain.dto; + +import lombok.Data; + +@Data +public class ProductLineDTO { + private String name; + private Integer sort; + private Boolean leaf; + private String business; + private Long parentId; + private String parentName; + +} diff --git a/src/main/java/com/project/information/domain/entity/BusinessGroupEntity.java b/src/main/java/com/project/information/domain/entity/BusinessGroupEntity.java new file mode 100644 index 0000000..65b1d3b --- /dev/null +++ b/src/main/java/com/project/information/domain/entity/BusinessGroupEntity.java @@ -0,0 +1,29 @@ +package com.project.information.domain.entity; + + +import com.baomidou.mybatisplus.annotation.TableName; +import com.project.base.domain.entity.BaseEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Index; +import jakarta.persistence.Table; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.hibernate.annotations.Comment; + +@Data +@Table(name = "evaluator_business_group", indexes = {@Index(name = "Idx_sort", columnList = "sort")}) +@Entity +@TableName(value = "evaluator_business_group") +@EqualsAndHashCode(callSuper = true) +public class BusinessGroupEntity extends BaseEntity { + + @Column(name = "name" , columnDefinition="varchar(255) comment '事业部名称'") + private String name; + + + @Column(name = "sort", nullable = false) + @Comment("排序权重") + private Integer sort = 0; // 默认值为0 + +} diff --git a/src/main/java/com/project/information/domain/entity/InformationEntity.java b/src/main/java/com/project/information/domain/entity/InformationEntity.java new file mode 100644 index 0000000..bd8209a --- /dev/null +++ b/src/main/java/com/project/information/domain/entity/InformationEntity.java @@ -0,0 +1,41 @@ +package com.project.information.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.project.base.domain.entity.BaseEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.hibernate.annotations.Comment; + +@Data +@Table(name = "evaluator_information") +@Entity +@TableName(value = "evaluator_information") +@EqualsAndHashCode(callSuper = true) +public class InformationEntity extends BaseEntity { + @Column(name = "sub_line_id") + @Comment("所属子产品线ID") + @TableField("sub_line_id") + private Long subLineId; + + @Column(name = "sub_line_name" , columnDefinition="varchar(550) comment '所属子产品线名称'") + @Comment("所属子产品线名称") + @TableField("sub_line_name") + private String subLineName; + + @Column(name = "name" , columnDefinition="varchar(550) comment '文件名称'") + private String name; + + + @Column(name = "file_path" , columnDefinition="varchar(550) comment '文件存储路径'") + @TableField("file_path") + private String filePath; + + @Column(name = "parse_status") + @TableField("parse_status") + @Comment("排序权重") + private Integer parseStatus; +} diff --git a/src/main/java/com/project/information/domain/entity/ProductLineEntity.java b/src/main/java/com/project/information/domain/entity/ProductLineEntity.java new file mode 100644 index 0000000..17e8a3f --- /dev/null +++ b/src/main/java/com/project/information/domain/entity/ProductLineEntity.java @@ -0,0 +1,43 @@ +package com.project.information.domain.entity; + + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.project.base.domain.entity.BaseEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Index; +import jakarta.persistence.Table; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.hibernate.annotations.Comment; + +@Data +@Table(name = "evaluator_product_line" , indexes = {@Index(name = "Idx_parentId_sort", columnList = "parent_id,sort")}) +@Entity +@TableName(value = "evaluator_product_line") +@EqualsAndHashCode(callSuper = true) +public class ProductLineEntity extends BaseEntity { + @Column(name = "name" , columnDefinition="varchar(550) comment '部门名称'") + private String name; + + @Column(name = "sort", nullable = false) + @Comment("排序权重") + private Integer sort = 0; // 默认值为0 + + @Column(name = "leaf", nullable = false) + @Comment("是否是子产品线") + private Boolean leaf; + + @Column(name = "business", columnDefinition="varchar(100) comment '所属BG名称'") + private String business; + + @Column(name = "parent_id") + @TableField("parent_id") + @Comment("父级ID") + private Long parentId; + + @Column(name = "parent_name", columnDefinition="varchar(550) comment '父级名称'") + @TableField("parent_name") + private String parentName; +} diff --git a/src/main/java/com/project/information/domain/param/BusinessGroupParam.java b/src/main/java/com/project/information/domain/param/BusinessGroupParam.java new file mode 100644 index 0000000..b3fc947 --- /dev/null +++ b/src/main/java/com/project/information/domain/param/BusinessGroupParam.java @@ -0,0 +1,8 @@ +package com.project.information.domain.param; + +import com.project.base.domain.param.BaseParam; +import lombok.Data; + +@Data +public class BusinessGroupParam extends BaseParam { +} diff --git a/src/main/java/com/project/information/domain/param/InformationParam.java b/src/main/java/com/project/information/domain/param/InformationParam.java new file mode 100644 index 0000000..49a6cfa --- /dev/null +++ b/src/main/java/com/project/information/domain/param/InformationParam.java @@ -0,0 +1,8 @@ +package com.project.information.domain.param; + +import com.project.base.domain.param.BaseParam; +import lombok.Data; + +@Data +public class InformationParam extends BaseParam { +} diff --git a/src/main/java/com/project/information/domain/param/ProductLineParam.java b/src/main/java/com/project/information/domain/param/ProductLineParam.java new file mode 100644 index 0000000..1623fd2 --- /dev/null +++ b/src/main/java/com/project/information/domain/param/ProductLineParam.java @@ -0,0 +1,8 @@ +package com.project.information.domain.param; + +import com.project.base.domain.param.BaseParam; +import lombok.Data; + +@Data +public class ProductLineParam extends BaseParam { +} diff --git a/src/main/java/com/project/information/domain/service/BatchSaveBusinessGroupDomainService.java b/src/main/java/com/project/information/domain/service/BatchSaveBusinessGroupDomainService.java new file mode 100644 index 0000000..f0eb57f --- /dev/null +++ b/src/main/java/com/project/information/domain/service/BatchSaveBusinessGroupDomainService.java @@ -0,0 +1,10 @@ +package com.project.information.domain.service; + +import com.project.base.domain.result.Result; +import com.project.information.domain.dto.BusinessGroupDTO; + +import java.util.List; + +public interface BatchSaveBusinessGroupDomainService { + Result> batchSave(String batchSaveStr) throws Exception; +} diff --git a/src/main/java/com/project/information/domain/service/BusinessGroupBaseService.java b/src/main/java/com/project/information/domain/service/BusinessGroupBaseService.java new file mode 100644 index 0000000..a82c623 --- /dev/null +++ b/src/main/java/com/project/information/domain/service/BusinessGroupBaseService.java @@ -0,0 +1,8 @@ +package com.project.information.domain.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.project.ding.domain.entity.UserEntity; +import com.project.information.domain.entity.BusinessGroupEntity; + +public interface BusinessGroupBaseService extends IService { +} diff --git a/src/main/java/com/project/information/domain/service/SearchBusinessGroupDomainService.java b/src/main/java/com/project/information/domain/service/SearchBusinessGroupDomainService.java new file mode 100644 index 0000000..249da88 --- /dev/null +++ b/src/main/java/com/project/information/domain/service/SearchBusinessGroupDomainService.java @@ -0,0 +1,12 @@ +package com.project.information.domain.service; + +import com.project.base.domain.result.Result; +import com.project.information.domain.dto.BusinessGroupDTO; +import com.project.information.domain.param.BusinessGroupParam; + +import java.util.List; + +public interface SearchBusinessGroupDomainService { + Result> list(BusinessGroupParam param) throws Exception; + +} diff --git a/src/main/java/com/project/information/domain/service/impl/BatchSaveBusinessGroupDomainServiceImpl.java b/src/main/java/com/project/information/domain/service/impl/BatchSaveBusinessGroupDomainServiceImpl.java new file mode 100644 index 0000000..c056832 --- /dev/null +++ b/src/main/java/com/project/information/domain/service/impl/BatchSaveBusinessGroupDomainServiceImpl.java @@ -0,0 +1,38 @@ +package com.project.information.domain.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.project.base.domain.result.Result; +import com.project.information.domain.dto.BusinessGroupDTO; +import com.project.information.domain.entity.BusinessGroupEntity; +import com.project.information.domain.service.BatchSaveBusinessGroupDomainService; +import com.project.information.domain.service.BusinessGroupBaseService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class BatchSaveBusinessGroupDomainServiceImpl implements BatchSaveBusinessGroupDomainService { + + @Autowired + private BusinessGroupBaseService businessGroupBaseService; + + @Override + public Result> batchSave(String batchSaveStr) throws Exception { + // 全量删掉 + businessGroupBaseService.remove(new LambdaQueryWrapper<>()); + + List res = new ArrayList<>(); + for (String saveStr : batchSaveStr.split(",")) { + BusinessGroupEntity businessGroupEntity = new BusinessGroupEntity(); + businessGroupEntity.setName(saveStr); + businessGroupBaseService.save(businessGroupEntity); + res.add(businessGroupEntity); + } + return Result.success(res.stream() + .map(entity -> entity.toDTO(BusinessGroupDTO::new)) + .collect(Collectors.toList())); + } +} diff --git a/src/main/java/com/project/information/domain/service/impl/BusinessGroupBaseServiceImpl.java b/src/main/java/com/project/information/domain/service/impl/BusinessGroupBaseServiceImpl.java new file mode 100644 index 0000000..baf9b71 --- /dev/null +++ b/src/main/java/com/project/information/domain/service/impl/BusinessGroupBaseServiceImpl.java @@ -0,0 +1,11 @@ +package com.project.information.domain.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.project.information.domain.entity.BusinessGroupEntity; +import com.project.information.domain.service.BusinessGroupBaseService; +import com.project.information.mapper.BusinessGroupMapper; +import org.springframework.stereotype.Service; + +@Service +public class BusinessGroupBaseServiceImpl extends ServiceImpl implements BusinessGroupBaseService { +} diff --git a/src/main/java/com/project/information/domain/service/impl/SearchBusinessGroupDomainServiceImpl.java b/src/main/java/com/project/information/domain/service/impl/SearchBusinessGroupDomainServiceImpl.java new file mode 100644 index 0000000..64082da --- /dev/null +++ b/src/main/java/com/project/information/domain/service/impl/SearchBusinessGroupDomainServiceImpl.java @@ -0,0 +1,29 @@ +package com.project.information.domain.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.project.base.domain.result.Result; +import com.project.information.domain.dto.BusinessGroupDTO; +import com.project.information.domain.entity.BusinessGroupEntity; +import com.project.information.domain.param.BusinessGroupParam; +import com.project.information.domain.service.SearchBusinessGroupDomainService; +import com.project.information.mapper.BusinessGroupMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class SearchBusinessGroupDomainServiceImpl implements SearchBusinessGroupDomainService { + + @Autowired + private BusinessGroupMapper businessGroupMapper; + @Override + public Result> list(BusinessGroupParam param) throws Exception { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + List entityList = businessGroupMapper.selectList(queryWrapper); + return Result.success(entityList.stream() + .map(entity -> entity.toDTO(BusinessGroupDTO::new)) + .collect(Collectors.toList())); + } +} diff --git a/src/main/java/com/project/information/mapper/BusinessGroupMapper.java b/src/main/java/com/project/information/mapper/BusinessGroupMapper.java new file mode 100644 index 0000000..5c3a811 --- /dev/null +++ b/src/main/java/com/project/information/mapper/BusinessGroupMapper.java @@ -0,0 +1,10 @@ +package com.project.information.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.project.information.domain.entity.BusinessGroupEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface BusinessGroupMapper extends BaseMapper { +} diff --git a/src/main/java/com/project/information/mapper/InformationMapper.java b/src/main/java/com/project/information/mapper/InformationMapper.java new file mode 100644 index 0000000..d9bb9f8 --- /dev/null +++ b/src/main/java/com/project/information/mapper/InformationMapper.java @@ -0,0 +1,9 @@ +package com.project.information.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.project.information.domain.entity.InformationEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface InformationMapper extends BaseMapper { +} diff --git a/src/main/java/com/project/information/mapper/ProductLineMapper.java b/src/main/java/com/project/information/mapper/ProductLineMapper.java new file mode 100644 index 0000000..895cb26 --- /dev/null +++ b/src/main/java/com/project/information/mapper/ProductLineMapper.java @@ -0,0 +1,9 @@ +package com.project.information.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.project.information.domain.entity.ProductLineEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProductLineMapper extends BaseMapper { +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index e8f41f4..b683466 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -40,6 +40,10 @@ spring: max-file-size: 100MB max-request-size: 100MB jackson: + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 + serialization: + write-dates-as-timestamps: false generator: write-numbers-as-strings: true minio: