张旭锋 пре 5 часа
родитељ
комит
a037a0434b
39 измењених фајлова са 2059 додато и 37 уклоњено
  1. 58 0
      src/main/java/com/jtzx/crm/module/api/web/sys/AdminDictProvinceRegionController.java
  2. 79 0
      src/main/java/com/jtzx/crm/module/api/web/sys/AdminParamController.java
  3. 0 4
      src/main/java/com/jtzx/crm/module/api/web/sys/AdminSysUserController.java
  4. 42 0
      src/main/java/com/jtzx/crm/module/sys/entity/DictAreaRegionEntity.java
  5. 42 0
      src/main/java/com/jtzx/crm/module/sys/entity/DictCityRegionEntity.java
  6. 50 0
      src/main/java/com/jtzx/crm/module/sys/entity/DictProvinceRegionEntity.java
  7. 43 0
      src/main/java/com/jtzx/crm/module/sys/entity/SysGroupEntity.java
  8. 46 0
      src/main/java/com/jtzx/crm/module/sys/entity/SysParamBaseDataEntity.java
  9. 43 0
      src/main/java/com/jtzx/crm/module/sys/entity/SysParamEntity.java
  10. 15 0
      src/main/java/com/jtzx/crm/module/sys/mapper/DictAreaRegionMapper.java
  11. 15 0
      src/main/java/com/jtzx/crm/module/sys/mapper/DictCityRegionMapper.java
  12. 15 0
      src/main/java/com/jtzx/crm/module/sys/mapper/DictProvinceRegionMapper.java
  13. 15 0
      src/main/java/com/jtzx/crm/module/sys/mapper/SysGroupMapper.java
  14. 15 0
      src/main/java/com/jtzx/crm/module/sys/mapper/SysParamBaseDataMapper.java
  15. 15 0
      src/main/java/com/jtzx/crm/module/sys/mapper/SysParamMapper.java
  16. 5 0
      src/main/java/com/jtzx/crm/module/sys/mapper/xml/DictAreaRegionMapper.xml
  17. 5 0
      src/main/java/com/jtzx/crm/module/sys/mapper/xml/DictCityRegionMapper.xml
  18. 5 0
      src/main/java/com/jtzx/crm/module/sys/mapper/xml/DictProvinceRegionMapper.xml
  19. 5 0
      src/main/java/com/jtzx/crm/module/sys/mapper/xml/SysGroupMapper.xml
  20. 5 0
      src/main/java/com/jtzx/crm/module/sys/mapper/xml/SysParamBaseDataMapper.xml
  21. 5 0
      src/main/java/com/jtzx/crm/module/sys/mapper/xml/SysParamMapper.xml
  22. 41 0
      src/main/java/com/jtzx/crm/module/sys/model/request/AdminSysGroupInsertOrUpdateDTO.java
  23. 46 0
      src/main/java/com/jtzx/crm/module/sys/model/request/AdminSysGroupListDTO.java
  24. 39 0
      src/main/java/com/jtzx/crm/module/sys/model/request/AdminSysParamBaseDataInsertOrUpdateDTO.java
  25. 46 0
      src/main/java/com/jtzx/crm/module/sys/model/request/AdminSysParamBaseDataListDTO.java
  26. 35 0
      src/main/java/com/jtzx/crm/module/sys/model/request/AdminSysParamInsertOrUpdateDTO.java
  27. 52 0
      src/main/java/com/jtzx/crm/module/sys/model/response/DictAreaRegionBO.java
  28. 52 0
      src/main/java/com/jtzx/crm/module/sys/model/response/DictCityRegionBO.java
  29. 58 0
      src/main/java/com/jtzx/crm/module/sys/model/response/DictProvinceRegionBO.java
  30. 49 0
      src/main/java/com/jtzx/crm/module/sys/model/response/SysGroupBO.java
  31. 53 0
      src/main/java/com/jtzx/crm/module/sys/model/response/SysParamBO.java
  32. 52 0
      src/main/java/com/jtzx/crm/module/sys/model/response/SysParamBaseDataBO.java
  33. 89 0
      src/main/java/com/jtzx/crm/module/sys/service/DictAreaRegionService.java
  34. 91 0
      src/main/java/com/jtzx/crm/module/sys/service/DictCityRegionService.java
  35. 185 0
      src/main/java/com/jtzx/crm/module/sys/service/DictProvinceRegionService.java
  36. 200 0
      src/main/java/com/jtzx/crm/module/sys/service/SysGroupService.java
  37. 201 0
      src/main/java/com/jtzx/crm/module/sys/service/SysParamBaseDataService.java
  38. 121 0
      src/main/java/com/jtzx/crm/module/sys/service/SysParamService.java
  39. 126 33
      src/test/java/com/jtzx/crm/test/ExampleUnitTest.java

+ 58 - 0
src/main/java/com/jtzx/crm/module/api/web/sys/AdminDictProvinceRegionController.java

@@ -0,0 +1,58 @@
+package com.jtzx.crm.module.api.web.sys;
+
+import cc.uncarbon.framework.web.model.response.ApiResult;
+import cn.dev33.satoken.annotation.SaCheckLogin;
+import com.jtzx.crm.module.api.constant.ApiConstant;
+import com.jtzx.crm.module.api.util.CrmAdminStpUtil;
+import com.jtzx.crm.module.sys.model.response.DictProvinceRegionBO;
+import com.jtzx.crm.module.sys.service.DictProvinceRegionService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+
+/**
+ * 后台管理-全国省省份数据管理接口
+ */
+@SaCheckLogin(type = CrmAdminStpUtil.TYPE)
+@Tag(name = "全国省省份数据管理接口")
+@RequestMapping(ApiConstant.HTTP_API_URL_PREFIX + "/api/v1")
+@RequiredArgsConstructor
+@RestController
+@Slf4j
+public class AdminDictProvinceRegionController {
+
+
+    private final DictProvinceRegionService dictProvinceRegionService;
+
+
+    @Operation(summary = "已使用的省份列表", description = "开通的省份列表数据")
+    @GetMapping("/region/listUsed")
+    public ApiResult<List<DictProvinceRegionBO>> listUsed() {
+        return ApiResult.data(dictProvinceRegionService.listUsed());
+    }
+
+    @Operation(summary = "未使用的省份列表", description = "添加省份时,下拉数据列表")
+    @GetMapping("/region/listAll")
+    public ApiResult<List<DictProvinceRegionBO>> list() {
+        return ApiResult.data(dictProvinceRegionService.listUnUsed());
+    }
+
+    @Operation(summary = "省份新增")
+    @GetMapping("/region/add/{id}/{sortCode}")
+    public ApiResult<Void> insert(@PathVariable Long id, @PathVariable Integer sortCode) {
+        dictProvinceRegionService.openProvinceStatus(id, sortCode);
+        return ApiResult.success();
+    }
+
+    @Operation(summary = "省份删除")
+    @GetMapping("/region/delete/{id}")
+    public ApiResult<Void> delete(@PathVariable Long id) {
+        dictProvinceRegionService.DeleteProvinceStatus(id);
+        return ApiResult.success();
+    }
+}

+ 79 - 0
src/main/java/com/jtzx/crm/module/api/web/sys/AdminParamController.java

@@ -0,0 +1,79 @@
+package com.jtzx.crm.module.api.web.sys;
+
+
+import cc.uncarbon.framework.web.model.response.ApiResult;
+import cn.dev33.satoken.annotation.SaCheckLogin;
+import com.jtzx.crm.module.api.constant.ApiConstant;
+import com.jtzx.crm.module.api.util.CrmAdminStpUtil;
+import com.jtzx.crm.module.sys.model.request.AdminSysParamBaseDataInsertOrUpdateDTO;
+import com.jtzx.crm.module.sys.model.request.AdminSysParamInsertOrUpdateDTO;
+import com.jtzx.crm.module.sys.model.response.SysParamBO;
+import com.jtzx.crm.module.sys.model.response.SysParamBaseDataBO;
+import com.jtzx.crm.module.sys.service.SysParamBaseDataService;
+import com.jtzx.crm.module.sys.service.SysParamService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@SaCheckLogin(type = CrmAdminStpUtil.TYPE)
+@Tag(name = "参数配置接口")
+@RequestMapping(ApiConstant.HTTP_API_URL_PREFIX + "/api/v1/param")
+@RequiredArgsConstructor
+@RestController
+@Slf4j
+public class AdminParamController {
+
+    private final SysParamBaseDataService sysParamBaseDataService;
+
+    private final SysParamService sysParamService;
+
+    @Operation(summary = "查询参数配置数据")
+    @GetMapping("/queryParams")
+    public ApiResult<SysParamBO> queryParams() {
+        SysParamBO sysParamBO = sysParamService.queryParams();
+        return ApiResult.data(sysParamBO);
+    }
+
+    @Operation(summary = "修改参数配置",description = "公海设置的三个框")
+    @PostMapping(value = "/updateParams")
+    public ApiResult<Void> updateParams(@RequestBody AdminSysParamInsertOrUpdateDTO dto){
+        sysParamService.adminUpdate(dto);
+        return ApiResult.success();
+    }
+
+
+    @Operation(summary = "学段,产品,职务,跟进状态列表",description = "type类型:0-学段,1-产品,2-职务,3-跟进")
+    @GetMapping("/listParams/{type}")
+    public ApiResult<List<SysParamBaseDataBO>> queryStage(@PathVariable Integer type) {
+        return ApiResult.data(sysParamBaseDataService.queryList(type));
+    }
+
+
+    @Operation(summary = "新增学段,产品,职务,跟进状态数据")
+    @PostMapping(value = "/addParams")
+    public ApiResult<Void> addParams(@RequestBody @Valid AdminSysParamBaseDataInsertOrUpdateDTO dto) {
+        sysParamBaseDataService.adminInsert(dto);
+        return ApiResult.success();
+    }
+
+    @Operation(summary = "修改学段,产品,职务,跟进状态数据")
+    @PostMapping(value = "/modifyParams")
+    public ApiResult<Void> modifyParams(@RequestBody @Valid AdminSysParamBaseDataInsertOrUpdateDTO dto) {
+        sysParamBaseDataService.update(dto);
+        return ApiResult.success();
+    }
+
+
+    @Operation(summary = "删除学段,产品,职务,跟进状态")
+    @GetMapping("/deleteParams/{id}")
+    public ApiResult<Void> deleteParams(@PathVariable Long id) {
+        sysParamBaseDataService.delete(id);
+        return ApiResult.success();
+    }
+
+}

+ 0 - 4
src/main/java/com/jtzx/crm/module/api/web/sys/AdminSysUserController.java

@@ -8,7 +8,6 @@ import cn.dev33.satoken.annotation.SaCheckLogin;
 import com.google.common.collect.Lists;
 import com.jtzx.crm.module.api.constant.ApiConstant;
 import com.jtzx.crm.module.api.util.CrmAdminStpUtil;
-import com.jtzx.crm.module.sys.annotation.SysLog;
 import com.jtzx.crm.module.sys.model.request.AdminListSysUserDTO;
 import com.jtzx.crm.module.sys.model.request.InsertOrUpdateSysUserDTO;
 import com.jtzx.crm.module.sys.model.request.UpdateSysUserPasswordDTO;
@@ -41,7 +40,6 @@ public class AdminSysUserController {
     }
 
 
-    @SysLog(value = "新增后台用户")
     @Operation(summary = "新增")
     @PostMapping(value = "/sys/users/add")
     public ApiResult<Void> insert(@RequestBody @Valid InsertOrUpdateSysUserDTO dto) {
@@ -49,7 +47,6 @@ public class AdminSysUserController {
         return ApiResult.success();
     }
 
-    @SysLog(value = "编辑后台用户")
     @Operation(summary = "编辑")
     @PostMapping(value = "/sys/users/update/{id}")
     public ApiResult<Void> update(@Valid InsertOrUpdateSysUserDTO dto) {
@@ -60,7 +57,6 @@ public class AdminSysUserController {
         return ApiResult.success();
     }
 
-    @SysLog(value = "删除后台用户")
     @Operation(summary = "删除")
     @GetMapping(value = "/sys/users/delete/{userId}")
     public ApiResult<Void> delete(@PathVariable Long userId) {

+ 42 - 0
src/main/java/com/jtzx/crm/module/sys/entity/DictAreaRegionEntity.java

@@ -0,0 +1,42 @@
+package com.jtzx.crm.module.sys.entity;
+
+import cc.uncarbon.framework.crud.entity.HelioBaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+import io.swagger.v3.oas.annotations.media.Schema;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+
+/**
+ * 全国省省份数据
+ */
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@TableName(value = "dict_area_region")
+public class DictAreaRegionEntity extends HelioBaseEntity<Long> {
+
+    @Schema(description = "")
+    @TableField(value = "code")
+    private String code;
+
+    @Schema(description = "")
+    @TableField(value = "name")
+    private String name;
+
+    @Schema(description = "")
+    @TableField(value = "parent_code")
+    private String parentCode;
+
+    @Schema(description = "")
+    @TableField(value = "level")
+    private Integer level;
+
+}

+ 42 - 0
src/main/java/com/jtzx/crm/module/sys/entity/DictCityRegionEntity.java

@@ -0,0 +1,42 @@
+package com.jtzx.crm.module.sys.entity;
+
+import cc.uncarbon.framework.crud.entity.HelioBaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+import io.swagger.v3.oas.annotations.media.Schema;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+
+/**
+ * 全国城市数据
+ */
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@TableName(value = "dict_city_region")
+public class DictCityRegionEntity extends HelioBaseEntity<Long> {
+
+    @Schema(description = "")
+    @TableField(value = "code")
+    private String code;
+
+    @Schema(description = "")
+    @TableField(value = "name")
+    private String name;
+
+    @Schema(description = "")
+    @TableField(value = "parent_code")
+    private String parentCode;
+
+    @Schema(description = "")
+    @TableField(value = "level")
+    private Integer level;
+
+}

+ 50 - 0
src/main/java/com/jtzx/crm/module/sys/entity/DictProvinceRegionEntity.java

@@ -0,0 +1,50 @@
+package com.jtzx.crm.module.sys.entity;
+
+import cc.uncarbon.framework.crud.entity.HelioBaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+import io.swagger.v3.oas.annotations.media.Schema;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+
+/**
+ * 全国省省份数据
+ */
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@TableName(value = "dict_province_region")
+public class DictProvinceRegionEntity extends HelioBaseEntity<Long> {
+
+    @Schema(description = "")
+    @TableField(value = "code")
+    private String code;
+
+    @Schema(description = "")
+    @TableField(value = "name")
+    private String name;
+
+    @Schema(description = "")
+    @TableField(value = "parent_code")
+    private String parentCode;
+
+    @Schema(description = "")
+    @TableField(value = "level")
+    private Integer level;
+
+    @Schema(description = "编号(前端会进行排序,前端传过来)")
+    @TableField(value = "sort_code")
+    private Integer sortCode;
+
+    @Schema(description = "使用状态,0-未使用,1-已使用")
+    @TableField(value = "use_status")
+    private Integer useStatus;
+
+}

+ 43 - 0
src/main/java/com/jtzx/crm/module/sys/entity/SysGroupEntity.java

@@ -0,0 +1,43 @@
+package com.jtzx.crm.module.sys.entity;
+
+import cc.uncarbon.framework.crud.entity.HelioBaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+
+
+/**
+ * 后台分组数据
+ */
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@TableName(value = "sys_group")
+public class SysGroupEntity extends HelioBaseEntity<Long> {
+
+    @Schema(description = "名称")
+    @TableField(value = "title")
+    private String title;
+
+    @Schema(description = "省份表主id")
+    @TableField(value = "region_id")
+    private Long regionId;
+
+    @Schema(description = "编号(前端会进行排序,前端传过来)")
+    @TableField(value = "sort_code")
+    private Integer sortCode;
+
+    @Schema(description = "逻辑删除标识",title = "0=否 1=是")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+}

+ 46 - 0
src/main/java/com/jtzx/crm/module/sys/entity/SysParamBaseDataEntity.java

@@ -0,0 +1,46 @@
+package com.jtzx.crm.module.sys.entity;
+
+import cc.uncarbon.framework.crud.entity.HelioBaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+
+
+/**
+ * 学段,产品,职务,跟进管理
+ */
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@TableName(value = "sys_param_base_data")
+public class SysParamBaseDataEntity extends HelioBaseEntity<Long> {
+
+    @Schema(description = "名称")
+    @TableField(value = "title")
+    private String title;
+
+    @Schema(description = "编号(前端会进行排序,前端传过来)")
+    @TableField(value = "sort_code")
+    private Integer sortCode;
+
+    @Schema(description = "类型:0-学段,1-产品,2-职务,3-跟进")
+    @TableField(value = "type")
+    private Integer type;
+
+    @Schema(description = "逻辑删除标识",title = "0=否 1=是")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @Schema(description = "状态,0-不是系统默认,1-系统默认(不能删除)")
+    @TableField("status")
+    private Integer status;
+}

+ 43 - 0
src/main/java/com/jtzx/crm/module/sys/entity/SysParamEntity.java

@@ -0,0 +1,43 @@
+package com.jtzx.crm.module.sys.entity;
+
+import cc.uncarbon.framework.crud.entity.HelioBaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+
+
+/**
+ * 参数设置
+ */
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@TableName(value = "sys_param")
+public class SysParamEntity extends HelioBaseEntity<Long> {
+
+    @Schema(description = "名称")
+    @TableField(value = "title")
+    private String title;
+
+    @Schema(description = "持有上限")
+    @TableField(value = "hold_top_count")
+    private Integer holdTopCount;
+
+    @Schema(description = "日退上限")
+    @TableField(value = "day_back_top_count")
+    private Integer dayBackTopCount;
+
+    @Schema(description = "退回公海天数")
+    @TableField(value = "back_public_day_count")
+    private Integer backPublicDayCount;
+
+}

+ 15 - 0
src/main/java/com/jtzx/crm/module/sys/mapper/DictAreaRegionMapper.java

@@ -0,0 +1,15 @@
+package com.jtzx.crm.module.sys.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import com.jtzx.crm.module.sys.entity.DictAreaRegionEntity;
+
+
+/**
+ * 全国省省份数据
+ */
+@Mapper
+public interface DictAreaRegionMapper extends BaseMapper<DictAreaRegionEntity> {
+
+}

+ 15 - 0
src/main/java/com/jtzx/crm/module/sys/mapper/DictCityRegionMapper.java

@@ -0,0 +1,15 @@
+package com.jtzx.crm.module.sys.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import com.jtzx.crm.module.sys.entity.DictCityRegionEntity;
+
+
+/**
+ * 全国城市数据
+ */
+@Mapper
+public interface DictCityRegionMapper extends BaseMapper<DictCityRegionEntity> {
+
+}

+ 15 - 0
src/main/java/com/jtzx/crm/module/sys/mapper/DictProvinceRegionMapper.java

@@ -0,0 +1,15 @@
+package com.jtzx.crm.module.sys.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import com.jtzx.crm.module.sys.entity.DictProvinceRegionEntity;
+
+
+/**
+ * 全国省省份数据
+ */
+@Mapper
+public interface DictProvinceRegionMapper extends BaseMapper<DictProvinceRegionEntity> {
+
+}

+ 15 - 0
src/main/java/com/jtzx/crm/module/sys/mapper/SysGroupMapper.java

@@ -0,0 +1,15 @@
+package com.jtzx.crm.module.sys.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import com.jtzx.crm.module.sys.entity.SysGroupEntity;
+
+
+/**
+ * 后台分组数据
+ */
+@Mapper
+public interface SysGroupMapper extends BaseMapper<SysGroupEntity> {
+
+}

+ 15 - 0
src/main/java/com/jtzx/crm/module/sys/mapper/SysParamBaseDataMapper.java

@@ -0,0 +1,15 @@
+package com.jtzx.crm.module.sys.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import com.jtzx.crm.module.sys.entity.SysParamBaseDataEntity;
+
+
+/**
+ * 学段,产品,职务,跟进管理
+ */
+@Mapper
+public interface SysParamBaseDataMapper extends BaseMapper<SysParamBaseDataEntity> {
+
+}

+ 15 - 0
src/main/java/com/jtzx/crm/module/sys/mapper/SysParamMapper.java

@@ -0,0 +1,15 @@
+package com.jtzx.crm.module.sys.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import com.jtzx.crm.module.sys.entity.SysParamEntity;
+
+
+/**
+ * 参数设置
+ */
+@Mapper
+public interface SysParamMapper extends BaseMapper<SysParamEntity> {
+
+}

+ 5 - 0
src/main/java/com/jtzx/crm/module/sys/mapper/xml/DictAreaRegionMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jtzx.crm.module.sys.mapper.DictAreaRegionMapper">
+
+</mapper>

+ 5 - 0
src/main/java/com/jtzx/crm/module/sys/mapper/xml/DictCityRegionMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jtzx.crm.module.sys.mapper.DictCityRegionMapper">
+
+</mapper>

+ 5 - 0
src/main/java/com/jtzx/crm/module/sys/mapper/xml/DictProvinceRegionMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jtzx.crm.module.sys.mapper.DictProvinceRegionMapper">
+
+</mapper>

+ 5 - 0
src/main/java/com/jtzx/crm/module/sys/mapper/xml/SysGroupMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jtzx.crm.module.sys.mapper.SysGroupMapper">
+
+</mapper>

+ 5 - 0
src/main/java/com/jtzx/crm/module/sys/mapper/xml/SysParamBaseDataMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jtzx.crm.module.sys.mapper.SysParamBaseDataMapper">
+
+</mapper>

+ 5 - 0
src/main/java/com/jtzx/crm/module/sys/mapper/xml/SysParamMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jtzx.crm.module.sys.mapper.SysParamMapper">
+
+</mapper>

+ 41 - 0
src/main/java/com/jtzx/crm/module/sys/model/request/AdminSysGroupInsertOrUpdateDTO.java

@@ -0,0 +1,41 @@
+package com.jtzx.crm.module.sys.model.request;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+
+/**
+ * 后台管理-新增/编辑后台分组数据 DTO
+ */
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class AdminSysGroupInsertOrUpdateDTO implements Serializable {
+
+    @Schema(description = "主键ID", hidden = true, title = "仅更新时使用")
+    private Long id;
+
+    @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Size(max = 50, message = "【名称】最长50位")
+    @NotBlank(message = "名称不能为空")
+    private String title;
+
+    @Schema(description = "省份表主id")
+    private Long regionId;
+
+    @Schema(description = "编号(前端会进行排序,前端传过来)")
+    private Integer sortCode;
+
+}

+ 46 - 0
src/main/java/com/jtzx/crm/module/sys/model/request/AdminSysGroupListDTO.java

@@ -0,0 +1,46 @@
+package com.jtzx.crm.module.sys.model.request;
+
+import cc.uncarbon.framework.core.constant.HelioConstant;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+
+/**
+ * 后台管理-分页列表后台分组数据 DTO
+ */
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class AdminSysGroupListDTO implements Serializable {
+
+    @Schema(description = "名称(关键词)")
+    private String title;
+
+    @Schema(description = "省份表主id")
+    private Long regionId;
+
+    @Schema(description = "编号(前端会进行排序,前端传过来)")
+    private Integer sortCode;
+
+    @Schema(description = "时间区间起")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    @DateTimeFormat(pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    private LocalDateTime beginAt;
+
+    @Schema(description = "时间区间止")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    @DateTimeFormat(pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    private LocalDateTime endAt;
+
+}

+ 39 - 0
src/main/java/com/jtzx/crm/module/sys/model/request/AdminSysParamBaseDataInsertOrUpdateDTO.java

@@ -0,0 +1,39 @@
+package com.jtzx.crm.module.sys.model.request;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+
+import java.io.Serializable;
+
+
+/**
+ * 后台管理-新增/编辑学段,产品,职务,跟进管理 DTO
+ */
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class AdminSysParamBaseDataInsertOrUpdateDTO implements Serializable {
+
+    @Schema(description = "主键ID",  title = "仅更新时使用")
+    private Long id;
+
+    @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Size(max = 50, message = "【名称】最长50位")
+    @NotBlank(message = "名称不能为空")
+    private String title;
+
+    @Schema(description = "编号(前端会进行排序,前端传过来)")
+    private Integer sortCode;
+
+    @Schema(description = "类型:0-学段,1-产品,2-职务,3-跟进")
+    private Integer type;
+
+}

+ 46 - 0
src/main/java/com/jtzx/crm/module/sys/model/request/AdminSysParamBaseDataListDTO.java

@@ -0,0 +1,46 @@
+package com.jtzx.crm.module.sys.model.request;
+
+import cc.uncarbon.framework.core.constant.HelioConstant;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+
+/**
+ * 后台管理-分页列表学段,产品,职务,跟进管理 DTO
+ */
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class AdminSysParamBaseDataListDTO implements Serializable {
+
+    @Schema(description = "名称(关键词)")
+    private String title;
+
+    @Schema(description = "编号(前端会进行排序,前端传过来)")
+    private Integer sortCode;
+
+    @Schema(description = "类型:0-学段,1-产品,2-职务,3-跟进")
+    private Integer type;
+
+    @Schema(description = "时间区间起")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    @DateTimeFormat(pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    private LocalDateTime beginAt;
+
+    @Schema(description = "时间区间止")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    @DateTimeFormat(pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    private LocalDateTime endAt;
+
+}

+ 35 - 0
src/main/java/com/jtzx/crm/module/sys/model/request/AdminSysParamInsertOrUpdateDTO.java

@@ -0,0 +1,35 @@
+package com.jtzx.crm.module.sys.model.request;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+
+import java.io.Serializable;
+
+
+/**
+ * 后台管理-新增/编辑参数设置 DTO
+ */
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class AdminSysParamInsertOrUpdateDTO implements Serializable {
+
+    @Schema(description = "主键ID", hidden = true, title = "仅更新时使用")
+    private Long id;
+
+    @Schema(description = "持有上限")
+    private Integer holdTopCount;
+
+    @Schema(description = "日退上限")
+    private Integer dayBackTopCount;
+
+    @Schema(description = "退回公海天数")
+    private Integer backPublicDayCount;
+
+}

+ 52 - 0
src/main/java/com/jtzx/crm/module/sys/model/response/DictAreaRegionBO.java

@@ -0,0 +1,52 @@
+package com.jtzx.crm.module.sys.model.response;
+
+import cc.uncarbon.framework.core.constant.HelioConstant;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+
+/**
+ * 全国省省份数据 BO
+ */
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class DictAreaRegionBO implements Serializable {
+
+    @Schema(description = "主键ID")
+    private Long id;
+
+    @Schema(description = "创建时刻")
+    @DateTimeFormat(pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    private LocalDateTime createdAt;
+
+    @Schema(description = "更新时刻")
+    @DateTimeFormat(pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    private LocalDateTime updatedAt;
+
+    @Schema(description = "")
+    private String code;
+
+    @Schema(description = "")
+    private String name;
+
+    @Schema(description = "")
+    private String parentCode;
+
+    @Schema(description = "")
+    private Integer level;
+
+}

+ 52 - 0
src/main/java/com/jtzx/crm/module/sys/model/response/DictCityRegionBO.java

@@ -0,0 +1,52 @@
+package com.jtzx.crm.module.sys.model.response;
+
+import cc.uncarbon.framework.core.constant.HelioConstant;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+
+/**
+ * 全国城市数据 BO
+ */
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class DictCityRegionBO implements Serializable {
+
+    @Schema(description = "主键ID")
+    private Long id;
+
+    @Schema(description = "创建时刻")
+    @DateTimeFormat(pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    private LocalDateTime createdAt;
+
+    @Schema(description = "更新时刻")
+    @DateTimeFormat(pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    private LocalDateTime updatedAt;
+
+    @Schema(description = "")
+    private String code;
+
+    @Schema(description = "")
+    private String name;
+
+    @Schema(description = "")
+    private String parentCode;
+
+    @Schema(description = "")
+    private Integer level;
+
+}

+ 58 - 0
src/main/java/com/jtzx/crm/module/sys/model/response/DictProvinceRegionBO.java

@@ -0,0 +1,58 @@
+package com.jtzx.crm.module.sys.model.response;
+
+import cc.uncarbon.framework.core.constant.HelioConstant;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+
+/**
+ * 全国省省份数据 BO
+ */
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class DictProvinceRegionBO implements Serializable {
+
+    @Schema(description = "主键ID")
+    private Long id;
+
+    @Schema(description = "创建时刻")
+    @DateTimeFormat(pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    private LocalDateTime createdAt;
+
+    @Schema(description = "更新时刻")
+    @DateTimeFormat(pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    private LocalDateTime updatedAt;
+
+    @Schema(description = "")
+    private String code;
+
+    @Schema(description = "")
+    private String name;
+
+    @Schema(description = "")
+    private String parentCode;
+
+    @Schema(description = "")
+    private Integer level;
+
+    @Schema(description = "编号(前端会进行排序,前端传过来)")
+    private Integer sortCode;
+
+    @Schema(description = "使用状态,0-未使用,1-已使用")
+    private Integer useStatus;
+
+}

+ 49 - 0
src/main/java/com/jtzx/crm/module/sys/model/response/SysGroupBO.java

@@ -0,0 +1,49 @@
+package com.jtzx.crm.module.sys.model.response;
+
+import cc.uncarbon.framework.core.constant.HelioConstant;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+
+/**
+ * 后台分组数据 BO
+ */
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class SysGroupBO implements Serializable {
+
+    @Schema(description = "主键ID")
+    private Long id;
+
+    @Schema(description = "创建时刻")
+    @DateTimeFormat(pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    private LocalDateTime createdAt;
+
+    @Schema(description = "更新时刻")
+    @DateTimeFormat(pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    private LocalDateTime updatedAt;
+
+    @Schema(description = "名称")
+    private String title;
+
+    @Schema(description = "省份表主id")
+    private Long regionId;
+
+    @Schema(description = "编号(前端会进行排序,前端传过来)")
+    private Integer sortCode;
+
+}

+ 53 - 0
src/main/java/com/jtzx/crm/module/sys/model/response/SysParamBO.java

@@ -0,0 +1,53 @@
+package com.jtzx.crm.module.sys.model.response;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+/**
+ * 参数设置 BO
+ */
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class SysParamBO implements Serializable {
+
+    @Schema(description = "主键ID")
+    private Long id;
+
+    @Schema(description = "名称")
+    private String title;
+
+    @Schema(description = "持有上限")
+    private Integer holdTopCount;
+
+    @Schema(description = "日退上限")
+    private Integer dayBackTopCount;
+
+    @Schema(description = "退回公海天数")
+    private Integer backPublicDayCount;
+
+    @Schema(description = "学段信息")
+    private List<SysParamBaseDataBO> stageData;
+
+    @Schema(description = "产品信息")
+    private List<SysParamBaseDataBO> productData;
+
+    @Schema(description = "职务信息")
+    private List<SysParamBaseDataBO> positionData;
+
+    @Schema(description = "跟进状态信息")
+    private List<SysParamBaseDataBO> followStatusData;
+
+    @Schema(description = "地区信息")
+    private List<DictProvinceRegionBO> regionData;
+}

+ 52 - 0
src/main/java/com/jtzx/crm/module/sys/model/response/SysParamBaseDataBO.java

@@ -0,0 +1,52 @@
+package com.jtzx.crm.module.sys.model.response;
+
+import cc.uncarbon.framework.core.constant.HelioConstant;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import lombok.experimental.SuperBuilder;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+
+/**
+ * 学段,产品,职务,跟进管理 BO
+ */
+@Accessors(chain = true)
+@SuperBuilder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class SysParamBaseDataBO implements Serializable {
+
+    @Schema(description = "主键ID")
+    private Long id;
+
+    @Schema(description = "创建时刻")
+    @DateTimeFormat(pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    private LocalDateTime createdAt;
+
+    @Schema(description = "更新时刻")
+    @DateTimeFormat(pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = HelioConstant.Jackson.DATE_TIME_FORMAT)
+    private LocalDateTime updatedAt;
+
+    @Schema(description = "名称")
+    private String title;
+
+    @Schema(description = "编号(前端会进行排序,前端传过来)")
+    private Integer sortCode;
+
+    @Schema(description = "类型:0-学段,1-产品,2-职务,3-跟进")
+    private Integer type;
+
+    @Schema(description = "状态,0-不是系统默认,1-系统默认(不能删除)")
+    private Integer status;
+
+}

+ 89 - 0
src/main/java/com/jtzx/crm/module/sys/service/DictAreaRegionService.java

@@ -0,0 +1,89 @@
+package com.jtzx.crm.module.sys.service;
+
+import cc.uncarbon.framework.core.page.PageResult;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jtzx.crm.module.sys.entity.DictAreaRegionEntity;
+import com.jtzx.crm.module.sys.mapper.DictAreaRegionMapper;
+import com.jtzx.crm.module.sys.model.response.DictAreaRegionBO;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+
+/**
+ * 全国省省份数据
+ */
+@RequiredArgsConstructor
+@Service
+@Slf4j
+public class DictAreaRegionService {
+
+    private final DictAreaRegionMapper dictAreaRegionMapper;
+
+
+
+    /*
+    ----------------------------------------------------------------
+                        私有方法 private methods
+    ----------------------------------------------------------------
+     */
+
+    /**
+     * 实体转 BO
+     *
+     * @param entity 实体
+     * @return BO
+     */
+    private DictAreaRegionBO entity2BO(DictAreaRegionEntity entity) {
+        if (entity == null) {
+            return null;
+        }
+
+        DictAreaRegionBO bo = new DictAreaRegionBO();
+        BeanUtil.copyProperties(entity, bo);
+
+        // 可以在此处为BO填充字段
+
+        return bo;
+    }
+
+    /**
+     * 实体 List 转 BO List
+     *
+     * @param entityList 实体 List
+     * @return BO List
+     */
+    private List<DictAreaRegionBO> entityList2BOs(List<DictAreaRegionEntity> entityList) {
+        if (CollUtil.isEmpty(entityList)) {
+            return Collections.emptyList();
+        }
+
+        // 深拷贝
+        List<DictAreaRegionBO> ret = new ArrayList<>(entityList.size());
+        entityList.forEach(
+                entity -> ret.add(this.entity2BO(entity))
+        );
+        return ret;
+    }
+
+    /**
+     * 实体分页转 BO 分页
+     *
+     * @param entityPage 实体分页
+     * @return BO 分页
+     */
+    private PageResult<DictAreaRegionBO> entityPage2BOPage(Page<DictAreaRegionEntity> entityPage) {
+        return new PageResult<DictAreaRegionBO>()
+                .setCurrent(entityPage.getCurrent())
+                .setSize(entityPage.getSize())
+                .setTotal(entityPage.getTotal())
+                .setRecords(this.entityList2BOs(entityPage.getRecords()));
+    }
+
+}

+ 91 - 0
src/main/java/com/jtzx/crm/module/sys/service/DictCityRegionService.java

@@ -0,0 +1,91 @@
+package com.jtzx.crm.module.sys.service;
+
+import cc.uncarbon.framework.core.page.PageResult;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jtzx.crm.module.sys.entity.DictCityRegionEntity;
+import com.jtzx.crm.module.sys.mapper.DictCityRegionMapper;
+import com.jtzx.crm.module.sys.model.response.DictCityRegionBO;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+
+/**
+ * 全国城市数据
+ */
+@RequiredArgsConstructor
+@Service
+@Slf4j
+public class DictCityRegionService {
+
+    private final DictCityRegionMapper dictCityRegionMapper;
+
+
+
+
+    /*
+    ----------------------------------------------------------------
+                        私有方法 private methods
+    ----------------------------------------------------------------
+     */
+
+    /**
+     * 实体转 BO
+     *
+     * @param entity 实体
+     * @return BO
+     */
+    private DictCityRegionBO entity2BO(DictCityRegionEntity entity) {
+        if (entity == null) {
+            return null;
+        }
+
+        DictCityRegionBO bo = new DictCityRegionBO();
+        BeanUtil.copyProperties(entity, bo);
+
+        // 可以在此处为BO填充字段
+
+        return bo;
+    }
+
+    /**
+     * 实体 List 转 BO List
+     *
+     * @param entityList 实体 List
+     * @return BO List
+     */
+    private List<DictCityRegionBO> entityList2BOs(List<DictCityRegionEntity> entityList) {
+        if (CollUtil.isEmpty(entityList)) {
+            return Collections.emptyList();
+        }
+
+        // 深拷贝
+        List<DictCityRegionBO> ret = new ArrayList<>(entityList.size());
+        entityList.forEach(
+            entity -> ret.add(this.entity2BO(entity))
+        );
+
+        return ret;
+    }
+
+    /**
+     * 实体分页转 BO 分页
+     *
+     * @param entityPage 实体分页
+     * @return BO 分页
+     */
+    private PageResult<DictCityRegionBO> entityPage2BOPage(Page<DictCityRegionEntity> entityPage) {
+        return new PageResult<DictCityRegionBO>()
+            .setCurrent(entityPage.getCurrent())
+            .setSize(entityPage.getSize())
+            .setTotal(entityPage.getTotal())
+            .setRecords(this.entityList2BOs(entityPage.getRecords()));
+    }
+
+}

+ 185 - 0
src/main/java/com/jtzx/crm/module/sys/service/DictProvinceRegionService.java

@@ -0,0 +1,185 @@
+package com.jtzx.crm.module.sys.service;
+
+import cc.uncarbon.framework.core.exception.BusinessException;
+import cc.uncarbon.framework.core.page.PageResult;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jtzx.crm.module.sys.entity.DictProvinceRegionEntity;
+import com.jtzx.crm.module.sys.mapper.DictProvinceRegionMapper;
+import com.jtzx.crm.module.sys.model.response.DictProvinceRegionBO;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+
+/**
+ * 全国省省份数据
+ */
+@RequiredArgsConstructor
+@Service
+@Slf4j
+public class DictProvinceRegionService {
+
+    private final DictProvinceRegionMapper dictProvinceRegionMapper;
+
+
+    /**
+     * 后台管理-查询所有的省份
+     */
+    public List<DictProvinceRegionBO> listAll() {
+        List<DictProvinceRegionEntity> list = dictProvinceRegionMapper.selectList(
+                new QueryWrapper<DictProvinceRegionEntity>()
+                        .lambda()// 排序
+                        .orderByDesc(DictProvinceRegionEntity::getCode)
+        );
+        return this.entityList2BOs(list);
+    }
+
+    /**
+     * 后台管理-查询已使用的省份
+     */
+    public List<DictProvinceRegionBO> listUsed() {
+        List<DictProvinceRegionEntity> list = dictProvinceRegionMapper.selectList(
+                new QueryWrapper<DictProvinceRegionEntity>()
+                        .lambda()// 排序
+                        .eq(DictProvinceRegionEntity::getUseStatus, 1)
+                        .orderByDesc(DictProvinceRegionEntity::getSortCode)
+        );
+        return this.entityList2BOs(list);
+    }
+
+    /**
+     * 后台管理-查询未使用的省份
+     */
+    public List<DictProvinceRegionBO> listUnUsed() {
+        List<DictProvinceRegionEntity> list = dictProvinceRegionMapper.selectList(
+                new QueryWrapper<DictProvinceRegionEntity>()
+                        .lambda()// 排序
+                        .eq(DictProvinceRegionEntity::getUseStatus, 0)
+                        .orderByDesc(DictProvinceRegionEntity::getCode)
+        );
+        return this.entityList2BOs(list);
+    }
+
+
+    /**
+     * 更新使用状态(相当于是参数设置中新增一个地区管理)
+     * @param id
+     */
+    public void openProvinceStatus(Long id, Integer sortCode) {
+        DictProvinceRegionEntity region = dictProvinceRegionMapper.selectById(id);
+        region.setUseStatus(1);
+        region.setSortCode(sortCode);
+        dictProvinceRegionMapper.updateById(region);
+    }
+
+    /**
+     * 更新使用状态(相当于是参数设置中删除一个地区管理)
+     * @param id
+     */
+    public void DeleteProvinceStatus(Long id) {
+        DictProvinceRegionEntity region = dictProvinceRegionMapper.selectById(id);
+        region.setUseStatus(0);
+        dictProvinceRegionMapper.updateById(region);
+        List<DictProvinceRegionEntity> regionEntityList =
+                dictProvinceRegionMapper.selectList(
+                        new LambdaQueryWrapper<>(DictProvinceRegionEntity.class)
+                                .select(
+                                        DictProvinceRegionEntity::getId,
+                                        DictProvinceRegionEntity::getSortCode
+                                )
+                                .eq(DictProvinceRegionEntity::getUseStatus, 1)
+                                .ge(DictProvinceRegionEntity::getSortCode, region.getSortCode())
+                );
+        //后面的编号往前提一个数
+        if (CollUtil.isNotEmpty(regionEntityList)) {
+            regionEntityList.forEach(e ->
+                    e.setSortCode(e.getSortCode() - 1));
+            dictProvinceRegionMapper.updateById(regionEntityList);
+        }
+
+    }
+
+
+    /**
+     * 根据 ID 取详情
+     *
+     * @param id 主键ID
+     * @return null or BO
+     */
+    public DictProvinceRegionBO getOneById(Long id) throws BusinessException {
+        DictProvinceRegionEntity entity = dictProvinceRegionMapper.selectById(id);
+        if (entity == null) {
+            throw new BusinessException(400, "无效全国省省份数据ID");
+        }
+        return this.entity2BO(entity);
+    }
+
+    /*
+    ----------------------------------------------------------------
+                        私有方法 private methods
+    ----------------------------------------------------------------
+     */
+
+    /**
+     * 实体转 BO
+     *
+     * @param entity 实体
+     * @return BO
+     */
+    private DictProvinceRegionBO entity2BO(DictProvinceRegionEntity entity) {
+        if (entity == null) {
+            return null;
+        }
+
+        DictProvinceRegionBO bo = new DictProvinceRegionBO();
+        BeanUtil.copyProperties(entity, bo);
+
+        // 可以在此处为BO填充字段
+
+        return bo;
+    }
+
+    /**
+     * 实体 List 转 BO List
+     *
+     * @param entityList 实体 List
+     * @return BO List
+     */
+    private List<DictProvinceRegionBO> entityList2BOs(List<DictProvinceRegionEntity> entityList) {
+        if (CollUtil.isEmpty(entityList)) {
+            return Collections.emptyList();
+        }
+
+        // 深拷贝
+        List<DictProvinceRegionBO> ret = new ArrayList<>(entityList.size());
+        entityList.forEach(
+                entity -> ret.add(this.entity2BO(entity))
+        );
+
+        return ret;
+    }
+
+    /**
+     * 实体分页转 BO 分页
+     *
+     * @param entityPage 实体分页
+     * @return BO 分页
+     */
+    private PageResult<DictProvinceRegionBO> entityPage2BOPage(Page<DictProvinceRegionEntity> entityPage) {
+        return new PageResult<DictProvinceRegionBO>()
+                .setCurrent(entityPage.getCurrent())
+                .setSize(entityPage.getSize())
+                .setTotal(entityPage.getTotal())
+                .setRecords(this.entityList2BOs(entityPage.getRecords()));
+    }
+
+
+}

+ 200 - 0
src/main/java/com/jtzx/crm/module/sys/service/SysGroupService.java

@@ -0,0 +1,200 @@
+package com.jtzx.crm.module.sys.service;
+
+import cc.uncarbon.framework.core.exception.BusinessException;
+import cc.uncarbon.framework.core.page.PageParam;
+import cc.uncarbon.framework.core.page.PageResult;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jtzx.crm.module.sys.entity.SysGroupEntity;
+import com.jtzx.crm.module.sys.mapper.SysGroupMapper;
+import com.jtzx.crm.module.sys.model.request.AdminSysGroupInsertOrUpdateDTO;
+import com.jtzx.crm.module.sys.model.response.SysGroupBO;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+
+/**
+ * 后台分组数据
+ */
+@RequiredArgsConstructor
+@Service
+@Slf4j
+public class SysGroupService {
+
+    private final SysGroupMapper sysGroupMapper;
+
+
+    /**
+     * 后台管理-分页列表
+     */
+    public PageResult<SysGroupBO> adminList(PageParam pageParam) {
+        Page<SysGroupEntity> entityPage = sysGroupMapper.selectPage(
+                new Page<>(pageParam.getPageNum(), pageParam.getPageSize()),
+                new QueryWrapper<SysGroupEntity>()
+                        .lambda()
+                        // 排序
+                        .orderByDesc(SysGroupEntity::getCreatedAt)
+        );
+
+        return this.entityPage2BOPage(entityPage);
+    }
+
+    /**
+     * 根据 ID 取详情
+     *
+     * @param id 主键ID
+     * @return null or BO
+     */
+    public SysGroupBO getOneById(Long id) {
+        return this.getOneById(id, false);
+    }
+
+    /**
+     * 根据 ID 取详情
+     *
+     * @param id 主键ID
+     * @param throwIfInvalidId 是否在 ID 无效时抛出异常
+     * @return null or BO
+     */
+    public SysGroupBO getOneById(Long id, boolean throwIfInvalidId) throws BusinessException {
+        SysGroupEntity entity = sysGroupMapper.selectById(id);
+        if (throwIfInvalidId && entity == null) {
+            throw new BusinessException(400, "无效后台分组数据ID");
+        }
+
+        return this.entity2BO(entity);
+    }
+
+    /**
+     * 后台管理-新增
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Long adminInsert(AdminSysGroupInsertOrUpdateDTO dto) {
+        log.info("[后台管理-后台分组数据-新增] >> DTO={}", dto);
+        this.checkExistence(dto);
+
+        dto.setId(null);
+        SysGroupEntity entity = new SysGroupEntity();
+        BeanUtil.copyProperties(dto, entity);
+
+        sysGroupMapper.insert(entity);
+
+        return entity.getId();
+    }
+
+    /**
+     * 后台管理-编辑
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void adminUpdate(AdminSysGroupInsertOrUpdateDTO dto) {
+        log.info("[后台管理-后台分组数据-编辑] >> DTO={}", dto);
+        this.checkExistence(dto);
+
+        SysGroupEntity entity = new SysGroupEntity();
+        BeanUtil.copyProperties(dto, entity);
+
+        sysGroupMapper.updateById(entity);
+    }
+
+    /**
+     * 后台管理-删除
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void adminDelete(Collection<Long> ids) {
+        log.info("[后台管理-后台分组数据-删除] >> ids={}", ids);
+        sysGroupMapper.deleteByIds(ids);
+    }
+
+
+    /*
+    ----------------------------------------------------------------
+                        私有方法 private methods
+    ----------------------------------------------------------------
+     */
+
+    /**
+     * 实体转 BO
+     *
+     * @param entity 实体
+     * @return BO
+     */
+    private SysGroupBO entity2BO(SysGroupEntity entity) {
+        if (entity == null) {
+            return null;
+        }
+
+        SysGroupBO bo = new SysGroupBO();
+        BeanUtil.copyProperties(entity, bo);
+
+        // 可以在此处为BO填充字段
+
+        return bo;
+    }
+
+    /**
+     * 实体 List 转 BO List
+     *
+     * @param entityList 实体 List
+     * @return BO List
+     */
+    private List<SysGroupBO> entityList2BOs(List<SysGroupEntity> entityList) {
+        if (CollUtil.isEmpty(entityList)) {
+            return Collections.emptyList();
+        }
+
+        // 深拷贝
+        List<SysGroupBO> ret = new ArrayList<>(entityList.size());
+        entityList.forEach(
+            entity -> ret.add(this.entity2BO(entity))
+        );
+
+        return ret;
+    }
+
+    /**
+     * 实体分页转 BO 分页
+     *
+     * @param entityPage 实体分页
+     * @return BO 分页
+     */
+    private PageResult<SysGroupBO> entityPage2BOPage(Page<SysGroupEntity> entityPage) {
+        return new PageResult<SysGroupBO>()
+            .setCurrent(entityPage.getCurrent())
+            .setSize(entityPage.getSize())
+            .setTotal(entityPage.getTotal())
+            .setRecords(this.entityList2BOs(entityPage.getRecords()));
+    }
+
+    /**
+     * 检查是否已存在同名数据
+     *
+     * @param dto DTO
+     */
+    private void checkExistence(AdminSysGroupInsertOrUpdateDTO dto) {
+        /*
+        可以根据自己业务需要,解禁这段代码,修改判断条件和文案
+
+        SysGroupEntity existingEntity = sysGroupMapper.selectOne(
+                new QueryWrapper<SysGroupEntity>()
+                        .lambda()
+                        .select(SysGroupEntity::getId)
+                        .eq(SysGroupEntity::getTitle, dto.getTitle())
+                        .last(HelioConstant.CRUD.SQL_LIMIT_1)
+        );
+
+        if (existingEntity != null && !existingEntity.getId().equals(dto.getId())) {
+            throw new BusinessException(400, "已存在相同后台分组数据,请重新输入");
+        }
+        */
+    }
+
+}

+ 201 - 0
src/main/java/com/jtzx/crm/module/sys/service/SysParamBaseDataService.java

@@ -0,0 +1,201 @@
+package com.jtzx.crm.module.sys.service;
+
+import cc.uncarbon.framework.core.exception.BusinessException;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.jtzx.crm.module.sys.entity.SysParamBaseDataEntity;
+import com.jtzx.crm.module.sys.mapper.SysParamBaseDataMapper;
+import com.jtzx.crm.module.sys.model.request.AdminSysParamBaseDataInsertOrUpdateDTO;
+import com.jtzx.crm.module.sys.model.response.SysParamBaseDataBO;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+
+/**
+ * 学段,产品,职务,跟进管理
+ */
+@RequiredArgsConstructor
+@Service
+@Slf4j
+public class SysParamBaseDataService {
+
+    private final SysParamBaseDataMapper sysParamBaseDataMapper;
+
+    /**
+     * 查询学段
+     * @return
+     */
+    public List<SysParamBaseDataBO> queryStage() {
+        return this.queryList(0);
+    }
+
+
+    /**
+     * 查询产品
+     * @return
+     */
+    public List<SysParamBaseDataBO> queryProduct() {
+        return this.queryList(1);
+    }
+
+
+    /**
+     * 查询职务
+     * @return
+     */
+    public List<SysParamBaseDataBO> queryPosition() {
+        return this.queryList(2);
+    }
+
+    /**
+     * 查询跟进状态
+     * @return
+     */
+    public List<SysParamBaseDataBO> queryFollowStatus() {
+        return this.queryList(3);
+    }
+
+
+    /**
+     * 类型:0-学段,1-产品,2-职务,3-跟进
+     * @param type
+     * @return
+     */
+    public List<SysParamBaseDataBO> queryList(Integer type) {
+        if (type == null) {
+            type = 0;
+        }
+        List<SysParamBaseDataEntity> baseDataEntityList =
+                sysParamBaseDataMapper.selectList(
+                        new LambdaQueryWrapper<>(SysParamBaseDataEntity.class)
+                                .eq(SysParamBaseDataEntity::getType, type)
+                                .orderByAsc(SysParamBaseDataEntity::getSortCode)
+                );
+        return this.entityList2BOs(baseDataEntityList);
+    }
+
+
+    /**
+     * 根据 ID 取详情
+     *
+     * @param id 主键ID
+     * @return null or BO
+     */
+    public SysParamBaseDataBO getOneById(Long id) throws BusinessException {
+        SysParamBaseDataEntity entity = sysParamBaseDataMapper.selectById(id);
+        if (entity == null) {
+            throw new BusinessException(400, "无效学段,产品,职务,跟进管理ID");
+        }
+        return this.entity2BO(entity);
+    }
+
+    /**
+     * 后台管理-新增
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Long adminInsert(AdminSysParamBaseDataInsertOrUpdateDTO dto) {
+        log.info("[后台管理-学段,产品,职务,跟进管理-新增] >> DTO={}", dto);
+        dto.setId(null);
+        SysParamBaseDataEntity entity = new SysParamBaseDataEntity();
+        BeanUtil.copyProperties(dto, entity);
+        entity.setStatus(0);
+        sysParamBaseDataMapper.insert(entity);
+        return entity.getId();
+    }
+
+    /**
+     * 后台管理-编辑 学段,产品,职务,跟进状态数据
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void update(AdminSysParamBaseDataInsertOrUpdateDTO dto) {
+        log.info("[后台管理-学段,产品,职务,跟进管理-编辑] >> DTO={}", dto);
+        dto.setType(null);
+        SysParamBaseDataEntity entity = new SysParamBaseDataEntity();
+        BeanUtil.copyProperties(dto, entity);
+        sysParamBaseDataMapper.updateById(entity);
+    }
+
+    /**
+     * 后台管理-删除,学段,产品,职务,跟进状态数据
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void delete(Long id) {
+        log.info("[后台管理-学段,产品,职务,跟进管理-删除] >> id={}", id);
+        SysParamBaseDataEntity sysParamBaseDataEntity = sysParamBaseDataMapper.selectById(id);
+        //把id之后的数据编号都往前提一个数
+        if (sysParamBaseDataEntity != null) {
+            if (sysParamBaseDataEntity.getStatus() == 1) {
+                throw new BusinessException(400, "系统默认不能删除");
+            }
+            List<SysParamBaseDataEntity> dataEntityList =
+                    sysParamBaseDataMapper.selectList(
+                            new LambdaQueryWrapper<>(sysParamBaseDataEntity)
+                                    .select(
+                                            SysParamBaseDataEntity::getId,
+                                            SysParamBaseDataEntity::getSortCode
+                                    )
+                                    .eq(SysParamBaseDataEntity::getType, sysParamBaseDataEntity.getType())
+                                    .ge(SysParamBaseDataEntity::getSortCode, sysParamBaseDataEntity.getSortCode())
+                    );
+            if (CollUtil.isNotEmpty(dataEntityList)) {
+                dataEntityList.forEach(e -> e.setSortCode(e.getSortCode() - 1));
+                sysParamBaseDataMapper.updateById(dataEntityList);
+            }
+            sysParamBaseDataMapper.deleteById(id);
+        }
+    }
+
+
+    /*
+    ----------------------------------------------------------------
+                        私有方法 private methods
+    ----------------------------------------------------------------
+     */
+
+    /**
+     * 实体转 BO
+     *
+     * @param entity 实体
+     * @return BO
+     */
+    private SysParamBaseDataBO entity2BO(SysParamBaseDataEntity entity) {
+        if (entity == null) {
+            return null;
+        }
+
+        SysParamBaseDataBO bo = new SysParamBaseDataBO();
+        BeanUtil.copyProperties(entity, bo);
+
+        // 可以在此处为BO填充字段
+        bo.setStatus(entity.getStatus());
+        return bo;
+    }
+
+    /**
+     * 实体 List 转 BO List
+     *
+     * @param entityList 实体 List
+     * @return BO List
+     */
+    private List<SysParamBaseDataBO> entityList2BOs(List<SysParamBaseDataEntity> entityList) {
+        if (CollUtil.isEmpty(entityList)) {
+            return Collections.emptyList();
+        }
+
+        // 深拷贝
+        List<SysParamBaseDataBO> ret = new ArrayList<>(entityList.size());
+        entityList.forEach(
+                entity -> ret.add(this.entity2BO(entity))
+        );
+
+        return ret;
+    }
+
+}

+ 121 - 0
src/main/java/com/jtzx/crm/module/sys/service/SysParamService.java

@@ -0,0 +1,121 @@
+package com.jtzx.crm.module.sys.service;
+
+import cc.uncarbon.framework.core.exception.BusinessException;
+import cn.hutool.core.bean.BeanUtil;
+import com.jtzx.crm.module.sys.entity.SysParamEntity;
+import com.jtzx.crm.module.sys.mapper.SysParamMapper;
+import com.jtzx.crm.module.sys.model.request.AdminSysParamInsertOrUpdateDTO;
+import com.jtzx.crm.module.sys.model.response.SysParamBO;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+
+/**
+ * 参数设置
+ */
+@RequiredArgsConstructor
+@Service
+@Slf4j
+public class SysParamService {
+
+    private final SysParamMapper sysParamMapper;
+
+    private final SysParamBaseDataService sysParamBaseDataService;
+
+    private final DictProvinceRegionService dictProvinceRegionService;
+
+    /**
+     * 查询参数配置数据
+     * @return
+     */
+    public SysParamBO queryParams() {
+        SysParamEntity sysParamEntity = sysParamMapper.selectOne(null);
+        if (sysParamEntity == null) {
+            sysParamEntity = new SysParamEntity();
+            sysParamEntity.setHoldTopCount(0);
+            sysParamEntity.setDayBackTopCount(0);
+            sysParamEntity.setBackPublicDayCount(0);
+            sysParamEntity.setTitle("公海设置");
+        }
+        return this.entity2BO(sysParamEntity);
+    }
+
+
+    /**
+     * 根据 ID 取详情
+     *
+     * @param id 主键ID
+     * @return null or BO
+     */
+    public SysParamBO getOneById(Long id) throws BusinessException {
+        SysParamEntity entity = sysParamMapper.selectById(id);
+        if (entity == null) {
+            throw new BusinessException(400, "无效参数设置ID");
+        }
+        return this.entity2BO(entity);
+    }
+
+    /**
+     * 后台管理-新增
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Long adminInsert(AdminSysParamInsertOrUpdateDTO dto) {
+        log.info("[后台管理-参数设置-新增] >> DTO={}", dto);
+        dto.setId(null);
+        SysParamEntity entity = new SysParamEntity();
+        BeanUtil.copyProperties(dto, entity);
+        sysParamMapper.insert(entity);
+        return entity.getId();
+    }
+
+    /**
+     * 后台管理-编辑
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void adminUpdate(AdminSysParamInsertOrUpdateDTO dto) {
+        log.info("[后台管理-参数设置-编辑] >> DTO={}", dto);
+
+        SysParamEntity entity = new SysParamEntity();
+        BeanUtil.copyProperties(dto, entity);
+
+        sysParamMapper.updateById(entity);
+    }
+
+
+    /*
+    ----------------------------------------------------------------
+                        私有方法 private methods
+    ----------------------------------------------------------------
+     */
+
+    /**
+     * 实体转 BO
+     *
+     * @param entity 实体
+     * @return BO
+     */
+    private SysParamBO entity2BO(SysParamEntity entity) {
+        if (entity == null) {
+            return null;
+        }
+
+        SysParamBO bo = new SysParamBO();
+        BeanUtil.copyProperties(entity, bo);
+
+        // 可以在此处为BO填充字段
+        bo.setStageData(
+                sysParamBaseDataService.queryStage());
+        bo.setProductData(
+                sysParamBaseDataService.queryProduct());
+        bo.setPositionData(
+                sysParamBaseDataService.queryPosition());
+        bo.setFollowStatusData(
+                sysParamBaseDataService.queryFollowStatus());
+        bo.setRegionData(
+                dictProvinceRegionService.listUsed());
+        return bo;
+    }
+
+}

+ 126 - 33
src/test/java/com/jtzx/crm/test/ExampleUnitTest.java

@@ -1,20 +1,25 @@
 package com.jtzx.crm.test;
 
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.Lists;
 import com.jtzx.crm.JtzxCrmSysApplication;
-import cc.uncarbon.framework.core.constant.HelioConstant;
-import cc.uncarbon.framework.core.context.TenantContext;
-import cc.uncarbon.framework.core.context.TenantContextHolder;
-import cc.uncarbon.framework.core.context.UserContext;
-import cc.uncarbon.framework.core.context.UserContextHolder;
-import com.jtzx.crm.module.sys.model.response.SysRoleBO;
-import com.jtzx.crm.module.sys.service.SysRoleService;
-import cn.hutool.core.collection.CollUtil;
+import com.jtzx.crm.module.sys.entity.DictAreaRegionEntity;
+import com.jtzx.crm.module.sys.entity.DictCityRegionEntity;
+import com.jtzx.crm.module.sys.entity.DictProvinceRegionEntity;
+import com.jtzx.crm.module.sys.mapper.DictAreaRegionMapper;
+import com.jtzx.crm.module.sys.mapper.DictCityRegionMapper;
+import com.jtzx.crm.module.sys.mapper.DictProvinceRegionMapper;
+import com.jtzx.crm.module.sys.model.response.DictAreaRegionBO;
+import com.jtzx.crm.module.sys.model.response.DictCityRegionBO;
+import com.jtzx.crm.module.sys.model.response.DictProvinceRegionBO;
 import jakarta.annotation.Resource;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 
+import java.io.File;
+import java.io.IOException;
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -26,31 +31,119 @@ import java.util.List;
 class ExampleUnitTest {
 
     @Resource
-    private SysRoleService sysRoleService;
-
-
-    @BeforeAll
-    public static void init() {
-        // 设置用户上下文
-        UserContext userContext = new UserContext();
-        userContext
-                .setUserId(1L)
-                .setUserName("超级管理员")
-                // 用户类型, 根据单元测试需要修改
-                .setUserTypeStr("ADMIN_USER");
-        UserContextHolder.setUserContext(userContext);
-
-        // 设置租户上下文
-        TenantContext tenantContext = new TenantContext();
-        tenantContext
-                .setTenantId(HelioConstant.Tenant.DEFAULT_PRIVILEGED_TENANT_ID)
-                .setTenantName("超级租户");
-        TenantContextHolder.setTenantContext(tenantContext);
+    private DictProvinceRegionMapper dictProvinceRegionMapper;
+
+    @Resource
+    private DictCityRegionMapper dictCityRegionMapper;
+
+    @Resource
+    private DictAreaRegionMapper dictAreaRegionMapper;
+
+
+    @Test
+    public void initProvinceData() {
+
+        // 1. 指定本地文件路径(注意反斜杠需要双写转义)
+        File jsonFile = new File("/mnt/d/dev/region/json/01省.json");
+
+        // 2. 创建 Jackson 核心对象
+        ObjectMapper objectMapper = new ObjectMapper();
+
+        try {
+            // 使用 TypeReference 指定解析目标为 List<Region>
+            List<DictProvinceRegionBO> regions = objectMapper.readValue(jsonFile, new TypeReference<>() {
+            });
+
+            // 打印验证
+            System.out.println("成功读取到 " + regions.size() + " 个省份数据:");
+            List<DictProvinceRegionEntity> regionEntityList = Lists.newArrayList();
+            regions.forEach(e -> {
+                DictProvinceRegionEntity region = DictProvinceRegionEntity.builder().build();
+                region.setCode(e.getCode());
+                region.setName(e.getName());
+                region.setParentCode(e.getParentCode());
+                region.setLevel(e.getLevel());
+                region.setUseStatus(0);
+                region.setRevision(0L);
+                region.setDelFlag(0);
+                region.setCreatedAt(LocalDateTime.now());
+                region.setUpdatedAt(LocalDateTime.now());
+                regionEntityList.add(region);
+            });
+            dictProvinceRegionMapper.insert(regionEntityList);
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
     }
 
+
     @Test
-    void exampleTest() {
-        List<SysRoleBO> selectOptions = sysRoleService.adminSelectOptions();
-        Assertions.assertTrue(CollUtil.isNotEmpty(selectOptions));
+    public void initCityData() {
+        // 1. 指定本地文件路径(注意反斜杠需要双写转义)
+        File jsonFile = new File("/mnt/d/dev/region/json/02市.json");
+
+        // 2. 创建 Jackson 核心对象
+        ObjectMapper objectMapper = new ObjectMapper();
+
+        try {
+            // 使用 TypeReference 指定解析目标为 List<Region>
+            List<DictCityRegionBO> regions = objectMapper.readValue(jsonFile, new TypeReference<>() {
+            });
+
+            // 打印验证
+            System.out.println("成功读取到 " + regions.size() + " 个省份数据:");
+            List<DictCityRegionEntity> regionEntityList = Lists.newArrayList();
+            regions.forEach(e -> {
+                DictCityRegionEntity region = DictCityRegionEntity.builder().build();
+                region.setCode(e.getCode());
+                region.setName(e.getName());
+                region.setParentCode(e.getParentCode());
+                region.setLevel(e.getLevel());
+                region.setCreatedAt(LocalDateTime.now());
+                region.setUpdatedAt(LocalDateTime.now());
+                regionEntityList.add(region);
+            });
+            dictCityRegionMapper.insert(regionEntityList);
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
     }
+
+
+    @Test
+    public void initAreaData() {
+        // 1. 指定本地文件路径(注意反斜杠需要双写转义)
+        File jsonFile = new File("/mnt/d/dev/region/json/03区(县).json");
+
+        // 2. 创建 Jackson 核心对象
+        ObjectMapper objectMapper = new ObjectMapper();
+
+        try {
+            // 使用 TypeReference 指定解析目标为 List<Region>
+            List<DictAreaRegionBO> regions = objectMapper.readValue(jsonFile, new TypeReference<>() {
+            });
+
+            // 打印验证
+            System.out.println("成功读取到 " + regions.size() + " 个省份数据:");
+            List<DictAreaRegionEntity> regionEntityList = Lists.newArrayList();
+            regions.forEach(e -> {
+                DictAreaRegionEntity region = DictAreaRegionEntity.builder().build();
+                region.setCode(e.getCode());
+                region.setName(e.getName());
+                region.setParentCode(e.getParentCode());
+                region.setLevel(e.getLevel());
+                region.setCreatedAt(LocalDateTime.now());
+                region.setUpdatedAt(LocalDateTime.now());
+                regionEntityList.add(region);
+            });
+            dictAreaRegionMapper.insert(regionEntityList);
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
 }