Quellcode durchsuchen

refactor(customer-data): 优化客户数据导入及权限校验逻辑

- 客户省市名称标准化及校验逻辑增强,支持直辖市和自治区特殊处理
- 修改导入客户数据时异常提示信息,增加对应数据名称方便定位问题
- 实现客户数据的批量新增接口,提升导入效率
- 在服务层添加批量导入方法,使用事务保障数据一致性
- 修改单条数据插入判重条件,新增省市字段判断避免重复添加
- 控制器方法调用批量插入替代逐条插入,提高性能和维护性
- 加入管理员角色获取组ID列表逻辑,排序并去重提升稳定性
- 调整接口方法签名格式,规范代码风格与格式一致性
zhangxf vor 3 Wochen
Ursprung
Commit
96d1dabc2c

+ 53 - 22
src/main/java/com/jtzx/crm/module/api/web/sys/CustomerDataPublicController.java

@@ -60,7 +60,7 @@ public class CustomerDataPublicController {
 
     @Operation(summary = "新增公海客户数据接口")
     @PostMapping(value = "/customer/add")
-    public ApiResult<Void> add(@RequestBody @Valid AdminSysCustomerDataInsertOrUpdateDTO dto) throws BusinessException{
+    public ApiResult<Void> add(@RequestBody @Valid AdminSysCustomerDataInsertOrUpdateDTO dto) throws BusinessException {
         sysCustomerDataPublicService.adminInsertCustomerData(dto);
         return ApiResult.success();
     }
@@ -68,14 +68,14 @@ public class CustomerDataPublicController {
 
     @Operation(summary = "修改公海客户数据接口")
     @PostMapping(value = "/customer/update")
-    public ApiResult<Void> update(@RequestBody @Valid AdminSysCustomerDataInsertOrUpdateDTO dto) throws BusinessException{
+    public ApiResult<Void> update(@RequestBody @Valid AdminSysCustomerDataInsertOrUpdateDTO dto) throws BusinessException {
         sysCustomerDataPublicService.adminUpdateCustomerData(dto);
         return ApiResult.success();
     }
 
     @Operation(summary = "删除公海客户信息接口")
     @GetMapping(value = "/customer/delete/{customerId}")
-    public ApiResult<Void> delete(@PathVariable Long customerId) throws BusinessException{
+    public ApiResult<Void> delete(@PathVariable Long customerId) throws BusinessException {
         sysCustomerDataPublicService.adminDeleteCustomerData(customerId);
         return ApiResult.success();
     }
@@ -83,7 +83,7 @@ public class CustomerDataPublicController {
 
     @Operation(summary = "认领公海客户信息接口")
     @GetMapping(value = "/customer/claim/{customerId}")
-    public ApiResult<Void> claim(@PathVariable Long customerId) throws BusinessException{
+    public ApiResult<Void> claim(@PathVariable Long customerId) throws BusinessException {
         sysCustomerDataPublicService.claimCustomer(customerId);
         return ApiResult.success();
     }
@@ -91,42 +91,42 @@ public class CustomerDataPublicController {
 
     @Operation(summary = "公海客户添加联系人数据接口")
     @PostMapping(value = "/customer/person/add")
-    public ApiResult<Void> personAdd(@RequestBody @Valid AdminSysCustomerPersonInsertOrUpdateDTO dto) throws BusinessException{
+    public ApiResult<Void> personAdd(@RequestBody @Valid AdminSysCustomerPersonInsertOrUpdateDTO dto) throws BusinessException {
         sysCustomerDataPublicService.adminInsertCustomerPerson(dto);
         return ApiResult.success();
     }
 
     @Operation(summary = "公海客户修改联系人数据接口")
     @PostMapping(value = "/customer/person/update")
-    public ApiResult<Void> personUpdate(@RequestBody @Valid AdminSysCustomerPersonInsertOrUpdateDTO dto) throws BusinessException{
+    public ApiResult<Void> personUpdate(@RequestBody @Valid AdminSysCustomerPersonInsertOrUpdateDTO dto) throws BusinessException {
         sysCustomerDataPublicService.adminUpdateCustomerPerson(dto);
         return ApiResult.success();
     }
 
     @Operation(summary = "公海客户删除联系人数据接口")
     @GetMapping(value = "/customer/person/delete/{personId}")
-    public ApiResult<Void> personDelete(@PathVariable Long personId) throws BusinessException{
+    public ApiResult<Void> personDelete(@PathVariable Long personId) throws BusinessException {
         sysCustomerDataPublicService.adminDeleteCustomerPerson(personId);
         return ApiResult.success();
     }
 
     @Operation(summary = "公海客户查询联系人数据接口")
     @PostMapping(value = "/customer/person/query")
-    public ApiResult<List<SysCustomerPersonBO>> personQuery(@RequestBody @Valid CustomerPersonReqDTO dto) throws BusinessException{
+    public ApiResult<List<SysCustomerPersonBO>> personQuery(@RequestBody @Valid CustomerPersonReqDTO dto) throws BusinessException {
         List<SysCustomerPersonBO> sysCustomerPersonBOS = sysCustomerDataPublicService.adminListCustomerPerson(dto);
         return ApiResult.data(sysCustomerPersonBOS);
     }
 
     @Operation(summary = "查询详情信息接口")
     @PostMapping(value = "/customer/data/detail", produces = "application/json;charset=UTF-8")
-    public ApiResult<SysCustomerDetailBO> queryCustomerDetail(@RequestBody AdminSysCustomerFollowReqDTO dto) throws BusinessException{
+    public ApiResult<SysCustomerDetailBO> queryCustomerDetail(@RequestBody AdminSysCustomerFollowReqDTO dto) throws BusinessException {
         SysCustomerDetailBO detailBO = sysCustomerDataPublicService.queryCustomerDetail(dto);
         return ApiResult.data(detailBO);
     }
 
     @Operation(summary = "查询日志记录信息接口")
     @PostMapping(value = "/customer/oper/log/", produces = "application/json;charset=UTF-8")
-    public ApiResult<SysCustomerOperLogDataBO> queryOperLogData(@RequestBody AdminSysCustomerOperLogListDTO dto) throws BusinessException{
+    public ApiResult<SysCustomerOperLogDataBO> queryOperLogData(@RequestBody AdminSysCustomerOperLogListDTO dto) throws BusinessException {
         SysCustomerOperLogDataBO result = sysCustomerDataPublicService.queryOperLogData(dto);
         return ApiResult.data(result);
     }
@@ -134,7 +134,7 @@ public class CustomerDataPublicController {
 
     @Operation(summary = "导入客户数据接口")
     @PostMapping(value = "/importCustomerData")
-    public ApiResult<Void> importCustomerData(@Parameter(description = "文件参数") @RequestPart MultipartFile file) throws BusinessException{
+    public ApiResult<Void> importCustomerData(@Parameter(description = "文件参数") @RequestPart MultipartFile file) throws BusinessException {
         permissionService.publicPrivateCustomerPermission();
         this.handleImportCustomerData(file);
         return ApiResult.success();
@@ -145,7 +145,7 @@ public class CustomerDataPublicController {
      *
      * @param file
      */
-    public void handleImportCustomerData(MultipartFile file) throws BusinessException{
+    public void handleImportCustomerData(MultipartFile file) throws BusinessException {
         try {
             InputStream inputStream = file.getInputStream();
             List<LinkedHashMap<Integer, Object>> allData = EasyExcel.read(inputStream)
@@ -162,10 +162,10 @@ public class CustomerDataPublicController {
                 throw new BusinessException("excel数据异常,导入失败");
             }
             //批量插入数据
-            dtoList.forEach(sysCustomerDataPublicService::adminInsertCustomerData);
+            sysCustomerDataPublicService.adminInsertCustomerData(dtoList);
         } catch (Exception e) {
             log.error("导入客户数据失败", e);
-            throw new RuntimeException("导入客户数据失败");
+            throw new BusinessException(e.getMessage());
         }
     }
 
@@ -203,37 +203,68 @@ public class CustomerDataPublicController {
             dto.setName((String) rowData.get(0));
 
             if (rowData.get(1) == null) {
-                throw new BusinessException("学段不能为空");
+                throw new BusinessException(rowData.get(0)+"/学段不能为空");
             }
             dto.setStageName((String) rowData.get(1));
             List<SysParamBaseDataEntity> stageList = sysParamBaseDataEntities.stream()
                     .filter(sysParamBaseDataEntity -> sysParamBaseDataEntity.getTitle().equals(rowData.get(1)))
                     .toList();
             if (CollUtil.isEmpty(stageList)) {
-                throw new BusinessException(rowData.get(1)+"学段不存在,导入失败");
+                throw new BusinessException(rowData.get(0)+ "学段不存在,导入失败");
             }
             dto.setStageId(stageList.getFirst().getId());
 
             if (rowData.get(2) == null) {
-                throw new BusinessException("省份不能为空");
+                throw new BusinessException(rowData.get(0)+"省份不能为空");
             }
             dto.setProvinceName((String) rowData.get(2));
+            if (dto.getProvinceName().startsWith("北京")) {
+                dto.setProvinceName("北京市");
+            } else if (dto.getProvinceName().startsWith("天津")) {
+                dto.setProvinceName("天津市");
+            } else if (dto.getProvinceName().startsWith("上海")) {
+                dto.setProvinceName("上海市");
+            } else if (dto.getProvinceName().startsWith("重庆")) {
+                dto.setProvinceName("重庆市");
+            } else if (dto.getProvinceName().startsWith("内蒙")) {
+                dto.setProvinceName("内蒙自治区");
+            } else if (dto.getProvinceName().startsWith("西藏")) {
+                dto.setProvinceName("西藏自治区");
+            } else if (dto.getProvinceName().startsWith("广西")) {
+                dto.setProvinceName("广西壮族自治区");
+            } else if (dto.getProvinceName().startsWith("宁夏")) {
+                dto.setProvinceName("宁夏回族自治区");
+            } else if (dto.getProvinceName().startsWith("新疆")) {
+                dto.setProvinceName("新疆维吾尔自治区");
+            } else {
+                if (!dto.getProvinceName().endsWith("省")) {
+                    dto.setProvinceName(dto.getProvinceName() + "省");
+                }
+            }
             List<DictProvinceRegionBO> provinceList = dictProvinceRegionBOS.stream()
-                    .filter(dictProvinceRegionBO -> dictProvinceRegionBO.getName().equals(rowData.get(2)))
+                    .filter(dictProvinceRegionBO -> dictProvinceRegionBO.getName().equals(dto.getProvinceName()))
                     .toList();
             if (CollUtil.isEmpty(provinceList)) {
-                throw new BusinessException(rowData.get(2)+"省份不存在,导入失败");
+                throw new BusinessException(rowData.get(0)+"省份不存在,导入失败");
             }
             dto.setProvinceId(provinceList.getFirst().getId());
             if (rowData.get(3) == null) {
-                throw new BusinessException("城市不能为空");
+                throw new BusinessException(rowData.get(0)+"城市不能为空");
             }
             dto.setCityName((String) rowData.get(3));
+            if (dto.getProvinceName().startsWith("北京") ||
+                    dto.getProvinceName().startsWith("天津") ||
+                    dto.getProvinceName().startsWith("上海") ||
+                    dto.getProvinceName().startsWith("重庆")) {
+                if(!dto.getCityName().endsWith("区")){
+                    dto.setCityName(dto.getCityName() + "区");
+                }
+            }
             List<DictCityRegionBO> cityList = dictCityRegionBOS.stream()
-                    .filter(dictCityRegionBO -> dictCityRegionBO.getName().equals(rowData.get(3)))
+                    .filter(dictCityRegionBO -> dictCityRegionBO.getName().equals(dto.getCityName()))
                     .toList();
             if (CollUtil.isEmpty(cityList)) {
-                throw new BusinessException(rowData.get(3)+"城市不存在,导入失败");
+                throw new BusinessException(rowData.get(0)+"城市不存在,导入失败");
             }
             dto.setCityId(cityList.getFirst().getId());
 

+ 12 - 0
src/main/java/com/jtzx/crm/module/sys/service/SysCustomerDataPublicService.java

@@ -116,6 +116,18 @@ public class SysCustomerDataPublicService {
         sysCustomerDataService.adminInsert(dto);
     }
 
+    /**
+     * 批量新增公海客户
+     * @param dtoList
+     * @throws BusinessException
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void adminInsertCustomerData(List<AdminSysCustomerDataInsertOrUpdateDTO> dtoList) throws BusinessException{
+        permissionService.publicPrivateCustomerPermission();
+        sysCustomerDataService.importData(dtoList);
+    }
+
+
     /**
      * 公海客户修改
      *

+ 20 - 5
src/main/java/com/jtzx/crm/module/sys/service/SysCustomerDataService.java

@@ -70,22 +70,37 @@ public class SysCustomerDataService {
         return this.entity2BO(entity);
     }
 
+    /**
+     * 批量导入
+     * @param dtoList
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void importData(List<AdminSysCustomerDataInsertOrUpdateDTO> dtoList){
+        if(CollUtil.isNotEmpty(dtoList)){
+            dtoList.forEach(this::adminInsert);
+        }
+    }
+
+
     /**
      * 后台管理-新增
      */
     @Transactional(rollbackFor = Exception.class)
     public Long adminInsert(AdminSysCustomerDataInsertOrUpdateDTO dto) throws BusinessException {
         log.info("[后台管理-客户(学校)数据-新增] >> DTO={}", dto);
-        long count =
-                sysCustomerDataMapper.selectCount(
+        List<SysCustomerDataEntity> customerDataEntityList =
+                sysCustomerDataMapper.selectList(
                         new LambdaQueryWrapper<SysCustomerDataEntity>()
                                 .select(
-                                        SysCustomerDataEntity::getId
+                                        SysCustomerDataEntity::getId,
+                                        SysCustomerDataEntity::getName
                                 )
                                 .eq(SysCustomerDataEntity::getName, dto.getName())
+                                .eq(SysCustomerDataEntity::getProvinceId,dto.getProvinceId())
+                                .eq(SysCustomerDataEntity::getCityId,dto.getCityId())
                 );
-        if (count > 0) {
-            throw new BusinessException(400, "添加失败,已存在相同名称学校");
+        if (!customerDataEntityList.isEmpty()) {
+            throw new BusinessException(400, customerDataEntityList.getFirst().getName()+"添加失败,已存在相同名称学校");
         }
         dto.setId(null);
         SysCustomerDataEntity entity = new SysCustomerDataEntity();

+ 22 - 0
src/main/java/com/jtzx/crm/module/sys/service/SysCustomerUserCommonService.java

@@ -215,6 +215,17 @@ public class SysCustomerUserCommonService {
         List<Long> groupIds = Lists.newArrayList();
         //管理员
         if (roles.contains("Admin")) {
+            List<SysGroupEntity> groupEntityList = sysGroupMapper.selectList(
+                    new LambdaQueryWrapper<>(SysGroupEntity.class)
+                            .select(
+                                    SysGroupEntity::getId
+                            )
+                            .orderByAsc(SysGroupEntity::getSortCode)
+            );
+            if (CollUtil.isNotEmpty(groupEntityList)) {
+                groupIds.addAll(
+                        groupEntityList.stream().map(SysGroupEntity::getId).filter(Objects::nonNull).distinct().toList());
+            }
             return this.handleAdminRole(provinceIds, cityIds, groupIds, userStatus);
         }
         //普通成员或小组组长
@@ -244,6 +255,17 @@ public class SysCustomerUserCommonService {
         List<Long> groupIds = Lists.newArrayList();
         //管理员
         if (roles.contains("Admin")) {
+            List<SysGroupEntity> groupEntityList = sysGroupMapper.selectList(
+                    new LambdaQueryWrapper<>(SysGroupEntity.class)
+                            .select(
+                                    SysGroupEntity::getId
+                            )
+                            .orderByAsc(SysGroupEntity::getSortCode)
+            );
+            if (CollUtil.isNotEmpty(groupEntityList)) {
+                groupIds.addAll(
+                        groupEntityList.stream().map(SysGroupEntity::getId).filter(Objects::nonNull).distinct().toList());
+            }
             return this.handleAdminRole(provinceIds, cityIds, groupIds, userStatus);
         }
         //小组组长