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: