lishuangjiang@potevio.com 1 年間 前
コミット
525a533306
13 ファイル変更185 行追加28 行削除
  1. 4 0
      sso-module-system/sso-module-system-api/src/main/java/com/poteviohealth/cgp/sso/module/system/enums/ErrorCodeConstants.java
  2. 4 0
      sso-module-system/sso-module-system-biz/src/main/java/com/poteviohealth/cgp/sso/module/system/controller/admin/dept/vo/dept/DeptRespVO.java
  3. 9 0
      sso-module-system/sso-module-system-biz/src/main/java/com/poteviohealth/cgp/sso/module/system/controller/admin/dept/vo/dept/DeptSaveReqVO.java
  4. 10 0
      sso-module-system/sso-module-system-biz/src/main/java/com/poteviohealth/cgp/sso/module/system/controller/admin/dept/vo/dept/DeptSimpleRespVO.java
  5. 32 2
      sso-module-system/sso-module-system-biz/src/main/java/com/poteviohealth/cgp/sso/module/system/controller/admin/userclient/UserClientController.java
  6. 13 0
      sso-module-system/sso-module-system-biz/src/main/java/com/poteviohealth/cgp/sso/module/system/controller/admin/userclient/vo/UserSsoVo.java
  7. 9 0
      sso-module-system/sso-module-system-biz/src/main/java/com/poteviohealth/cgp/sso/module/system/dal/dataobject/dept/DeptDO.java
  8. 3 0
      sso-module-system/sso-module-system-biz/src/main/java/com/poteviohealth/cgp/sso/module/system/dal/mysql/dept/DeptMapper.java
  9. 41 1
      sso-module-system/sso-module-system-biz/src/main/java/com/poteviohealth/cgp/sso/module/system/service/dept/DeptServiceImpl.java
  10. 1 0
      sso-module-system/sso-module-system-biz/src/main/java/com/poteviohealth/cgp/sso/module/system/service/user/AdminUserService.java
  11. 5 0
      sso-module-system/sso-module-system-biz/src/main/java/com/poteviohealth/cgp/sso/module/system/service/user/AdminUserServiceImpl.java
  12. 47 18
      sso-module-system/sso-module-system-biz/src/main/java/com/poteviohealth/cgp/sso/module/system/util/transmit/TransmitSecurityUtil.java
  13. 7 7
      sso-server/src/main/java/com/poteviohealth/cgp/sso/server/controller/DefaultController.java

+ 4 - 0
sso-module-system/sso-module-system-api/src/main/java/com/poteviohealth/cgp/sso/module/system/enums/ErrorCodeConstants.java

@@ -73,6 +73,10 @@ public interface ErrorCodeConstants {
     ErrorCode DEPT_NOT_ENABLE = new ErrorCode(1_002_004_006, "部门({})不处于开启状态,不允许选择");
     ErrorCode DEPT_PARENT_IS_CHILD = new ErrorCode(1_002_004_007, "不能设置自己的子部门为父部门");
 
+    ErrorCode DEPT_EXITS_USERS = new ErrorCode(1_002_004_008, "存在关联用户,无法删除");
+
+    ErrorCode DEPT_CODE_DUPLICATE = new ErrorCode(1_002_004_009, "已经存在该编码的部门");
+
     // ========== 岗位模块 1-002-005-000 ==========
     ErrorCode POST_NOT_FOUND = new ErrorCode(1_002_005_000, "当前岗位不存在");
     ErrorCode POST_NOT_ENABLE = new ErrorCode(1_002_005_001, "岗位({}) 不处于开启状态,不允许选择");

+ 4 - 0
sso-module-system/sso-module-system-biz/src/main/java/com/poteviohealth/cgp/sso/module/system/controller/admin/dept/vo/dept/DeptRespVO.java

@@ -36,4 +36,8 @@ public class DeptRespVO {
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式")
     private LocalDateTime createTime;
 
+
+    @Schema(description = "部门编码", example = "1")
+    private String code;
+
 }

+ 9 - 0
sso-module-system/sso-module-system-biz/src/main/java/com/poteviohealth/cgp/sso/module/system/controller/admin/dept/vo/dept/DeptSaveReqVO.java

@@ -46,4 +46,13 @@ public class DeptSaveReqVO {
     @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}")
     private Integer status;
 
+    @Schema(description = "部门级别", example = "1")
+    private Integer level;
+
+    @Schema(description = "部门路径", example = "1")
+    private String treePath;
+
+    @Schema(description = "部门编码", example = "1")
+    private String code;
+
 }

+ 10 - 0
sso-module-system/sso-module-system-biz/src/main/java/com/poteviohealth/cgp/sso/module/system/controller/admin/dept/vo/dept/DeptSimpleRespVO.java

@@ -20,4 +20,14 @@ public class DeptSimpleRespVO {
     @Schema(description = "父部门 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
     private Long parentId;
 
+    @Schema(description = "部门级别", example = "1")
+    private Integer level;
+
+    @Schema(description = "部门路径", example = "1")
+    private String treePath;
+
+
+    @Schema(description = "部门编码", example = "1")
+    private String code;
+
 }

+ 32 - 2
sso-module-system/sso-module-system-biz/src/main/java/com/poteviohealth/cgp/sso/module/system/controller/admin/userclient/UserClientController.java

@@ -1,5 +1,6 @@
 package com.poteviohealth.cgp.sso.module.system.controller.admin.userclient;
 
+import cn.hutool.core.collection.CollUtil;
 import com.poteviohealth.cgp.sso.framework.common.enums.CommonStatusEnum;
 import com.poteviohealth.cgp.sso.framework.common.pojo.CommonResult;
 import com.poteviohealth.cgp.sso.framework.common.pojo.PageResult;
@@ -7,10 +8,12 @@ import com.poteviohealth.cgp.sso.framework.common.util.object.BeanUtils;
 import com.poteviohealth.cgp.sso.framework.security.core.util.SecurityFrameworkUtils;
 import com.poteviohealth.cgp.sso.module.system.controller.admin.user.vo.user.UserSyncReqVO;
 import com.poteviohealth.cgp.sso.module.system.controller.admin.userclient.vo.*;
+import com.poteviohealth.cgp.sso.module.system.dal.dataobject.dept.DeptDO;
 import com.poteviohealth.cgp.sso.module.system.dal.dataobject.oauth2.OAuth2ClientDO;
 import com.poteviohealth.cgp.sso.module.system.dal.dataobject.user.AdminUserDO;
 import com.poteviohealth.cgp.sso.module.system.dal.dataobject.userclient.UserClientDO;
 import com.poteviohealth.cgp.sso.module.system.enums.ErrorCodeConstants;
+import com.poteviohealth.cgp.sso.module.system.service.dept.DeptService;
 import com.poteviohealth.cgp.sso.module.system.service.oauth2.OAuth2ClientService;
 import com.poteviohealth.cgp.sso.module.system.service.user.AdminUserService;
 import com.poteviohealth.cgp.sso.module.system.service.userclient.UserClientService;
@@ -55,6 +58,9 @@ public class UserClientController {
     @Resource
     private OAuth2ClientService oAuth2ClientService;
 
+    @Resource
+    private DeptService deptService;
+
     @Resource
     private RestTemplate restTemplate;
 
@@ -177,7 +183,7 @@ public class UserClientController {
         HttpEntity< Map<String, Object>> httpEntity = new HttpEntity<>(dataMap);
         try {
             ResponseEntity exchange = restTemplate.postForEntity(oAuth2Client.getSyncUserInfoUrl(), httpEntity,Object.class);
-            System.out.println(exchange);
+            log.info("###################",exchange);
             if(exchange.getStatusCode()== HttpStatus.OK){
                 Map<String,Object> resultRemote = (Map)exchange.getBody();
                 if(Objects.nonNull(resultRemote)){
@@ -210,12 +216,36 @@ public class UserClientController {
         dataMap.put("mobile", user.getMobile());
         String signature = TransmitSecurityUtil.constructSignature(oAuth2Client.getSecret(), nonce, timestamp, dataMap);
         String url = constructUrl(syncUserInfoUrl, nonce, signature, timestamp, oAuth2Client.getClientId());
+        //获取机构信息
+        String companyName = null;
+        String deptName = null;
+        String deptCode = null;
+        if(Objects.nonNull(user.getDeptId())){
+            DeptDO dept = deptService.getDept(user.getDeptId());
+            if(dept.getParentId().compareTo(DeptDO.PARENT_ID_ROOT)!=0){
+                Set<Long> deptIds = Arrays.stream(dept.getTreePath().split(",")).map(s->Long.parseLong(s.trim())).collect(Collectors.toSet());
+                List<DeptDO> deptList = deptService.getDeptList(deptIds);
+                Map<Long,DeptDO> deptMap = deptList.stream().collect(Collectors.toMap(DeptDO::getParentId,Function.identity()));
+                DeptDO rootDept = deptMap.get(0L);
+                if(Objects.nonNull(rootDept)){
+                    DeptDO company = deptMap.get(rootDept.getId());
+                    if (Objects.nonNull(company)){
+                        companyName = company.getName();
+                        DeptDO deptOrg = deptMap.get(company.getId());
+                        if(Objects.nonNull(deptOrg)){
+                            deptName = deptOrg.getName();
+                            deptCode = deptOrg.getCode();
+                        }
+                    }
+                }
+            }
+        }
         //头部信息
         HttpHeaders headers = new HttpHeaders();
         headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
         headers.set(HEADER, Objects.nonNull(oAuth2Client.getAppId())? oAuth2Client.getAppId(): oAuth2Client.getClientId());
         HttpEntity<UserSsoVo> httpEntity = new HttpEntity<>(new UserSsoVo(user.getUsername()
-                , user.getNickname(), user.getIdNumber(), user.getMobile(), null, null, null),
+                , user.getNickname(), user.getIdNumber(), user.getMobile(), null, companyName, deptName,deptName,deptCode),
                 headers);
         ResponseEntity exchange = restTemplate.postForEntity(url, httpEntity,Object.class);
         System.out.println(exchange);

+ 13 - 0
sso-module-system/sso-module-system-biz/src/main/java/com/poteviohealth/cgp/sso/module/system/controller/admin/userclient/vo/UserSsoVo.java

@@ -49,4 +49,17 @@ public class UserSsoVo {
      */
     @Schema(description = "机构名称", name = "deptName", required = false)
     private String deptName;
+
+    /**
+     * 机构名称
+     */
+    @Schema(description = "机构名称", name = "orgName", required = false)
+    private String  instName;
+
+
+    /**
+     * 机构编码
+     */
+    @Schema(description = "机构编码", name = "orgCode", required = false)
+    private String  instCode;
 }

+ 9 - 0
sso-module-system/sso-module-system-biz/src/main/java/com/poteviohealth/cgp/sso/module/system/dal/dataobject/dept/DeptDO.java

@@ -6,6 +6,7 @@ import com.poteviohealth.cgp.sso.module.system.dal.dataobject.user.AdminUserDO;
 import com.baomidou.mybatisplus.annotation.KeySequence;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -63,4 +64,12 @@ public class DeptDO extends TenantBaseDO {
      */
     private Integer status;
 
+    @Schema(description = "部门级别", example = "1")
+    private Integer level;
+
+    @Schema(description = "部门路径", example = "1")
+    private String treePath;
+
+    private String code;
+
 }

+ 3 - 0
sso-module-system/sso-module-system-biz/src/main/java/com/poteviohealth/cgp/sso/module/system/dal/mysql/dept/DeptMapper.java

@@ -30,4 +30,7 @@ public interface DeptMapper extends BaseMapperX<DeptDO> {
         return selectList(DeptDO::getParentId, parentIds);
     }
 
+    default DeptDO selectByParentIdAndCode(Long parentId, String code){
+        return selectOne(DeptDO::getParentId, parentId, DeptDO::getCode, code);
+    }
 }

+ 41 - 1
sso-module-system/sso-module-system-biz/src/main/java/com/poteviohealth/cgp/sso/module/system/service/dept/DeptServiceImpl.java

@@ -9,9 +9,13 @@ import com.poteviohealth.cgp.sso.module.system.controller.admin.dept.vo.dept.Dep
 import com.poteviohealth.cgp.sso.module.system.controller.admin.dept.vo.dept.DeptSaveReqVO;
 import com.poteviohealth.cgp.sso.module.system.dal.dataobject.dept.DeptDO;
 import com.poteviohealth.cgp.sso.module.system.dal.mysql.dept.DeptMapper;
+import com.poteviohealth.cgp.sso.module.system.dal.mysql.user.AdminUserMapper;
 import com.poteviohealth.cgp.sso.module.system.dal.redis.RedisKeyConstants;
 import com.google.common.annotations.VisibleForTesting;
+import com.poteviohealth.cgp.sso.module.system.service.user.AdminUserService;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
@@ -36,6 +40,8 @@ public class DeptServiceImpl implements DeptService {
 
     @Resource
     private DeptMapper deptMapper;
+    @Resource
+    private AdminUserMapper adminUserMapper;
 
     @Override
     @CacheEvict(cacheNames = RedisKeyConstants.DEPT_CHILDREN_ID_LIST,
@@ -43,12 +49,20 @@ public class DeptServiceImpl implements DeptService {
     public Long createDept(DeptSaveReqVO createReqVO) {
         if (createReqVO.getParentId() == null) {
             createReqVO.setParentId(DeptDO.PARENT_ID_ROOT);
+            createReqVO.setLevel(1);
         }
         // 校验父部门的有效性
         validateParentDept(null, createReqVO.getParentId());
         // 校验部门名的唯一性
         validateDeptNameUnique(null, createReqVO.getParentId(), createReqVO.getName());
+        // 校验部门编码唯一性
+        validateDeptCodeUnique(null, createReqVO.getParentId(), createReqVO.getCode());
 
+        if(!createReqVO.getParentId().equals(DeptDO.PARENT_ID_ROOT)){
+            DeptDO parentDept = deptMapper.selectById(createReqVO.getParentId());
+            createReqVO.setLevel(parentDept.getLevel()+1);
+            createReqVO.setTreePath(StringUtils.isNotEmpty(parentDept.getTreePath())?parentDept.getTreePath()+","+parentDept.getId():String.valueOf(parentDept.getId()));
+        }
         // 插入部门
         DeptDO dept = BeanUtils.toBean(createReqVO, DeptDO.class);
         deptMapper.insert(dept);
@@ -61,6 +75,7 @@ public class DeptServiceImpl implements DeptService {
     public void updateDept(DeptSaveReqVO updateReqVO) {
         if (updateReqVO.getParentId() == null) {
             updateReqVO.setParentId(DeptDO.PARENT_ID_ROOT);
+            updateReqVO.setLevel(1);
         }
         // 校验自己存在
         validateDeptExists(updateReqVO.getId());
@@ -68,12 +83,34 @@ public class DeptServiceImpl implements DeptService {
         validateParentDept(updateReqVO.getId(), updateReqVO.getParentId());
         // 校验部门名的唯一性
         validateDeptNameUnique(updateReqVO.getId(), updateReqVO.getParentId(), updateReqVO.getName());
-
+        // 校验部门编码唯一性
+        validateDeptCodeUnique(updateReqVO.getId(), updateReqVO.getParentId(), updateReqVO.getCode());
+        DeptDO deptDO = deptMapper.selectById(updateReqVO.getId());
+        if(deptDO.getParentId().compareTo(updateReqVO.getParentId())!=0
+                &&!updateReqVO.getParentId().equals(DeptDO.PARENT_ID_ROOT)){
+            DeptDO parentDept = deptMapper.selectById(updateReqVO.getParentId());
+            updateReqVO.setLevel(parentDept.getLevel()+1);
+            updateReqVO.setTreePath(StringUtils.isNotEmpty(parentDept.getTreePath())?parentDept.getTreePath()+","+parentDept.getId():String.valueOf(parentDept.getId()));
+        }
         // 更新部门
         DeptDO updateObj = BeanUtils.toBean(updateReqVO, DeptDO.class);
         deptMapper.updateById(updateObj);
     }
 
+    private void validateDeptCodeUnique(Long id, Long parentId, String code) {
+        DeptDO dept = deptMapper.selectByParentIdAndCode(parentId, code);
+        if (dept == null) {
+            return;
+        }
+        // 如果 id 为空,说明不用比较是否为相同 id 的部门
+        if (id == null) {
+            throw exception(DEPT_CODE_DUPLICATE);
+        }
+        if (ObjectUtil.notEqual(dept.getId(), id)) {
+            throw exception(DEPT_CODE_DUPLICATE);
+        }
+    }
+
     @Override
     @CacheEvict(cacheNames = RedisKeyConstants.DEPT_CHILDREN_ID_LIST,
             allEntries = true) // allEntries 清空所有缓存,因为操作一个部门,涉及到多个缓存
@@ -84,6 +121,9 @@ public class DeptServiceImpl implements DeptService {
         if (deptMapper.selectCountByParentId(id) > 0) {
             throw exception(DEPT_EXITS_CHILDREN);
         }
+        if (CollectionUtils.isNotEmpty(adminUserMapper.selectListByDeptIds(Collections.singletonList(id)))){
+            throw exception(DEPT_EXITS_USERS);
+        }
         // 删除部门
         deptMapper.deleteById(id);
     }

+ 1 - 0
sso-module-system/sso-module-system-biz/src/main/java/com/poteviohealth/cgp/sso/module/system/service/user/AdminUserService.java

@@ -210,4 +210,5 @@ public interface AdminUserService {
      */
     boolean isPasswordMatch(String rawPassword, String encodedPassword);
 
+    List<AdminUserDO> getUsersByDeptId(Long id);
 }

+ 5 - 0
sso-module-system/sso-module-system-biz/src/main/java/com/poteviohealth/cgp/sso/module/system/service/user/AdminUserServiceImpl.java

@@ -517,4 +517,9 @@ public class AdminUserServiceImpl implements AdminUserService {
         return passwordEncoder.encode(password);
     }
 
+
+    @Override
+    public List<AdminUserDO> getUsersByDeptId(Long id) {
+        return userMapper.selectListByDeptIds(Collections.singletonList(id));
+    }
 }

+ 47 - 18
sso-module-system/sso-module-system-biz/src/main/java/com/poteviohealth/cgp/sso/module/system/util/transmit/TransmitSecurityUtil.java

@@ -70,6 +70,19 @@ public class TransmitSecurityUtil {
         return  hmac.digestHex(tempStr);
     }
 
+    public static String encryByPublicKey(String orignStr){
+        // RSA加密算法,此算法依赖于hutool-crypto和hutool-core
+        RSA rsa = new RSA(null, publicKey);
+        byte[] encrypt = rsa.encrypt(orignStr, KeyType.PublicKey);
+        return HexUtil.encodeHexStr(encrypt);
+    }
+
+    public static String decryByPrivateKey(String encryptString){
+        RSA rsa = new RSA(privateKey, null);
+        byte[] oldString = rsa.decrypt(encryptString, KeyType.PrivateKey);
+        return new String(oldString);
+    }
+
     /**
      * 校验摘要签名
      * @param appSecret
@@ -192,6 +205,9 @@ public class TransmitSecurityUtil {
     }
 
 
+
+
+
     public static void main(String[] args) throws Exception {
         // 示例业务数据
 //        Map<String, Object> dataMap = new LinkedHashMap<>();
@@ -231,24 +247,37 @@ public class TransmitSecurityUtil {
 //        System.out.println(verifyData(en,tt));
 //         String tt = "普天东台";
 //        System.out.println(MD5(tt+"o8Hde!Xg|hP>8hjP"));
-        Long timestamp = System.currentTimeMillis();
-        Map<String, Object> dataMap = new LinkedHashMap<>();
-        dataMap.put("timestamp", timestamp);
-        dataMap.put("devOperator", "potevio_dev");
-        System.out.println(dataMap);
-        System.out.println("+++++++++++++++++++++++++");
-        String data = JSON.toJSONString(dataMap);
-        RSA rsa = new RSA(privateKey, null);
-        byte[] encrypt = rsa.encrypt(data, KeyType.PrivateKey);
-        String encryptString = HexUtil.encodeHexStr(encrypt);
-        System.out.println("encryptStr::"+encryptString);
-        RSA rsa2 = new RSA(null, publicKey);
-        byte[] oldString = rsa2.decrypt(encryptString, KeyType.PublicKey);
-        System.out.println(new String(oldString));
-        System.out.println("=============================");
-        Map<String, Object> o = JSON.parseObject(oldString, Map.class);
-        System.out.println(o.get("timestamp"));
-        System.out.println(o.get("devOperator"));
+//        Long timestamp = System.currentTimeMillis();
+//        Map<String, Object> dataMap = new LinkedHashMap<>();
+//        dataMap.put("timestamp", timestamp);
+//        dataMap.put("devOperator", "potevio_dev");
+//        System.out.println(dataMap);
+//        System.out.println("+++++++++++++++++++++++++");
+//        String data = JSON.toJSONString(dataMap);
+//        RSA rsa = new RSA(privateKey, null);
+//        byte[] encrypt = rsa.encrypt(data, KeyType.PrivateKey);
+//        String encryptString = HexUtil.encodeHexStr(encrypt);
+//        System.out.println("encryptStr::"+encryptString);
+//        RSA rsa2 = new RSA(null, publicKey);
+//        byte[] oldString = rsa2.decrypt(encryptString, KeyType.PublicKey);
+//        System.out.println(new String(oldString));
+//        System.out.println("=============================");
+//        Map<String, Object> o = JSON.parseObject(oldString, Map.class);
+//        System.out.println(o.get("timestamp"));
+//        System.out.println(o.get("devOperator"));
+
+        String test = encryByPublicKey("test11111111111111");
+        System.out.println(test);
+        System.out.println(test.length());
+//        System.out.println(MD5(test));
+        String s = decryByPrivateKey(test);
+        System.out.println(s);
+
+
+//        RSA rsa = new RSA(null, publicKey);
+//        byte[] signature = rsa.encrypt("test", KeyType.PublicKey);
+//        String sign = HexUtil.encodeHexStr(signature);
+
 
     }
 }

+ 7 - 7
sso-server/src/main/java/com/poteviohealth/cgp/sso/server/controller/DefaultController.java

@@ -18,13 +18,13 @@ public class DefaultController {
     @RequestMapping("/admin-api/bpm/**")
     public CommonResult<Boolean> bpm404() {
         return CommonResult.error(NOT_IMPLEMENTED.getCode(),
-                "[工作流模块 sso-module-bpm - 已禁用][参考 https://doc.iocoder.cn/bpm/ 开启]");
+                "[工作流模块 sso-module-bpm - 已禁用]");
     }
 
     @RequestMapping("/admin-api/mp/**")
     public CommonResult<Boolean> mp404() {
         return CommonResult.error(NOT_IMPLEMENTED.getCode(),
-                "[微信公众号 sso-module-mp - 已禁用][参考 https://doc.iocoder.cn/mp/build/ 开启]");
+                "[微信公众号 sso-module-mp - 已禁用]");
     }
 
     @RequestMapping(value = {"/admin-api/product/**", // 商品中心
@@ -32,31 +32,31 @@ public class DefaultController {
             "/admin-api/promotion/**"})  // 营销中心
     public CommonResult<Boolean> mall404() {
         return CommonResult.error(NOT_IMPLEMENTED.getCode(),
-                "[商城系统 sso-module-mall - 已禁用][参考 https://doc.iocoder.cn/mall/build/ 开启]");
+                "[商城系统 sso-module-mall - 已禁用]");
     }
 
     @RequestMapping("/admin-api/erp/**")
     public CommonResult<Boolean> erp404() {
         return CommonResult.error(NOT_IMPLEMENTED.getCode(),
-                "[ERP 模块 sso-module-erp - 已禁用][参考 https://doc.iocoder.cn/erp/build/ 开启]");
+                "[ERP 模块 sso-module-erp - 已禁用]");
     }
 
     @RequestMapping("/admin-api/crm/**")
     public CommonResult<Boolean> crm404() {
         return CommonResult.error(NOT_IMPLEMENTED.getCode(),
-                "[CRM 模块 sso-module-crm - 已禁用][参考 https://doc.iocoder.cn/crm/build/ 开启]");
+                "[CRM 模块 sso-module-crm - 已禁用]");
     }
 
     @RequestMapping(value = {"/admin-api/report/**"})
     public CommonResult<Boolean> report404() {
         return CommonResult.error(NOT_IMPLEMENTED.getCode(),
-                "[报表模块 sso-module-report - 已禁用][参考 https://doc.iocoder.cn/report/ 开启]");
+                "[报表模块 sso-module-report - 已禁用]");
     }
 
     @RequestMapping(value = {"/admin-api/pay/**"})
     public CommonResult<Boolean> pay404() {
         return CommonResult.error(NOT_IMPLEMENTED.getCode(),
-                "[支付模块 sso-module-pay - 已禁用][参考 https://doc.iocoder.cn/pay/build/ 开启]");
+                "[支付模块 sso-module-pay - 已禁用]");
     }
 
 }