gao 2 months ago
commit
4324a425a8
100 changed files with 6892 additions and 0 deletions
  1. 52 0
      crm-manager/manager_realse_shop_start.bat
  2. 23 0
      crm-manager/manager_shop.bat
  3. 50 0
      crm-manager/manager_shop_start.bat
  4. 30 0
      crm-manager/manager_start.bat
  5. 50 0
      crm-manager/manager_test_shop_start.bat
  6. 203 0
      crm-manager/pom.xml
  7. 26 0
      crm-manager/src/main/java/com/crm/manager/ManagerApplication.java
  8. 71 0
      crm-manager/src/main/java/com/crm/manager/configuration/CurrentUserArgumentResolver.java
  9. 50 0
      crm-manager/src/main/java/com/crm/manager/configuration/FeignConfiguration.java
  10. 26 0
      crm-manager/src/main/java/com/crm/manager/configuration/FeignMultipartSupportConfig.java
  11. 11 0
      crm-manager/src/main/java/com/crm/manager/configuration/GetCurrentUserInfo.java
  12. 71 0
      crm-manager/src/main/java/com/crm/manager/configuration/InterceptorRoleConfiguration.java
  13. 15 0
      crm-manager/src/main/java/com/crm/manager/configuration/WebConfig.java
  14. 120 0
      crm-manager/src/main/java/com/crm/manager/controller/AuthorityController.java
  15. 34 0
      crm-manager/src/main/java/com/crm/manager/controller/CommonController.java
  16. 167 0
      crm-manager/src/main/java/com/crm/manager/controller/SysConfigController.java
  17. 97 0
      crm-manager/src/main/java/com/crm/manager/controller/SysIpLimitController.java
  18. 124 0
      crm-manager/src/main/java/com/crm/manager/controller/SysReasonsRefusalController.java
  19. 323 0
      crm-manager/src/main/java/com/crm/manager/controller/UserController.java
  20. 34 0
      crm-manager/src/main/java/com/crm/manager/controller/UserGroupController.java
  21. 202 0
      crm-manager/src/main/java/com/crm/manager/controller/UserRoleController.java
  22. 15 0
      crm-manager/src/main/java/com/crm/manager/dao/mapper/SysConfigMapper.java
  23. 15 0
      crm-manager/src/main/java/com/crm/manager/dao/mapper/SysIpLimitMapper.java
  24. 17 0
      crm-manager/src/main/java/com/crm/manager/dao/mapper/SysNodeMapper.java
  25. 18 0
      crm-manager/src/main/java/com/crm/manager/dao/mapper/SysReasonsRefusalMapper.java
  26. 38 0
      crm-manager/src/main/java/com/crm/manager/dao/mapper/UserInfoDao.java
  27. 11 0
      crm-manager/src/main/java/com/crm/manager/dao/mapper/UserInfoMapper.java
  28. 16 0
      crm-manager/src/main/java/com/crm/manager/dao/mapper/UserRoleDetailMapper.java
  29. 17 0
      crm-manager/src/main/java/com/crm/manager/dao/mapper/UserRoleNodeMapper.java
  30. 27 0
      crm-manager/src/main/java/com/crm/manager/dao/repository/SysActionRepository.java
  31. 48 0
      crm-manager/src/main/java/com/crm/manager/dao/repository/SysConfigRepository.java
  32. 26 0
      crm-manager/src/main/java/com/crm/manager/dao/repository/SysIpLimitRepository.java
  33. 22 0
      crm-manager/src/main/java/com/crm/manager/dao/repository/SysNodeRepository.java
  34. 22 0
      crm-manager/src/main/java/com/crm/manager/dao/repository/SysReasonsRefusalRepository.java
  35. 18 0
      crm-manager/src/main/java/com/crm/manager/dao/repository/SysUserLoginHistoryRepository.java
  36. 44 0
      crm-manager/src/main/java/com/crm/manager/dao/repository/UserDepartmentRepository.java
  37. 16 0
      crm-manager/src/main/java/com/crm/manager/dao/repository/UserGroupRepository.java
  38. 62 0
      crm-manager/src/main/java/com/crm/manager/dao/repository/UserInfoRepository.java
  39. 16 0
      crm-manager/src/main/java/com/crm/manager/dao/repository/UserRoleDetailRepository.java
  40. 16 0
      crm-manager/src/main/java/com/crm/manager/dao/repository/UserRoleNodeRepository.java
  41. 46 0
      crm-manager/src/main/java/com/crm/manager/dao/repository/UserRoleRepository.java
  42. 124 0
      crm-manager/src/main/java/com/crm/manager/interceptor/RoleInterceptor.java
  43. 18 0
      crm-manager/src/main/java/com/crm/manager/property/RoleConfigureProperty.java
  44. 25 0
      crm-manager/src/main/java/com/crm/manager/property/WebStaticsProperty.java
  45. 25 0
      crm-manager/src/main/java/com/crm/manager/service/AuthorityService.java
  46. 15 0
      crm-manager/src/main/java/com/crm/manager/service/CommonService.java
  47. 77 0
      crm-manager/src/main/java/com/crm/manager/service/SysConfigService.java
  48. 29 0
      crm-manager/src/main/java/com/crm/manager/service/SysIpLimitService.java
  49. 25 0
      crm-manager/src/main/java/com/crm/manager/service/SysReasonsRefusalService.java
  50. 64 0
      crm-manager/src/main/java/com/crm/manager/service/UserDepartmentService.java
  51. 12 0
      crm-manager/src/main/java/com/crm/manager/service/UserGroupService.java
  52. 80 0
      crm-manager/src/main/java/com/crm/manager/service/UserInfoService.java
  53. 15 0
      crm-manager/src/main/java/com/crm/manager/service/UserRoleDetailService.java
  54. 17 0
      crm-manager/src/main/java/com/crm/manager/service/UserRoleNodeService.java
  55. 111 0
      crm-manager/src/main/java/com/crm/manager/service/UserRoleService.java
  56. 151 0
      crm-manager/src/main/java/com/crm/manager/service/impl/AuthorityServiceImpl.java
  57. 25 0
      crm-manager/src/main/java/com/crm/manager/service/impl/CommonServiceImpl.java
  58. 323 0
      crm-manager/src/main/java/com/crm/manager/service/impl/SysConfigServiceImpl.java
  59. 137 0
      crm-manager/src/main/java/com/crm/manager/service/impl/SysIpLimitServiceImpl.java
  60. 127 0
      crm-manager/src/main/java/com/crm/manager/service/impl/SysReasonsRefusalServiceImpl.java
  61. 245 0
      crm-manager/src/main/java/com/crm/manager/service/impl/UserDepartmentServiceImpl.java
  62. 41 0
      crm-manager/src/main/java/com/crm/manager/service/impl/UserGroupServiceImpl.java
  63. 644 0
      crm-manager/src/main/java/com/crm/manager/service/impl/UserInfoServiceImpl.java
  64. 59 0
      crm-manager/src/main/java/com/crm/manager/service/impl/UserRoleDetailServiceImpl.java
  65. 64 0
      crm-manager/src/main/java/com/crm/manager/service/impl/UserRoleNodeServiceImpl.java
  66. 666 0
      crm-manager/src/main/java/com/crm/manager/service/impl/UserRoleServiceImpl.java
  67. 109 0
      crm-manager/src/main/java/com/crm/manager/service/impl/base/BaseUploadServiceImpl.java
  68. 39 0
      crm-manager/src/main/resources/application-dev.yml
  69. 32 0
      crm-manager/src/main/resources/application-ho.yml
  70. 33 0
      crm-manager/src/main/resources/application-hu.yml
  71. 28 0
      crm-manager/src/main/resources/application-prod.yml
  72. 31 0
      crm-manager/src/main/resources/application-test.yml
  73. 81 0
      crm-manager/src/main/resources/application.yml
  74. 41 0
      crm-manager/src/main/resources/i18n/messages.properties
  75. 43 0
      crm-manager/src/main/resources/i18n/messages_en_US.properties
  76. 42 0
      crm-manager/src/main/resources/i18n/messages_vn_VN.properties
  77. 43 0
      crm-manager/src/main/resources/i18n/messages_zh_CN.properties
  78. 57 0
      crm-manager/src/main/resources/logback-dev.xml
  79. 57 0
      crm-manager/src/main/resources/logback-prod.xml
  80. 32 0
      crm-manager/src/main/resources/mapper/SysConfigMapper.xml
  81. 33 0
      crm-manager/src/main/resources/mapper/SysIpLimitMapper.xml
  82. 39 0
      crm-manager/src/main/resources/mapper/SysNodeMapper.xml
  83. 49 0
      crm-manager/src/main/resources/mapper/SysReasonsRefusalMapper.xml
  84. 156 0
      crm-manager/src/main/resources/mapper/UserInfoDao.xml
  85. 55 0
      crm-manager/src/main/resources/mapper/UserInfoMapper.xml
  86. 18 0
      crm-manager/src/main/resources/mapper/UserRoleDetailMapper.xml
  87. 18 0
      crm-manager/src/main/resources/mapper/UserRoleNodeMapper.xml
  88. 1 0
      crm-manager/打包.bat
  89. 1 0
      crm-manager/打包依赖.bat
  90. 30 0
      crm-model/.gitignore
  91. 80 0
      crm-model/pom.xml
  92. 4 0
      crm-model/src/main/java/com/crm/rely/backend/model/constant/ConfigConstants.java
  93. 11 0
      crm-model/src/main/java/com/crm/rely/backend/model/constant/CustomConstants.java
  94. 9 0
      crm-model/src/main/java/com/crm/rely/backend/model/constant/EmailTemplateConstants.java
  95. 13 0
      crm-model/src/main/java/com/crm/rely/backend/model/constant/ManagerConstants.java
  96. 11 0
      crm-model/src/main/java/com/crm/rely/backend/model/constant/PayConstants.java
  97. 15 0
      crm-model/src/main/java/com/crm/rely/backend/model/constant/PayTypeConstants.java
  98. 124 0
      crm-model/src/main/java/com/crm/rely/backend/model/dto/custom/CustomInfoDto.java
  99. 115 0
      crm-model/src/main/java/com/crm/rely/backend/model/dto/custom/InfoDto.java
  100. 34 0
      crm-model/src/main/java/com/crm/rely/backend/model/dto/export/PayInfoBalanceHistoryExport.java

+ 52 - 0
crm-manager/manager_realse_shop_start.bat

@@ -0,0 +1,52 @@
+@echo off & setlocal enabledelayedexpansion
+  ::ipconfig>ip.txt
+  
+   
+netstat -aon |findstr :8500>pid.txt
+      
+     for /f "delims=" %%a in (pid.txt) do (
+         
+      for /f "tokens=1* delims=:" %%i in ('call echo %%a^|find /i "TCP"') do (
+         echo %%a
+     ::��ȡ�����ݹ��˺�,д����һ�����±���
+     rem Echo %%a>>"text.txt"
+        ) 
+    )
+rem ��ȡ�ļ�������
+set /P OEM=<pid.txt
+  
+rem ��ȡ�ļ��е��ַ���
+  
+echo  %OEM:~71,76%
+  
+taskkill /f /pid %OEM:~71,76%
+
+@echo off
+       cd D:\server\cwg_crm\manager-service
+       D:
+       if not exist D:\server\cwg_crm\backup\manager\%date:~10,4%%date:~4,2%%date:~7,2% md D:\server\cwg_crm\backup\manager\%date:~10,4%%date:~4,2%%date:~7,2%
+       if exist "D:\server\cwg_crm\manager-service\com-crm-manager-1.0.0.jar" (
+	copy "D:\server\cwg_crm\manager-service\com-crm-manager-1.0.0.jar" "D:\server\cwg_crm\backup\manager\%date:~10,4%%date:~4,2%%date:~7,2%\com-crm-manager-1.0.0-%date:~10,4%%date:~4,2%%date:~7,2%%time:~0,2%%time:~3,2%%time:~6,2%.jar"
+	del "D:\server\cwg_crm\manager-service\com-crm-manager-1.0.0.jar"
+) 
+       if exist "D:\server\cwg_crm\manager-service\dependency\crm-backend-1.0.0.jar" (
+	copy "D:\server\cwg_crm\manager-service\dependency\crm-backend-1.0.0.jar" "D:\server\cwg_crm\backup\manager\%date:~10,4%%date:~4,2%%date:~7,2%\crm-backend-1.0.0-%date:~10,4%%date:~4,2%%date:~7,2%%time:~0,2%%time:~3,2%%time:~6,2%.jar"
+	del "D:\server\cwg_crm\manager-service\dependency\crm-backend-1.0.0.jar"
+)
+       if exist "D:\server\cwg_crm\manager-service\dependency\crm-login-backend-1.0.0.jar" (
+	copy "D:\server\cwg_crm\manager-service\dependency\crm-login-backend-1.0.0.jar" "D:\server\cwg_crm\backup\manager\%date:~10,4%%date:~4,2%%date:~7,2%\crm-login-backend-1.0.0-%date:~10,4%%date:~4,2%%date:~7,2%%time:~0,2%%time:~3,2%%time:~6,2%.jar"
+	del "D:\server\cwg_crm\manager-service\dependency\crm-login-backend-1.0.0.jar"
+)
+       if exist "D:\server\cwg_crm\manager-service\dependency\crm-core-1.0.0.jar" (
+	copy "D:\server\cwg_crm\manager-service\dependency\crm-core-1.0.0.jar" "D:\server\cwg_crm\backup\manager\%date:~10,4%%date:~4,2%%date:~7,2%\crm-core-1.0.0-%date:~10,4%%date:~4,2%%date:~7,2%%time:~0,2%%time:~3,2%%time:~6,2%.jar"
+	del "D:\server\cwg_crm\manager-service\dependency\crm-core-1.0.0.jar"
+)
+       cd "C:\Users\Administrator\crm\crm-manager"
+       copy "C:\Users\Administrator\crm\crm-manager\com-crm-manager-1.0.0.jar" "D:\server\cwg_crm\manager-service\com-crm-manager-1.0.0.jar"
+       copy "C:\Users\Administrator\crm\crm-manager\dependency\crm-backend-1.0.0.jar" "D:\server\cwg_crm\manager-service\dependency\crm-backend-1.0.0.jar"
+       copy "C:\Users\Administrator\crm\crm-manager\dependency\crm-login-backend-1.0.0.jar" "D:\server\cwg_crm\manager-service\dependency\crm-login-backend-1.0.0.jar"
+       copy "C:\Users\Administrator\crm\crm-manager\dependency\crm-core-1.0.0.jar" "D:\server\cwg_crm\manager-service\dependency\crm-core-1.0.0.jar"
+       cd D:\server\cwg_crm\manager-service
+       D:
+       javaw -Xmx4096m  -Dloader.path=dependency -jar com-crm-manager-1.0.0.jar  --spring.profiles.active=prod
+       echo good bye

+ 23 - 0
crm-manager/manager_shop.bat

@@ -0,0 +1,23 @@
+@echo off & setlocal enabledelayedexpansion
+  ::ipconfig>ip.txt
+  
+   
+netstat -aon |findstr 8500>pid.txt
+      
+     for /f "delims=" %%a in (pid.txt) do (
+         
+      for /f "tokens=1* delims=:" %%i in ('call echo %%a^|find /i "TCP"') do (
+         echo %%a
+     ::��ȡ�����ݹ��˺�,д����һ�����±���
+     rem Echo %%a>>"text.txt"
+        ) 
+    )
+rem ��ȡ�ļ�������
+set /P OEM=<pid.txt
+  
+rem ��ȡ�ļ��е��ַ���
+  
+echo  %OEM:~71,76%
+  
+taskkill /f /pid %OEM:~71,76%
+exit 0

+ 50 - 0
crm-manager/manager_shop_start.bat

@@ -0,0 +1,50 @@
+@echo off & setlocal enabledelayedexpansion
+  ::ipconfig>ip.txt
+  
+   
+netstat -aon |findstr 8500>pid.txt
+      
+     for /f "delims=" %%a in (pid.txt) do (
+         
+      for /f "tokens=1* delims=:" %%i in ('call echo %%a^|find /i "TCP"') do (
+         echo %%a
+     ::��ȡ�����ݹ��˺�,д����һ�����±���
+     rem Echo %%a>>"text.txt"
+        ) 
+    )
+rem ��ȡ�ļ�������
+set /P OEM=<pid.txt
+  
+rem ��ȡ�ļ��е��ַ���
+  
+echo  %OEM:~71,76%
+  
+taskkill /f /pid %OEM:~71,76%
+
+@echo off
+       cd C:\server\cwg_crm\manager-service
+       if not exist C:\server\cwg_crm\backup\manager md C:\server\cwg_crm\backup\manager
+       if exist "C:\server\cwg_crm\manager-service\com-crm-manager-1.0.0.jar" (
+	copy "C:\server\cwg_crm\manager-service\com-crm-manager-1.0.0.jar" "C:\server\cwg_crm\backup\manager\com-crm-manager-1.0.0-%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%.jar"
+	del "C:\server\cwg_crm\manager-service\com-crm-manager-1.0.0.jar"
+) 
+       if exist "C:\server\cwg_crm\manager-service\dependency\crm-backend-1.0.0.jar" (
+	copy "C:\server\cwg_crm\manager-service\dependency\crm-backend-1.0.0.jar" "C:\server\cwg_crm\backup\manager\crm-backend-1.0.0-%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%.jar"
+	del "C:\server\cwg_crm\manager-service\dependency\crm-backend-1.0.0.jar"
+)
+       if exist "C:\server\cwg_crm\manager-service\dependency\crm-login-backend-1.0.0.jar" (
+	copy "C:\server\cwg_crm\manager-service\dependency\crm-login-backend-1.0.0.jar" "C:\server\cwg_crm\backup\manager\crm-login-backend-1.0.0-%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%.jar"
+	del "C:\server\cwg_crm\manager-service\dependency\crm-login-backend-1.0.0.jar"
+)
+       if exist "C:\server\cwg_crm\manager-service\dependency\crm-core-1.0.0.jar" (
+	copy "C:\server\cwg_crm\manager-service\dependency\crm-core-1.0.0.jar" "C:\server\cwg_crm\backup\manager\crm-core-1.0.0-%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%.jar"
+	del "C:\server\cwg_crm\manager-service\dependency\crm-core-1.0.0.jar"
+)
+       cd "C:\Users\Administrator\crm\crm-manager"
+       copy "C:\Users\Administrator\crm\crm-manager\com-crm-manager-1.0.0.jar" "C:\server\cwg_crm\manager-service\com-crm-manager-1.0.0.jar"
+       copy "C:\Users\Administrator\crm\crm-manager\dependency\crm-backend-1.0.0.jar" "C:\server\cwg_crm\manager-service\dependency\crm-backend-1.0.0.jar"
+       copy "C:\Users\Administrator\crm\crm-manager\dependency\crm-login-backend-1.0.0.jar" "C:\server\cwg_crm\manager-service\dependency\crm-login-backend-1.0.0.jar"
+       copy "C:\Users\Administrator\crm\crm-manager\dependency\crm-core-1.0.0.jar" "C:\server\cwg_crm\manager-service\dependency\crm-core-1.0.0.jar"
+      cd C:\server\cwg_crm\manager-service
+       javaw -Xmx512m -Dloader.path=dependency -jar com-crm-manager-1.0.0.jar  --spring.profiles.active=prod
+       echo good bye

+ 30 - 0
crm-manager/manager_start.bat

@@ -0,0 +1,30 @@
+
+@echo off
+       cd C:\server\cwg_crm\manager-service
+       if not exist C:\server\cwg_crm\backup\manager md C:\server\cwg_crm\backup\manager
+       if exist "C:\server\cwg_crm\manager-service\com-crm-manager-1.0.0.jar" (
+	copy "C:\server\cwg_crm\manager-service\com-crm-manager-1.0.0.jar" "C:\server\cwg_crm\backup\manager\com-crm-manager-1.0.0-%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%.jar"
+	del "C:\server\cwg_crm\manager-service\com-crm-manager-1.0.0.jar"
+) 
+       if exist "C:\server\cwg_crm\manager-service\dependency\crm-backend-1.0.0.jar" (
+	copy "C:\server\cwg_crm\manager-service\dependency\crm-backend-1.0.0.jar" "C:\server\cwg_crm\backup\manager\crm-backend-1.0.0-%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%.jar"
+	del "C:\server\cwg_crm\manager-service\dependency\crm-backend-1.0.0.jar"
+)
+       if exist "C:\server\cwg_crm\manager-service\dependency\crm-login-backend-1.0.0.jar" (
+	copy "C:\server\cwg_crm\manager-service\dependency\crm-login-backend-1.0.0.jar" "C:\server\cwg_crm\backup\manager\crm-login-backend-1.0.0-%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%.jar"
+	del "C:\server\cwg_crm\manager-service\dependency\crm-login-backend-1.0.0.jar"
+)
+       if exist "C:\server\cwg_crm\manager-service\dependency\crm-core-1.0.0.jar" (
+	copy "C:\server\cwg_crm\manager-service\dependency\crm-core-1.0.0.jar" "C:\server\cwg_crm\backup\manager\crm-core-1.0.0-%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%.jar"
+	del "C:\server\cwg_crm\manager-service\dependency\crm-core-1.0.0.jar"
+)
+       cd "C:\Users\Administrator\crm\crm-manager"
+       c:
+       copy "C:\Users\Administrator\crm\crm-manager\com-crm-manager-1.0.0.jar" "C:\server\cwg_crm\manager-service\com-crm-manager-1.0.0.jar"
+       copy "C:\Users\Administrator\crm\crm-manager\dependency\crm-backend-1.0.0.jar" "C:\server\cwg_crm\manager-service\dependency\crm-backend-1.0.0.jar"
+       copy "C:\Users\Administrator\crm\crm-manager\dependency\crm-login-backend-1.0.0.jar" "C:\server\cwg_crm\manager-service\dependency\crm-login-backend-1.0.0.jar"
+       copy "C:\Users\Administrator\crm\crm-manager\dependency\crm-core-1.0.0.jar" "C:\server\cwg_crm\manager-service\dependency\crm-core-1.0.0.jar"
+       cd C:\server\cwg_crm\manager-service
+       title manager
+       java -Xmx2048m  -Dloader.path=dependency -jar com-crm-manager-1.0.0.jar --spring.profiles.active=prod
+       echo good bye

+ 50 - 0
crm-manager/manager_test_shop_start.bat

@@ -0,0 +1,50 @@
+@echo off & setlocal enabledelayedexpansion
+  ::ipconfig>ip.txt
+  
+   
+netstat -aon |findstr 8500>pid.txt
+      
+     for /f "delims=" %%a in (pid.txt) do (
+         
+      for /f "tokens=1* delims=:" %%i in ('call echo %%a^|find /i "TCP"') do (
+         echo %%a
+     ::��ȡ�����ݹ��˺�,д����һ�����±���
+     rem Echo %%a>>"text.txt"
+        ) 
+    )
+rem ��ȡ�ļ�������
+set /P OEM=<pid.txt
+  
+rem ��ȡ�ļ��е��ַ���
+  
+echo  %OEM:~71,76%
+  
+taskkill /f /pid %OEM:~71,76%
+
+@echo off
+       cd C:\server\cwg_crm\manager-service
+       if not exist C:\server\cwg_crm\backup\manager md C:\server\cwg_crm\backup\manager
+       if exist "C:\server\cwg_crm\manager-service\com-crm-manager-1.0.0.jar" (
+	copy "C:\server\cwg_crm\manager-service\com-crm-manager-1.0.0.jar" "C:\server\cwg_crm\backup\manager\com-crm-manager-1.0.0-%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%.jar"
+	del "C:\server\cwg_crm\manager-service\com-crm-manager-1.0.0.jar"
+) 
+       if exist "C:\server\cwg_crm\manager-service\dependency\crm-backend-1.0.0.jar" (
+	copy "C:\server\cwg_crm\manager-service\dependency\crm-backend-1.0.0.jar" "C:\server\cwg_crm\backup\manager\crm-backend-1.0.0-%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%.jar"
+	del "C:\server\cwg_crm\manager-service\dependency\crm-backend-1.0.0.jar"
+)
+       if exist "C:\server\cwg_crm\manager-service\dependency\crm-login-backend-1.0.0.jar" (
+	copy "C:\server\cwg_crm\manager-service\dependency\crm-login-backend-1.0.0.jar" "C:\server\cwg_crm\backup\manager\crm-login-backend-1.0.0-%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%.jar"
+	del "C:\server\cwg_crm\manager-service\dependency\crm-login-backend-1.0.0.jar"
+)
+       if exist "C:\server\cwg_crm\manager-service\dependency\crm-core-1.0.0.jar" (
+	copy "C:\server\cwg_crm\manager-service\dependency\crm-core-1.0.0.jar" "C:\server\cwg_crm\backup\manager\crm-core-1.0.0-%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%.jar"
+	del "C:\server\cwg_crm\manager-service\dependency\crm-core-1.0.0.jar"
+)
+       cd "C:\Users\Administrator\crm\crm-manager"
+       copy "C:\Users\Administrator\crm\crm-manager\com-crm-manager-1.0.0.jar" "C:\server\cwg_crm\manager-service\com-crm-manager-1.0.0.jar"
+       copy "C:\Users\Administrator\crm\crm-manager\dependency\crm-backend-1.0.0.jar" "C:\server\cwg_crm\manager-service\dependency\crm-backend-1.0.0.jar"
+       copy "C:\Users\Administrator\crm\crm-manager\dependency\crm-login-backend-1.0.0.jar" "C:\server\cwg_crm\manager-service\dependency\crm-login-backend-1.0.0.jar"
+       copy "C:\Users\Administrator\crm\crm-manager\dependency\crm-core-1.0.0.jar" "C:\server\cwg_crm\manager-service\dependency\crm-core-1.0.0.jar"
+      cd C:\server\cwg_crm\manager-service
+       javaw -Xmx1024m  -Dloader.path=dependency -jar com-crm-manager-1.0.0.jar  --spring.profiles.active=test
+       echo good bye

+ 203 - 0
crm-manager/pom.xml

@@ -0,0 +1,203 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.crm.manager</groupId>
+    <artifactId>com-crm-manager</artifactId>
+    <version>2.2.0</version>
+    <packaging>jar</packaging>
+
+    <name>com_crm_manager</name>
+    <description>crm manager module for eman</description>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>3.2.12</version>
+
+        <relativePath/> <!-- lookup parent fromAccount repository -->
+    </parent>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>17</java.version>
+        <spring-cloud.version>2023.0.3</spring-cloud.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.crm.login.backend</groupId>
+            <artifactId>crm-login-backend</artifactId>
+            <version>2.1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.crm.model</groupId>
+            <artifactId>crm-model</artifactId>
+            <version>2.2.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>io.github.openfeign.form</groupId>
+            <artifactId>feign-form</artifactId>
+            <version>3.8.0</version>
+        </dependency>
+        <dependency>
+            <groupId>io.github.openfeign.form</groupId>
+            <artifactId>feign-form-spring</artifactId>
+            <version>3.8.0</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>com.mysql</groupId>
+            <artifactId>mysql-connector-j</artifactId>
+        </dependency>
+
+        <!--mybatis-->
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>3.0.3</version>
+        </dependency>
+
+        <!-- 导出 -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>5.2.5</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>5.2.5</version>
+        </dependency>
+
+        <!-- EasyExcel(兼容新版 POI) -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>3.3.4</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.jetbrains</groupId>
+            <artifactId>annotations</artifactId>
+            <version>24.1.0</version>
+            <scope>compile</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+
+
+    </dependencies>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>${spring-cloud.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <outputDirectory>
+                        ${project.build.directory}/../../lib
+                    </outputDirectory>
+                    <layout>ZIP</layout>
+                    <includes>
+                        <include>
+                            <groupId>com.crm.manager</groupId>
+                            <artifactId>com-crm-manager</artifactId>
+                        </include>
+                    </includes>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.mybatis.generator</groupId>
+                <artifactId>mybatis-generator-maven-plugin</artifactId>
+                <version>1.3.5</version>
+            </plugin>
+        </plugins>
+    </build>
+
+    <repositories>
+        <repository>
+            <id>spring-snapshots</id>
+            <name>Spring Snapshots</name>
+            <url>https://repo.spring.io/snapshot</url>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+        </repository>
+        <repository>
+            <id>spring-milestones</id>
+            <name>Spring Milestones</name>
+            <url>https://repo.spring.io/milestone</url>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+
+    <pluginRepositories>
+        <pluginRepository>
+            <id>spring-snapshots</id>
+            <name>Spring Snapshots</name>
+            <url>https://repo.spring.io/snapshot</url>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+        </pluginRepository>
+        <pluginRepository>
+            <id>spring-milestones</id>
+            <name>Spring Milestones</name>
+            <url>https://repo.spring.io/milestone</url>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+
+
+</project>

+ 26 - 0
crm-manager/src/main/java/com/crm/manager/ManagerApplication.java

@@ -0,0 +1,26 @@
+package com.crm.manager;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.jms.annotation.EnableJms;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+/**
+ * @author houn
+ */
+@EnableJms
+@SpringBootApplication
+@EnableScheduling
+@EnableFeignClients
+@MapperScan("com.crm.manager.dao.mapper")
+@EntityScan({"com.crm.rely.backend.core.pojo.table", "com.crm.rely.backend.model.pojo.table"})
+@ComponentScan(basePackages = {"com.crm.manager", "com.crm.rely.backend","com.crm.login.rely.backend.property"})
+public class ManagerApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(ManagerApplication.class, args);
+    }
+}

+ 71 - 0
crm-manager/src/main/java/com/crm/manager/configuration/CurrentUserArgumentResolver.java

@@ -0,0 +1,71 @@
+package com.crm.manager.configuration;
+
+import com.crm.rely.backend.configuration.ApplicationContextProvider;
+import com.crm.rely.backend.core.constant.Constants;
+import com.crm.rely.backend.model.entity.user.info.UserInfoEntity;
+import com.crm.rely.backend.service.RedisService;
+import com.crm.rely.backend.util.AESUtil;
+import com.google.common.base.Strings;
+import jakarta.servlet.http.HttpServletRequest;
+import org.springframework.core.MethodParameter;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.support.WebDataBinderFactory;
+import org.springframework.web.context.request.NativeWebRequest;
+import org.springframework.web.method.support.HandlerMethodArgumentResolver;
+import org.springframework.web.method.support.ModelAndViewContainer;
+
+/**
+ * 当前用户信息解析器
+ * 用于在Controller方法中自动注入当前登录用户的信息
+ * 通过解析请求头中的Access-Token来获取用户信息
+ */
+@Component
+public class CurrentUserArgumentResolver implements HandlerMethodArgumentResolver {
+
+    @Override
+    public boolean supportsParameter(MethodParameter parameter) {
+        // 检查参数是否被@GetCurrentUserInfo注解标记且类型为UserInfoEntity
+        return parameter.hasParameterAnnotation(GetCurrentUserInfo.class)
+                && parameter.getParameterType().equals(UserInfoEntity.class);
+    }
+
+    @Override
+    public Object resolveArgument(MethodParameter parameter,ModelAndViewContainer mavContainer,
+                                  NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
+        HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
+        // 获取请求头中的Access-Token
+        String token = request.getHeader("Access-Token");
+        
+        // 如果token为空,返回null
+        if (Strings.isNullOrEmpty(token)) {
+            return null;
+        }
+        
+        String decryptStr = AESUtil.decrypt(token);
+        
+        if (Strings.isNullOrEmpty(decryptStr)) {
+            return null;
+        }
+        
+        String[] tokenParts = decryptStr.split(Constants.LOGIN_LINK);
+        
+        if (tokenParts.length < 1) {
+            return null;
+        }
+        
+        // 获取redis key
+        String redisKey = tokenParts[0];
+
+        // 从ApplicationContext中获取RedisService实例
+        RedisService redisService = ApplicationContextProvider.getBean(RedisService.class);
+        String nowKey = redisService.getString(redisKey);
+        
+        if (Strings.isNullOrEmpty(nowKey)) {
+            return null;
+        }
+        
+        // 从redis中获取用户信息实体
+        UserInfoEntity entity = redisService.getEntity(nowKey, UserInfoEntity.class);
+        return entity;
+    }
+}

+ 50 - 0
crm-manager/src/main/java/com/crm/manager/configuration/FeignConfiguration.java

@@ -0,0 +1,50 @@
+package com.crm.manager.configuration;
+
+import com.crm.rely.backend.core.constant.Constants;
+import com.crm.rely.backend.core.exception.ServiceException;
+import com.crm.rely.backend.service.RedisService;
+import com.crm.rely.backend.util.UUIDUtil;
+import com.google.common.base.Strings;
+import feign.RequestInterceptor;
+import feign.RequestTemplate;
+import jakarta.servlet.http.HttpServletRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+/**
+ * Created by max on 2020/6/17.
+ */
+@Configuration
+public class FeignConfiguration implements RequestInterceptor {
+
+    @Autowired
+    private RedisService redisService;
+
+    @Override
+    public void apply(RequestTemplate requestTemplate) {
+       ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        String token = null;
+        String language = null;
+        if (null != attributes) {
+            HttpServletRequest request = attributes.getRequest();
+            token = request.getHeader(Constants.ACCESS_TOKEN);
+            language = request.getHeader(Constants.Language);
+        }
+
+        String feignToken = UUIDUtil.getUUID();
+        if (Strings.isNullOrEmpty(token)) {
+            token = feignToken;
+        }
+        requestTemplate.header(Constants.ACCESS_TOKEN, token);
+        requestTemplate.header(Constants.Feign_Token, feignToken);
+        requestTemplate.header(Constants.Language, language);
+
+        try {
+            redisService.saveObject(feignToken, token, Constants.Feign_Token_TIME);
+        } catch (ServiceException e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 26 - 0
crm-manager/src/main/java/com/crm/manager/configuration/FeignMultipartSupportConfig.java

@@ -0,0 +1,26 @@
+package com.crm.manager.configuration;
+
+import feign.codec.Encoder;
+import org.springframework.beans.factory.ObjectFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
+import org.springframework.cloud.openfeign.support.SpringEncoder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+/**
+ * @Author: houn
+ * @Date: 2020/9/4 18:20
+ * @Description:
+ */
+@Configuration
+public class FeignMultipartSupportConfig {
+    @Autowired
+    private ObjectFactory<HttpMessageConverters> messageConverters;
+
+    @Bean
+    @Primary
+    public Encoder feignEncoder() {
+        return new SpringEncoder(this.messageConverters);
+    }
+}

+ 11 - 0
crm-manager/src/main/java/com/crm/manager/configuration/GetCurrentUserInfo.java

@@ -0,0 +1,11 @@
+package com.crm.manager.configuration;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.PARAMETER)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface GetCurrentUserInfo {
+}

+ 71 - 0
crm-manager/src/main/java/com/crm/manager/configuration/InterceptorRoleConfiguration.java

@@ -0,0 +1,71 @@
+package com.crm.manager.configuration;
+
+import com.crm.manager.interceptor.RoleInterceptor;
+import com.crm.login.rely.backend.property.LoginConfigureProperty;
+import com.crm.manager.property.RoleConfigureProperty;
+import com.crm.rely.backend.aspect.ControllerAop;
+import com.crm.rely.backend.service.RedisService;
+import com.crm.manager.service.UserRoleService;
+import com.google.common.base.Strings;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.annotation.Order;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Configuration
+@Order(3)
+public class InterceptorRoleConfiguration implements WebMvcConfigurer {
+
+    @Autowired
+    LoginConfigureProperty loginConfigureProperty;
+    @Autowired
+    RoleConfigureProperty roleConfigureProperty;
+
+    @Autowired
+    private RedisService redisService;
+    @Autowired
+    private UserRoleService roleInfoService;
+
+    @Autowired
+    private ControllerAop controllerAop;
+
+    @Bean
+    RoleInterceptor loginInterceptor() {
+        return new RoleInterceptor(redisService, roleInfoService,controllerAop);
+    }
+
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        List<String> stringList = new ArrayList<String>();
+        for (String value : loginConfigureProperty.getExcludePathPatterns()) {
+            stringList.add(value);
+        }
+        for (String value : roleConfigureProperty.getExcludePathPatterns()) {
+            if (!Strings.isNullOrEmpty(value)) {
+                stringList.add(value);
+            }
+        }
+        String[] excludeList = new String[stringList.size()];
+
+        stringList.toArray(excludeList);
+
+        registry.addInterceptor(new RoleInterceptor(redisService, roleInfoService,controllerAop))
+                .addPathPatterns("/**")
+                .excludePathPatterns(excludeList);
+    }
+
+    @Override
+    public void addCorsMappings(CorsRegistry registry) {
+        registry.addMapping("/**")
+                .allowedOrigins("*")
+                .allowCredentials(true)
+                .allowedMethods("POST")
+                .maxAge(3600);
+    }
+}

+ 15 - 0
crm-manager/src/main/java/com/crm/manager/configuration/WebConfig.java

@@ -0,0 +1,15 @@
+package com.crm.manager.configuration;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.method.support.HandlerMethodArgumentResolver;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import java.util.List;
+
+@Configuration
+public class WebConfig implements WebMvcConfigurer {
+    @Override
+    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
+        resolvers.add(new CurrentUserArgumentResolver());
+    }
+}

+ 120 - 0
crm-manager/src/main/java/com/crm/manager/controller/AuthorityController.java

@@ -0,0 +1,120 @@
+package com.crm.manager.controller;
+
+import com.crm.manager.service.AuthorityService;
+import com.crm.manager.service.UserRoleService;
+import com.crm.rely.backend.core.dto.base.BaseResultDto;
+import com.crm.rely.backend.core.dto.user.role.UserNodeDisplayDto;
+import com.crm.rely.backend.core.entity.system.action.SysActionAddEntity;
+import com.crm.rely.backend.core.entity.system.action.SysActionDeleteEntity;
+import com.crm.rely.backend.core.entity.system.action.SysActionUpdateEntity;
+import com.crm.rely.backend.core.entity.system.node.SysNodeAddEntity;
+import com.crm.rely.backend.core.entity.system.node.SysNodeDeleteEntity;
+import com.crm.rely.backend.core.entity.system.node.SysNodeUpdateEntity;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 权限
+ *
+ * @author houn
+ */
+@RestController
+@RequestMapping("/authority")
+public class AuthorityController {
+
+    @Autowired
+    private AuthorityService authorityService;
+
+    @Autowired
+    private UserRoleService roleInfoService;
+
+    /**
+     * 添加节点
+     *
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/node/add")
+    public BaseResultDto nodeAdd(@RequestBody @Validated SysNodeAddEntity entity) throws Exception {
+        authorityService.add(entity);
+        return BaseResultDto.success();
+    }
+
+    /**
+     * 删除节点
+     *
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/node/delete")
+    public BaseResultDto nodeDelete(@RequestBody @Validated SysNodeDeleteEntity entity) throws Exception {
+        authorityService.delete(entity);
+        return BaseResultDto.success();
+    }
+
+    /**
+     * 修改节点
+     *
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/node/update")
+    public BaseResultDto nodeUpdate(@RequestBody @Validated SysNodeUpdateEntity entity) throws Exception {
+        authorityService.update(entity);
+        return BaseResultDto.success();
+    }
+
+    /**
+     * 添加按钮
+     *
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/action/add")
+    public BaseResultDto actionAdd(@RequestBody @Validated SysActionAddEntity entity) throws Exception {
+        authorityService.add(entity);
+        return BaseResultDto.success();
+    }
+
+    /**
+     * 删除按钮
+     *
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/action/delete")
+    public BaseResultDto actionDelete(@RequestBody @Validated SysActionDeleteEntity entity) throws Exception {
+        authorityService.delete(entity);
+        return BaseResultDto.success();
+    }
+
+    /**
+     * 修改按钮
+     *
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/action/update")
+    public BaseResultDto actionUpdate(@RequestBody @Validated SysActionUpdateEntity entity) throws Exception {
+        authorityService.update(entity);
+        return BaseResultDto.success();
+    }
+
+    @PostMapping("/info")
+    public BaseResultDto info() throws Exception {
+        List<UserNodeDisplayDto> userNodeDisplayDtos = roleInfoService.getUserNodeDisplay(0L);
+        return BaseResultDto.success(userNodeDisplayDtos);
+    }
+}

+ 34 - 0
crm-manager/src/main/java/com/crm/manager/controller/CommonController.java

@@ -0,0 +1,34 @@
+package com.crm.manager.controller;
+
+import com.crm.manager.configuration.GetCurrentUserInfo;
+import com.crm.manager.service.CommonService;
+import com.crm.rely.backend.core.constant.Constants;
+import com.crm.rely.backend.core.dto.base.BaseResultDto;
+import com.crm.rely.backend.model.entity.user.info.UserInfoEntity;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+
+/**
+ * 通用上传服务
+ */
+@RestController
+@RequestMapping("/common")
+public class CommonController {
+
+    @Autowired
+    private CommonService commonService;
+
+    @PostMapping("/upload")
+    public BaseResultDto upload(@RequestParam(value = "file", required = false) MultipartFile file, @GetCurrentUserInfo UserInfoEntity infoEntity) throws Exception {
+        String middlePath = "/file/" + infoEntity.getId() + "/common";
+        commonService.validated(file);
+        String path = commonService.uploadFile(middlePath, file);
+
+        return BaseResultDto.success(Constants.UPLOAD_SUCCESS, path);
+    }
+}

+ 167 - 0
crm-manager/src/main/java/com/crm/manager/controller/SysConfigController.java

@@ -0,0 +1,167 @@
+package com.crm.manager.controller;
+
+import com.crm.manager.configuration.GetCurrentUserInfo;
+import com.crm.manager.service.SysConfigService;
+import com.crm.rely.backend.core.constant.Constants;
+import com.crm.rely.backend.core.constant.GlobalConfigConstants;
+import com.crm.rely.backend.core.constant.PrefixEnum;
+import com.crm.rely.backend.core.dto.base.BaseResultDto;
+import com.crm.rely.backend.core.dto.base.ResultWithPagerDto;
+import com.crm.rely.backend.core.dto.system.config.SysConfigSearchDto;
+import com.crm.rely.backend.core.entity.system.config.*;
+import com.crm.rely.backend.model.entity.user.info.UserInfoEntity;
+import com.crm.rely.backend.util.GetIpAndMac;
+import com.crm.rely.backend.util.MD5Util;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Date;
+
+/**
+ * 配置
+ *
+ * @author houn
+ */
+@RestController
+@RequestMapping("/config")
+public class SysConfigController {
+
+    @Autowired
+    private SysConfigService sysConfigService;
+
+    @PostMapping("/refresh")
+    public BaseResultDto refresh() throws Exception {
+
+        sysConfigService.refresh();
+        return BaseResultDto.success();
+    }
+
+    @PostMapping("/cancel")
+    public BaseResultDto cancel() throws Exception {
+
+        sysConfigService.cancel();
+        return BaseResultDto.success();
+    }
+
+    /**
+     * 添加配置
+     *
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/add")
+    public BaseResultDto add(@RequestBody @Validated SysConfigAddEntity entity) throws Exception {
+
+        entity.setPwd(MD5Util.getMD5(entity.getPwd()));
+
+        sysConfigService.add(entity);
+        return BaseResultDto.success();
+    }
+
+    /**
+     * 删除配置
+     *
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/delete")
+    public BaseResultDto delete(@RequestBody @Validated SysConfigDeleteEntity entity, @GetCurrentUserInfo UserInfoEntity infoEntity) throws Exception {
+        if (!PrefixEnum.PREFIX_SYSTEM.equals(infoEntity.getPrefix())) {
+            return BaseResultDto.error(Constants.SYSTEM_ERROR);
+        }
+        sysConfigService.delete(entity);
+        return BaseResultDto.success();
+    }
+
+    /**
+     * 修改配置
+     *
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/update")
+    public BaseResultDto update(@RequestBody @Validated SysConfigUpdateEntity entity, @GetCurrentUserInfo UserInfoEntity infoEntity) throws Exception {
+        entity.setEmail(infoEntity.getEmail());
+        sysConfigService.update(entity);
+
+        return BaseResultDto.success();
+    }
+
+    @PostMapping("/update/send/code")
+    public BaseResultDto updateManagerSendEmailCode(@GetCurrentUserInfo UserInfoEntity infoEntity) throws Exception {
+
+        return updateSendEmailCode(infoEntity);
+    }
+
+    /**
+     * 列表查询
+     *
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/search/list")
+    public BaseResultDto list(@RequestBody @Validated SysConfigSearchEntity entity) throws Exception {
+
+        ResultWithPagerDto<SysConfigSearchDto> result = sysConfigService.searchPageList(entity);
+
+        return result;
+    }
+
+    /**
+     * 单个查询
+     *
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/search/single")
+    public BaseResultDto single(@RequestBody @Validated SysConfigSingleEntity entity) throws Exception {
+
+        SysConfigSearchDto result = sysConfigService.searchSingle(entity);
+
+        return BaseResultDto.success(result);
+    }
+
+    /**
+     * 查看全局邮件配置
+     *
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/email/search")
+    public BaseResultDto searchGlobal() throws Exception {
+
+        SysConfigSearchDto dto = sysConfigService.searchSingleByCode(GlobalConfigConstants.EMAIL_CONFIG_CONFIGURE);
+        return BaseResultDto.success(dto);
+    }
+
+    /**
+     * 发送修改配置邮件code(当前人员邮箱)
+     *
+     * @param infoEntity 登录人信息
+     * @return
+     * @throws Exception
+     */
+    private BaseResultDto updateSendEmailCode(@GetCurrentUserInfo UserInfoEntity infoEntity) throws Exception {
+        if (infoEntity == null || infoEntity == null) {
+            return BaseResultDto.error(Constants.SYSTEM_ERROR);
+        }
+        SendUpdateEmailCodeEntity emailCodeEntity = new SendUpdateEmailCodeEntity();
+
+        emailCodeEntity.setEmail(infoEntity.getEmail());
+        emailCodeEntity.setTime(new Date());
+        emailCodeEntity.setUser(infoEntity.getId());
+        emailCodeEntity.setIp(GetIpAndMac.getIp());
+
+        sysConfigService.sendUpdateEmailCode(emailCodeEntity);
+        return BaseResultDto.success(Constants.SEND_SUCCESS);
+    }
+}

+ 97 - 0
crm-manager/src/main/java/com/crm/manager/controller/SysIpLimitController.java

@@ -0,0 +1,97 @@
+package com.crm.manager.controller;
+
+import com.crm.manager.service.SysIpLimitService;
+import com.crm.rely.backend.core.constant.Constants;
+import com.crm.rely.backend.core.dto.base.BaseResultDto;
+import com.crm.rely.backend.core.dto.base.ResultWithPagerDto;
+import com.crm.rely.backend.core.dto.system.ip.SysIpLimitDto;
+import com.crm.rely.backend.core.entity.base.SingleLongEntity;
+import com.crm.rely.backend.core.entity.system.ip.SysIpLimitAddEntity;
+import com.crm.rely.backend.core.entity.system.ip.SysIpLimitDeleteEntity;
+import com.crm.rely.backend.core.entity.system.ip.SysIpLimitSearchEntity;
+import com.crm.rely.backend.core.entity.system.ip.SysIpLimitUpdateEntity;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @author: houn
+ */
+@RestController
+@RequestMapping("/ip/limit")
+public class SysIpLimitController {
+
+    @Autowired
+    private SysIpLimitService service;
+
+    /**
+     * 添加
+     *
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/add")
+    public BaseResultDto add(@RequestBody @Validated SysIpLimitAddEntity entity) throws Exception {
+        if (service.validatedIpExist(entity.getIp())) {
+            return BaseResultDto.error(Constants.SYSTEM_ERROR);
+        }
+        service.add(entity);
+        return BaseResultDto.success();
+    }
+
+    /**
+     * 删除
+     *
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/delete")
+    public BaseResultDto delete(@RequestBody @Validated SysIpLimitDeleteEntity entity) throws Exception {
+        service.delete(entity);
+        ;
+        return BaseResultDto.success();
+    }
+
+    /**
+     * 修改
+     *
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/update")
+    public BaseResultDto update(@RequestBody @Validated SysIpLimitUpdateEntity entity) throws Exception {
+        service.update(entity);
+        return BaseResultDto.success();
+    }
+
+    /**
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/search/list")
+    public BaseResultDto list(@RequestBody @Validated SysIpLimitSearchEntity entity) throws Exception {
+        ResultWithPagerDto<SysIpLimitDto> result = service.searchPageList(entity);
+        return result;
+    }
+
+    @PostMapping("/search/single")
+    public BaseResultDto single(@RequestBody @Validated SingleLongEntity entity) throws Exception {
+        SysIpLimitDto dto = service.searchSingle(entity);
+        return BaseResultDto.success(dto);
+    }
+
+    @PostMapping("/list")
+    public BaseResultDto list() throws Exception {
+        List<SysIpLimitDto> dtos = service.getList();
+        return BaseResultDto.success(dtos);
+    }
+}

+ 124 - 0
crm-manager/src/main/java/com/crm/manager/controller/SysReasonsRefusalController.java

@@ -0,0 +1,124 @@
+package com.crm.manager.controller;
+
+import com.crm.manager.service.SysReasonsRefusalService;
+import com.crm.rely.backend.core.constant.FeignClientAnnotation;
+import com.crm.rely.backend.core.dto.base.BaseResultDto;
+import com.crm.rely.backend.core.dto.base.ResultWithPagerDto;
+import com.crm.rely.backend.core.dto.system.reasons.refusal.SysReasonsRefusalSearchDto;
+import com.crm.rely.backend.core.entity.base.SingleLongEntity;
+import com.crm.rely.backend.core.entity.system.reasons.refusal.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+/**
+ * 拒绝理由
+ *
+ * @author houn
+ */
+@RestController
+@RequestMapping("/reasons/refusal")
+public class SysReasonsRefusalController {
+
+    @Autowired
+    private SysReasonsRefusalService sysReasonsRefusalService;
+
+    /**
+     * 添加拒绝理由
+     *
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/add")
+    public BaseResultDto add(@RequestBody @Validated SysReasonsRefusalAddEntity entity) throws Exception {
+
+        if (entity.getSubIndex() == null) {
+            entity.setSubIndex(0);
+        }
+        sysReasonsRefusalService.add(entity);
+        return BaseResultDto.success();
+    }
+
+    /**
+     * 删除拒绝理由
+     *
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/delete")
+    public BaseResultDto delete(@RequestBody @Validated SysReasonsRefusalDeleteEntity entity) throws Exception {
+        sysReasonsRefusalService.delete(entity);
+        return BaseResultDto.success();
+    }
+
+    /**
+     * 修改拒绝理由
+     *
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/update")
+    public BaseResultDto update(@RequestBody @Validated SysReasonsRefusalUpdateEntity entity) throws Exception {
+        if (entity.getSubIndex() == null) {
+            entity.setSubIndex(0);
+        }
+        sysReasonsRefusalService.update(entity);
+        return BaseResultDto.success();
+    }
+
+    /**
+     * 列表查询
+     *
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/search/list")
+    public BaseResultDto searchList(@RequestBody @Validated SysReasonsRefusalSearchPageEntity entity) throws Exception {
+
+
+        ResultWithPagerDto<SysReasonsRefusalSearchDto> result = sysReasonsRefusalService.searchPageList(entity);
+
+        return result;
+    }
+
+    /**
+     * 单个查询
+     *
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/search/single")
+    public BaseResultDto searchLingle(@RequestBody @Validated SingleLongEntity entity) throws Exception {
+
+        SysReasonsRefusalSearchDto result = sysReasonsRefusalService.searchSingle(entity);
+
+        return BaseResultDto.success(result);
+    }
+
+    @PostMapping("/list")
+    public BaseResultDto list(@RequestBody @Validated SysReasonsRefusalSearchEntity entity) throws Exception {
+
+        BaseResultDto<Map<String, SysReasonsRefusalSearchDto>> result = sysReasonsRefusalService.searchList(entity);
+
+        return result;
+    }
+
+    @PostMapping("/custom/list")
+    @FeignClientAnnotation
+    public BaseResultDto<Map<String, SysReasonsRefusalSearchDto>> customList(@RequestBody @Validated SysReasonsRefusalSearchEntity entity) throws Exception {
+
+        BaseResultDto<Map<String, SysReasonsRefusalSearchDto>> result = sysReasonsRefusalService.searchList(entity);
+
+        return result;
+    }
+}

+ 323 - 0
crm-manager/src/main/java/com/crm/manager/controller/UserController.java

@@ -0,0 +1,323 @@
+package com.crm.manager.controller;
+
+import com.crm.login.rely.backend.controller.BaseLoginController;
+import com.crm.manager.configuration.GetCurrentUserInfo;
+import com.crm.manager.service.UserInfoService;
+import com.crm.manager.service.UserRoleService;
+import com.crm.rely.backend.core.constant.Constants;
+import com.crm.rely.backend.core.constant.PrefixEnum;
+import com.crm.rely.backend.core.constant.RegexpConstants;
+import com.crm.rely.backend.core.dto.base.BaseResultDto;
+import com.crm.rely.backend.core.dto.base.BaseResultWithPagerDto;
+import com.crm.rely.backend.core.dto.user.role.UserNodeDisplayDto;
+import com.crm.rely.backend.core.entity.base.SingleLongEntity;
+import com.crm.rely.backend.core.entity.login.InfoEntity;
+import com.crm.rely.backend.core.exception.ServiceException;
+import com.crm.rely.backend.model.dto.user.info.UserInfoDto;
+import com.crm.rely.backend.model.dto.user.info.UserInfoSearchDto;
+import com.crm.rely.backend.model.entity.user.info.*;
+import com.crm.rely.backend.model.pojo.table.UserInfoTable;
+import com.crm.rely.backend.service.BlackListLoginService;
+import com.crm.rely.backend.service.SysCountryService;
+import com.crm.rely.backend.util.DateUtil;
+import com.crm.rely.backend.util.GetIpAndMac;
+import com.crm.rely.backend.util.MD5Util;
+import com.google.common.base.Strings;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+import static java.util.regex.Pattern.matches;
+
+/**
+ * @program: crm-backend
+ * @description:
+ * @author: houn
+ * @create: 2019-07-25 15:57
+ */
+@Slf4j
+@RestController
+@RequestMapping("/user")
+public class UserController extends BaseLoginController {
+
+    @Autowired
+    private UserInfoService userInfoService;
+
+    @Autowired
+    private UserRoleService userRoleService;
+
+    @Autowired
+    private SysCountryService sysCountryService;
+
+    @Autowired
+    private BlackListLoginService blackListLoginService;
+
+    /**
+     * 登录信息
+     *
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/login")
+    public BaseResultDto login(@RequestBody @Validated UserLoginEntity entity, HttpServletRequest request) throws Exception {
+
+        //密码处理为
+        entity.setPassword(MD5Util.getMD5(entity.getPassword()));
+
+        /**
+         * 处理登录时间 登录ip 登录地区
+         */
+        entity.setIp(GetIpAndMac.getIp(request));
+        String returnStr = sysCountryService.getAdderByIp(entity.getIp());
+
+        entity.setAddress(returnStr);
+        entity.setTime(new Date());
+
+        UserInfoEntity userInfoEntity = userInfoService.login(entity);
+
+        String accessToken = super.login(userInfoEntity);
+
+        return BaseResultDto.success(Constants.LOGIN_SUCCESS, accessToken);
+    }
+
+    /**
+     * 退出登录
+     *
+     * @param httpServletRequest
+     * @throws Exception
+     */
+    @Override
+    @PostMapping("/logout")
+    public BaseResultDto logout(HttpServletRequest httpServletRequest) throws Exception {
+
+        return super.logout(httpServletRequest);
+    }
+
+    /**
+     * 获取登录信息
+     *
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/info")
+    public BaseResultDto info(@GetCurrentUserInfo UserInfoEntity entity) throws Exception {
+
+        UserInfoDto userInfoDto = new UserInfoDto();
+
+        BeanUtils.copyProperties(entity, userInfoDto);
+
+        Long roleId;
+        if (PrefixEnum.PREFIX_SYSTEM.equals(entity.getPrefix())) {
+            roleId = 0L;
+        } else {
+            roleId = entity.getRoleId();
+        }
+        List<UserNodeDisplayDto> userNodeDisplayDtos = userRoleService.getUserNodeDisplay(roleId);
+        userInfoDto.setDisplay(userNodeDisplayDtos);
+
+        return BaseResultDto.success(userInfoDto);
+    }
+
+    @PostMapping("/display/{roleId}")
+    public String getUserNodeDisplay(@PathVariable("roleId") Long roleId) throws Exception {
+        userRoleService.getUserNodeDisplay(roleId);
+        return "success";
+    }
+
+    /**
+     * 添加用户
+     *
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/add")
+    public BaseResultDto add(@RequestBody @Validated UserInfoAddEntity entity) throws Exception {
+        entity.setEmail(entity.getEmail().toLowerCase());
+        //密码
+        entity.setPassword(MD5Util.getMD5(entity.getPassword()));
+
+        //如果登录名不填 默认为邮箱
+        if (Strings.isNullOrEmpty(entity.getUsername())) {
+            entity.setUsername(entity.getEmail());
+        }
+
+        //如果不填是否禁用 默认为1 可以登录
+        if (entity.getValid() == null) {
+            entity.setValid(1);
+        }
+        if (entity.getInRate() == null && entity.getInRate().compareTo(BigDecimal.ZERO) < 0) {
+            entity.setInRate(new BigDecimal(0.02));
+        }
+
+        if (entity.getOutRate() == null && entity.getOutRate().compareTo(BigDecimal.ZERO) < 0) {
+            entity.setOutRate(new BigDecimal(0.01));
+        }
+
+        userInfoService.add(entity);
+
+        return BaseResultDto.success(Constants.ADD_SUCCESS);
+    }
+
+    /**
+     * 删除用户信息
+     *
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/delete")
+    public BaseResultDto delete(@RequestBody @Validated UserInfoDeleteEntity entity) throws Exception {
+
+        userInfoService.delete(entity);
+
+        return BaseResultDto.success(Constants.DELETE_SUCCESS);
+    }
+
+    /**
+     * 修改用户信息
+     *
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/update")
+    public BaseResultDto update(@RequestBody @Validated UserInfoUpdateEntity entity) throws Exception {
+        entity.setEmail(entity.getEmail().toLowerCase());
+
+        if (entity.getIpLimit() == null) {
+            entity.setIpLimit(0);
+        }
+        //验证是否为空
+        if (!Strings.isNullOrEmpty(entity.getPassword())) {
+
+            //验证格式
+            if (!matches(RegexpConstants.REGEXP_PWD, entity.getPassword())) {
+                return BaseResultDto.error(Constants.PASSWORD_FORMAT_ERROR);
+            }
+
+            entity.setPassword(MD5Util.getMD5(entity.getPassword()));
+        }
+        UserInfoTable userInfoTable = userInfoService.update(entity);
+
+        PrefixEnum prefixEnum = userInfoService.getPrefixEnum(userInfoTable.getRoleId());
+        //如果密码不为空 则在修改后吧redis中的客户信息置空(退出登录)
+        if (!Strings.isNullOrEmpty(entity.getPassword())) {
+            logout(prefixEnum, userInfoTable.getId());
+        } else {
+            //如果redis没有记录 则不用更新
+            UserInfoEntity infoEntity = loginInfo(prefixEnum, userInfoTable.getId(), UserInfoEntity.class);
+            if (infoEntity != null) {
+                infoEntity.setValid(userInfoTable.getValid() == null ? 0 : userInfoTable.getValid());
+                BeanUtils.copyProperties(userInfoTable, infoEntity);
+                saveLoginInfo(infoEntity);
+            }
+        }
+
+        return BaseResultDto.success();
+    }
+
+    /**
+     * 查询用户 page
+     *
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/search/page")
+    public BaseResultDto searchPage(@RequestBody @Validated UserInfoSearchEntity entity) throws Exception {
+        if (entity.getEndDate() != null) {
+            entity.setEndDate(DateUtil.operationDay(entity.getEndDate(), 1));
+        }
+        if (entity.getStartDate() != null) {
+            entity.setStartDate(DateUtil.parseDate(entity.getStartDate()));
+        }
+        BaseResultWithPagerDto resultWithPagerDto = userInfoService.searchPage(entity);
+
+        return resultWithPagerDto;
+    }
+
+    /**
+     * 单个查询
+     *
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/search/single")
+    public BaseResultDto searchSingle(@RequestBody @Validated SingleLongEntity entity) throws Exception {
+
+        UserInfoSearchDto userInfoSearchDto = userInfoService.searchSingle(entity.getId());
+
+        return BaseResultDto.success(Constants.SEARCH_SUCCESS, userInfoSearchDto);
+    }
+
+
+    /**
+     * 未登录修改密码发送邮件
+     *
+     * @param entity
+     * @param req
+     * @return
+     */
+    @PostMapping("/update/password/send/email")
+    public BaseResultDto updatePasswordSendEmail(@RequestBody @Validated UserUpdatePasswordSendEmailEntity entity,
+                                                 HttpServletRequest req) throws Exception {
+
+
+        entity.setIp(GetIpAndMac.getIp(req));
+        entity.setTime(new Date());
+        userInfoService.updatePasswordSendEmail(entity);
+
+        return BaseResultDto.success(Constants.SEND_SUCCESS);
+    }
+
+    /**
+     * 未登录根据邮件修改密码
+     *
+     * @param entity
+     * @param req
+     * @return
+     */
+    @PostMapping("/update/email/password")
+    public BaseResultDto updatePassword(@RequestBody @Validated UserUpdateEmailPasswordEntity entity,
+                                        HttpServletRequest req) throws Exception {
+
+        entity.setModifyIp(GetIpAndMac.getIp(req));
+        entity.setModifyTime(new Date());
+        entity.setPassword(MD5Util.getMD5(entity.getPassword()));
+
+        userInfoService.updatePassword(entity);
+
+        return BaseResultDto.success(Constants.SUCCESS);
+    }
+
+    @PostMapping("/update/login/password")
+    public BaseResultDto updatePassword(@RequestBody @Validated UserUpdateLoginPasswordEntity entity,
+                                        HttpServletRequest req, InfoEntity infoEntity) throws Exception {
+
+        entity.setId(infoEntity.getId());
+        if (entity.getNewPassword().equals(entity.getOldPassword())) {
+            return BaseResultDto.error(Constants.PASSWORD_NEW_AND_OLD_IDENTICAL_ERROR);
+        }
+
+        entity.setModifyIp(GetIpAndMac.getIp(req));
+        entity.setModifyTime(new Date());
+        entity.setModifyUser(infoEntity.getId());
+        entity.setNewPassword(MD5Util.getMD5(entity.getNewPassword()));
+        entity.setOldPassword(MD5Util.getMD5(entity.getOldPassword()));
+
+        userInfoService.updatePassword(entity);
+
+        return BaseResultDto.success(Constants.UPDATE_SUCCESS);
+    }
+}

+ 34 - 0
crm-manager/src/main/java/com/crm/manager/controller/UserGroupController.java

@@ -0,0 +1,34 @@
+package com.crm.manager.controller;
+
+import com.crm.login.rely.backend.controller.BaseLoginController;
+import com.crm.manager.service.UserGroupService;
+import com.crm.rely.backend.core.dto.base.BaseResultDto;
+import com.crm.rely.backend.core.dto.user.group.UserGroupDto;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @program: crm-backend
+ * @description:
+ * @author: houn
+ * @create: 2019-07-25 15:57
+ */
+@RestController
+@RequestMapping("/user/group")
+public class UserGroupController extends BaseLoginController {
+
+    @Autowired
+    private UserGroupService userGroupService;
+
+
+    @PostMapping("/get")
+    public BaseResultDto<List<UserGroupDto>> get() throws Exception {
+        BaseResultDto<List<UserGroupDto>> resultDto=   userGroupService.getAllGroup();
+
+        return resultDto;
+    }
+}

+ 202 - 0
crm-manager/src/main/java/com/crm/manager/controller/UserRoleController.java

@@ -0,0 +1,202 @@
+package com.crm.manager.controller;
+
+import com.crm.manager.configuration.GetCurrentUserInfo;
+import com.crm.manager.service.UserRoleService;
+import com.crm.rely.backend.core.constant.Constants;
+import com.crm.rely.backend.core.constant.ManagerConstant;
+import com.crm.rely.backend.core.dto.base.BaseResultDto;
+import com.crm.rely.backend.core.dto.base.ResultWithPagerDto;
+import com.crm.rely.backend.core.dto.user.role.UserAllRoleDto;
+import com.crm.rely.backend.core.dto.user.role.UserNodeDisplayDto;
+import com.crm.rely.backend.core.dto.user.role.UserRoleDto;
+import com.crm.rely.backend.core.entity.base.SingleLongEntity;
+import com.crm.rely.backend.core.exception.ControllerException;
+import com.crm.rely.backend.model.entity.user.info.UserInfoEntity;
+import com.crm.rely.backend.model.entity.user.role.UserRoleAddEntity;
+import com.crm.rely.backend.model.entity.user.role.UserRoleOperateListEntity;
+import com.crm.rely.backend.model.entity.user.role.UserRoleSearchEntity;
+import com.crm.rely.backend.model.entity.user.role.UserRoleUpdateEntity;
+import com.crm.rely.backend.util.DateUtil;
+import jakarta.validation.Valid;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 角色
+ */
+@RestController
+@RequestMapping("/user/role")
+public class UserRoleController {
+
+    @Autowired
+    private UserRoleService roleInfoService;
+
+    /**
+     * 添加角色
+     *
+     * @param userRoleAddEntity
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/add")
+    public BaseResultDto addRoleInfo(@RequestBody @Valid UserRoleAddEntity userRoleAddEntity) throws Exception {
+
+        if (ManagerConstant.ROLE_CODE_SYSTEM.equals(userRoleAddEntity.getCode())) {
+            return BaseResultDto.error(Constants.NOT_PERMIT);
+        }
+
+        String roleCode = getRoleCode(userRoleAddEntity.getDepartmentId());
+        userRoleAddEntity.setCode(roleCode);
+        roleInfoService.addRoleInfo(userRoleAddEntity);
+
+        return BaseResultDto.success();
+    }
+
+    @PostMapping("/add/detail/list")
+    public BaseResultDto<List<UserNodeDisplayDto>> getDetailList() throws Exception {
+
+        List<UserNodeDisplayDto> userNodeDisplayEntities = roleInfoService.getUserNodeDisplay(-1L);
+
+        return BaseResultDto.success(userNodeDisplayEntities);
+    }
+
+    /**
+     * 修改角色
+     *
+     * @return
+     */
+    @PostMapping("/update")
+    public BaseResultDto updateRoleInfoBase(@RequestBody @Valid UserRoleUpdateEntity userRoleUpdateEntity) throws Exception {
+        if (ManagerConstant.ROLE_CODE_SYSTEM.equals(userRoleUpdateEntity.getCode())) {
+            return BaseResultDto.error(Constants.NOT_PERMIT);
+        }
+
+
+        String roleCode = getRoleCode(userRoleUpdateEntity.getDepartmentId());
+        userRoleUpdateEntity.setCode(roleCode);
+        roleInfoService.updateRoleInfo(userRoleUpdateEntity);
+
+        return BaseResultDto.success();
+    }
+
+    /**
+     * 修改角色权限
+     *
+     * @return
+     */
+    @PostMapping("/update/detail")
+    public BaseResultDto updateRoleInfoDetail(@RequestBody @Valid UserRoleOperateListEntity userRoleOperateListEntity) throws Exception {
+
+        roleInfoService.updateRoleInfo(userRoleOperateListEntity);
+
+        return BaseResultDto.success();
+    }
+
+    /**
+     * 拉取所有权限列表 用于修改权限的时候用
+     *
+     * @return
+     */
+    @PostMapping("/update/detail/list")
+    public BaseResultDto<List<UserNodeDisplayDto>> getDetailList(@RequestBody @Valid SingleLongEntity singleLongEntity, @GetCurrentUserInfo UserInfoEntity userInfoEntity) throws Exception {
+
+        if (userInfoEntity.getRoleId() != null && userInfoEntity.getRoleId() != 0) {
+            if (singleLongEntity.getId() == null || singleLongEntity.getId() == 0) {
+                throw new ControllerException("管理员权限无法修改");
+            }
+        }
+
+        List<UserNodeDisplayDto> userNodeDisplayEntities = roleInfoService.getUserNodeDisplay(singleLongEntity.getId());
+
+        return BaseResultDto.success(userNodeDisplayEntities);
+    }
+
+    /**
+     * 删除角色
+     *
+     * @return
+     */
+    @PostMapping("/delete")
+    public BaseResultDto deleteRoleInfo(@RequestBody @Valid SingleLongEntity singleLongEntity) throws Exception {
+
+        roleInfoService.deleteRoleInfo(singleLongEntity.getId());
+
+        return BaseResultDto.success();
+    }
+
+    /**
+     * id查询角色信息
+     *
+     * @return
+     */
+    @PostMapping("/search/single")
+    public BaseResultDto<UserRoleDto> searchSingle(@RequestBody @Valid SingleLongEntity singleLongEntity) throws Exception {
+
+        UserRoleDto roleInfo = roleInfoService.getRoleInfo(singleLongEntity.getId());
+
+        return BaseResultDto.success(roleInfo);
+    }
+
+    /**
+     * 查询角色信息列表
+     *
+     * @return
+     */
+    @PostMapping("/search/page")
+    public ResultWithPagerDto<UserRoleDto> searchListPage(@RequestBody @Valid UserRoleSearchEntity entity) throws Exception {
+        if (entity.getEndDate() != null) {
+            entity.setEndDate(DateUtil.operationDay(entity.getEndDate(), 1));
+        }
+        if (entity.getStartDate() != null) {
+            entity.setStartDate(DateUtil.parseDate(entity.getStartDate()));
+        }
+        ResultWithPagerDto<UserRoleDto> result = roleInfoService.getListInfo(entity);
+
+        return result;
+    }
+
+    /**
+     * 查询角色信息列表
+     *
+     * @return
+     */
+    @PostMapping("/search/list")
+    public BaseResultDto<List<UserAllRoleDto>> allList() throws Exception {
+
+        List<UserAllRoleDto> result = roleInfoService.getListInfo();
+
+        return BaseResultDto.success(result);
+    }
+
+    private String getRoleCode(Long departmentId) {
+        int dId = departmentId == null ? -1 : departmentId.intValue();
+        String roleCode;
+        switch (dId) {
+            case 1:
+                roleCode = ManagerConstant.ROLE_CODE_SALE;
+                break;
+            case 2:
+                roleCode = ManagerConstant.ROLE_CODE_FINANCE;
+                break;
+            case 3:
+                roleCode = ManagerConstant.ROLE_CODE_MARKET;
+                break;
+            case 4:
+                roleCode = ManagerConstant.ROLE_CODE_LEGAL_AFFAIRS;
+                break;
+            case 5:
+                roleCode = ManagerConstant.ROLE_CODE_ADMIN;
+                break;
+            default:
+                roleCode = ManagerConstant.ROLE_CODE_USER;
+                break;
+        }
+        return roleCode;
+    }
+
+}

+ 15 - 0
crm-manager/src/main/java/com/crm/manager/dao/mapper/SysConfigMapper.java

@@ -0,0 +1,15 @@
+package com.crm.manager.dao.mapper;
+
+import com.crm.rely.backend.core.entity.system.config.SysConfigSearchEntity;
+import com.crm.rely.backend.core.pojo.table.SysConfigTable;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface SysConfigMapper {
+
+    Integer countList(SysConfigSearchEntity entity);
+
+    List<SysConfigTable> pageList(SysConfigSearchEntity entity);
+}

+ 15 - 0
crm-manager/src/main/java/com/crm/manager/dao/mapper/SysIpLimitMapper.java

@@ -0,0 +1,15 @@
+package com.crm.manager.dao.mapper;
+
+import com.crm.rely.backend.core.entity.system.ip.SysIpLimitSearchEntity;
+import com.crm.rely.backend.core.pojo.table.SysIpLimitTable;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface SysIpLimitMapper {
+
+    Integer countList(SysIpLimitSearchEntity entity);
+
+    List<SysIpLimitTable> pageList(SysIpLimitSearchEntity entity);
+}

+ 17 - 0
crm-manager/src/main/java/com/crm/manager/dao/mapper/SysNodeMapper.java

@@ -0,0 +1,17 @@
+package com.crm.manager.dao.mapper;
+
+import com.crm.rely.backend.core.pojo.table.SysNodeTable;
+import com.crm.rely.backend.core.pojo.view.SysNodeView;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface SysNodeMapper {
+    List<SysNodeView> getSysNodesByRoleId(@Param("roleId") Long roleId);
+
+    List<SysNodeTable> findAllByRoleId(@Param("roleId") Long roleId);
+
+    void delete(List<SysNodeTable> tables);
+}

+ 18 - 0
crm-manager/src/main/java/com/crm/manager/dao/mapper/SysReasonsRefusalMapper.java

@@ -0,0 +1,18 @@
+package com.crm.manager.dao.mapper;
+
+import com.crm.rely.backend.core.entity.system.reasons.refusal.SysReasonsRefusalSearchEntity;
+import com.crm.rely.backend.core.entity.system.reasons.refusal.SysReasonsRefusalSearchPageEntity;
+import com.crm.rely.backend.core.pojo.table.SysReasonsRefusalTable;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface SysReasonsRefusalMapper {
+
+    Integer countList(SysReasonsRefusalSearchPageEntity entity);
+
+    List<SysReasonsRefusalTable> searchPageList(SysReasonsRefusalSearchPageEntity entity);
+
+    List<SysReasonsRefusalTable> searchList(SysReasonsRefusalSearchEntity entity);
+}

+ 38 - 0
crm-manager/src/main/java/com/crm/manager/dao/mapper/UserInfoDao.java

@@ -0,0 +1,38 @@
+package com.crm.manager.dao.mapper;
+
+import com.crm.rely.backend.model.pojo.table.UserInfoTable;
+import com.crm.rely.backend.model.entity.user.info.UserInfoSearchEntity;
+import com.crm.rely.backend.model.pojo.view.UserInfoView;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * Created by max on 2020/6/17.
+ */
+@Repository
+public interface UserInfoDao {
+
+    String getStampById(Long id);
+
+    List<String> getStampListByIds(List<Long> ids);
+
+    Integer searchByPageCount(UserInfoSearchEntity entity);
+
+    List<UserInfoView> searchByPageList(UserInfoSearchEntity entity);
+
+    UserInfoView getOne(Long id);
+
+    List<UserInfoTable> findAllByRoleCode(String roleCode);
+
+    UserInfoTable getSuperAdminInfo();
+
+    List<UserInfoTable> findAllByStamp(String stamp);
+
+    String getMaxStampByPid(Long pid);
+
+    void updateUserStampByBatch(List<UserInfoTable> tables);
+
+    String findStampById(Long id);
+
+}

+ 11 - 0
crm-manager/src/main/java/com/crm/manager/dao/mapper/UserInfoMapper.java

@@ -0,0 +1,11 @@
+package com.crm.manager.dao.mapper;
+
+
+import com.crm.rely.backend.model.pojo.table.UserInfoTable;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface UserInfoMapper {
+
+    void updateById(UserInfoTable entity);
+}

+ 16 - 0
crm-manager/src/main/java/com/crm/manager/dao/mapper/UserRoleDetailMapper.java

@@ -0,0 +1,16 @@
+package com.crm.manager.dao.mapper;
+
+import com.crm.rely.backend.core.pojo.table.UserRoleDetailTable;
+import com.crm.rely.backend.core.pojo.table.UserRoleNodeTable;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface UserRoleDetailMapper {
+
+    List<UserRoleDetailTable> findAllByRoleId(@Param("roleId") Long roleId);
+
+    void delete(List<UserRoleDetailTable> tables);
+}

+ 17 - 0
crm-manager/src/main/java/com/crm/manager/dao/mapper/UserRoleNodeMapper.java

@@ -0,0 +1,17 @@
+package com.crm.manager.dao.mapper;
+
+import com.crm.rely.backend.core.pojo.table.SysNodeTable;
+import com.crm.rely.backend.core.pojo.table.UserRoleNodeTable;
+import com.crm.rely.backend.core.pojo.view.SysNodeView;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface UserRoleNodeMapper {
+
+    List<UserRoleNodeTable> findAllByRoleId(@Param("roleId") Long roleId);
+
+    void delete(List<UserRoleNodeTable> tables);
+}

+ 27 - 0
crm-manager/src/main/java/com/crm/manager/dao/repository/SysActionRepository.java

@@ -0,0 +1,27 @@
+package com.crm.manager.dao.repository;
+
+import com.crm.rely.backend.core.pojo.table.SysActionTable;
+import com.crm.rely.backend.dao.repository.BaseRepository;
+import jakarta.persistence.LockModeType;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * @author houn
+ */
+@Repository
+public interface SysActionRepository extends BaseRepository<SysActionTable> {
+    @Lock(LockModeType.PESSIMISTIC_WRITE)
+    SysActionTable findFirstById(Long id);
+
+    @Lock(LockModeType.PESSIMISTIC_WRITE)
+    List<SysActionTable> findAllByIdIn(List<Long> ids);
+
+    @Lock(LockModeType.PESSIMISTIC_WRITE)
+    List<SysActionTable> findAllByNodeIdIn(List<Long> nodeIds);
+
+    List<SysActionTable> getAllByOrderByCode();
+
+}

+ 48 - 0
crm-manager/src/main/java/com/crm/manager/dao/repository/SysConfigRepository.java

@@ -0,0 +1,48 @@
+package com.crm.manager.dao.repository;
+
+import com.crm.rely.backend.core.pojo.table.SysConfigTable;
+import com.crm.rely.backend.dao.repository.BaseRepository;
+import jakarta.persistence.LockModeType;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * @author: houn
+ */
+@Repository
+public interface SysConfigRepository extends BaseRepository<SysConfigTable> {
+
+    /**
+     * 根据codes 获取系统配置信息
+     *
+     * @param codes code的列表
+     * @return
+     */
+    List<SysConfigTable> getByCodeIn(List<String> codes);
+
+    /**
+     * 根据code 获取系统配置信息
+     *
+     * @param code code
+     * @return
+     */
+    SysConfigTable getByCode(String code);
+
+
+    List<SysConfigTable> getAllByIdIsNotNull();
+
+    SysConfigTable getByIdAndCode(Long id,String code);
+
+    @Lock(LockModeType.PESSIMISTIC_WRITE)
+    SysConfigTable findFirstByCode(String code);
+
+    @Lock(LockModeType.PESSIMISTIC_WRITE)
+    List<SysConfigTable> findAllByCodeIn(List<String> codes);
+
+    @Lock(LockModeType.PESSIMISTIC_WRITE)
+    SysConfigTable findFirstByIdAndCode(Long id, String code);
+
+    boolean existsByCode(String code);
+}

+ 26 - 0
crm-manager/src/main/java/com/crm/manager/dao/repository/SysIpLimitRepository.java

@@ -0,0 +1,26 @@
+package com.crm.manager.dao.repository;
+
+import com.crm.rely.backend.core.pojo.table.SysIpLimitTable;
+import com.crm.rely.backend.dao.repository.BaseRepository;
+import jakarta.persistence.LockModeType;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+
+@Repository
+public interface SysIpLimitRepository extends BaseRepository<SysIpLimitTable> {
+
+    @Lock(LockModeType.PESSIMISTIC_WRITE)
+    SysIpLimitTable findFirstById(Long id);
+
+    SysIpLimitTable getFirstById(Long id);
+
+    @Lock(LockModeType.PESSIMISTIC_WRITE)
+    List<SysIpLimitTable> findAllByIdIn(List<Long> ids);
+
+    List<SysIpLimitTable> getAllByIdIsNotNull();
+
+    boolean existsByIp(String ip);
+}

+ 22 - 0
crm-manager/src/main/java/com/crm/manager/dao/repository/SysNodeRepository.java

@@ -0,0 +1,22 @@
+package com.crm.manager.dao.repository;
+
+import com.crm.rely.backend.core.pojo.table.SysNodeTable;
+import com.crm.rely.backend.dao.repository.BaseRepository;
+import jakarta.persistence.LockModeType;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface SysNodeRepository extends BaseRepository<SysNodeTable> {
+
+    @Lock(LockModeType.PESSIMISTIC_WRITE)
+    SysNodeTable findFirstById(Long id);
+
+    @Lock(LockModeType.PESSIMISTIC_WRITE)
+    List<SysNodeTable> findAllByIdIn(List<Long> ids);
+
+    @Lock(LockModeType.PESSIMISTIC_WRITE)
+    List<SysNodeTable> findAllByPidIn(List<Long> ids);
+}

+ 22 - 0
crm-manager/src/main/java/com/crm/manager/dao/repository/SysReasonsRefusalRepository.java

@@ -0,0 +1,22 @@
+package com.crm.manager.dao.repository;
+
+import com.crm.rely.backend.core.pojo.table.SysReasonsRefusalTable;
+import com.crm.rely.backend.dao.repository.BaseRepository;
+import jakarta.persistence.LockModeType;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+
+@Repository
+public interface SysReasonsRefusalRepository extends BaseRepository<SysReasonsRefusalTable> {
+
+    @Lock(LockModeType.PESSIMISTIC_WRITE)
+    SysReasonsRefusalTable findFirstById(Long id);
+
+    SysReasonsRefusalTable getFirstById(Long id);
+
+    @Lock(LockModeType.PESSIMISTIC_WRITE)
+    List<SysReasonsRefusalTable> findAllByIdIn(List<Long> ids);
+}

+ 18 - 0
crm-manager/src/main/java/com/crm/manager/dao/repository/SysUserLoginHistoryRepository.java

@@ -0,0 +1,18 @@
+package com.crm.manager.dao.repository;
+
+import com.crm.rely.backend.core.pojo.table.SysUserLoginHistoryTable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @program: crm-backend
+ * @description:
+ * @author: houn
+ * @create: 2021-07-21 16:25
+ */
+@Repository
+public interface SysUserLoginHistoryRepository extends JpaRepository<SysUserLoginHistoryTable, Long>, JpaSpecificationExecutor<SysUserLoginHistoryTable> {
+
+
+}

+ 44 - 0
crm-manager/src/main/java/com/crm/manager/dao/repository/UserDepartmentRepository.java

@@ -0,0 +1,44 @@
+package com.crm.manager.dao.repository;
+
+import com.crm.rely.backend.core.pojo.table.UserDepartmentTable;
+import com.crm.rely.backend.dao.repository.BaseRepository;
+import jakarta.persistence.LockModeType;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * @author houn
+ */
+@Repository
+public interface UserDepartmentRepository extends BaseRepository<UserDepartmentTable> {
+
+    /**
+     * 根据名称判断部门是否存在
+     *
+     * @param name
+     * @return
+     */
+    boolean existsByName(String name);
+
+    /**
+     * 根据id查询部门 加行锁
+     *
+     * @param id 主键id
+     * @return
+     */
+    @Lock(LockModeType.PESSIMISTIC_WRITE)
+    UserDepartmentTable findFirstById(Long id);
+
+    /**
+     * 根据id查询部门列表 加行锁
+     *
+     * @param ids
+     * @return
+     */
+    @Lock(LockModeType.PESSIMISTIC_WRITE)
+    List<UserDepartmentTable> findByIdIn(Iterable<Long> ids);
+
+    List<UserDepartmentTable> getAllByOrderBySubIndex();
+}

+ 16 - 0
crm-manager/src/main/java/com/crm/manager/dao/repository/UserGroupRepository.java

@@ -0,0 +1,16 @@
+package com.crm.manager.dao.repository;
+
+import com.crm.rely.backend.core.pojo.table.UserGroupTable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+
+@Repository
+public interface UserGroupRepository extends JpaRepository<UserGroupTable, Long> {
+
+    UserGroupTable getFirstById(Long id);
+
+    List<UserGroupTable> getAllByIdNotNull();
+}

+ 62 - 0
crm-manager/src/main/java/com/crm/manager/dao/repository/UserInfoRepository.java

@@ -0,0 +1,62 @@
+package com.crm.manager.dao.repository;
+
+import com.crm.rely.backend.model.pojo.table.UserInfoTable;
+import com.crm.rely.backend.dao.repository.BaseRepository;
+import jakarta.persistence.LockModeType;
+import jakarta.validation.constraints.NotNull;
+import org.hibernate.validator.constraints.NotBlank;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.stereotype.Repository;
+
+
+/**
+ * @program: crm-backend
+ * @description:
+ * @author: houn
+ * @create: 2019-07-25 16:25
+ */
+@Repository
+public interface UserInfoRepository extends BaseRepository<UserInfoTable> {
+
+    /**
+     * 用户名密码查询用户
+     *
+     * @param username
+     * @param password
+     * @return
+     */
+    UserInfoTable findFirstByUsernameAndPassword(String username, String password);
+
+    UserInfoTable getFirstByEmailNotNullAndEmail(String email);
+
+    /**
+     * 根据id查询用户信息
+     *
+     * @param id
+     * @return
+     */
+    @Lock(LockModeType.PESSIMISTIC_WRITE)
+    UserInfoTable findFirstById(Long id);
+
+    /**
+     * 查询用户名是否已存在
+     *
+     * @param username
+     * @return
+     */
+    boolean existsByUsername(String username);
+
+    /**
+     * 查询邮箱是否已存在
+     *
+     * @param email
+     * @return
+     */
+    boolean existsByEmail(String email);
+
+
+    UserInfoTable getFirstById(Long id);
+
+
+    UserInfoTable getFirstByUsername(String username);;
+}

+ 16 - 0
crm-manager/src/main/java/com/crm/manager/dao/repository/UserRoleDetailRepository.java

@@ -0,0 +1,16 @@
+package com.crm.manager.dao.repository;
+
+import com.crm.rely.backend.core.pojo.table.UserRoleDetailTable;
+import com.crm.rely.backend.dao.repository.BaseRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface UserRoleDetailRepository extends BaseRepository<UserRoleDetailTable> {
+    List<UserRoleDetailTable> findAllByIdNotInAndRoleId(List<Long> ids, Long roleId);
+
+    List<UserRoleDetailTable> findAllByIdInAndRoleId(List<Long> ids, Long roleId);
+
+    List<UserRoleDetailTable> findAllByRoleId(Long roleId);
+}

+ 16 - 0
crm-manager/src/main/java/com/crm/manager/dao/repository/UserRoleNodeRepository.java

@@ -0,0 +1,16 @@
+package com.crm.manager.dao.repository;
+
+import com.crm.rely.backend.core.pojo.table.UserRoleNodeTable;
+import com.crm.rely.backend.dao.repository.BaseRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface UserRoleNodeRepository extends BaseRepository<UserRoleNodeTable> {
+    List<UserRoleNodeTable> findAllByIdNotInAndRoleId(List<Long> ids, Long roleId);
+
+    List<UserRoleNodeTable> findAllByIdInAndRoleId(List<Long> ids, Long roleId);
+
+    List<UserRoleNodeTable> findAllByRoleId(Long roleId);
+}

+ 46 - 0
crm-manager/src/main/java/com/crm/manager/dao/repository/UserRoleRepository.java

@@ -0,0 +1,46 @@
+package com.crm.manager.dao.repository;
+
+import com.crm.rely.backend.core.pojo.table.UserRoleTable;
+import com.crm.rely.backend.dao.repository.BaseRepository;
+import jakarta.persistence.LockModeType;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface UserRoleRepository extends BaseRepository<UserRoleTable> {
+
+
+    boolean existsByName(String name);
+
+    boolean existsById(Long id);
+
+    /**
+     * 根据部门id 查询是否存在改部门下的角色
+     *
+     * @param departmentIds
+     * @return
+     */
+    boolean existsByDepartmentIdIn(Iterable<Long> departmentIds);
+
+    /**
+     * 根据ids获取数据
+     *
+     * @param ids
+     * @return
+     */
+    @Lock(LockModeType.PESSIMISTIC_WRITE)
+    List<UserRoleTable> findAllByIdIn(List<Long> ids);
+
+    /**
+     * 根据id获取数据
+     *
+     * @param id
+     * @return
+     */
+    @Lock(LockModeType.PESSIMISTIC_WRITE)
+    UserRoleTable findFirstById(Long id);
+
+    UserRoleTable getFirstById(Long id);
+}

+ 124 - 0
crm-manager/src/main/java/com/crm/manager/interceptor/RoleInterceptor.java

@@ -0,0 +1,124 @@
+package com.crm.manager.interceptor;
+
+import com.crm.manager.service.UserRoleService;
+import com.crm.rely.backend.aspect.ControllerAop;
+import com.crm.rely.backend.core.constant.Constants;
+import com.crm.rely.backend.core.constant.PrefixEnum;
+import com.crm.rely.backend.core.constant.RoleConstants;
+import com.crm.rely.backend.core.exception.LoginException;
+import com.crm.rely.backend.core.exception.ServiceException;
+import com.crm.rely.backend.model.constant.ManagerConstants;
+import com.crm.rely.backend.model.entity.user.info.UserInfoEntity;
+import com.crm.rely.backend.service.RedisService;
+import com.crm.rely.backend.util.HttpServletRequestUtil;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.ModelAndView;
+
+import java.util.List;
+
+
+public class RoleInterceptor implements HandlerInterceptor {
+
+    @Autowired
+    private RedisService redisService;
+    @Autowired
+    private UserRoleService roleInfoService;
+
+    @Autowired
+    private ControllerAop controllerAop;
+
+    public RoleInterceptor() {
+
+    }
+
+    public RoleInterceptor(RedisService redisService, UserRoleService roleInfoService, ControllerAop controllerAop) {
+        this.redisService = redisService;
+
+        this.roleInfoService = roleInfoService;
+
+        this.controllerAop = controllerAop;
+    }
+
+    @Override
+    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
+        //如果为OPTIONS直接返回成功
+        if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) {
+            return true;
+        }
+        // 放行根路径和静态资源
+        String requestURI = httpServletRequest.getRequestURI();
+        if ("/".equals(requestURI)
+                || "/index.html".equals(requestURI)
+                || requestURI.startsWith("/front/")
+                || requestURI.startsWith("/js/")
+                || requestURI.startsWith("/css/")
+                || requestURI.startsWith("/images/")
+                || requestURI.startsWith("/img/")
+                || requestURI.startsWith("/fonts/")
+                || requestURI.startsWith("/favicon.ico")
+                || isStaticResource(requestURI)) {
+            return true;
+        }
+
+        UserInfoEntity infoEntity = HttpServletRequestUtil.getLoginInfo(UserInfoEntity.class,httpServletRequest,
+                redisService, true);
+
+        if (infoEntity == null) {
+            throw new LoginException(Constants.INVALID);
+        }
+        if (PrefixEnum.PREFIX_SYSTEM.equals(infoEntity.getPrefix())) {
+            return true;
+        }
+
+        String key = null;
+        if (infoEntity.getRoleId() == null || infoEntity.getRoleId() == 0) {
+            key = RoleConstants.ROLE_USER_ACTION + ManagerConstants.ROLE_USER_PREFIX+ RoleConstants.ROLE_ADMIN;
+        } else {
+            key = RoleConstants.ROLE_USER_ACTION +ManagerConstants.ROLE_USER_PREFIX+ infoEntity.getRoleId().toString();
+        }
+        String requestPath = httpServletRequest.getRequestURI();
+        /*
+         * 验证权限
+         */
+        if (!redisService.hasKey(key)) {
+            roleInfoService.getUserNodeDisplay(infoEntity.getRoleId());
+        }
+        List<String> actionList = redisService.getObject(key);
+        if (actionList == null || actionList.size() == 0) {
+            throw new ServiceException(Constants.NOT_PERMIT);
+        }
+        for (String action : actionList) {
+            if (requestPath.startsWith(action)) {
+                return true;
+            }
+        }
+        throw new ServiceException(Constants.NOT_PERMIT);
+    }
+
+    @Override
+    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
+
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
+
+    }
+
+    private boolean isStaticResource(String requestURI) {
+        // 常见的静态资源扩展名
+        String[] staticExtensions = {".js", ".css", ".png", ".jpg", ".jpeg", ".gif", ".ico", ".svg", ".woff", ".woff2", ".ttf", ".eot"};
+
+        for (String extension : staticExtensions) {
+            if (requestURI.endsWith(extension)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+}

+ 18 - 0
crm-manager/src/main/java/com/crm/manager/property/RoleConfigureProperty.java

@@ -0,0 +1,18 @@
+package com.crm.manager.property;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author houn
+ */
+@Data
+@Component
+public class RoleConfigureProperty {
+
+    @Value("${role.excludePathPatterns:/**}")
+    private String[] excludePathPatterns;
+
+}

+ 25 - 0
crm-manager/src/main/java/com/crm/manager/property/WebStaticsProperty.java

@@ -0,0 +1,25 @@
+package com.crm.manager.property;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "web")
+public class WebStaticsProperty {
+
+    private String frontPath;
+
+    private String uploadFile;
+
+    private String[] webUploadVideo;
+
+    private String[] webUploadImage;
+
+    private long webImageMax;
+
+    private long webVideoMax;
+
+    private Long maxSize;
+}

+ 25 - 0
crm-manager/src/main/java/com/crm/manager/service/AuthorityService.java

@@ -0,0 +1,25 @@
+package com.crm.manager.service;
+
+import com.crm.rely.backend.core.entity.system.action.SysActionAddEntity;
+import com.crm.rely.backend.core.entity.system.action.SysActionDeleteEntity;
+import com.crm.rely.backend.core.entity.system.action.SysActionUpdateEntity;
+import com.crm.rely.backend.core.entity.system.node.SysNodeAddEntity;
+import com.crm.rely.backend.core.entity.system.node.SysNodeDeleteEntity;
+import com.crm.rely.backend.core.entity.system.node.SysNodeUpdateEntity;
+import com.crm.rely.backend.core.exception.ServiceException;
+
+public interface AuthorityService {
+    void add(SysActionAddEntity entity) throws ServiceException;
+
+    void delete(SysActionDeleteEntity entity) throws ServiceException;
+
+    void update(SysActionUpdateEntity entity) throws ServiceException;
+
+    void add(SysNodeAddEntity entity) throws ServiceException;
+
+    void delete(SysNodeDeleteEntity entity) throws ServiceException;
+
+    void update(SysNodeUpdateEntity entity) throws ServiceException;
+
+    String updateRedisAuthorityIdentification() throws ServiceException;
+}

+ 15 - 0
crm-manager/src/main/java/com/crm/manager/service/CommonService.java

@@ -0,0 +1,15 @@
+package com.crm.manager.service;
+
+import com.crm.rely.backend.core.exception.ServiceException;
+import org.springframework.web.multipart.MultipartFile;
+
+public interface CommonService {
+
+    void validated(MultipartFile file) throws ServiceException;
+
+    String uploadFile(String middlePath, MultipartFile file) throws Exception;
+
+    String uploadFile(MultipartFile file) throws Exception;
+
+    void validatedVideo(MultipartFile file) throws ServiceException;
+}

+ 77 - 0
crm-manager/src/main/java/com/crm/manager/service/SysConfigService.java

@@ -0,0 +1,77 @@
+package com.crm.manager.service;
+
+import com.crm.rely.backend.core.dto.base.ResultWithPagerDto;
+import com.crm.rely.backend.core.dto.system.config.SysConfigSearchDto;
+import com.crm.rely.backend.core.entity.system.config.*;
+import com.crm.rely.backend.core.pojo.table.SysConfigTable;
+import com.crm.rely.backend.core.exception.ServiceException;
+
+import java.util.List;
+
+public interface SysConfigService {
+
+    /**
+     * 添加配置
+     *
+     * @param entity
+     * @throws ServiceException
+     */
+    void add(SysConfigAddEntity entity) throws ServiceException;
+
+    /**
+     * 修改配置
+     *
+     * @param entity
+     * @throws ServiceException
+     */
+    void update(SysConfigUpdateEntity entity) throws ServiceException;
+
+    void updates(SysConfigUpdateEntitys entitys) throws ServiceException;
+
+    /**
+     * 删除配置
+     *
+     * @param entity
+     * @throws ServiceException
+     */
+    void delete(SysConfigDeleteEntity entity) throws ServiceException;
+
+    /**
+     * 根据条件查询配置
+     *
+     * @param entity
+     * @return
+     * @throws ServiceException
+     */
+    ResultWithPagerDto<SysConfigSearchDto> searchPageList(SysConfigSearchEntity entity) throws ServiceException;
+
+    /**
+     * 根据条件 单个获取配置信息
+     *
+     * @param entity
+     * @return
+     * @throws ServiceException
+     */
+    SysConfigSearchDto searchSingle(SysConfigSingleEntity entity) throws ServiceException;
+
+    /**
+     * 根据条件 单个获取配置信息
+     *
+     * @param code
+     * @return
+     * @throws ServiceException
+     */
+    SysConfigSearchDto searchSingleByCode(String code) throws ServiceException;
+
+    List<SysConfigSearchDto> searchSingleByCodes(List<String> codes) throws ServiceException;
+
+    List<SysConfigTable> getByCodes(List<String> codes) throws ServiceException;
+
+    void sendUpdateEmailCode(SendUpdateEmailCodeEntity entity) throws ServiceException;
+
+    void refresh() throws ServiceException;
+
+    void cancel() throws ServiceException;
+
+    SysConfigTable getByCode(String customVerifyKycProperty);
+}

+ 29 - 0
crm-manager/src/main/java/com/crm/manager/service/SysIpLimitService.java

@@ -0,0 +1,29 @@
+package com.crm.manager.service;
+
+import com.crm.rely.backend.core.dto.base.ResultWithPagerDto;
+import com.crm.rely.backend.core.dto.system.ip.SysIpLimitDto;
+import com.crm.rely.backend.core.entity.base.SingleLongEntity;
+import com.crm.rely.backend.core.entity.system.ip.SysIpLimitAddEntity;
+import com.crm.rely.backend.core.entity.system.ip.SysIpLimitDeleteEntity;
+import com.crm.rely.backend.core.entity.system.ip.SysIpLimitSearchEntity;
+import com.crm.rely.backend.core.entity.system.ip.SysIpLimitUpdateEntity;
+import com.crm.rely.backend.core.exception.ServiceException;
+
+import java.util.List;
+
+public interface SysIpLimitService {
+
+    void add(SysIpLimitAddEntity entity) throws ServiceException;
+
+    void update(SysIpLimitUpdateEntity entity) throws ServiceException;
+
+    void delete(SysIpLimitDeleteEntity entity) throws ServiceException;
+
+    ResultWithPagerDto<SysIpLimitDto> searchPageList(SysIpLimitSearchEntity entity) throws ServiceException;
+
+    SysIpLimitDto searchSingle(SingleLongEntity entity) throws ServiceException;
+
+    List<SysIpLimitDto> getList() throws ServiceException;
+
+    boolean validatedIpExist(String ip) throws ServiceException;
+}

+ 25 - 0
crm-manager/src/main/java/com/crm/manager/service/SysReasonsRefusalService.java

@@ -0,0 +1,25 @@
+package com.crm.manager.service;
+
+import com.crm.rely.backend.core.dto.base.BaseResultDto;
+import com.crm.rely.backend.core.dto.base.ResultWithPagerDto;
+import com.crm.rely.backend.core.dto.system.reasons.refusal.SysReasonsRefusalSearchDto;
+import com.crm.rely.backend.core.entity.base.SingleLongEntity;
+import com.crm.rely.backend.core.entity.system.reasons.refusal.*;
+import com.crm.rely.backend.core.exception.ServiceException;
+
+import java.util.Map;
+
+public interface SysReasonsRefusalService {
+
+    void add(SysReasonsRefusalAddEntity entity) throws ServiceException;
+
+    void delete(SysReasonsRefusalDeleteEntity entity) throws ServiceException;
+
+    void update(SysReasonsRefusalUpdateEntity entity) throws ServiceException;
+
+    ResultWithPagerDto<SysReasonsRefusalSearchDto> searchPageList(SysReasonsRefusalSearchPageEntity entity) throws ServiceException;
+
+    SysReasonsRefusalSearchDto searchSingle(SingleLongEntity entity) throws ServiceException;
+
+    BaseResultDto<Map<String, SysReasonsRefusalSearchDto>> searchList(SysReasonsRefusalSearchEntity entity) throws ServiceException;
+}

+ 64 - 0
crm-manager/src/main/java/com/crm/manager/service/UserDepartmentService.java

@@ -0,0 +1,64 @@
+package com.crm.manager.service;
+
+import com.crm.rely.backend.core.dto.base.BaseResultDto;
+import com.crm.rely.backend.core.exception.ServiceException;
+import com.crm.rely.backend.core.dto.base.BaseResultWithPagerDto;
+import com.crm.rely.backend.core.dto.user.department.UserDepartmentSearchDto;
+import com.crm.rely.backend.model.entity.user.department.UserDepartmentAddEntity;
+import com.crm.rely.backend.model.entity.user.department.UserDepartmentDeleteEntity;
+import com.crm.rely.backend.model.entity.user.department.UserDepartmentSearchEntity;
+import com.crm.rely.backend.model.entity.user.department.UserDepartmentUpdateEntity;
+
+/**
+ * @program: crm-backend
+ * @description:
+ * @author: houn
+ * @create: 2019-07-25 13:56
+ */
+public interface UserDepartmentService {
+
+    /**
+     * 添加部门
+     *
+     * @param entity
+     * @throws ServiceException
+     */
+    void add(UserDepartmentAddEntity entity) throws ServiceException;
+
+    /**
+     * 更新部门信息
+     *
+     * @param entity
+     * @throws ServiceException
+     */
+    void update(UserDepartmentUpdateEntity entity) throws ServiceException;
+
+    /**
+     * 删除部门(批量)
+     *
+     * @param entity
+     * @throws ServiceException
+     */
+    void delete(UserDepartmentDeleteEntity entity) throws ServiceException;
+
+    /**
+     * 根据条件搜索列表
+     *
+     * @param entity
+     * @return
+     * @throws ServiceException
+     */
+    BaseResultWithPagerDto searchPage(UserDepartmentSearchEntity entity) throws ServiceException;
+
+    BaseResultDto searchList() throws ServiceException;
+
+    /**
+     * 根据id查询
+     *
+     * @param id
+     * @return
+     * @throws ServiceException
+     */
+    UserDepartmentSearchDto searchSingle(Long id) throws ServiceException;
+
+}

+ 12 - 0
crm-manager/src/main/java/com/crm/manager/service/UserGroupService.java

@@ -0,0 +1,12 @@
+package com.crm.manager.service;
+
+import com.crm.rely.backend.core.dto.base.BaseResultDto;
+import com.crm.rely.backend.core.dto.user.group.UserGroupDto;
+
+import java.util.List;
+
+public interface UserGroupService {
+
+    BaseResultDto<List<UserGroupDto>> getAllGroup();
+
+}

+ 80 - 0
crm-manager/src/main/java/com/crm/manager/service/UserInfoService.java

@@ -0,0 +1,80 @@
+package com.crm.manager.service;
+
+import com.crm.rely.backend.core.constant.PrefixEnum;
+import com.crm.rely.backend.core.dto.base.BaseResultWithPagerDto;
+import com.crm.rely.backend.core.exception.ServiceException;
+import com.crm.rely.backend.model.dto.user.info.UserInfoSearchDto;
+import com.crm.rely.backend.model.entity.user.info.*;
+import com.crm.rely.backend.model.pojo.table.UserInfoTable;
+
+/**
+ * @program: crm-backend
+ * @description:
+ * @author: houn
+ * @create: 2019-07-25 16:12
+ */
+public interface UserInfoService {
+
+    /**
+     * 用户登录
+     *
+     * @param entity
+     * @return
+     * @throws ServiceException
+     */
+    UserInfoEntity login(UserLoginEntity entity) throws ServiceException;
+
+    /**
+     * 添加用户信息
+     *
+     * @param entity
+     * @throws ServiceException
+     */
+    void add(UserInfoAddEntity entity) throws ServiceException, InterruptedException;
+
+    /**
+     * 删除用户
+     *
+     * @param entity
+     * @throws ServiceException
+     */
+    void delete(UserInfoDeleteEntity entity) throws ServiceException;
+
+    /**
+     * 修改用户信息
+     *
+     * @param entity
+     * @throws ServiceException
+     */
+    UserInfoTable update(UserInfoUpdateEntity entity) throws ServiceException;
+
+    /**
+     * 根据条件搜索列表
+     *
+     * @param entity
+     * @return
+     * @throws ServiceException
+     */
+    BaseResultWithPagerDto searchPage(UserInfoSearchEntity entity) throws ServiceException;
+
+    /**
+     * 根据id查询
+     *
+     * @param id
+     * @return
+     * @throws ServiceException
+     */
+    UserInfoSearchDto searchSingle(Long id) throws ServiceException;
+
+    void updateLang(UserInfoUpdateLangEntity entity) throws ServiceException;
+
+    void updatePasswordSendEmail(UserUpdatePasswordSendEmailEntity entity) throws ServiceException;
+
+    void updatePassword(UserUpdateEmailPasswordEntity entity) throws ServiceException;
+
+    void updatePassword(UserUpdateLoginPasswordEntity entity) throws ServiceException;
+
+
+    PrefixEnum getPrefixEnum(Long roleId) throws ServiceException;
+
+}

+ 15 - 0
crm-manager/src/main/java/com/crm/manager/service/UserRoleDetailService.java

@@ -0,0 +1,15 @@
+package com.crm.manager.service;
+
+import com.crm.rely.backend.core.pojo.table.UserRoleDetailTable;
+import com.crm.rely.backend.core.exception.ServiceException;
+
+import java.util.List;
+
+public interface UserRoleDetailService {
+
+    void update(List<UserRoleDetailTable> sellerRoleDetailTables, Long roleId) throws ServiceException;
+
+    List<UserRoleDetailTable> getUserRoleDetailsByRoleId(Long roleId) throws ServiceException;
+
+    void deleteRoleDetailByRoleId(Long roleId) throws ServiceException;
+}

+ 17 - 0
crm-manager/src/main/java/com/crm/manager/service/UserRoleNodeService.java

@@ -0,0 +1,17 @@
+package com.crm.manager.service;
+
+
+import com.crm.rely.backend.core.pojo.table.UserRoleNodeTable;
+import com.crm.rely.backend.core.pojo.view.SysNodeView;
+import com.crm.rely.backend.core.exception.ServiceException;
+
+import java.util.List;
+
+public interface UserRoleNodeService {
+
+    void update(List<UserRoleNodeTable> sellerRoleNodeTables, Long roleId) throws ServiceException;
+
+    List<SysNodeView> getSysNodesByRoleId(Long roleId) throws ServiceException;
+
+    void deleteRoleNodeByRoleId(Long roleId) throws ServiceException;
+}

+ 111 - 0
crm-manager/src/main/java/com/crm/manager/service/UserRoleService.java

@@ -0,0 +1,111 @@
+package com.crm.manager.service;
+
+import com.crm.rely.backend.core.exception.ServiceException;
+import com.crm.rely.backend.core.dto.base.ResultWithPagerDto;
+import com.crm.rely.backend.core.dto.user.role.UserNodeDisplayDto;
+import com.crm.rely.backend.core.dto.user.role.UserAllRoleDto;
+import com.crm.rely.backend.core.dto.user.role.UserRoleDto;
+import com.crm.rely.backend.model.entity.user.role.*;
+
+import java.util.List;
+
+/**
+ * 角色功能
+ */
+public interface UserRoleService {
+
+    /**
+     * 获取权限
+     *
+     * @param roleId
+     * @return
+     * @throws ServiceException
+     */
+    List<UserNodeDisplayDto> getUserNodeDisplay(Long roleId) throws ServiceException;
+
+    /**
+     * 判断角色是否存在
+     *
+     * @param roleId
+     * @throws ServiceException
+     */
+    void existRole(Long roleId) throws ServiceException;
+
+    /**
+     * 添加角色信息
+     *
+     * @param sellerRoleAddEntity
+     * @throws ServiceException
+     */
+    void addRoleInfo(UserRoleAddEntity sellerRoleAddEntity) throws ServiceException;
+
+    /**
+     * 修改角色信息(基础信息)
+     *
+     * @param sellerRoleUpdateEntity
+     * @throws ServiceException
+     */
+    void updateRoleInfo(UserRoleUpdateEntity sellerRoleUpdateEntity) throws ServiceException;
+
+    /**
+     * 修改角色信息(权限)
+     *
+     * @param sellerRoleOperateListEntity
+     * @throws ServiceException
+     */
+    void updateRoleInfo(UserRoleOperateListEntity sellerRoleOperateListEntity) throws ServiceException;
+
+    /**
+     * 删除角色信息
+     *
+     * @param roleId
+     * @throws ServiceException
+     */
+    void deleteRoleInfo(Long roleId) throws ServiceException;
+
+    /**
+     * 单个获取角色信息
+     *
+     * @param roleId
+     * @return
+     * @throws ServiceException
+     */
+    UserRoleDto getRoleInfo(Long roleId) throws ServiceException;
+
+    /**
+     * 获取角色列表(分页)
+     *
+     * @param sellerRoleSearchEntity
+     * @return
+     * @throws ServiceException
+     */
+    ResultWithPagerDto<UserRoleDto> getListInfo(UserRoleSearchEntity sellerRoleSearchEntity) throws ServiceException;
+
+    /**
+     * 拉取所有角色(下拉使用)
+     *
+     * @return
+     * @throws ServiceException
+     */
+    List<UserAllRoleDto> getListInfo() throws ServiceException;
+
+    /**
+     * 更新挂靠用户的数量
+     *
+     * @param entitys
+     * @throws ServiceException
+     */
+    void updateNumber(List<UserRoleUpdateNumberEntity> entitys) throws ServiceException;
+
+    /**
+     * 更新挂靠用户的数量
+     *
+     * @param entity
+     * @throws ServiceException
+     */
+    void updateNumber(UserRoleUpdateNumberEntity entity) throws ServiceException;
+
+    String getRoleCodeById(Long id) throws ServiceException;
+
+
+}

+ 151 - 0
crm-manager/src/main/java/com/crm/manager/service/impl/AuthorityServiceImpl.java

@@ -0,0 +1,151 @@
+package com.crm.manager.service.impl;
+
+import com.crm.manager.dao.repository.SysActionRepository;
+import com.crm.manager.dao.repository.SysNodeRepository;
+import com.crm.manager.service.AuthorityService;
+import com.crm.rely.backend.core.constant.Constants;
+import com.crm.rely.backend.core.entity.system.action.SysActionAddEntity;
+import com.crm.rely.backend.core.entity.system.action.SysActionDeleteEntity;
+import com.crm.rely.backend.core.entity.system.action.SysActionUpdateEntity;
+import com.crm.rely.backend.core.entity.system.node.SysNodeAddEntity;
+import com.crm.rely.backend.core.entity.system.node.SysNodeDeleteEntity;
+import com.crm.rely.backend.core.entity.system.node.SysNodeUpdateEntity;
+import com.crm.rely.backend.core.pojo.table.SysActionTable;
+import com.crm.rely.backend.core.pojo.table.SysNodeTable;
+import com.crm.rely.backend.core.exception.ServiceException;
+import com.crm.rely.backend.service.RedisService;
+import com.crm.rely.backend.util.UUIDUtil;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class AuthorityServiceImpl implements AuthorityService {
+
+    @Autowired
+    private SysActionRepository sysActionRepository;
+
+    @Autowired
+    private SysNodeRepository sysNodeRepository;
+
+    @Autowired
+    private RedisService redisService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void add(SysActionAddEntity entity) throws ServiceException {
+
+        SysActionTable sysActionTable = new SysActionTable();
+        BeanUtils.copyProperties(entity, sysActionTable);
+        sysActionRepository.save(sysActionTable);
+        updateRedisAuthorityIdentification();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void delete(SysActionDeleteEntity entity) throws ServiceException {
+        List<SysActionTable> sysActionTables = sysActionRepository.findAllByIdIn(entity.getIds());
+
+        if (sysActionTables == null || sysActionTables.size() <= 0) {
+            throw ServiceException.exception(Constants.INFO_NOT_FOUND);
+        }
+        sysActionRepository.deleteAll(sysActionTables);
+        updateRedisAuthorityIdentification();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void update(SysActionUpdateEntity entity) throws ServiceException {
+        SysActionTable sysActionTable = sysActionRepository.findFirstById(entity.getId());
+        if (sysActionTable == null) {
+            throw ServiceException.exception(Constants.INFO_NOT_FOUND);
+        }
+        BeanUtils.copyProperties(entity, sysActionTable);
+        sysActionRepository.save(sysActionTable);
+        updateRedisAuthorityIdentification();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void add(SysNodeAddEntity entity) throws ServiceException {
+        SysNodeTable sysNodeTable = new SysNodeTable();
+        BeanUtils.copyProperties(entity, sysNodeTable);
+        sysNodeRepository.save(sysNodeTable);
+        updateRedisAuthorityIdentification();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void delete(SysNodeDeleteEntity entity) throws ServiceException {
+        List<SysNodeTable> sysNodeTables = sysNodeRepository.findAllByIdIn(entity.getIds());
+        //递归出当前节点及下列节点
+        sysNodeTables = getSysNodeTables(sysNodeTables);
+
+        //判断节点及下列节点是否存在
+        if (sysNodeTables != null && sysNodeTables.size() > 0) {
+            List<Long> nodeIds = new ArrayList<>(sysNodeTables.size());
+            for (SysNodeTable sysNodeTable :
+                    sysNodeTables) {
+                nodeIds.add(sysNodeTable.getId());
+            }
+            //查询节点下挂载的按钮
+            List<SysActionTable> sysActionTables = sysActionRepository.findAllByNodeIdIn(nodeIds);
+            if (sysActionTables != null || sysActionTables.size() >= 0) {
+
+                //按钮如果存在 则一起删除
+                sysActionRepository.deleteAll(sysActionTables);
+            }
+            sysNodeRepository.deleteAll(sysNodeTables);
+            updateRedisAuthorityIdentification();
+            return;
+        }
+        //如果选择的节点都不存在 则返回错误 通知到前端
+        throw ServiceException.exception(Constants.INFO_NOT_FOUND);
+    }
+
+    private List<SysNodeTable> getSysNodeTables(List<SysNodeTable> sysNodeTables) {
+
+        if (sysNodeTables == null || sysNodeTables.size() <= 0) {
+            return null;
+        }
+        List<Long> ids = new ArrayList<>(sysNodeTables.size());
+        for (SysNodeTable sysNodeTable :
+                sysNodeTables) {
+            ids.add(sysNodeTable.getId());
+        }
+        List<SysNodeTable> pidIn = sysNodeRepository.findAllByPidIn(ids);
+        List<SysNodeTable> result = getSysNodeTables(pidIn);
+        if (result != null) {
+            sysNodeTables.addAll(result);
+        }
+        return sysNodeTables;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void update(SysNodeUpdateEntity entity) throws ServiceException {
+        SysNodeTable sysNodeTable = sysNodeRepository.findFirstById(entity.getId());
+        if (sysNodeTable == null) {
+            throw ServiceException.exception(Constants.INFO_NOT_FOUND);
+        }
+        BeanUtils.copyProperties(entity, sysNodeTable);
+        sysNodeRepository.save(sysNodeTable);
+        updateRedisAuthorityIdentification();
+    }
+
+    /**
+     * 更新redis中权限标识
+     *
+     * @throws ServiceException
+     */
+    @Override
+    public String updateRedisAuthorityIdentification() throws ServiceException {
+        String uuid = UUIDUtil.getUUID();
+        redisService.saveObject(Constants.UPDATE_REDIS_AUTHORITY_IDENTIFICATION, uuid);
+        return uuid;
+    }
+}

+ 25 - 0
crm-manager/src/main/java/com/crm/manager/service/impl/CommonServiceImpl.java

@@ -0,0 +1,25 @@
+package com.crm.manager.service.impl;
+
+import com.crm.manager.service.CommonService;
+import com.crm.manager.service.impl.base.BaseUploadServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+@Slf4j
+@Service
+public class CommonServiceImpl extends BaseUploadServiceImpl implements CommonService {
+    @Override
+    public String uploadFile(String middlePath,MultipartFile file) throws Exception {
+
+        String path = saveFile(middlePath, file);
+
+        return path;
+    }
+    @Override
+    public String uploadFile(MultipartFile file) throws Exception {
+        String middlePath = "/common";
+        return uploadFile(middlePath,file);
+    }
+
+}

+ 323 - 0
crm-manager/src/main/java/com/crm/manager/service/impl/SysConfigServiceImpl.java

@@ -0,0 +1,323 @@
+
+package com.crm.manager.service.impl;
+
+import com.crm.manager.dao.mapper.SysConfigMapper;
+import com.crm.manager.dao.repository.SysConfigRepository;
+import com.crm.manager.service.SysConfigService;
+import com.crm.rely.backend.core.constant.*;
+import com.crm.rely.backend.core.dto.base.PageDto;
+import com.crm.rely.backend.core.dto.base.ResultWithPagerDto;
+import com.crm.rely.backend.core.dto.system.config.SysConfigSearchDto;
+import com.crm.rely.backend.core.entity.system.config.*;
+import com.crm.rely.backend.core.entity.system.email.SysEmailSendEntity;
+import com.crm.rely.backend.core.pojo.table.SysConfigTable;
+import com.crm.rely.backend.core.exception.ServiceException;
+import com.crm.rely.backend.service.EmailService;
+import com.crm.rely.backend.service.RedisService;
+import com.crm.rely.backend.util.DateUtil;
+import com.crm.rely.backend.util.GetRandom;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+
+@Service
+public class SysConfigServiceImpl implements SysConfigService {
+
+    @Autowired
+    private SysConfigRepository sysConfigRepository;
+
+    @Autowired
+    private SysConfigMapper sysConfigMapper;
+
+    @Autowired
+    private EmailService emailService;
+
+    @Autowired
+    private RedisService redisService;
+
+
+    @Override
+    public SysConfigTable getByCode(String code) throws ServiceException {
+        SysConfigTable sysConfigTable = redisService.getEntity(code, SysConfigTable.class);
+
+        if (sysConfigTable == null) {
+            sysConfigTable = sysConfigRepository.getByCode(code);
+            if (sysConfigTable == null) {
+                throw ServiceException.exception(Constants.INFO_NOT_FOUND);
+            } else {
+                redisService.save(sysConfigTable.getCode(), sysConfigTable);
+            }
+
+        }
+        return sysConfigTable;
+    }
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void add(SysConfigAddEntity entity) throws ServiceException {
+        existCode(entity.getCode());
+
+        SysConfigTable sysConfigTable = new SysConfigTable();
+        BeanUtils.copyProperties(entity, sysConfigTable);
+        sysConfigRepository.save(sysConfigTable);
+        saveCache(sysConfigTable);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void update(SysConfigUpdateEntity entity) throws ServiceException {
+        emailService.validateCode(entity.getEmail(), entity.getEmailCode());
+
+        SysConfigTable sysConfigTable;
+        if (entity.getId() == null) {
+            sysConfigTable = sysConfigRepository.findFirstByCode(entity.getCode());
+        } else {
+            sysConfigTable = sysConfigRepository.findFirstByIdAndCode(entity.getId(), entity.getCode());
+        }
+
+        if (sysConfigTable == null) {
+            throw ServiceException.exception(Constants.INFO_NOT_FOUND);
+        }
+
+        BeanUtils.copyProperties(entity, sysConfigTable);
+        sysConfigRepository.save(sysConfigTable);
+
+        saveCache(sysConfigTable);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updates(SysConfigUpdateEntitys entitys) throws ServiceException {
+        if (entitys == null || entitys.getUpdateData() == null || entitys.getUpdateData().size() <= 0) {
+            return;
+        }
+        emailService.validateCode(entitys.getEmail(), entitys.getEmailCode());
+
+        List<String> codes = new ArrayList<>(entitys.getUpdateData().size());
+        for (BaseSysConfigUpdateEntity entity : entitys.getUpdateData()) {
+            codes.add(entity.getCode());
+            entity.setModifyIp(entitys.getModifyIp());
+            entity.setModifyUser(entitys.getModifyUser());
+            entity.setModifyTime(entitys.getModifyTime());
+        }
+        List<SysConfigTable> sysConfigTables = sysConfigRepository.findAllByCodeIn(codes);
+        if (sysConfigTables == null || sysConfigTables.size() <= 0) {
+            throw ServiceException.exception(Constants.INFO_NOT_FOUND);
+        }
+        for (BaseSysConfigUpdateEntity entity : entitys.getUpdateData()) {
+            for (int i = 0; i < sysConfigTables.size(); i++) {
+
+                SysConfigTable sysConfigTable = sysConfigTables.get(i);
+                if (entity.getCode() != null && entity.getCode().equals(sysConfigTable.getCode())) {
+
+                    entity.setId(sysConfigTable.getId());
+                    BeanUtils.copyProperties(entity, sysConfigTable);
+                }
+            }
+        }
+        sysConfigRepository.saveAll(sysConfigTables);
+
+        saveCache(sysConfigTables);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void delete(SysConfigDeleteEntity entity) throws ServiceException {
+        SysConfigTable sysConfigTable = sysConfigRepository.findFirstByIdAndCode(entity.getId(), entity.getCode());
+
+        if (sysConfigTable == null) {
+            throw ServiceException.exception(Constants.INFO_NOT_FOUND);
+        }
+
+        sysConfigRepository.delete(sysConfigTable);
+        redisService.remove(sysConfigTable.getCode());
+    }
+
+    @Override
+    public ResultWithPagerDto<SysConfigSearchDto> searchPageList(SysConfigSearchEntity entity) throws ServiceException {
+        Integer count = sysConfigMapper.countList(entity);
+        PageDto pageDto = PageDto.format(entity, count);
+        if (count == null || count <= 0) {
+            return ResultWithPagerDto.success(pageDto);
+        }
+        List<SysConfigTable> sysConfigTables = sysConfigMapper.pageList(entity);
+
+        if (sysConfigTables == null || sysConfigTables.size() <= 0) {
+
+            throw new ServiceException(Constants.SYSTEM_ERROR);
+        }
+        List<SysConfigSearchDto> sysConfigSearchDtos = transform(sysConfigTables);
+
+        return ResultWithPagerDto.success(pageDto, sysConfigSearchDtos);
+    }
+
+    @Override
+    public SysConfigSearchDto searchSingle(SysConfigSingleEntity entity) throws ServiceException {
+        SysConfigTable sysConfigTable = sysConfigRepository.getByIdAndCode(entity.getId(), entity.getCode());
+
+        if (sysConfigTable == null) {
+            throw ServiceException.exception(Constants.INFO_NOT_FOUND);
+        }
+        return transform(sysConfigTable);
+
+    }
+
+    @Override
+    public SysConfigSearchDto searchSingleByCode(String code) throws ServiceException {
+        SysConfigTable sysConfigTable = redisService.getEntity(code, SysConfigTable.class);
+
+        if (sysConfigTable == null) {
+            sysConfigTable = sysConfigRepository.getByCode(code);
+            if (sysConfigTable == null) {
+                throw ServiceException.exception(Constants.INFO_NOT_FOUND);
+            } else {
+                redisService.save(sysConfigTable.getCode(), sysConfigTable);
+            }
+
+        }
+        return transform(sysConfigTable);
+    }
+
+    @Override
+    public List<SysConfigSearchDto> searchSingleByCodes(List<String> codes) throws ServiceException {
+        List<SysConfigTable> sysConfigTables = getByCodes(codes);
+
+        return transform(sysConfigTables);
+    }
+
+    private List<SysConfigSearchDto> transform(List<SysConfigTable> sysConfigTables) {
+        if (sysConfigTables == null || sysConfigTables.size() <= 0) {
+            return null;
+        }
+        List<SysConfigSearchDto> sysConfigSearchDtos = new ArrayList<>(sysConfigTables.size());
+
+        for (SysConfigTable sysConfigTable : sysConfigTables) {
+            SysConfigSearchDto sysConfigSearchDto = transform(sysConfigTable);
+            sysConfigSearchDtos.add(sysConfigSearchDto);
+        }
+
+        return sysConfigSearchDtos;
+    }
+
+    private SysConfigSearchDto transform(SysConfigTable sysConfigTable) {
+        SysConfigSearchDto sysConfigSearchDto = new SysConfigSearchDto();
+        BeanUtils.copyProperties(sysConfigTable, sysConfigSearchDto);
+        return sysConfigSearchDto;
+    }
+
+    private void existCode(String code) throws ServiceException {
+        boolean exist = sysConfigRepository.existsByCode(code);
+        if (exist) {
+            throw ServiceException.exception(ManagerConstant.CONFIG_CODE_EXIST);
+        }
+    }
+
+    @Override
+    public List<SysConfigTable> getByCodes(List<String> codes) throws ServiceException {
+        List<SysConfigTable> sysConfigTables = new ArrayList<>(codes.size());
+        for (int i = 0; i < codes.size(); ) {
+            SysConfigTable sysConfigTable = redisService.getEntity(codes.get(i), SysConfigTable.class);
+            if (sysConfigTable != null) {
+                sysConfigTables.add(sysConfigTable);
+                codes.remove(i);
+            } else {
+                i++;
+            }
+        }
+        if (codes != null && codes.size() > 0) {
+            List<SysConfigTable> supplementTables = sysConfigRepository.getByCodeIn(codes);
+            if (sysConfigTables == null || supplementTables.size() <= 0) {
+                throw ServiceException.exception(Constants.INFO_NOT_FOUND);
+            }
+
+            saveCache(supplementTables);
+
+            sysConfigTables.addAll(supplementTables);
+        }
+        return sysConfigTables;
+    }
+
+    @Override
+    public void sendUpdateEmailCode(SendUpdateEmailCodeEntity entity) throws ServiceException {
+
+        //构建实体
+        SysEmailSendEntity sysEmailSendEntity = createUpdateEmailSendEmailSendUpdateEmailCodeEntity(entity);
+
+        //发送收据
+        emailService.sendCode(sysEmailSendEntity, sysEmailSendEntity.getMap().get(MapConstants.CODE));
+    }
+
+    /**
+     * 刷新redis config中的数据
+     *
+     * @throws ServiceException
+     */
+    @Override
+    public void refresh() throws ServiceException {
+        List<SysConfigTable> sysConfigTables = sysConfigRepository.getAllByIdIsNotNull();
+        saveCache(sysConfigTables);
+    }
+
+    @Override
+    public void cancel() throws ServiceException {
+        List<String> configListKey = redisService.getList(GlobalConfigConstants.CONFIG_LIST, String.class);
+        configListKey.add(GlobalConfigConstants.CONFIG_LIST);
+        redisService.remove(configListKey);
+    }
+
+    private SysEmailSendEntity createUpdateEmailSendEmailSendUpdateEmailCodeEntity(SendUpdateEmailCodeEntity entity) {
+        SysEmailSendEntity sysEmailSendEntity = new SysEmailSendEntity();
+
+        Map<String, String> map = new HashMap<>(2);
+        String code = GetRandom.getRandom(6);
+        map.put(MapConstants.CODE, code);
+        Date time = DateUtil.operationMinute(new Date(), Constants.EMAIL_VALIDATECODE_TIME);
+        map.put(MapConstants.EXPIRE_TIME, DateUtil.formatTime(time));
+        map.put(MapConstants.DATE_TIME, DateUtil.formatTime());
+
+        sysEmailSendEntity.setAddIp(entity.getIp());
+        sysEmailSendEntity.setAddTime(entity.getTime());
+
+        sysEmailSendEntity.setUsers(entity.getEmail());
+        sysEmailSendEntity.setEmailSendEnum(EmailSendEnum.UPDATE_CONFIG_EMAIL_CODE);
+
+        sysEmailSendEntity.setTemplateName(GlobalSystemEmailCodeConstants.CONFIG_UPDATE_EMAIL_CODE_SEND);
+
+        sysEmailSendEntity.setMap(map);
+
+        return sysEmailSendEntity;
+    }
+
+    private void saveCache(List<SysConfigTable> sysConfigTables) throws ServiceException {
+        List<String> configListKey = redisService.getList(GlobalConfigConstants.CONFIG_LIST, String.class);
+        sysConfigTables.forEach(v -> {
+            try {
+                saveCache(v, configListKey);
+            } catch (ServiceException e) {
+                e.printStackTrace();
+            }
+        });
+    }
+
+    private void saveCache(SysConfigTable sysConfigTable) throws ServiceException {
+        saveCache(sysConfigTable, null);
+    }
+
+    private void saveCache(SysConfigTable sysConfigTable, List<String> configListKey) throws ServiceException {
+        if (configListKey == null) {
+            configListKey = redisService.getList(GlobalConfigConstants.CONFIG_LIST, String.class);
+        }
+        if (configListKey == null) {
+            configListKey = new ArrayList<>(10);
+        }
+        if (!configListKey.contains(sysConfigTable.getCode())) {
+            configListKey.add(sysConfigTable.getCode());
+        }
+        redisService.save(sysConfigTable.getCode(), sysConfigTable);
+        redisService.save(GlobalConfigConstants.CONFIG_LIST, configListKey);
+    }
+}

+ 137 - 0
crm-manager/src/main/java/com/crm/manager/service/impl/SysIpLimitServiceImpl.java

@@ -0,0 +1,137 @@
+package com.crm.manager.service.impl;
+
+import com.crm.manager.dao.mapper.SysIpLimitMapper;
+import com.crm.manager.dao.repository.SysIpLimitRepository;
+import com.crm.manager.service.SysIpLimitService;
+import com.crm.rely.backend.core.constant.Constants;
+import com.crm.rely.backend.core.dto.base.PageDto;
+import com.crm.rely.backend.core.dto.base.ResultWithPagerDto;
+import com.crm.rely.backend.core.dto.system.ip.SysIpLimitDto;
+import com.crm.rely.backend.core.entity.base.SingleLongEntity;
+import com.crm.rely.backend.core.entity.system.ip.SysIpLimitAddEntity;
+import com.crm.rely.backend.core.entity.system.ip.SysIpLimitDeleteEntity;
+import com.crm.rely.backend.core.entity.system.ip.SysIpLimitSearchEntity;
+import com.crm.rely.backend.core.entity.system.ip.SysIpLimitUpdateEntity;
+import com.crm.rely.backend.core.pojo.table.SysIpLimitTable;
+import com.crm.rely.backend.core.exception.ServiceException;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Author: houn
+ * @Date: 2020/10/18 21:38
+ * @Description:
+ */
+@Service
+public class SysIpLimitServiceImpl implements SysIpLimitService {
+
+    @Autowired
+    private SysIpLimitRepository repository;
+
+    @Autowired
+    private SysIpLimitMapper mapper;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void add(SysIpLimitAddEntity entity) throws ServiceException {
+
+        SysIpLimitTable table = new SysIpLimitTable();
+        BeanUtils.copyProperties(entity, table);
+        repository.save(table);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void update(SysIpLimitUpdateEntity entity) throws ServiceException {
+        SysIpLimitTable table = repository.findFirstById(entity.getId());
+        if (table == null) {
+            throw ServiceException.exception(Constants.INFO_NOT_FOUND);
+        }
+        if (!table.getIp().equals(entity.getIp())) {
+            if (validatedIpExist(entity.getIp())) {
+                throw ServiceException.exception(Constants.IP_CODE_IS_EXIST_ERROR);
+            }
+        }
+
+        BeanUtils.copyProperties(entity, table);
+        repository.save(table);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void delete(SysIpLimitDeleteEntity entity) throws ServiceException {
+        List<SysIpLimitTable> tables = repository.findAllByIdIn(entity.getIds());
+        if (tables == null) {
+            throw ServiceException.exception(Constants.INFO_NOT_FOUND);
+        }
+
+        repository.deleteAll(tables);
+    }
+
+    @Override
+    public ResultWithPagerDto<SysIpLimitDto> searchPageList(SysIpLimitSearchEntity entity) throws ServiceException {
+        Integer count = mapper.countList(entity);
+        PageDto pageDto = PageDto.format(entity, count);
+        if (count == null || count <= 0) {
+            return ResultWithPagerDto.success(pageDto);
+        }
+        List<SysIpLimitTable> sysBankTables = mapper.pageList(entity);
+
+        if (sysBankTables == null || sysBankTables.size() <= 0) {
+
+            throw new ServiceException(Constants.SYSTEM_ERROR);
+        }
+        List<SysIpLimitDto> sysIpLimitDtos = new ArrayList<>(sysBankTables.size());
+
+        for (SysIpLimitTable sysBankTable : sysBankTables) {
+            SysIpLimitDto sysConfigSearchDto = transformListDto(sysBankTable);
+            sysIpLimitDtos.add(sysConfigSearchDto);
+        }
+
+        return ResultWithPagerDto.success(pageDto, sysIpLimitDtos);
+    }
+
+    @Override
+    public SysIpLimitDto searchSingle(SingleLongEntity entity) throws ServiceException {
+        SysIpLimitTable table = repository.getFirstById(entity.getId());
+        if (table == null) {
+            throw ServiceException.exception(Constants.INFO_NOT_FOUND);
+        }
+        SysIpLimitDto sysIpLimitDto = transformListDto(table);
+        return sysIpLimitDto;
+    }
+
+    @Override
+    public List<SysIpLimitDto> getList() throws ServiceException {
+        List<SysIpLimitTable> sysBankTables = repository.getAllByIdIsNotNull();
+        if (sysBankTables == null) {
+            return null;
+        }
+
+        List<SysIpLimitDto> dtos = new ArrayList<>(sysBankTables.size());
+
+        for (SysIpLimitTable table : sysBankTables) {
+            SysIpLimitDto sysBankListDto = transformListDto(table);
+            dtos.add(sysBankListDto);
+        }
+
+        return dtos;
+    }
+
+    @Override
+    public boolean validatedIpExist(String ip) throws ServiceException {
+        return repository.existsByIp(ip);
+    }
+
+
+    private SysIpLimitDto transformListDto(SysIpLimitTable sysBankTable) {
+        SysIpLimitDto sysBankListDto = new SysIpLimitDto();
+        BeanUtils.copyProperties(sysBankTable, sysBankListDto);
+        return sysBankListDto;
+    }
+}

+ 127 - 0
crm-manager/src/main/java/com/crm/manager/service/impl/SysReasonsRefusalServiceImpl.java

@@ -0,0 +1,127 @@
+package com.crm.manager.service.impl;
+
+import com.crm.manager.dao.mapper.SysReasonsRefusalMapper;
+import com.crm.manager.dao.repository.SysReasonsRefusalRepository;
+import com.crm.manager.service.SysReasonsRefusalService;
+import com.crm.rely.backend.core.constant.Constants;
+import com.crm.rely.backend.core.dto.base.BaseResultDto;
+import com.crm.rely.backend.core.dto.base.PageDto;
+import com.crm.rely.backend.core.dto.base.ResultWithPagerDto;
+import com.crm.rely.backend.core.dto.system.reasons.refusal.SysReasonsRefusalSearchDto;
+import com.crm.rely.backend.core.entity.base.SingleLongEntity;
+import com.crm.rely.backend.core.entity.system.reasons.refusal.*;
+import com.crm.rely.backend.core.pojo.table.SysReasonsRefusalTable;
+import com.crm.rely.backend.core.exception.ServiceException;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author: houn
+ * @Date: 2020/9/11 1:15
+ * @Description:
+ */
+@Service
+public class SysReasonsRefusalServiceImpl implements SysReasonsRefusalService {
+
+    @Autowired
+    private SysReasonsRefusalRepository sysReasonsRefusalRepository;
+
+    @Autowired
+    private SysReasonsRefusalMapper sysReasonsRefusalMapper;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void add(SysReasonsRefusalAddEntity entity) throws ServiceException {
+
+        SysReasonsRefusalTable sysReasonsRefusalTable = new SysReasonsRefusalTable();
+        BeanUtils.copyProperties(entity, sysReasonsRefusalTable);
+        sysReasonsRefusalRepository.save(sysReasonsRefusalTable);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void delete(SysReasonsRefusalDeleteEntity entity) throws ServiceException {
+        List<SysReasonsRefusalTable> sysReasonsRefusalTables = sysReasonsRefusalRepository.findAllByIdIn(entity.getIds());
+
+        if (sysReasonsRefusalTables == null || sysReasonsRefusalTables.size() <= 0) {
+            return;
+        }
+
+        sysReasonsRefusalRepository.deleteAll(sysReasonsRefusalTables);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void update(SysReasonsRefusalUpdateEntity entity) throws ServiceException {
+        SysReasonsRefusalTable sysReasonsRefusalTable = sysReasonsRefusalRepository.findFirstById(entity.getId());
+
+        BeanUtils.copyProperties(entity, sysReasonsRefusalTable);
+
+        sysReasonsRefusalRepository.save(sysReasonsRefusalTable);
+    }
+
+    @Override
+    public ResultWithPagerDto<SysReasonsRefusalSearchDto> searchPageList(SysReasonsRefusalSearchPageEntity entity) throws ServiceException {
+        Integer count = sysReasonsRefusalMapper.countList(entity);
+        PageDto pageDto = PageDto.format(entity, count);
+        if (count == null || count <= 0) {
+            return ResultWithPagerDto.success(pageDto);
+        }
+        List<SysReasonsRefusalTable> sysReasonsRefusalTables = sysReasonsRefusalMapper.searchPageList(entity);
+
+        if (sysReasonsRefusalTables == null || sysReasonsRefusalTables.size() <= 0) {
+
+            throw new ServiceException(Constants.SYSTEM_ERROR);
+        }
+        List<SysReasonsRefusalSearchDto> sysReasonsRefusalSearchDtos = new ArrayList<>(sysReasonsRefusalTables.size());
+
+        for (SysReasonsRefusalTable sysReasonsRefusalTable : sysReasonsRefusalTables) {
+            SysReasonsRefusalSearchDto sysReasonsRefusalSearchDto = transform(sysReasonsRefusalTable);
+            sysReasonsRefusalSearchDtos.add(sysReasonsRefusalSearchDto);
+        }
+
+        return ResultWithPagerDto.success(pageDto, sysReasonsRefusalSearchDtos);
+    }
+
+    @Override
+    public SysReasonsRefusalSearchDto searchSingle(SingleLongEntity entity) throws ServiceException {
+        SysReasonsRefusalTable sysReasonsRefusalTable = sysReasonsRefusalRepository.getFirstById(entity.getId());
+
+        if (sysReasonsRefusalTable == null) {
+            throw ServiceException.exception(Constants.INFO_NOT_FOUND);
+        }
+        return transform(sysReasonsRefusalTable);
+    }
+
+    @Override
+    public BaseResultDto<Map<String, SysReasonsRefusalSearchDto>> searchList(SysReasonsRefusalSearchEntity entity) throws ServiceException {
+        List<SysReasonsRefusalTable> sysReasonsRefusalTables = sysReasonsRefusalMapper.searchList(entity);
+
+        if (sysReasonsRefusalTables == null || sysReasonsRefusalTables.size() <= 0) {
+
+            return ResultWithPagerDto.success();
+        }
+        Map<String, SysReasonsRefusalSearchDto> sysReasonsRefusalSearchDtos = new HashMap<>(sysReasonsRefusalTables.size());
+
+        for (SysReasonsRefusalTable sysReasonsRefusalTable : sysReasonsRefusalTables) {
+            SysReasonsRefusalSearchDto sysReasonsRefusalSearchDto = transform(sysReasonsRefusalTable);
+            sysReasonsRefusalSearchDtos.put(String.valueOf(sysReasonsRefusalSearchDto.getId()), sysReasonsRefusalSearchDto);
+        }
+
+        return BaseResultDto.success(sysReasonsRefusalSearchDtos);
+    }
+
+
+    private SysReasonsRefusalSearchDto transform(SysReasonsRefusalTable sysReasonsRefusalTable) {
+        SysReasonsRefusalSearchDto sysReasonsRefusalSearchDto = new SysReasonsRefusalSearchDto();
+        BeanUtils.copyProperties(sysReasonsRefusalTable, sysReasonsRefusalSearchDto);
+        return sysReasonsRefusalSearchDto;
+    }
+}

+ 245 - 0
crm-manager/src/main/java/com/crm/manager/service/impl/UserDepartmentServiceImpl.java

@@ -0,0 +1,245 @@
+package com.crm.manager.service.impl;
+
+import com.crm.rely.backend.core.dto.base.BaseResultDto;
+import com.crm.rely.backend.core.exception.DataNotFoundException;
+import com.crm.rely.backend.core.exception.ServiceException;
+import com.crm.rely.backend.core.constant.Constants;
+import com.crm.rely.backend.core.dto.base.BaseResultWithPagerDto;
+import com.crm.rely.backend.core.dto.base.PageDto;
+import com.crm.rely.backend.core.constant.ManagerConstant;
+import com.crm.rely.backend.core.dto.user.department.UserDepartmentSearchDto;
+import com.crm.rely.backend.util.FormatPage;
+import com.crm.manager.dao.repository.UserDepartmentRepository;
+import com.crm.manager.dao.repository.UserRoleRepository;
+import com.crm.rely.backend.model.entity.user.department.UserDepartmentAddEntity;
+import com.crm.rely.backend.model.entity.user.department.UserDepartmentDeleteEntity;
+import com.crm.rely.backend.model.entity.user.department.UserDepartmentSearchEntity;
+import com.crm.rely.backend.model.entity.user.department.UserDepartmentUpdateEntity;
+import com.crm.rely.backend.core.pojo.table.UserDepartmentTable;
+import com.crm.manager.service.UserDepartmentService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.persistence.criteria.Predicate;
+import java.util.*;
+
+/**
+ * @program: crm-backend
+ * @description:
+ * @author: houn
+ * @create: 2019-07-25 13:56
+ */
+@Service
+public class UserDepartmentServiceImpl implements UserDepartmentService {
+
+    @Autowired
+    private UserDepartmentRepository userDepartmentRepository;
+
+    @Autowired
+    private UserRoleRepository userRoleRepository;
+
+    /**
+     * 添加部门
+     *
+     * @param entity
+     * @throws ServiceException
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void add(UserDepartmentAddEntity entity) throws ServiceException {
+
+        existByName(entity.getName());
+
+        UserDepartmentTable userDepartmentTable = new UserDepartmentTable();
+
+        BeanUtils.copyProperties(entity, userDepartmentTable);
+
+        userDepartmentTable.setRoleNumber(0);
+
+        userDepartmentRepository.save(userDepartmentTable);
+    }
+
+    /**
+     * 更新部门信息
+     *
+     * @param entity
+     * @throws ServiceException
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void update(UserDepartmentUpdateEntity entity) throws ServiceException {
+
+        UserDepartmentTable userDepartmentTable = userDepartmentRepository.findFirstById(entity.getId());
+        if (userDepartmentTable == null) {
+            throw new DataNotFoundException(Constants.INFO_NOT_FOUND);
+        }
+        if (userDepartmentTable.getName() == null || !userDepartmentTable.getName().equals(entity.getName())) {
+            existByName(entity.getName());
+        }
+
+        BeanUtils.copyProperties(entity, userDepartmentTable);
+
+        userDepartmentRepository.save(userDepartmentTable);
+    }
+
+    /**
+     * 删除部门(批量)
+     *
+     * @param entity
+     * @throws ServiceException
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void delete(UserDepartmentDeleteEntity entity) throws ServiceException {
+
+        boolean existDepartmentId = userRoleRepository.existsByDepartmentIdIn(entity.getIds());
+
+        if (existDepartmentId) {
+            //todo 部门下存在角色 不能删除
+            throw new ServiceException("");
+        }
+
+        List<UserDepartmentTable> userDepartmentTables = userDepartmentRepository.findByIdIn(entity.getIds());
+
+        if (userDepartmentTables == null || userDepartmentTables.size() <= 0) {
+            return;
+        }
+
+        userDepartmentRepository.deleteAll(userDepartmentTables);
+    }
+
+    /**
+     * 根据条件搜索列表
+     *
+     * @param entity
+     * @return
+     * @throws ServiceException
+     */
+    @Override
+    public BaseResultWithPagerDto searchPage(UserDepartmentSearchEntity entity) throws ServiceException {
+
+        //创建有序map map为排序字段
+        Map<String, String> map = new LinkedHashMap<>(1);
+        map.put("subIndex", "asc");
+        Pageable pageable = FormatPage.formatPageable(entity.getPage(), map);
+
+        Specification specification = getSpecification(entity);
+
+        Page<UserDepartmentTable> userDepartmentTablePage = userDepartmentRepository.findAll(specification, pageable);
+
+        long count = userDepartmentTablePage.getTotalElements();
+        PageDto pageDto = FormatPage.format(entity.getPage(), count);
+
+        if (count <= 0) {
+            return new BaseResultWithPagerDto(Constants.SUCCESS_CODE, Constants.SEARCH_SUCCESS, pageDto);
+        }
+
+        List<UserDepartmentSearchDto> userDepartmentSearchDtos = transform(userDepartmentTablePage.getContent());
+
+        return new BaseResultWithPagerDto(Constants.SUCCESS_CODE, Constants.SEARCH_SUCCESS, pageDto, userDepartmentSearchDtos);
+    }
+    @Override
+    public BaseResultDto searchList() throws ServiceException {
+
+
+        List<UserDepartmentTable> userDepartmentTables = userDepartmentRepository.getAllByOrderBySubIndex();
+
+
+        List<UserDepartmentSearchDto> userDepartmentSearchDtos = transform(userDepartmentTables);
+
+        return BaseResultDto.success(userDepartmentSearchDtos);
+    }
+
+    /**
+     * 根据id查询
+     *
+     * @param id
+     * @return
+     * @throws ServiceException
+     */
+    @Override
+    public UserDepartmentSearchDto searchSingle(Long id) throws ServiceException {
+        UserDepartmentTable userDepartmentTable = userDepartmentRepository.findById(id).orElse(null);;
+        if (userDepartmentTable == null) {
+            throw new DataNotFoundException(Constants.INFO_NOT_FOUND);
+        }
+
+        UserDepartmentSearchDto userDepartmentSearchDto = transform(userDepartmentTable);
+
+        return userDepartmentSearchDto;
+    }
+
+    /**
+     * 验证当前部门用户名是否存在 存在则抛出serviceException异常 内容为部门名称已存在
+     *
+     * @param name
+     * @throws ServiceException
+     */
+    private void existByName(String name) throws ServiceException {
+        boolean existName = userDepartmentRepository.existsByName(name);
+
+        if (existName) {
+            throw new ServiceException(ManagerConstant.DEPARTMENT_NAME_IS_EXIST_ERROR);
+        }
+    }
+
+    /**
+     * 拼接动态sql
+     *
+     * @param entity
+     * @return
+     */
+    private Specification getSpecification(UserDepartmentSearchEntity entity) {
+
+        Specification<UserDepartmentTable> specification = (root, query, cb) -> {
+
+            List<Predicate> predicates = new ArrayList<>(1);
+            if (entity.getName() != null) {
+                predicates.add(cb.like(root.get("name").as(String.class), "%" + entity.getName() + "%"));
+            }
+            Predicate[] pre = new Predicate[predicates.size()];
+
+            return query.where(predicates.toArray(pre)).getRestriction();
+        };
+
+        return specification;
+    }
+
+    /**
+     * 转化(list转化为dtos)
+     *
+     * @param userDepartmentTables
+     * @return
+     */
+    private List<UserDepartmentSearchDto> transform(List<UserDepartmentTable> userDepartmentTables) {
+
+        if (userDepartmentTables == null || userDepartmentTables.size() <= 0) {
+            return null;
+        }
+
+        List<UserDepartmentSearchDto> transform = new ArrayList<>(userDepartmentTables.size());
+        userDepartmentTables.forEach(value -> transform.add(transform(value)));
+
+        return transform;
+    }
+
+    /**
+     * 转化为dto
+     *
+     * @param userDepartmentTable
+     * @return
+     */
+    private UserDepartmentSearchDto transform(UserDepartmentTable userDepartmentTable) {
+
+        UserDepartmentSearchDto userDepartmentSearchDto = new UserDepartmentSearchDto();
+
+        BeanUtils.copyProperties(userDepartmentTable, userDepartmentSearchDto);
+
+        return userDepartmentSearchDto;
+    }
+}

+ 41 - 0
crm-manager/src/main/java/com/crm/manager/service/impl/UserGroupServiceImpl.java

@@ -0,0 +1,41 @@
+package com.crm.manager.service.impl;
+
+import com.crm.manager.dao.repository.UserGroupRepository;
+import com.crm.manager.service.UserGroupService;
+import com.crm.rely.backend.core.dto.base.BaseResultDto;
+import com.crm.rely.backend.core.dto.user.group.UserGroupDto;
+import com.crm.rely.backend.core.pojo.table.UserGroupTable;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Author: houn
+ * @Date: 2020/9/11 16:13
+ * @Description:
+ */
+@Service
+public class UserGroupServiceImpl implements UserGroupService {
+
+    @Autowired
+    private UserGroupRepository userGroupRepository;
+
+    @Override
+    public BaseResultDto<List<UserGroupDto>> getAllGroup() {
+        List<UserGroupTable> userGroupTables = userGroupRepository.getAllByIdNotNull();
+        if (userGroupTables == null || userGroupTables.size() <= 0) {
+            return BaseResultDto.success();
+        }
+        List<UserGroupDto> userGroupDtos = new ArrayList<>(userGroupTables.size());
+        userGroupTables.forEach(value -> {
+            UserGroupDto userGroupDto = new UserGroupDto();
+
+            BeanUtils.copyProperties(value, userGroupDto);
+            userGroupDtos.add(userGroupDto);
+        });
+        return BaseResultDto.success(userGroupDtos);
+    }
+}

+ 644 - 0
crm-manager/src/main/java/com/crm/manager/service/impl/UserInfoServiceImpl.java

@@ -0,0 +1,644 @@
+package com.crm.manager.service.impl;
+
+import com.crm.manager.dao.mapper.UserInfoDao;
+import com.crm.manager.dao.repository.*;
+import com.crm.manager.service.*;
+
+import com.crm.rely.backend.core.constant.*;
+import com.crm.rely.backend.core.dto.base.BaseResultWithPagerDto;
+import com.crm.rely.backend.core.dto.base.PageDto;
+import com.crm.rely.backend.core.dto.base.ResultWithPagerDto;
+import com.crm.rely.backend.core.dto.user.department.UserDepartmentSearchDto;
+import com.crm.rely.backend.core.dto.user.role.UserRoleDto;
+import com.crm.rely.backend.core.entity.system.email.SysEmailSendEntity;
+import com.crm.rely.backend.core.exception.DataNotFoundException;
+import com.crm.rely.backend.core.exception.ServiceException;
+import com.crm.rely.backend.core.pojo.table.SysUserLoginHistoryTable;
+import com.crm.rely.backend.core.pojo.table.UserGroupTable;
+import com.crm.rely.backend.model.dto.user.info.UserInfoSearchDto;
+import com.crm.rely.backend.model.entity.user.info.*;
+import com.crm.rely.backend.model.entity.user.role.UserRoleUpdateNumberEntity;
+import com.crm.rely.backend.model.pojo.table.*;
+import com.crm.rely.backend.model.pojo.view.UserInfoView;
+import com.crm.rely.backend.service.EmailService;
+import com.crm.rely.backend.service.MqSendService;
+import com.crm.rely.backend.service.RedisService;
+import com.crm.rely.backend.util.*;
+import com.google.common.base.Strings;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * @program: crm-backend
+ * @description:
+ * @author: houn
+ * @create: 2019-07-25 16:14
+ */
+@Service
+@Slf4j
+public class UserInfoServiceImpl implements UserInfoService {
+
+    @Autowired
+    private UserInfoRepository userInfoRepository;
+
+    @Autowired
+    private SysUserLoginHistoryRepository sysUserLoginHistoryRepository;
+
+    @Autowired
+    private UserRoleService userRoleService;
+
+    @Autowired
+    private UserInfoDao userInfoDao;
+
+    @Autowired
+    private UserDepartmentService userDepartmentService;
+
+    @Autowired
+    private UserGroupRepository userGroupRepository;
+
+    @Autowired
+    private RedisService redisService;
+
+    @Autowired
+    private MqSendService mqSendService;
+
+    @Autowired
+    private SysIpLimitService sysIpLimitService;
+
+    /**
+     * 用户登录
+     *
+     * @param entity
+     * @return
+     * @throws ServiceException
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public UserInfoEntity login(UserLoginEntity entity) throws ServiceException {
+
+        UserInfoTable userInfoTable = userInfoRepository.findFirstByUsernameAndPassword(entity.getLoginName(), entity.getPassword());
+
+        if (userInfoTable == null) {
+            throw new ServiceException(Constants.LOGIN_FAIL);
+        }
+        limitIp(entity.getIp(), userInfoTable);
+//        if (userInfoTable.getWithdrawCId() != null || userInfoTable.getCustomId() != null) {
+//            throw ServiceException.exception(Constants.NOT_PERMIT);
+//        }
+        if (userInfoTable.getRoleId() != null && userInfoTable.getRoleId().equals(-1)) {
+            throw ServiceException.exception(Constants.NOT_PERMIT);
+        }
+        if (userInfoTable.getValid() == null || !userInfoTable.getValid().equals(1)) {
+            throw ServiceException.exception(Constants.RESTRICTED_LOGIN);
+        }
+        UserRoleDto userRoleDto;
+        UserDepartmentSearchDto userDepartmentSearchDto;
+        if (userInfoTable.getRoleId() != null) {
+            userRoleDto = userRoleService.getRoleInfo(userInfoTable.getRoleId());
+            if (userRoleDto == null) {
+                throw ServiceException.exception(Constants.SYSTEM_ERROR);
+            }
+            if (userRoleDto.getDepartmentId() != null) {
+                userDepartmentSearchDto = userDepartmentService.searchSingle(userRoleDto.getDepartmentId());
+                if (userDepartmentSearchDto == null) {
+                    throw ServiceException.exception(Constants.SYSTEM_ERROR);
+                }
+            } else {
+                userDepartmentSearchDto = null;
+            }
+
+        } else {
+            userRoleDto = null;
+            userDepartmentSearchDto = null;
+        }
+        userInfoTable.setLastAddress(entity.getAddress());
+        userInfoTable.setLastIp(entity.getIp());
+        userInfoTable.setLastTime(entity.getTime());
+        UserGroupTable userGroupTable = null;
+        if (userInfoTable.getGroupId() != null && userInfoTable.getGroupId() > 0) {
+            userGroupTable = userGroupRepository.getFirstById(userInfoTable.getGroupId());
+        }
+        UserInfoEntity infoEntity = transform(userInfoTable, entity, userRoleDto, userDepartmentSearchDto, userGroupTable);
+
+
+        /**
+         * 更新登录信息
+         */
+        userInfoRepository.save(userInfoTable);
+
+        try {
+            SysUserLoginHistoryTable sysUserLoginHistoryTable = new SysUserLoginHistoryTable();
+            sysUserLoginHistoryTable.setAddress(entity.getAddress());
+            sysUserLoginHistoryTable.setLoginIp(entity.getIp());
+            sysUserLoginHistoryTable.setLoginUser(userInfoTable.getId());
+            sysUserLoginHistoryTable.setLoginTime(entity.getTime());
+            sysUserLoginHistoryRepository.save(sysUserLoginHistoryTable);
+        } catch (Exception e) {
+            e.getStackTrace();
+        }
+
+        return infoEntity;
+    }
+
+    /**
+     * 添加用户信息
+     *
+     * @param entity
+     * @throws ServiceException
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void add(UserInfoAddEntity entity) throws ServiceException, InterruptedException {
+
+        //判断角色是否存在
+        userRoleService.existRole(entity.getRoleId());
+
+        //用户名
+        existByUsername(entity.getUsername());
+
+        //邮箱
+        existByEmail(entity.getEmail());
+
+        UserInfoTable userInfoTable = new UserInfoTable();
+        BeanUtils.copyProperties(entity, userInfoTable);
+
+        /*
+            判断角色
+         */
+        Long roleId = userInfoTable.getRoleId();
+        userRoleService.getRoleCodeById(roleId);
+
+        userInfoRepository.save(userInfoTable);
+
+        UserRoleUpdateNumberEntity userRoleUpdateNumberEntity = new UserRoleUpdateNumberEntity();
+        userRoleUpdateNumberEntity.setId(entity.getRoleId());
+        userRoleUpdateNumberEntity.setChangeNumber(1);
+        userRoleService.updateNumber(userRoleUpdateNumberEntity);
+
+    }
+
+    /**
+     * 删除用户
+     *
+     * @param entity
+     * @throws ServiceException
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void delete(UserInfoDeleteEntity entity) throws ServiceException {
+
+        List<UserInfoTable> userInfoTables = userInfoRepository.findAllById(entity.getIds());
+        if (userInfoTables == null || userInfoTables.size() <= 0) {
+            return;
+        }
+
+        userInfoRepository.deleteAll(userInfoTables);
+
+        List<UserRoleUpdateNumberEntity> userRoleUpdateNumberEntities = new ArrayList<>(userInfoTables.size());
+
+        List<Long> userIds = new ArrayList<>(userInfoTables.size());
+        userInfoTables.forEach(value -> {
+            if (value.getRoleId() != null) {
+                UserRoleUpdateNumberEntity userRoleUpdateNumberEntity = new UserRoleUpdateNumberEntity();
+                userRoleUpdateNumberEntity.setId(value.getRoleId());
+                userRoleUpdateNumberEntity.setChangeNumber(-1);
+                userRoleUpdateNumberEntities.add(userRoleUpdateNumberEntity);
+
+
+                if (value.getUserType() != null) {
+                    userIds.add(value.getId());
+                }
+            }
+        });
+
+        if (userRoleUpdateNumberEntities != null && userRoleUpdateNumberEntities.size() > 0) {
+
+            userRoleService.updateNumber(userRoleUpdateNumberEntities);
+        }
+    }
+
+    /**
+     * 修改用户信息
+     *
+     * @param entity
+     * @throws ServiceException
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public UserInfoTable update(UserInfoUpdateEntity entity) throws ServiceException {
+
+        UserInfoTable userInfoTable = userInfoRepository.findFirstById(entity.getId());
+
+        if (userInfoTable == null) {
+            throw new ServiceException(Constants.USER_NOT_EXIST_ERROR);
+        }
+
+        List<UserRoleUpdateNumberEntity> userRoleUpdateNumberEntities = null;
+        //角色
+        if (!entity.getRoleId().equals(userInfoTable.getRoleId())) {
+            userRoleService.existRole(entity.getRoleId());
+
+            userRoleUpdateNumberEntities = new ArrayList<>(2);
+            UserRoleUpdateNumberEntity userRoleUpdateNumberEntityOld = new UserRoleUpdateNumberEntity();
+            userRoleUpdateNumberEntityOld.setId(userInfoTable.getRoleId());
+            userRoleUpdateNumberEntityOld.setChangeNumber(-1);
+            userRoleUpdateNumberEntities.add(userRoleUpdateNumberEntityOld);
+
+            UserRoleUpdateNumberEntity userRoleUpdateNumberEntityNew = new UserRoleUpdateNumberEntity();
+            userRoleUpdateNumberEntityNew.setId(entity.getRoleId());
+            userRoleUpdateNumberEntityNew.setChangeNumber(1);
+            userRoleUpdateNumberEntities.add(userRoleUpdateNumberEntityNew);
+
+        }
+
+        //用户名
+        if (!entity.getUsername().equals(userInfoTable.getUsername())) {
+            existByUsername(entity.getUsername());
+        }
+
+        //邮箱
+        if (!entity.getEmail().equals(userInfoTable.getEmail())) {
+            existByEmail(entity.getEmail());
+        }
+
+        if (Strings.isNullOrEmpty(entity.getPassword())) {
+            entity.setPassword(userInfoTable.getPassword());
+        }
+        if (entity.getOutRate() == null && entity.getOutRate().compareTo(BigDecimal.ZERO) < 0) {
+            entity.setOutRate(userInfoTable.getOutRate());
+        }
+        if (entity.getInRate() == null && entity.getInRate().compareTo(BigDecimal.ZERO) < 0) {
+            entity.setInRate(userInfoTable.getInRate());
+        }
+
+        /*
+            上级发生变动
+         */
+        //新上级
+        UserInfoTable pUser = null;
+        if (entity.getPid() != null) {
+            pUser = userInfoRepository.getFirstById(entity.getPid());
+        }
+        if (entity.getPid() != null && pUser == null) {
+            throw new ServiceException(Constants.USER_NOT_EXIST_ERROR);
+        }
+        BeanUtils.copyProperties(entity, userInfoTable);
+
+        userInfoRepository.save(userInfoTable);
+
+        if (userRoleUpdateNumberEntities != null) {
+            userRoleService.updateNumber(userRoleUpdateNumberEntities);
+        }
+
+        return userInfoTable;
+    }
+
+    /**
+     * 根据条件搜索列表
+     *
+     * @param entity
+     * @return
+     * @throws ServiceException
+     */
+    @Override
+    public BaseResultWithPagerDto<List<UserInfoSearchDto>> searchPage(UserInfoSearchEntity entity) throws ServiceException {
+
+        Integer count = userInfoDao.searchByPageCount(entity);
+        PageDto pageDto = PageDto.format(entity, count);
+        if (count == null || count <= 0) {
+            return ResultWithPagerDto.success(pageDto);
+        }
+        List<UserInfoView> userInfoViews = userInfoDao.searchByPageList(entity);
+
+        if (userInfoViews == null || userInfoViews.size() <= 0) {
+
+            throw new ServiceException(Constants.SYSTEM_ERROR);
+        }
+        List<UserInfoSearchDto> userInfoSearchDtos = new ArrayList<>(userInfoViews.size());
+
+        for (UserInfoView sysEmailConfigTable : userInfoViews) {
+            UserInfoSearchDto sysConfigSearchDto = transform(sysEmailConfigTable);
+            userInfoSearchDtos.add(sysConfigSearchDto);
+        }
+
+        return new BaseResultWithPagerDto(pageDto, userInfoSearchDtos);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateLang(UserInfoUpdateLangEntity entity) throws ServiceException {
+
+        UserInfoTable userInfoTable = userInfoRepository.findFirstById(entity.getId());
+        if (userInfoTable == null) {
+            throw ServiceException.exception(Constants.SYSTEM_ERROR);
+        }
+        if (entity.getLang() != null && !entity.getLang().equals(userInfoTable.getLang())) {
+            userInfoTable.setLang(entity.getLang());
+            userInfoRepository.save(userInfoTable);
+        }
+    }
+
+    @Override
+    public void updatePasswordSendEmail(UserUpdatePasswordSendEmailEntity entity) throws ServiceException {
+
+        UserInfoTable userInfoTable = userInfoRepository.getFirstByEmailNotNullAndEmail(entity.getEmail());
+
+        if (userInfoTable == null || Strings.isNullOrEmpty(userInfoTable.getPassword())) {
+            throw new ServiceException(Constants.USER_NOT_EXIST_ERROR);
+        }
+
+        SysEmailSendEntity sysEmailSendEntity = createUpdatePasswordSendEmailSysEmailEntity(entity, userInfoTable);
+
+
+        redisService.save(sysEmailSendEntity.getMap().get(MapConstants.TOKEN), userInfoTable.getId(), Constants.EMAIL_TOKEN_TIME * 60 * 1000);
+
+        mqSendService.send(Constants.ACTIVEMQ_JMS_URL_EMAIL, sysEmailSendEntity);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updatePassword(UserUpdateEmailPasswordEntity entity) throws ServiceException {
+
+        Long id = redisService.getEntity(entity.getToken(), Long.class);
+        if (id == null) {
+            throw new ServiceException(Constants.EMAIL_EXPIRE);
+        }
+
+        UserInfoTable userInfoTable = userInfoRepository.findFirstById(id);
+
+        if (userInfoTable == null) {
+            throw new ServiceException(Constants.USER_NOT_EXIST_ERROR);
+        }
+
+        /**
+         * 填写修改时间和密码
+         */
+        userInfoTable.setPassword(entity.getPassword());
+        userInfoTable.setModifyIp(entity.getModifyIp());
+        userInfoTable.setModifyTime(entity.getModifyTime());
+        userInfoTable.setModifyUser(userInfoTable.getModifyUser());
+
+        userInfoRepository.save(userInfoTable);
+        redisService.remove(entity.getToken());
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updatePassword(UserUpdateLoginPasswordEntity entity) throws ServiceException {
+
+        UserInfoTable userInfoTable = userInfoRepository.findFirstById(entity.getId());
+
+        if (userInfoTable == null) {
+            throw new ServiceException(Constants.USER_NOT_EXIST_ERROR);
+        }
+
+        if (!entity.getOldPassword().equals(userInfoTable.getPassword())) {
+            throw new ServiceException(Constants.PASSWORD_ERROR);
+        }
+        /**
+         * 填写修改时间和密码
+         */
+        userInfoTable.setPassword(entity.getNewPassword());
+        userInfoTable.setModifyIp(entity.getModifyIp());
+        userInfoTable.setModifyTime(entity.getModifyTime());
+        userInfoTable.setModifyUser(userInfoTable.getModifyUser());
+
+        userInfoRepository.save(userInfoTable);
+    }
+
+    /**
+     * 根据id查询
+     *
+     * @param id
+     * @return
+     * @throws ServiceException
+     */
+    @Override
+    public UserInfoSearchDto searchSingle(Long id) throws ServiceException {
+
+        UserInfoView userInfoView = userInfoDao.getOne(id);
+        if (userInfoView == null) {
+            throw new DataNotFoundException(Constants.USER_NOT_EXIST_ERROR);
+        }
+
+        UserInfoSearchDto userInfoSearchDto = transform(userInfoView);
+
+        return userInfoSearchDto;
+    }
+
+    /**
+     * 验证用户名是否已存在
+     *
+     * @param username
+     * @throws ServiceException
+     */
+    private void existByUsername(String username) throws ServiceException {
+        boolean existByUsername = userInfoRepository.existsByUsername(username);
+        if (existByUsername) {
+            throw new ServiceException(Constants.USERNAME_IS_EXIST_ERROR);
+        }
+    }
+
+    /**
+     * 验证邮箱是否已存在
+     *
+     * @param email
+     * @throws ServiceException
+     */
+    private void existByEmail(String email) throws ServiceException {
+        boolean existByEmail = userInfoRepository.existsByEmail(email);
+        if (existByEmail) {
+            throw new ServiceException(Constants.EMAIL_IS_EXIST_ERROR);
+        }
+    }
+
+    /**
+     * 构建修改密码发送邮件实体
+     *
+     * @param entity
+     * @param userInfoTable
+     * @return
+     */
+    private SysEmailSendEntity createUpdatePasswordSendEmailSysEmailEntity(UserUpdatePasswordSendEmailEntity entity, UserInfoTable userInfoTable) {
+        SysEmailSendEntity sysEmailSendEntity = new SysEmailSendEntity();
+        String token = AESUtil.encrypt(entity.getEmail() + Constants.LOGIN_LINK + UUIDUtil.getUUID() + Constants.LOGIN_LINK + userInfoTable.getId());
+        Date time = DateUtil.operationMinute(new Date(), Constants.EMAIL_TOKEN_TIME);
+        Map<String, String> map = new HashMap<>(3);
+        map.put(MapConstants.TOKEN, token);
+        map.put(MapConstants.EXPIRE_TIME, DateUtil.formatTime(time));
+        map.put(MapConstants.DATE_TIME, DateUtil.formatTime());
+
+        sysEmailSendEntity.setAddIp(entity.getIp());
+        sysEmailSendEntity.setAddTime(entity.getTime());
+        sysEmailSendEntity.setAddUser(userInfoTable.getAddUser());
+        sysEmailSendEntity.setUsers(entity.getEmail());
+        sysEmailSendEntity.setEmailSendEnum(EmailSendEnum.FORGET_PASSWORD);
+        if (CountryUtil.isCN(userInfoTable.getLang())) {
+            sysEmailSendEntity.setTemplateName(GlobalSystemEmailCodeConstants.USER_UPDATE_PASSWORD_SEND_CN);
+        } else {
+            sysEmailSendEntity.setTemplateName(GlobalSystemEmailCodeConstants.USER_UPDATE_PASSWORD_SEND_EN);
+        }
+        sysEmailSendEntity.setMap(map);
+
+        return sysEmailSendEntity;
+    }
+
+    private UserInfoEntity transform(UserInfoTable userInfoTable, UserLoginEntity entity, UserRoleDto userRoleDto, UserDepartmentSearchDto userDepartmentSearchDto, UserGroupTable userGroupTable) {
+
+        UserInfoEntity infoEntity = new UserInfoEntity();
+        BeanUtils.copyProperties(userInfoTable, infoEntity);
+        if (userRoleDto != null) {
+            infoEntity.setRoleName(userRoleDto.getName());
+            infoEntity.setRoleCode(userRoleDto.getCode());
+        } else {
+            infoEntity.setRoleName(ManagerConstant.ROLE_CODE_SYSTEM);
+            infoEntity.setRoleCode(ManagerConstant.ROLE_CODE_SYSTEM);
+        }
+
+        infoEntity.setId(userInfoTable.getId());
+        infoEntity.setThisAddress(entity.getAddress());
+        infoEntity.setThisIp(entity.getIp());
+        infoEntity.setThisTime(entity.getTime());
+        infoEntity.setValid(userInfoTable.getValid() == null ? 0 : userInfoTable.getValid());
+
+        PrefixEnum prefixEnum;
+        switch (infoEntity.getRoleCode()) {
+            case ManagerConstant.ROLE_CODE_SYSTEM:
+                prefixEnum = PrefixEnum.PREFIX_SYSTEM;
+                infoEntity.setRoleId(0L);
+                break;
+            case ManagerConstant.ROLE_CODE_SALE:
+                prefixEnum = PrefixEnum.PREFIX_SALE;
+                break;
+            case ManagerConstant.ROLE_CODE_ADMIN:
+                prefixEnum = PrefixEnum.PREFIX_ADMIN;
+                break;
+            case ManagerConstant.ROLE_CODE_FINANCE:
+                prefixEnum = PrefixEnum.PREFIX_FINANCE;
+                break;
+            case ManagerConstant.ROLE_CODE_MARKET:
+                prefixEnum = PrefixEnum.PREFIX_MARKET;
+                break;
+            case ManagerConstant.ROLE_CODE_LEGAL_AFFAIRS:
+                prefixEnum = PrefixEnum.PREFIX_LEGAL_AFFAIRS;
+                break;
+            case ManagerConstant.ROLE_CODE_USER:
+                prefixEnum = PrefixEnum.PREFIX_USER;
+            default:
+                prefixEnum = PrefixEnum.PREFIX_USER;
+                break;
+        }
+        infoEntity.setPrefix(prefixEnum);
+
+        return infoEntity;
+    }
+
+
+    /**
+     * 转化(list转化为dtos)
+     *
+     * @param userInfoViews
+     * @return
+     */
+    private List<UserInfoSearchDto> transform(List<UserInfoView> userInfoViews) {
+
+        if (userInfoViews == null || userInfoViews.size() <= 0) {
+            return null;
+        }
+
+        List<UserInfoSearchDto> transform = new ArrayList<>(userInfoViews.size());
+        userInfoViews.forEach(value -> transform.add(transform(value)));
+
+        return transform;
+    }
+
+    /**
+     * 转化为dto
+     *
+     * @param userInfoView
+     * @return
+     */
+    private UserInfoSearchDto transform(UserInfoView userInfoView) {
+
+        UserInfoSearchDto userInfoSearchDto = new UserInfoSearchDto();
+
+        BeanUtils.copyProperties(userInfoView, userInfoSearchDto);
+
+        return userInfoSearchDto;
+    }
+
+    private void limitIp(String ip, UserInfoTable userInfoTable) throws ServiceException {
+        if (userInfoTable == null) {
+            throw ServiceException.exception(Constants.SYSTEM_ERROR);
+        }
+        if (userInfoTable.getIpLimit() == null || userInfoTable.getIpLimit().equals(0)) {
+            return;
+        }
+        /**
+         * 如果ip限制开启 则进行ip校验 如果记录上的ip限制地址不为空
+         */
+        if (!Strings.isNullOrEmpty(userInfoTable.getLimitIp())) {
+            /**
+             * 记录ip限制校验
+             */
+            if (!userInfoTable.getIpLimit().equals(ip)) {
+                throw ServiceException.exception(Constants.RESTRICTED_LOGIN);
+            }
+        } else {
+            boolean validateResult = sysIpLimitService.validatedIpExist(ip);
+            if (!validateResult) {
+                throw ServiceException.exception(Constants.RESTRICTED_LOGIN);
+            }
+        }
+    }
+
+    @Override
+    public PrefixEnum getPrefixEnum(Long roleId) throws ServiceException {
+        UserRoleDto userRoleDto;
+
+        userRoleDto = userRoleService.getRoleInfo(roleId);
+        if (userRoleDto == null) {
+            throw ServiceException.exception(Constants.SYSTEM_ERROR);
+        }
+        return getPrefixEnum(userRoleDto.getCode());
+    }
+
+    private PrefixEnum getPrefixEnum(String code) {
+        PrefixEnum prefixEnum;
+        switch (code) {
+            case ManagerConstant.ROLE_CODE_SYSTEM:
+                prefixEnum = PrefixEnum.PREFIX_SYSTEM;
+                break;
+            case ManagerConstant.ROLE_CODE_SALE:
+                prefixEnum = PrefixEnum.PREFIX_SALE;
+                break;
+            case ManagerConstant.ROLE_CODE_ADMIN:
+                prefixEnum = PrefixEnum.PREFIX_ADMIN;
+                break;
+            case ManagerConstant.ROLE_CODE_FINANCE:
+                prefixEnum = PrefixEnum.PREFIX_FINANCE;
+                break;
+            case ManagerConstant.ROLE_CODE_MARKET:
+                prefixEnum = PrefixEnum.PREFIX_MARKET;
+                break;
+            case ManagerConstant.ROLE_CODE_LEGAL_AFFAIRS:
+                prefixEnum = PrefixEnum.PREFIX_LEGAL_AFFAIRS;
+                break;
+            case ManagerConstant.ROLE_CODE_USER:
+                prefixEnum = PrefixEnum.PREFIX_USER;
+            default:
+                prefixEnum = PrefixEnum.PREFIX_USER;
+                break;
+        }
+        return prefixEnum;
+    }
+
+}

+ 59 - 0
crm-manager/src/main/java/com/crm/manager/service/impl/UserRoleDetailServiceImpl.java

@@ -0,0 +1,59 @@
+package com.crm.manager.service.impl;
+
+import com.crm.manager.dao.mapper.UserRoleDetailMapper;
+import com.crm.manager.dao.repository.UserRoleDetailRepository;
+import com.crm.rely.backend.core.pojo.table.UserRoleDetailTable;
+import com.crm.manager.service.UserRoleDetailService;
+import com.crm.rely.backend.core.exception.ServiceException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @author houn
+ */
+@SuppressWarnings("Duplicates")
+@Service
+public class UserRoleDetailServiceImpl implements UserRoleDetailService {
+
+    @Autowired
+    private UserRoleDetailRepository userRoleDetailRepository;
+
+    @Autowired
+    private UserRoleDetailMapper userRoleDetailMapper;
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class})
+    public void update(List<UserRoleDetailTable> sellerRoleDetailTables, Long roleId) throws ServiceException {
+
+        List<UserRoleDetailTable> deleteSellerRoleDetailTables = userRoleDetailMapper.findAllByRoleId(roleId);
+
+        if (deleteSellerRoleDetailTables != null && deleteSellerRoleDetailTables.size() > 0) {
+            userRoleDetailMapper.delete(deleteSellerRoleDetailTables);
+        }
+
+        if (sellerRoleDetailTables != null && sellerRoleDetailTables.size() > 0) {
+            userRoleDetailRepository.saveAll(sellerRoleDetailTables);
+        }
+    }
+
+    @Override
+    public List<UserRoleDetailTable> getUserRoleDetailsByRoleId(Long roleId) throws ServiceException {
+
+        List<UserRoleDetailTable> roleDetailTables = userRoleDetailRepository.findAllByRoleId(roleId);
+
+        return roleDetailTables;
+    }
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class})
+    public void deleteRoleDetailByRoleId(Long roleId) throws ServiceException {
+        List<UserRoleDetailTable> sellerRoleDetailTables = userRoleDetailRepository.findAllByRoleId(roleId);
+        if (sellerRoleDetailTables == null || sellerRoleDetailTables.size() == 0) {
+            return;
+        }
+        userRoleDetailRepository.deleteAll(sellerRoleDetailTables);
+    }
+}

+ 64 - 0
crm-manager/src/main/java/com/crm/manager/service/impl/UserRoleNodeServiceImpl.java

@@ -0,0 +1,64 @@
+package com.crm.manager.service.impl;
+
+import com.crm.manager.dao.mapper.UserRoleNodeMapper;
+import com.crm.rely.backend.core.exception.ServiceException;
+import com.crm.manager.dao.repository.UserRoleNodeRepository;
+import com.crm.manager.dao.mapper.SysNodeMapper;
+import com.crm.rely.backend.core.pojo.table.UserRoleNodeTable;
+import com.crm.rely.backend.core.pojo.view.SysNodeView;
+import com.crm.manager.service.UserRoleNodeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @author houn
+ */
+@Service
+public class UserRoleNodeServiceImpl implements UserRoleNodeService {
+
+    @Autowired
+    private UserRoleNodeRepository userRoleNodeRepository;
+
+    @Autowired
+    private UserRoleNodeMapper userRoleNodeMapper;
+
+    @Autowired
+    private SysNodeMapper shopNodeMapper;
+
+    @Override
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = {Exception.class})
+    public void update(List<UserRoleNodeTable> sellerRoleNodeTables, Long roleId) throws ServiceException {
+
+        List<UserRoleNodeTable> deleteSellerRoleDetailTables = userRoleNodeMapper.findAllByRoleId(roleId);
+
+        if (deleteSellerRoleDetailTables != null && deleteSellerRoleDetailTables.size() > 0) {
+            userRoleNodeMapper.delete(deleteSellerRoleDetailTables);
+        }
+        if (sellerRoleNodeTables != null && sellerRoleNodeTables.size() > 0) {
+            userRoleNodeRepository.saveAll(sellerRoleNodeTables);
+        }
+
+    }
+
+    @Override
+    public List<SysNodeView> getSysNodesByRoleId(Long roleId) throws ServiceException {
+
+        List<SysNodeView> sysNodeViews = shopNodeMapper.getSysNodesByRoleId(roleId);
+
+        return sysNodeViews;
+    }
+
+    @Override
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = {Exception.class})
+    public void deleteRoleNodeByRoleId(Long roleId) throws ServiceException {
+        List<UserRoleNodeTable> sellerRoleNodeTables = userRoleNodeRepository.findAllByRoleId(roleId);
+        if (sellerRoleNodeTables == null || sellerRoleNodeTables.size() == 0) {
+            return;
+        }
+        userRoleNodeRepository.deleteAll(sellerRoleNodeTables);
+    }
+}

+ 666 - 0
crm-manager/src/main/java/com/crm/manager/service/impl/UserRoleServiceImpl.java

@@ -0,0 +1,666 @@
+package com.crm.manager.service.impl;
+
+import com.crm.manager.dao.repository.SysActionRepository;
+import com.crm.manager.dao.repository.UserRoleRepository;
+import com.crm.manager.service.AuthorityService;
+import com.crm.manager.service.UserRoleDetailService;
+import com.crm.manager.service.UserRoleNodeService;
+import com.crm.manager.service.UserRoleService;
+import com.crm.rely.backend.core.constant.Constants;
+import com.crm.rely.backend.core.constant.ManagerConstant;
+import com.crm.rely.backend.core.constant.RoleConstants;
+import com.crm.rely.backend.core.dto.base.PageDto;
+import com.crm.rely.backend.core.dto.base.ResultWithPagerDto;
+import com.crm.rely.backend.core.dto.user.role.UserActionDisplayDto;
+import com.crm.rely.backend.core.dto.user.role.UserAllRoleDto;
+import com.crm.rely.backend.core.dto.user.role.UserNodeDisplayDto;
+import com.crm.rely.backend.core.dto.user.role.UserRoleDto;
+import com.crm.rely.backend.core.pojo.table.SysActionTable;
+import com.crm.rely.backend.core.pojo.table.UserRoleDetailTable;
+import com.crm.rely.backend.core.pojo.table.UserRoleNodeTable;
+import com.crm.rely.backend.core.pojo.table.UserRoleTable;
+import com.crm.rely.backend.core.pojo.view.SysNodeView;
+import com.crm.rely.backend.core.exception.ServiceException;
+import com.crm.rely.backend.model.constant.ManagerConstants;
+import com.crm.rely.backend.model.entity.user.role.*;
+import com.crm.rely.backend.service.RedisService;
+import com.crm.rely.backend.util.FormatPage;
+import com.crm.rely.backend.util.GetRandom;
+import com.crm.rely.backend.util.ValidateUtil;
+import com.google.common.base.Strings;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.persistence.criteria.Predicate;
+import java.util.*;
+
+
+/**
+ * @author houn
+ */
+@Service
+public class UserRoleServiceImpl implements UserRoleService {
+
+    @Autowired
+    private UserRoleRepository userRoleRepository;
+
+//    @Autowired
+//    private SellerInfoDao sellerInfoDao;
+
+    @Autowired
+    private UserRoleNodeService userRoleNodeService;
+
+    @Autowired
+    private UserRoleDetailService userRoleDetailService;
+
+    @Autowired
+    private SysActionRepository userActionRepository;
+
+    @Autowired
+    private RedisService redisService;
+
+    @Autowired
+    private AuthorityService authorityService;
+
+    /**
+     * 获取角色权限信息
+     *
+     * @param roleId
+     * @return
+     * @throws ServiceException
+     */
+    @Override
+    public List<UserNodeDisplayDto> getUserNodeDisplay(Long roleId) throws ServiceException {
+        /*
+         *  查询服务器中是否已存在角色信息
+         */
+        String key = null;
+        String roleUpdateRedisAuthorityIdentificationKey;
+        if (roleId == null || roleId == 0) {
+            key = RoleConstants.ROLE_USER_NODE + ManagerConstants.ROLE_USER_PREFIX + RoleConstants.ROLE_ADMIN;
+            roleUpdateRedisAuthorityIdentificationKey = Constants.UPDATE_REDIS_AUTHORITY_IDENTIFICATION + "_" + RoleConstants.ROLE_ADMIN;
+        } else {
+            key = RoleConstants.ROLE_USER_NODE + ManagerConstants.ROLE_USER_PREFIX + roleId;
+            roleUpdateRedisAuthorityIdentificationKey = Constants.UPDATE_REDIS_AUTHORITY_IDENTIFICATION + "_" + roleId;
+        }
+        //获取更新标识
+        String updateRedisAuthorityIdentification = redisService.getObject(Constants.UPDATE_REDIS_AUTHORITY_IDENTIFICATION);
+        if (Strings.isNullOrEmpty(updateRedisAuthorityIdentification)) {
+            updateRedisAuthorityIdentification = authorityService.updateRedisAuthorityIdentification();
+        }
+        //获取角色更新标识
+        String roleUpdateRedisAuthorityIdentification = redisService.getObject(roleUpdateRedisAuthorityIdentificationKey);
+        //判断更新标识是否存在 如果不存在或者存在且和角色更新标识相同的话 直接从redis中获取权限
+        if (!Strings.isNullOrEmpty(roleUpdateRedisAuthorityIdentification) && updateRedisAuthorityIdentification.equals(roleUpdateRedisAuthorityIdentification)) {
+            if (redisService.hasKey(key)) {
+                List<UserNodeDisplayDto> userNodeDisplayDtos = redisService.getObject(key);
+                if (userNodeDisplayDtos.size() != 0) {
+                    return userNodeDisplayDtos;
+                }
+            }
+        }
+        List<UserNodeDisplayDto> result = updateUserNode(roleId);
+        //更新角色更新标识
+        redisService.saveObject(roleUpdateRedisAuthorityIdentificationKey, updateRedisAuthorityIdentification);
+        return result;
+    }
+
+    /**
+     * 判断角色是否存在
+     *
+     * @param roleId
+     * @throws ServiceException
+     */
+    @Override
+    public void existRole(Long roleId) throws ServiceException {
+
+        boolean existRole = userRoleRepository.existsById(roleId);
+        if (!existRole) {
+            throw new ServiceException(ManagerConstant.ROLE_NOT_EXIST_ERROR);
+        }
+    }
+
+    /**
+     * 添加角色
+     *
+     * @param userRoleAddEntity
+     * @throws ServiceException
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void addRoleInfo(UserRoleAddEntity userRoleAddEntity) throws ServiceException {
+        if (userRoleRepository.existsByName(userRoleAddEntity.getName())) {
+            throw new ServiceException("该角色名已存在");
+        }
+
+        UserRoleTable userRoleTable = new UserRoleTable();
+
+        BeanUtils.copyProperties(userRoleAddEntity, userRoleTable);
+        userRoleTable.setNumber(0);
+        userRoleTable = userRoleRepository.saveAndFlush(userRoleTable);
+
+        UserRoleOperateListEntity sellerRoleOperateListEntity = new UserRoleOperateListEntity();
+        sellerRoleOperateListEntity.setModifyUser(userRoleAddEntity.getAddUser());
+        sellerRoleOperateListEntity.setModifyTime(userRoleAddEntity.getAddTime());
+        sellerRoleOperateListEntity.setModifyIp(userRoleAddEntity.getAddIp());
+        sellerRoleOperateListEntity.setDepartmentId(userRoleAddEntity.getDepartmentId());
+        sellerRoleOperateListEntity.setRoleId(userRoleTable.getId());
+        sellerRoleOperateListEntity.setData(userRoleAddEntity.getData());
+        updateRoleInfo(sellerRoleOperateListEntity);
+    }
+
+    /**
+     * 修改角色信息
+     *
+     * @param userRoleUpdateEntity
+     * @throws ServiceException
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateRoleInfo(UserRoleUpdateEntity userRoleUpdateEntity) throws ServiceException {
+
+        UserRoleTable userRoleTable = userRoleRepository.findById(userRoleUpdateEntity.getId()).orElse(null);
+        if (userRoleTable == null) {
+            throw new ServiceException(Constants.INFO_NOT_FOUND);
+        }
+        if (!userRoleTable.getName().equals(userRoleUpdateEntity.getName())) {
+            if (userRoleRepository.existsByName(userRoleUpdateEntity.getName())) {
+                throw new ServiceException("该角色名已存在");
+            }
+        }
+
+        BeanUtils.copyProperties(userRoleUpdateEntity, userRoleTable);
+
+        userRoleRepository.save(userRoleTable);
+
+        UserRoleOperateListEntity userRoleOperateListEntity = new UserRoleOperateListEntity();
+        userRoleOperateListEntity.setModifyUser(userRoleUpdateEntity.getModifyUser());
+        userRoleOperateListEntity.setModifyTime(userRoleUpdateEntity.getModifyTime());
+        userRoleOperateListEntity.setModifyIp(userRoleUpdateEntity.getModifyIp());
+        userRoleOperateListEntity.setRoleId(userRoleTable.getId());
+        userRoleOperateListEntity.setData(userRoleUpdateEntity.getData());
+        updateRoleInfo(userRoleOperateListEntity);
+    }
+
+    /**
+     * 修改权限
+     *
+     * @param userRoleOperateListEntity
+     * @throws ServiceException
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateRoleInfo(UserRoleOperateListEntity userRoleOperateListEntity) throws ServiceException {
+
+        if (userRoleOperateListEntity == null) {
+            return;
+        }
+        if (!userRoleRepository.existsById(userRoleOperateListEntity.getRoleId())) {
+            throw new ServiceException("当前角色不可修改!!!");
+        }
+        Long roleId = userRoleOperateListEntity.getRoleId();
+        List<UserRoleNodeTable> roleNodeTables = null;
+        List<UserRoleDetailTable> roleDetailTables = null;
+        List<UserRoleOperateEntity> userRoleOperateEntities = userRoleOperateListEntity.getData();
+        if (userRoleOperateEntities != null && userRoleOperateEntities.size() > 0) {
+            roleNodeTables = new ArrayList<>();
+            roleDetailTables = new ArrayList<>();
+
+            for (UserRoleOperateEntity userRoleOperateEntity : userRoleOperateEntities) {
+
+                //节点
+                if (userRoleOperateEntity.getType() == 0) {
+                    UserRoleNodeTable userRoleNodeTable = new UserRoleNodeTable();
+                    userRoleNodeTable.setNodeId(userRoleOperateEntity.getId());
+                    userRoleNodeTable.setRoleId(roleId);
+                    userRoleNodeTable.setAddIp(userRoleOperateListEntity.getModifyIp());
+                    userRoleNodeTable.setAddTime(userRoleOperateListEntity.getModifyTime());
+                    userRoleNodeTable.setAddUser(userRoleOperateListEntity.getModifyUser());
+                    roleNodeTables.add(userRoleNodeTable);
+                }
+                //按钮
+                else if (userRoleOperateEntity.getType() == 1) {
+                    UserRoleDetailTable userRoleDetailTable = new UserRoleDetailTable();
+                    userRoleDetailTable.setActionId(userRoleOperateEntity.getId());
+                    userRoleDetailTable.setNodeId(userRoleOperateEntity.getPid());
+                    userRoleDetailTable.setRoleId(roleId);
+                    userRoleDetailTable.setAddIp(userRoleOperateListEntity.getModifyIp());
+                    userRoleDetailTable.setAddTime(userRoleOperateListEntity.getModifyTime());
+                    userRoleDetailTable.setAddUser(userRoleOperateListEntity.getModifyUser());
+                    roleDetailTables.add(userRoleDetailTable);
+                }
+            }
+
+            for (UserRoleDetailTable pojo : roleDetailTables) {
+                boolean exist = false;
+                for (UserRoleNodeTable nodePojo : roleNodeTables) {
+                    if (pojo.getNodeId().equals(nodePojo.getId())) {
+                        exist = true;
+                        break;
+                    }
+                }
+                if (exist) {
+                    throw new RuntimeException(Constants.SYSTEM_ERROR);
+                }
+            }
+        }
+
+        /*
+         * 修改原有的角色信息
+         */
+        userRoleNodeService.update(roleNodeTables, roleId);
+
+        userRoleDetailService.update(roleDetailTables, roleId);
+
+        /*
+         * 更新内存中的角色信息
+         */
+        updateUserNode(roleId);
+    }
+
+    /**
+     * 删除角色
+     *
+     * @param roleId
+     * @throws ServiceException
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteRoleInfo(Long roleId) throws ServiceException {
+
+        UserRoleTable userRoleTable = userRoleRepository.findById(roleId).orElse(null);
+        if (userRoleTable == null) {
+            throw new ServiceException(Constants.INFO_NOT_FOUND);
+        }
+
+        /**
+         * 检测当前角色下存在用户
+         */
+//        int count = sellerInfoDao.countByRoleIdAndShopId(roleId, shopId);
+        int count = 0;
+        if (count >= 1) {
+            throw new SecurityException("角色下存在用户,不能删除!");
+        }
+        /*
+         * 删除数据库数据信息
+         */
+        userRoleNodeService.deleteRoleNodeByRoleId(roleId);
+        userRoleDetailService.deleteRoleDetailByRoleId(roleId);
+        userRoleRepository.delete(userRoleTable);
+
+        /**
+         * 删除redis中数据
+         */
+        String requestId = GetRandom.getRandom(10);
+        try {
+            if (redisService.tryLock(RoleConstants.ROLE_LOCK + ManagerConstants.ROLE_USER_PREFIX + roleId, requestId,
+                    RoleConstants.ROLE_LOCK_ESPIRE_TIME)) {
+                if (redisService.hasKey(RoleConstants.ROLE_USER_NODE + ManagerConstants.ROLE_USER_PREFIX + roleId)) {
+                    redisService.remove(RoleConstants.ROLE_USER_NODE + ManagerConstants.ROLE_USER_PREFIX + roleId);
+                }
+                if (redisService.hasKey(RoleConstants.ROLE_USER_ACTION + ManagerConstants.ROLE_USER_PREFIX + roleId)) {
+                    redisService.remove(RoleConstants.ROLE_USER_ACTION + ManagerConstants.ROLE_USER_PREFIX + roleId);
+                }
+            } else {
+                throw new ServiceException("当前角色权限正在修改,请稍后重试!!!");
+            }
+        } finally {
+            redisService.unlock(RoleConstants.ROLE_LOCK + ManagerConstants.ROLE_USER_PREFIX + roleId, requestId);
+        }
+
+    }
+
+    /**
+     * 获取单个角色信息
+     *
+     * @param roleId
+     * @return
+     * @throws ServiceException
+     */
+    @Override
+    public UserRoleDto getRoleInfo(Long roleId) throws ServiceException {
+        UserRoleTable userRoleTable = userRoleRepository.getFirstById(roleId);
+        if (userRoleTable == null) {
+            throw new ServiceException(Constants.INFO_NOT_FOUND);
+        }
+
+        return transform(userRoleTable);
+    }
+
+    /**
+     * 拉取角色列表
+     *
+     * @param userRoleSearchEntity
+     * @return
+     * @throws ServiceException
+     */
+    @Override
+    public ResultWithPagerDto<UserRoleDto> getListInfo(UserRoleSearchEntity userRoleSearchEntity) throws ServiceException {
+
+        Map<String, String> map = new LinkedHashMap<>(1);
+        map.put("addTime", "desc");
+        Pageable pageable = FormatPage.formatPageable(userRoleSearchEntity.getPage());
+        Specification<UserRoleTable> specification = (root, query, cb) -> {
+
+            List<Predicate> predicates = new ArrayList<>();
+
+            if (ValidateUtil.vStringNull(userRoleSearchEntity.getName())) {
+                predicates.add(cb.like(root.get("name").as(String.class), "%" + userRoleSearchEntity.getName() + "%"));
+            }
+            if (userRoleSearchEntity.getStartDate() != null) {
+                predicates.add(cb.greaterThan(root.get("addTime").as(Date.class), userRoleSearchEntity.getStartDate()));
+            }
+            if (userRoleSearchEntity.getStartDate() != null) {
+                predicates.add(cb.lessThanOrEqualTo(root.get("addTime").as(Date.class), userRoleSearchEntity.getEndDate()));
+            }
+            if (ValidateUtil.vStringNull(userRoleSearchEntity.getName())) {
+                predicates.add(cb.like(root.get("name").as(String.class), "%" + userRoleSearchEntity.getName() + "%"));
+            }
+            //创建一个条件的集合,长度为上面满足条件的个数
+            Predicate[] pre = new Predicate[predicates.size()];
+            //这句大概意思就是将上面拼接好的条件返回去
+            return query.where(predicates.toArray(pre)).getRestriction();
+        };
+        Page<UserRoleTable> pageResult = userRoleRepository.findAll(specification, pageable);
+        PageDto pageDto = FormatPage.format(userRoleSearchEntity.getPage(), (int) pageResult.getTotalElements());
+
+        if (pageResult.getTotalElements() <= 0) {
+            return new ResultWithPagerDto(Constants.SUCCESS_CODE, Constants.SEARCH_SUCCESS, null, pageDto);
+        }
+
+        List<UserRoleDto> dtos = new ArrayList<>();
+        for (UserRoleTable userRoleTable : pageResult.getContent()) {
+            dtos.add(transform(userRoleTable));
+        }
+
+        return new ResultWithPagerDto(Constants.SUCCESS_CODE, Constants.SEARCH_SUCCESS, dtos, pageDto);
+    }
+
+    /**
+     * 获取所有店铺下角色信息列表
+     *
+     * @return
+     * @throws ServiceException
+     */
+    @Override
+    public List<UserAllRoleDto> getListInfo() throws ServiceException {
+
+        List<UserRoleTable> roleTables = userRoleRepository.findAll();
+        List<UserAllRoleDto> allRoleDtos = new ArrayList<>();
+
+        for (UserRoleTable sellerRoleTable : roleTables) {
+            UserAllRoleDto shellerAllRoleDto = new UserAllRoleDto();
+            BeanUtils.copyProperties(sellerRoleTable, shellerAllRoleDto);
+            allRoleDtos.add(shellerAllRoleDto);
+        }
+
+        return allRoleDtos;
+    }
+
+    /**
+     * 更新挂靠用户的数量
+     *
+     * @param entitys
+     * @throws ServiceException
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateNumber(List<UserRoleUpdateNumberEntity> entitys) throws ServiceException {
+
+        if (entitys == null || entitys.size() <= 0) {
+            return;
+        }
+        List<Long> ids = new ArrayList<>(entitys.size());
+
+        Map<Long, UserRoleUpdateNumberEntity> map = new HashMap<>(entitys.size());
+
+        entitys.forEach(value -> {
+            ids.add(value.getId());
+            map.put(value.getId(), value);
+        });
+
+        List<UserRoleTable> userRoleTables = userRoleRepository.findAllByIdIn(ids);
+        if (userRoleTables == null || userRoleTables.size() <= 0) {
+            return;
+        }
+        userRoleTables.forEach(userRoleTable -> {
+            UserRoleUpdateNumberEntity userRoleUpdateNumberEntity = map.get(userRoleTable.getId());
+            BeanUtils.copyProperties(userRoleUpdateNumberEntity, userRoleTable);
+            int number = userRoleTable.getNumber() + userRoleUpdateNumberEntity.getChangeNumber();
+            if (number < 0) {
+                number = 0;
+            }
+            userRoleTable.setNumber(number);
+        });
+
+        userRoleRepository.saveAll(userRoleTables);
+    }
+
+    /**
+     * 更新挂靠用户的数量
+     *
+     * @param entity
+     * @throws ServiceException
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateNumber(UserRoleUpdateNumberEntity entity) throws ServiceException {
+
+        UserRoleTable userRoleTable = userRoleRepository.findFirstById(entity.getId());
+
+        if (userRoleTable == null) {
+            throw new ServiceException(ManagerConstant.ROLE_NOT_EXIST_ERROR);
+        }
+
+        BeanUtils.copyProperties(entity, userRoleTable);
+
+        userRoleRepository.save(userRoleTable);
+    }
+
+    private UserRoleDto transform(UserRoleTable sellerRoleTable) {
+        UserRoleDto shellerRoleDto = new UserRoleDto();
+        BeanUtils.copyProperties(sellerRoleTable, shellerRoleDto);
+        return shellerRoleDto;
+    }
+
+    /**
+     * 修改权限
+     *
+     * @param roleId
+     * @return
+     * @throws ServiceException
+     */
+    private List<UserNodeDisplayDto> updateUserNode(Long roleId) throws ServiceException {
+
+        /*
+         * 获取节点信息
+         */
+        List<SysNodeView> sysNodeViews = userRoleNodeService.getSysNodesByRoleId(roleId);
+
+        /*
+         * 获取按钮信息
+         */
+        List<SysActionTable> sysActionTables = userActionRepository.getAllByOrderByCode();
+
+//        if (sysActionTables == null || sysActionTables.size() == 0) {
+//            throw new RuntimeException("权限信息有误,请联系管理员");
+//        }
+        /*
+         * 获取详细信息
+         */
+        List<UserRoleDetailTable> roleDetailTables = new ArrayList<UserRoleDetailTable>();
+        if (sysActionTables != null || sysActionTables.size() >= 0) {
+            if (roleId != null && roleId != 0 && roleId != -1) {
+                roleDetailTables = userRoleDetailService.getUserRoleDetailsByRoleId(roleId);
+            } else {
+                if (roleId != -1) {
+                    for (SysActionTable sysActionTable : sysActionTables) {
+
+                        UserRoleDetailTable userRoleDetailTable = new UserRoleDetailTable();
+                        userRoleDetailTable.setActionId(sysActionTable.getId());
+                        userRoleDetailTable.setRoleId(null);
+                        userRoleDetailTable.setNodeId(sysActionTable.getNodeId());
+
+                        roleDetailTables.add(userRoleDetailTable);
+                    }
+                }
+            }
+        }
+
+        /*
+         *  整合节点权限信息
+         */
+        List<UserNodeDisplayDto> userNodeDisplayEntities = new ArrayList<UserNodeDisplayDto>();
+        if (sysNodeViews != null && sysNodeViews.size() > 0) {
+            for (SysNodeView sysNodeTable : sysNodeViews) {
+                if (sysNodeTable.getPid() == null || sysNodeTable.getPid() == 0) {
+                    UserNodeDisplayDto userNodeDisplayEntity = getUserNodeDisplayDto(sysNodeTable);
+                    recursion(sysNodeViews, sysActionTables, roleDetailTables, userNodeDisplayEntity);
+                    userNodeDisplayEntities.add(userNodeDisplayEntity);
+                }
+            }
+        }
+
+        /*
+         *  将结果存入redis中  redis记录简单加锁方式
+         */
+        String key;
+        if (roleId == null || roleId == 0) {
+            key = RoleConstants.ROLE_ADMIN;
+        } else {
+            key = roleId + "";
+        }
+
+        String requestId = System.currentTimeMillis() + "";
+        try {
+            if (redisService.tryLock(RoleConstants.ROLE_LOCK + ManagerConstants.ROLE_USER_PREFIX + key, requestId, RoleConstants.ROLE_LOCK_ESPIRE_TIME)) {
+                /*
+                 *  处理前端显示节点信息
+                 */
+                List<UserNodeDisplayDto> nodeList = new ArrayList<UserNodeDisplayDto>();
+                nodeList.addAll(userNodeDisplayEntities);
+                redisService.saveObject(RoleConstants.ROLE_USER_NODE + ManagerConstants.ROLE_USER_PREFIX + key, userNodeDisplayEntities);
+
+                /*
+                 * 处理后端角色判定信息
+                 */
+                List<String> actionList = new ArrayList<>();
+                for (UserRoleDetailTable userRoleDetailPojo : roleDetailTables) {
+                    for (SysActionTable sysActionPojo : sysActionTables) {
+                        if (userRoleDetailPojo.getActionId().equals(sysActionPojo.getId())) {
+                            actionList.add(sysActionPojo.getAction());
+                        }
+                    }
+                }
+                redisService.saveObject(RoleConstants.ROLE_USER_ACTION + ManagerConstants.ROLE_USER_PREFIX + key, actionList);
+            } else {
+                throw new ServiceException("当前角色权限正在修改,请稍后重试!!!");
+            }
+        } finally {
+            redisService.unlock(RoleConstants.ROLE_LOCK + ManagerConstants.ROLE_USER_PREFIX + key, requestId);
+        }
+        return userNodeDisplayEntities;
+    }
+
+    /**
+     * 递归节点信息,获取前台展示的节点数据
+     *
+     * @param sysNodeViews
+     * @param sysActionTables
+     * @param userRoleDetailTables
+     * @param userNodeDisplayDto
+     */
+    private void recursion(List<SysNodeView> sysNodeViews, List<SysActionTable> sysActionTables,
+                           List<UserRoleDetailTable> userRoleDetailTables, UserNodeDisplayDto userNodeDisplayDto) {
+        for (SysNodeView sysNodePojo : sysNodeViews) {
+            if (userNodeDisplayDto.getId().equals(sysNodePojo.getPid())) {
+                UserNodeDisplayDto child = getUserNodeDisplayDto(sysNodePojo);
+
+                Map<String, UserActionDisplayDto> userActionDisplayDtos = getUserActionDisplayDtos(sysActionTables, userRoleDetailTables, child.getId());
+                child.setBtns(userActionDisplayDtos);
+
+                userNodeDisplayDto.getChildren().add(child);
+                recursion(sysNodeViews, sysActionTables, userRoleDetailTables, child);
+            } else {
+                Map<String, UserActionDisplayDto> userActionDisplayDtos = getUserActionDisplayDtos(sysActionTables, userRoleDetailTables, userNodeDisplayDto.getId());
+                userNodeDisplayDto.setBtns(userActionDisplayDtos);
+            }
+        }
+    }
+
+    private Map<String, UserActionDisplayDto> getUserActionDisplayDtos(List<SysActionTable> sysActionTables, List<UserRoleDetailTable> userRoleDetailTables, Long nodeId) {
+
+        if (sysActionTables == null && sysActionTables.size() <= 0) {
+            return new HashMap<>(0);
+        }
+        Map<String, UserActionDisplayDto> userActionDisplayDtos = new HashMap<>(sysActionTables.size());
+        List<SysActionTable> removeSysActionTables = new ArrayList<>(sysActionTables.size());
+        int size = sysActionTables.size();
+
+        for (int i = 0; i < size; i++) {
+            SysActionTable sysActionPojo = sysActionTables.get(i);
+            if (sysActionPojo.getNodeId().equals(nodeId)) {
+                UserActionDisplayDto userActionDisplayDto = getUserActionDisplayDto(sysActionPojo, userRoleDetailTables, nodeId);
+                userActionDisplayDtos.put(userActionDisplayDto.getCode(), userActionDisplayDto);
+                removeSysActionTables.add(sysActionPojo);
+            }
+        }
+        if (removeSysActionTables.size() > 0) {
+            userRoleDetailTables.removeAll(removeSysActionTables);
+        }
+        return userActionDisplayDtos;
+    }
+
+    private UserActionDisplayDto getUserActionDisplayDto(SysActionTable sysActionTable, List<UserRoleDetailTable> userRoleDetailTables, Long nodeId) {
+        if (sysActionTable.getNodeId() != null && sysActionTable.getNodeId().equals(nodeId)) {
+            UserActionDisplayDto userActionDisplayDto = new UserActionDisplayDto();
+            userActionDisplayDto.setName(sysActionTable.getName());
+            userActionDisplayDto.setCode(sysActionTable.getCode());
+            userActionDisplayDto.setId(sysActionTable.getId());
+            userActionDisplayDto.setPid(sysActionTable.getNodeId());
+            userActionDisplayDto.setShow(false);
+            userActionDisplayDto.setTId(userActionDisplayDto.getId() + "-" + userActionDisplayDto.getType());
+            if (userRoleDetailTables != null && userRoleDetailTables.size() != 0) {
+                Iterator<UserRoleDetailTable> userRoleDetailPojoIterator = userRoleDetailTables.iterator();
+                while (userRoleDetailPojoIterator.hasNext()) {
+                    UserRoleDetailTable userRoleDetailPojo = userRoleDetailPojoIterator.next();
+                    if (userRoleDetailPojo.getNodeId().equals(nodeId)
+                            && userRoleDetailPojo.getActionId().equals(sysActionTable.getId())) {
+                        userActionDisplayDto.setShow(true);
+                    }
+                }
+            }
+            return userActionDisplayDto;
+        }
+        return null;
+    }
+
+    private UserNodeDisplayDto getUserNodeDisplayDto(SysNodeView sysNodeTable) {
+        UserNodeDisplayDto userNodeDisplayEntity = new UserNodeDisplayDto();
+        userNodeDisplayEntity.setName(sysNodeTable.getName());
+        userNodeDisplayEntity.setCode(sysNodeTable.getCode());
+        userNodeDisplayEntity.setIcon(sysNodeTable.getIcon());
+        userNodeDisplayEntity.setLink(sysNodeTable.getLink());
+        userNodeDisplayEntity.setId(sysNodeTable.getId());
+        userNodeDisplayEntity.setShow(sysNodeTable.getShow());
+        userNodeDisplayEntity.setPid(sysNodeTable.getPid());
+        userNodeDisplayEntity.setSubIndex(sysNodeTable.getSubIndex());
+        userNodeDisplayEntity.setTId(sysNodeTable.getId() + "-" + userNodeDisplayEntity.getType());
+        return userNodeDisplayEntity;
+    }
+
+    @Override
+    public String getRoleCodeById(Long id) throws ServiceException {
+
+        UserRoleTable userRoleTable = userRoleRepository.getOne(id);
+        if (userRoleTable == null) {
+            throw new ServiceException("info_not_found");
+        }
+        return userRoleTable.getCode();
+    }
+}

+ 109 - 0
crm-manager/src/main/java/com/crm/manager/service/impl/base/BaseUploadServiceImpl.java

@@ -0,0 +1,109 @@
+package com.crm.manager.service.impl.base;
+
+import com.crm.manager.service.SysConfigService;
+import com.crm.rely.backend.configuration.LocaleMessage;
+import com.crm.rely.backend.core.constant.Constants;
+import com.crm.rely.backend.core.constant.GlobalConfigConstants;
+import com.crm.rely.backend.core.exception.ServiceException;
+import com.crm.rely.backend.core.pojo.table.SysConfigTable;
+import com.crm.rely.backend.util.Base64Util;
+import com.crm.rely.backend.util.FileProcessUtil;
+import com.google.common.base.Strings;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class BaseUploadServiceImpl {
+    @Autowired
+    private LocaleMessage localeMessage;
+
+    @Autowired
+    private SysConfigService sysConfigService;
+
+    @Value("${web.upload-path:./upload}")
+    private String UPLOAD;
+
+    public void validated(MultipartFile file) throws ServiceException {
+        if (file == null) {
+            throw ServiceException.exception(localeMessage.getMessage(Constants.UPLOAD_FILE_NOT_NULL, Constants.UPLOAD_FILE_NOT_NULL));
+        }
+        List<String> codes = new ArrayList<>(2);
+        codes.add(GlobalConfigConstants.UPLOAD_SIZE_MAX);
+        codes.add(GlobalConfigConstants.UPLOAD_REGEX);
+        List<SysConfigTable> sysConfigTables = sysConfigService.getByCodes(codes);
+        if (sysConfigTables == null || sysConfigTables.size() != 2) {
+            throw ServiceException.exception(Constants.SYSTEM_ERROR);
+        }
+        int size = 0;
+        String regex = null;
+        for (SysConfigTable sysConfigTable : sysConfigTables) {
+            if (GlobalConfigConstants.UPLOAD_SIZE_MAX.equals(sysConfigTable.getCode())) {
+                try {
+                    size = Integer.parseInt(sysConfigTable.getValue());
+                } catch (NumberFormatException e) {
+                    throw new ServiceException(Constants.SYSTEM_ERROR);
+                }
+            } else if (GlobalConfigConstants.UPLOAD_REGEX.equals(sysConfigTable.getCode())) {
+                regex = sysConfigTable.getValue();
+            }
+        }
+
+        validated(file, size, regex);
+    }
+
+    public void validatedVideo(MultipartFile file) throws ServiceException {
+        if (file == null) {
+            throw ServiceException.exception(localeMessage.getMessage(Constants.UPLOAD_FILE_NOT_NULL, Constants.UPLOAD_FILE_NOT_NULL));
+        }
+        List<String> codes = new ArrayList<>(2);
+        codes.add(GlobalConfigConstants.UPLOAD_VIDEO_SIZE_MAX);
+        codes.add(GlobalConfigConstants.UPLOAD_VIDEO_REGEX);
+        List<SysConfigTable> sysConfigTables = sysConfigService.getByCodes(codes);
+        if (sysConfigTables == null || sysConfigTables.size() != 2) {
+            throw ServiceException.exception(Constants.SYSTEM_ERROR);
+        }
+        int size = 0;
+        String regex = null;
+        for (SysConfigTable sysConfigTable : sysConfigTables) {
+            if (GlobalConfigConstants.UPLOAD_VIDEO_SIZE_MAX.equals(sysConfigTable.getCode())) {
+                try {
+                    size = Integer.parseInt(sysConfigTable.getValue());
+                } catch (NumberFormatException e) {
+                    throw new ServiceException(Constants.SYSTEM_ERROR);
+                }
+            } else if (GlobalConfigConstants.UPLOAD_VIDEO_REGEX.equals(sysConfigTable.getCode())) {
+                regex = sysConfigTable.getValue();
+            }
+        }
+
+        validated(file, size, regex);
+    }
+
+    private void validated(MultipartFile file, int size, String regex) throws ServiceException {
+        //验证文件大小
+        if (file.getSize() > size * 1000 * 1024) {
+            throw new ServiceException(localeMessage.getMessage(Constants.UPLOAD_FILE_SIZE_MAX) + size + "MB");
+        }
+        //文件格式
+        String fileName = file.getOriginalFilename().toLowerCase();
+        if (!fileName
+                .substring(fileName.lastIndexOf(".") + 1, fileName.length())
+                .matches(regex)) {
+            throw ServiceException.exception(localeMessage.getMessage(Constants.UPLOAD_FILE_REGEX, Constants.UPLOAD_FILE_REGEX) + " " + regex);
+
+        }
+    }
+
+    protected String saveFile(String middlePath, MultipartFile file) {
+        if (!Strings.isNullOrEmpty(middlePath) && !middlePath.startsWith("/")) {
+            middlePath = "/" + middlePath;
+        }
+        String savePath = UPLOAD + (Strings.isNullOrEmpty(middlePath) ? ("/file/common/") : middlePath);
+
+        String path = FileProcessUtil.upload(file, savePath);
+        return (Strings.isNullOrEmpty(middlePath) ? ("/file/common/") : middlePath) + path;
+    }
+}

+ 39 - 0
crm-manager/src/main/resources/application-dev.yml

@@ -0,0 +1,39 @@
+spring:
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://103.214.175.29:28571/cwg_pay?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true&useSSL=false
+    username: root
+    password: NSH01Y0GTmUNjgg6xw80qg==
+  cloud:
+    client:
+      ip-address: 127.0.0.1
+  jpa:
+    database: MYSQL
+    hibernate:
+      naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy
+    show-sql: true
+  activemq:
+    broker-url: tcp://localhost:61616
+logging:
+  level:
+    com.crm.manager.dao.mapper: trace
+eureka:
+  instance:
+    prefer-ip-address: true
+    ip-address: ${spring.cloud.client.ip-address}
+    instance-id: ${spring.application.name}:${eureka.instance.ip-address}:${server.port}
+  client:
+    service-url:
+      defaultZone: http://admin:admin123456@localhost:17000/eureka
+web:
+  front-path: ./front
+  upload-path: ../upload
+ribbon:
+  ReadTimeout: 60000
+  ConnectTimeout: 60000
+role:
+  excludePathPatterns:
+    /**
+#logging:
+#  config: classpath:logback-dev.xml
+

+ 32 - 0
crm-manager/src/main/resources/application-ho.yml

@@ -0,0 +1,32 @@
+spring:
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://192.168.110.19:3306/cwg_pay?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&allowMultiQueries=true&useSSL=false
+    username: root
+    password: 123123
+  jpa:
+    database: MYSQL
+    hibernate:
+      naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy
+    show-sql: true
+  activemq:
+    broker-url: tcp://localhost:61616
+logging:
+  level:
+    com.crm.manager.dao.mapper: trace
+
+web:
+  front-path: ./front
+  upload-path: ./upload
+ribbon:
+  ReadTimeout: 60000
+  ConnectTimeout: 60000
+#role:
+#  excludePathPatterns:
+#    /**
+#login:
+#  excludePathPatterns:
+#    /**
+#logging:
+#  config: classpath:logback-dev.xml
+

+ 33 - 0
crm-manager/src/main/resources/application-hu.yml

@@ -0,0 +1,33 @@
+spring:
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://8.210.194.53:13542/crm_business?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&allowMultiQueries=true&useSSL=false
+    username: root
+    password: F28c49d8be
+  jpa:
+    database: MYSQL
+    hibernate:
+      naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy
+    show-sql: true
+  activemq:
+    broker-url: tcp://localhost:61616
+logging:
+  level:
+    com.crm.manager.dao.mapper: trace
+#  redis:
+#    host: 127.0.0.1
+
+web:
+  front-path: G:/crm/crm-back/crm-core/front
+  upload-path: D:\upload
+  export-path: D:/work/cwg/export
+eureka:
+  client:
+    serviceUrl:
+      defaultZone: http://admin:admin123456@localhost:7000/eureka
+ribbon:
+  ReadTimeout: 60000
+  ConnectTimeout: 60000
+#logging:
+#  config: classpath:logback-dev.xml
+

+ 28 - 0
crm-manager/src/main/resources/application-prod.yml

@@ -0,0 +1,28 @@
+spring:
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://localhost:18654/cwg_pay?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&allowMultiQueries=true&useSSL=false
+    username: pay_user
+    password: YcEWyqZTHWj8KvASB+gQ629m
+  jpa:
+    database: MYSQL
+    hibernate:
+      naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy
+    show-sql: true
+  activemq:
+    broker-url: tcp://localhost:61616
+  data:
+    redis:
+      host: 127.0.0.1
+eureka:
+  client:
+    serviceUrl:
+      defaultZone: http://admin:admin123456@localhost:7000/eureka
+  instance:
+    ip-address: localhost
+    instance-id: ${spring.application.name}:${eureka.instance.ip-address}:${server.port}
+login:
+  single-sign-on: true
+logging:
+  config: classpath:logback-prod.xml
+

+ 31 - 0
crm-manager/src/main/resources/application-test.yml

@@ -0,0 +1,31 @@
+spring:
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://localhost:28571/cwg_pay?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&allowMultiQueries=true&useSSL=false
+    username: root
+    password: NSH01Y0GTmUNjgg6xw80qg==
+  jpa:
+    database: MYSQL
+    hibernate:
+      naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy
+    show-sql: true
+logging:
+  level:
+    com.crm.manager.dao.mapper: trace
+  config: classpath:logback-prod.xml
+#  redis:
+#    host: 127.0.0.1
+eureka:
+  client:
+    serviceUrl:
+      defaultZone: http://admin:admin123456@localhost:7000/eureka
+login:
+  single-sign-on: true
+web:
+  upload-path: C:\server\cwg_crm\upload
+  export-path: C:\server\cwg_crm\export
+ribbon:
+  ReadTimeout: 60000
+  ConnectTimeout: 60000
+
+

+ 81 - 0
crm-manager/src/main/resources/application.yml

@@ -0,0 +1,81 @@
+server:
+  port: 15233
+spring:
+  profiles:
+    active: dev
+  application:
+    name: MANAGER-SERVICE
+mybatis:
+  type-aliases-package: com.crm.manager.pojo.view
+login:
+  excludePathPatterns:
+    /user/login,
+    /user/logout,
+    /user/switch/lang,
+    /user/update/password/send/email,
+    /user/update/email/password,
+    /market/upload/email/template/export,
+    /web/upload/cid/template/export,
+    /cooperative/partner/*/add,
+    /user/display/*,
+    /pay/order/create,
+    /pay/order/withdraw/create,
+    /pay/order/get,
+    /pay/order/submit,
+    /user/register,
+    /user/testKyc
+#  single-sign-on: true
+role:
+  googleVerified: false
+  excludePathPatterns:
+    /user/info,
+    /user/search/info,
+    /user/group/get,
+    /user/sales,
+    /user/update/login/password,
+    /user/role/search/list,
+    /account/deal/password/change/custom/searcher/list,
+    /account/deal/password/reset/custom/searcher/list,
+    /account/investor/password/change/custom/searcher/list,
+    /account/leverage/custom/searcher/list,
+    /account/*,
+    /department/search/list,
+    /custom/group/list,
+    /custom/group/type/list,
+    /custom/group/search/info,
+    /custom/login/search/info,
+    /control/panel/custom/dynamic,
+    /custom/search/real/single,
+    /country/get,
+    /control/panel/**,
+    /index/**,
+    /reasons/refusal/list,
+    /reasons/refusal/custom/list,
+    /push/message/custom/list,
+    /push/message/list,
+    /email/config/list,
+    /trade/**,
+    /trade/sharding/**,
+    /ib/report/*,
+    /ib/search/ib/single,
+    /ib/tree,
+    /ib/tree/**,
+    /ib/point,
+    /bank/custom/list,
+    /agent/point/change/list,
+    /account/belong/change/add,
+    /agent/belong/change/**,
+    /custom/update/ibInvalid,
+    /agent/balance/frozen/**,
+    /email/config/test/send,
+    /web/activity/dropdown,
+    /account/trading/activity/*,
+    /remittance/channel/get/code,
+    /common/upload,
+    /*/channel/get/code,
+    /risk/group/leverage/symbol/list,
+    /source/list,
+    /pay/order/withdraw/upload,
+    /pay/order/withdraw/*/upload,
+    /pay/order/withdraw/template/*/export,
+    /pay/info/get/list

+ 41 - 0
crm-manager/src/main/resources/i18n/messages.properties

@@ -0,0 +1,41 @@
+department_name_not_null_error=\u90E8\u95E8\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A
+department_name_is_exist_error=\u90E8\u95E8\u540D\u79F0\u5DF2\u5B58\u5728
+name_not_null=\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A
+role_name_not_null_error=\u89D2\u8272\u540D\u4E0D\u80FD\u4E3A\u7A7A
+role_not_null_error=\u89D2\u8272\u4E0D\u80FD\u4E3A\u7A7A
+role_not_exist_error=\u89D2\u8272\u4E0D\u5B58\u5728
+config_code_not_null=\u914D\u7F6Ecode\u4E0D\u80FD\u4E3A\u7A7A
+config_code_exist=\u914D\u7F6Ecode\u5DF2\u5B58\u5728
+config_pwd_error=\u914D\u7F6E\u5BC6\u7801\u9A8C\u8BC1\u9519\u8BEF
+email_code_not_null=\u90AE\u4EF6code\u4E0D\u80FD\u4E3A\u7A7A
+email_code_exist=\u90AE\u4EF6code\u5DF2\u5B58\u5728
+email_name_not_null=\u90AE\u4EF6\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A
+email_subject_not_null=\u90AE\u4EF6\u6807\u9898\u4E0D\u80FD\u4E3A\u7A7A
+email_content_not_null=\u90AE\u4EF6\u5185\u5BB9\u4E0D\u80FD\u4E3A\u7A7A
+email_type_not_null=\u90AE\u4EF6\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A
+remittance_channel_code_not_null=\u5165\u91D1\u901A\u9053code\u4E0D\u80FD\u4E3A\u7A7A
+remittance_channel_code_exist=\u5165\u91D1\u901A\u9053code\u5DF2\u5B58\u5728
+remittance_channel_name_not_null=\u5165\u91D1\u901A\u9053\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A
+remittance_channel_request_url_not_null=\u5165\u91D1\u901A\u9053\u8BF7\u6C42\u8DEF\u7531\u5730\u5740\u4E0D\u80FD\u4E3A\u7A7A
+remittance_channel_property_not_null=\u5165\u91D1\u901A\u9053\u914D\u7F6E\u4FE1\u606F\u4E0D\u80FD\u4E3A\u7A7A
+remittance_channel_Icon_not_null=\u5165\u91D1\u901A\u9053icon\u4E0D\u80FD\u4E3A\u7A7A
+remittance_channel_introduce_not_null=\u5165\u91D1\u901A\u9053\u4ECB\u7ECD\u4E0D\u80FD\u4E3A\u7A7A
+remittance_channel_banks_not_null=\u5165\u91D1\u901A\u9053\u94F6\u884C(\u8D27\u5E01)\u5217\u8868\u4E0D\u80FD\u4E3A\u7A7A
+remit_channel_code_not_null=\u51FA\u91D1\u901A\u9053code\u4E0D\u80FD\u4E3A\u7A7A
+remit_channel_code_exist=\u51FA\u91D1\u901A\u9053code\u5DF2\u5B58\u5728
+remit_channel_name_not_null=\u51FA\u91D1\u901A\u9053\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A
+remit_channel_request_url_not_null=\u51FA\u91D1\u901A\u9053\u8BF7\u6C42\u8DEF\u7531\u5730\u5740\u4E0D\u80FD\u4E3A\u7A7A
+remit_channel_Icon_not_null=\u51FA\u91D1\u901A\u9053icon\u4E0D\u80FD\u4E3A\u7A7A
+remit_channel_introduce_not_null=\u51FA\u91D1\u901A\u9053\u4ECB\u7ECD\u4E0D\u80FD\u4E3A\u7A7A
+remit_channel_banks_not_null=\u51FA\u91D1\u901A\u9053\u94F6\u884C(\u8D27\u5E01)\u5217\u8868\u4E0D\u80FD\u4E3A\u7A7A
+role_code_not_null_error=\u89D2\u8272code\u4E0D\u80FD\u4E3A\u7A7A
+role_code_not_admin_error=\u89D2\u8272code\u4E0D\u80FD\u4E3A\u8D85\u7EA7\u7BA1\u7406\u5458
+custom_group_code_not_null=\u7EC4\u522B\u6807\u8BC6\u4E0D\u80FD\u4E3A\u7A7A
+custom_group_code_is_exist=\u7EC4\u522B\u6807\u8BC6\u5DF2\u5B58\u5728
+custom_group_name_not_null=\u7EC4\u522B\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A
+custom_group_type_not_null=\u7EC4\u522B\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A
+custom_group_com_point_not_null=\u7EC4\u522B\u4F63\u91D1\u4E0D\u80FD\u4E3A\u7A7A
+custom_group_pos_not_null=\u7EC4\u522BA/B\u4ED3\u4E0D\u80FD\u4E3A\u7A7A
+custom_group_hide_not_null=\u7EC4\u522BHIDE\u4E0D\u80FD\u4E3A\u7A7A
+custom_group_currency_not_null=\u7EC4\u522B\u8D27\u5E01\u4E0D\u80FD\u4E3A\u7A7A
+markets_email_interval_error=\u8425\u9500\u90AE\u4EF6\u53D1\u9001\u9891\u7E41

+ 43 - 0
crm-manager/src/main/resources/i18n/messages_en_US.properties

@@ -0,0 +1,43 @@
+department_name_not_null_error=Department name cannot be empty
+department_name_is_exist_error=Department name already exists
+name_not_null=The name cannot be empty
+role_name_not_null_error=Role name cannot be empty
+role_not_null_error=Role cannot be empty
+role_not_exist_error=The role does not exist
+config_code_not_null=Configuration code cannot be empty
+config_code_exist=Configuration code already exists
+config_pwd_error=Configuration password validation error
+email_code_not_null=Email code cannot be empty
+email_code_exist=Message code already exists
+email_name_not_null=The message name cannot be empty
+email_subject_not_null=Email Subject cannot be empty
+email_content_not_null=Email content cannot be empty
+email_type_not_null=Email type cannot be empty
+remittance_channel_code_not_null=Deposit channel code cannot be empty
+remittance_channel_code_exist=Deposit channel code already exists
+remittance_channel_name_not_null=Deposit channel name cannot be empty
+remittance_channel_request_url_not_null=Deposit channel request routing address cannot be empty
+remittance_channel_property_not_null=Deposit channel configuration information cannot be empty
+remittance_channel_Icon_not_null=Deposit channel icon cannot be empty
+remittance_channel_introduce_not_null=Deposit channel description cannot be empty
+remittance_channel_banks_not_null=Deposit channel Bank (currency) list cannot be empty
+remit_channel_code_not_null=Withdrawal channel code cannot be empty
+remit_channel_code_exist=Withdrawal channel code already exists
+remit_channel_name_not_null=Withdrawal channel name cannot be empty
+remit_channel_request_url_not_null=Withdrawal channel request routing address cannot be empty
+remit_channel_Icon_not_null=Withdrawal channel icon cannot be empty
+remit_channel_introduce_not_null=Withdrawal channel description cannot be empty
+remit_channel_banks_not_null=Withdrawal channel Bank (currency) list cannot be empty
+role_code_not_null_error=Role code cannot be empty
+role_code_not_admin_error=Role code cannot be super administrator
+custom_group_code_not_null=Group ID cannot be empty
+custom_group_code_is_exist=Group ID already exists
+custom_group_name_not_null=Group name cannot be empty
+custom_group_type_not_null=Group type cannot be empty
+custom_group_com_point_not_null=Group Commission cannot be empty
+custom_group_pos_not_null=Group A / b position cannot be empty
+custom_group_hide_not_null=Group HIDE cannot be empty
+custom_group_currency_not_null=Group currency cannot be empty
+positive=Positive
+negative=Negative
+markets_email_interval_error=Frequent marketing emails

+ 42 - 0
crm-manager/src/main/resources/i18n/messages_vn_VN.properties

@@ -0,0 +1,42 @@
+department_name_not_null_error=Department name cannot be empty
+department_name_is_exist_error=Department name already exists
+name_not_null=The name cannot be empty
+role_name_not_null_error=Role name cannot be empty
+role_not_null_error=Role cannot be empty
+role_not_exist_error=The role does not exist
+config_code_not_null=Configuration code cannot be empty
+config_code_exist=Configuration code already exists
+config_pwd_error=Configuration password validation error
+email_code_not_null=Email code cannot be empty
+email_code_exist=Message code already exists
+email_name_not_null=The message name cannot be empty
+email_subject_not_null=Email Subject cannot be empty
+email_content_not_null=Email content cannot be empty
+email_type_not_null=Email type cannot be empty
+remittance_channel_code_not_null=Deposit channel code cannot be empty
+remittance_channel_code_exist=Deposit channel code already exists
+remittance_channel_name_not_null=Deposit channel name cannot be empty
+remittance_channel_request_url_not_null=Deposit channel request routing address cannot be empty
+remittance_channel_property_not_null=Deposit channel configuration information cannot be empty
+remittance_channel_Icon_not_null=Deposit channel icon cannot be empty
+remittance_channel_introduce_not_null=Deposit channel description cannot be empty
+remittance_channel_banks_not_null=Deposit channel Bank (currency) list cannot be empty
+remit_channel_code_not_null=Withdrawal channel code cannot be empty
+remit_channel_code_exist=Withdrawal channel code already exists
+remit_channel_name_not_null=Withdrawal channel name cannot be empty
+remit_channel_request_url_not_null=Withdrawal channel request routing address cannot be empty
+remit_channel_Icon_not_null=Withdrawal channel icon cannot be empty
+remit_channel_introduce_not_null=Withdrawal channel description cannot be empty
+remit_channel_banks_not_null=Withdrawal channel Bank (currency) list cannot be empty
+role_code_not_null_error=Role code cannot be empty
+role_code_not_admin_error=Role code cannot be super administrator
+custom_group_code_not_null=Group ID cannot be empty
+custom_group_code_is_exist=Group ID already exists
+custom_group_name_not_null=Group name cannot be empty
+custom_group_type_not_null=Group type cannot be empty
+custom_group_com_point_not_null=Group Commission cannot be empty
+custom_group_pos_not_null=Group A / b position cannot be empty
+custom_group_hide_not_null=Group HIDE cannot be empty
+custom_group_currency_not_null=Group currency cannot be empty
+positive=Positive
+negative=Negative

+ 43 - 0
crm-manager/src/main/resources/i18n/messages_zh_CN.properties

@@ -0,0 +1,43 @@
+department_name_not_null_error=\u90E8\u95E8\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A
+department_name_is_exist_error=\u90E8\u95E8\u540D\u79F0\u5DF2\u5B58\u5728
+name_not_null=\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A
+role_name_not_null_error=\u89D2\u8272\u540D\u4E0D\u80FD\u4E3A\u7A7A
+role_not_null_error=\u89D2\u8272\u4E0D\u80FD\u4E3A\u7A7A
+role_not_exist_error=\u89D2\u8272\u4E0D\u5B58\u5728
+config_code_not_null=\u914D\u7F6Ecode\u4E0D\u80FD\u4E3A\u7A7A
+config_code_exist=\u914D\u7F6Ecode\u5DF2\u5B58\u5728
+config_pwd_error=\u914D\u7F6E\u5BC6\u7801\u9A8C\u8BC1\u9519\u8BEF
+email_code_not_null=\u90AE\u4EF6code\u4E0D\u80FD\u4E3A\u7A7A
+email_code_exist=\u90AE\u4EF6code\u5DF2\u5B58\u5728
+email_name_not_null=\u90AE\u4EF6\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A
+email_subject_not_null=\u90AE\u4EF6\u6807\u9898\u4E0D\u80FD\u4E3A\u7A7A
+email_content_not_null=\u90AE\u4EF6\u5185\u5BB9\u4E0D\u80FD\u4E3A\u7A7A
+email_type_not_null=\u90AE\u4EF6\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A
+remittance_channel_code_not_null=\u5165\u91D1\u901A\u9053code\u4E0D\u80FD\u4E3A\u7A7A
+remittance_channel_code_exist=\u5165\u91D1\u901A\u9053code\u5DF2\u5B58\u5728
+remittance_channel_name_not_null=\u5165\u91D1\u901A\u9053\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A
+remittance_channel_request_url_not_null=\u5165\u91D1\u901A\u9053\u8BF7\u6C42\u8DEF\u7531\u5730\u5740\u4E0D\u80FD\u4E3A\u7A7A
+remittance_channel_property_not_null=\u5165\u91D1\u901A\u9053\u914D\u7F6E\u4FE1\u606F\u4E0D\u80FD\u4E3A\u7A7A
+remittance_channel_Icon_not_null=\u5165\u91D1\u901A\u9053icon\u4E0D\u80FD\u4E3A\u7A7A
+remittance_channel_introduce_not_null=\u5165\u91D1\u901A\u9053\u4ECB\u7ECD\u4E0D\u80FD\u4E3A\u7A7A
+remittance_channel_banks_not_null=\u5165\u91D1\u901A\u9053\u94F6\u884C(\u8D27\u5E01)\u5217\u8868\u4E0D\u80FD\u4E3A\u7A7A
+remit_channel_code_not_null=\u51FA\u91D1\u901A\u9053code\u4E0D\u80FD\u4E3A\u7A7A
+remit_channel_code_exist=\u51FA\u91D1\u901A\u9053code\u5DF2\u5B58\u5728
+remit_channel_name_not_null=\u51FA\u91D1\u901A\u9053\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A
+remit_channel_request_url_not_null=\u51FA\u91D1\u901A\u9053\u8BF7\u6C42\u8DEF\u7531\u5730\u5740\u4E0D\u80FD\u4E3A\u7A7A
+remit_channel_Icon_not_null=\u51FA\u91D1\u901A\u9053icon\u4E0D\u80FD\u4E3A\u7A7A
+remit_channel_introduce_not_null=\u51FA\u91D1\u901A\u9053\u4ECB\u7ECD\u4E0D\u80FD\u4E3A\u7A7A
+remit_channel_banks_not_null=\u51FA\u91D1\u901A\u9053\u94F6\u884C(\u8D27\u5E01)\u5217\u8868\u4E0D\u80FD\u4E3A\u7A7A
+role_code_not_null_error=\u89D2\u8272code\u4E0D\u80FD\u4E3A\u7A7A
+role_code_not_admin_error=\u89D2\u8272code\u4E0D\u80FD\u4E3A\u8D85\u7EA7\u7BA1\u7406\u5458
+custom_group_code_not_null=\u7EC4\u522B\u6807\u8BC6\u4E0D\u80FD\u4E3A\u7A7A
+custom_group_code_is_exist=\u7EC4\u522B\u6807\u8BC6\u5DF2\u5B58\u5728
+custom_group_name_not_null=\u7EC4\u522B\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A
+custom_group_type_not_null=\u7EC4\u522B\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A
+custom_group_com_point_not_null=\u7EC4\u522B\u4F63\u91D1\u4E0D\u80FD\u4E3A\u7A7A
+custom_group_pos_not_null=\u7EC4\u522BA/B\u4ED3\u4E0D\u80FD\u4E3A\u7A7A
+custom_group_hide_not_null=\u7EC4\u522BHIDE\u4E0D\u80FD\u4E3A\u7A7A
+custom_group_currency_not_null=\u7EC4\u522B\u8D27\u5E01\u4E0D\u80FD\u4E3A\u7A7A
+positive=\u662F
+negative=\u5426
+markets_email_interval_error=\u8425\u9500\u90AE\u4EF6\u53D1\u9001\u9891\u7E41

+ 57 - 0
crm-manager/src/main/resources/logback-dev.xml

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<configuration>
+    <property name="LOG_HOME" value="../log/paymanager"/>
+
+    <appender name="errorFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+
+            <fileNamePattern>${LOG_HOME}/errorFile.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <maxHistory>30</maxHistory>
+        </rollingPolicy>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{35} - %msg%n</pattern>0
+        </encoder>
+    </appender>
+    <appender name="infoFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>INFO</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>-
+        </filter>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_HOME}/infoFile.%d{yyyy-MM-dd}.log</fileNamePattern>
+
+            <maxHistory>30</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{35} - %msg%n</pattern>
+        </encoder>
+    </appender>
+    <appender name="consoleFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>CONSOLE</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+
+            <fileNamePattern>${LOG_HOME}/consoleFile.%d{yyyy-MM-dd}.log</fileNamePattern>
+
+            <maxHistory>30</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{35} - %msg%n</pattern>
+        </encoder>
+    </appender>
+    <root additivity="false">
+        <level value="CONSOLE"></level>
+        <appender-ref ref="consoleFile" />
+        <appender-ref ref="infoFile" />
+        <appender-ref ref="errorFile" />
+    </root>
+</configuration>

+ 57 - 0
crm-manager/src/main/resources/logback-prod.xml

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<configuration>
+    <property name="LOG_HOME" value="../log/paymanager"/>
+
+    <appender name="errorFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+
+            <fileNamePattern>${LOG_HOME}/error/errorFile.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <maxHistory>30</maxHistory>
+        </rollingPolicy>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{35} - %msg%n</pattern>0
+        </encoder>
+    </appender>
+    <appender name="infoFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>INFO</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>-
+        </filter>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_HOME}/info/infoFile.%d{yyyy-MM-dd}.log</fileNamePattern>
+
+            <maxHistory>30</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{35} - %msg%n</pattern>
+        </encoder>
+    </appender>
+    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_HOME}/hibernate/logback.%d{yyyy-MM-dd}.log</fileNamePattern>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+        </encoder>
+    </appender>
+    <logger name="org.hibernate.SQL" additivity="false" >
+        <level value="DEBUG" />
+        <appender-ref ref="file" />
+    </logger>
+    <logger name="org.hibernate.type.descriptor.sql.BasicBinder" additivity="false" level="TRACE" >
+        <level value="TRACE" />
+        <appender-ref ref="file" />
+    </logger>
+    <root additivity="false">
+        <level value="info"></level>
+        <appender-ref ref="infoFile" />
+        <appender-ref ref="errorFile" />
+        <appender-ref ref="file" />
+    </root>
+</configuration>

+ 32 - 0
crm-manager/src/main/resources/mapper/SysConfigMapper.xml

@@ -0,0 +1,32 @@
+<?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.crm.manager.dao.mapper.SysConfigMapper">
+
+    <select id="countList" resultType="integer"
+            parameterType="com.crm.rely.backend.core.entity.system.config.SysConfigSearchEntity">
+
+        select count(*) from sys_config
+        <where>
+            <if test="code!=null and code!=''">
+                and code=#{code}
+            </if>
+        </where>
+
+    </select>
+
+    <select id="pageList" resultType="com.crm.rely.backend.core.pojo.table.SysConfigTable"
+            parameterType="com.crm.rely.backend.core.entity.system.config.SysConfigSearchEntity">
+
+        select * from sys_config
+        <where>
+            <if test="code!=null and code!=''">
+                and code=#{code}
+            </if>
+        </where>
+        limit #{page.offset},#{page.row}
+    </select>
+
+
+</mapper>

+ 33 - 0
crm-manager/src/main/resources/mapper/SysIpLimitMapper.xml

@@ -0,0 +1,33 @@
+<?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.crm.manager.dao.mapper.SysIpLimitMapper">
+
+    <select id="countList" resultType="integer"
+            parameterType="com.crm.rely.backend.core.entity.system.ip.SysIpLimitSearchEntity">
+
+        select count(*) from sys_ip_limit
+        <where>
+            <if test="ip!=null">
+                ip like concat("%",#{ip},"%")
+            </if>
+        </where>
+    </select>
+
+    <select id="pageList" resultType="com.crm.rely.backend.core.pojo.table.SysIpLimitTable"
+            parameterType="com.crm.rely.backend.core.entity.system.ip.SysIpLimitSearchEntity">
+        select * from sys_ip_limit
+        <where>
+            <if test="ip!=null">
+                ip like concat("%",#{ip},"%")
+            </if>
+        </where>
+        order by  add_time desc
+        <if test="page!=null">
+            limit #{page.offset},#{page.row}
+        </if>
+    </select>
+
+
+</mapper>

+ 39 - 0
crm-manager/src/main/resources/mapper/SysNodeMapper.xml

@@ -0,0 +1,39 @@
+<?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.crm.manager.dao.mapper.SysNodeMapper">
+
+    <select id="getSysNodesByRoleId" resultType="com.crm.rely.backend.core.pojo.view.SysNodeView" parameterType="Long">
+        SELECT
+        sys_node.id as id,
+        `code`,
+        `name`,
+        pid,
+        link,
+        icon,
+        sub_index,
+        <if test="roleId!=null and roleId!=0 and roleId!=-1">
+            (CASE WHEN user_role_node.id IS NULL THEN FALSE ELSE TRUE END) `show`
+        </if>
+        <if test="roleId==-1">
+            false as `show`
+        </if>
+        <if test="roleId==null or roleId==0">
+            TRUE as `show`
+        </if>
+        FROM sys_node
+        <if test="roleId!=null and roleId!=0 and roleId!=-1">
+            LEFT JOIN user_role_node on sys_node.id = user_role_node.node_id and user_role_node.role_id =
+            #{roleId}
+        </if>
+        WHERE sys_node.valid = 1
+        group by id
+        ORDER BY sys_node.sub_index,id
+    </select>
+
+
+    <select id="findAllByRoleId" resultType="com.crm.rely.backend.core.pojo.table.SysNodeTable">
+        select  * from  sys_node
+    </select>
+</mapper>

+ 49 - 0
crm-manager/src/main/resources/mapper/SysReasonsRefusalMapper.xml

@@ -0,0 +1,49 @@
+<?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.crm.manager.dao.mapper.SysReasonsRefusalMapper">
+
+    <select id="countList" resultType="integer"
+            parameterType="com.crm.rely.backend.core.entity.system.reasons.refusal.SysReasonsRefusalSearchPageEntity">
+
+        select count(*) from sys_reasons_refusal
+        <where>
+            <if test="type!=null">
+                and `type`=#{type}
+            </if>
+        </where>
+
+    </select>
+
+    <select id="searchPageList" resultType="com.crm.rely.backend.core.pojo.table.SysReasonsRefusalTable"
+            parameterType="com.crm.rely.backend.core.entity.system.reasons.refusal.SysReasonsRefusalSearchPageEntity">
+
+        select * from sys_reasons_refusal
+        <where>
+            <if test="type!=null">
+                and `type`=#{type}
+            </if>
+        </where>
+        order by sub_index
+        <if test="page!=null">
+            limit #{page.offset},#{page.row}
+        </if>
+
+    </select>
+
+    <select id="searchList" resultType="com.crm.rely.backend.core.pojo.table.SysReasonsRefusalTable"
+            parameterType="com.crm.rely.backend.core.entity.system.reasons.refusal.SysReasonsRefusalSearchEntity">
+
+        select * from sys_reasons_refusal
+        <where>
+            <if test="type!=null">
+                and `type` in(#{type},-1)
+            </if>
+        </where>
+        order by `type` desc, sub_index
+
+    </select>
+
+
+</mapper>

+ 156 - 0
crm-manager/src/main/resources/mapper/UserInfoDao.xml

@@ -0,0 +1,156 @@
+<?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.crm.manager.dao.mapper.UserInfoDao">
+
+    <select id="getStampById" parameterType="Long" resultType="String">
+        select stamp
+        from user_info
+        where id=#{id}
+    </select>
+
+    <select id="getStampListByIds" parameterType="java.util.List" resultType="String">
+        select stamp
+        from user_info
+        where id in
+        <foreach collection="list" index="idx" item="item" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
+
+    <select id="searchByPageList" parameterType="com.crm.rely.backend.model.entity.user.info.UserInfoSearchEntity"
+            resultType="com.crm.rely.backend.model.pojo.view.UserInfoView">
+        SELECT user_info.*,
+        user_group.`name` AS group_name,
+        user_group.en_name AS group_en_name,
+        user_role.`name` as role_name
+        FROM user_info
+        LEFT JOIN user_group ON user_group.id= user_info.group_id
+        LEFT JOIN user_role ON user_role.id =user_info.role_id
+        where user_info.role_id!=-1
+        <if test="name!=null and name!=''">
+            and user_info.name like binary concat('%',#{name},'%')
+        </if>
+        <if test="username!=null and username!=''">
+            and user_info.username like binary concat('%',#{username},'%')
+        </if>
+        <if test="email!=null and email!=''">
+            and user_info.email like binary concat('%',#{email},'%')
+        </if>
+        <if test="ibNo!=null and ibNo!=''">
+            and user_info.ib_no like binary concat('%',#{ibNo},'%')
+        </if>
+        <if test="roleId!=null">
+            and user_info.role_id =#{roleId}
+        </if>
+        <if test="valid!=null">
+            and user_info.valid =#{valid}
+        </if>
+        <if test="startDate != null">
+            AND user_info.add_time>#{startDate}
+        </if>
+        <if test="endDate != null">
+            AND #{endDate}>user_info.add_time
+        </if>
+        order by id desc
+        <if test="page != null">
+            limit #{page.offset},#{page.row}
+        </if>
+    </select>
+
+    <select id="searchByPageCount" parameterType="com.crm.rely.backend.model.entity.user.info.UserInfoSearchEntity"
+            resultType="integer">
+        SELECT count(user_info.id)
+        FROM user_info
+        where user_info.role_id!=-1
+        <if test="name!=null and name!=''">
+            and user_info.name like binary concat('%',#{name},'%')
+        </if>
+        <if test="username!=null and username!=''">
+            and user_info.username like binary concat('%',#{username},'%')
+        </if>
+        <if test="email!=null and email!=''">
+            and user_info.email like binary concat('%',#{email},'%')
+        </if>
+        <if test="ibNo!=null and ibNo!=''">
+            and user_info.ib_no like binary concat('%',#{ibNo},'%')
+        </if>
+        <if test="roleId!=null">
+            and user_info.role_id =#{roleId}
+        </if>
+        <if test="valid!=null">
+            and user_info.valid =#{valid}
+        </if>
+        <if test="startDate != null">
+            AND user_info.add_time>#{startDate}
+        </if>
+        <if test="endDate != null">
+            AND #{endDate}>user_info.add_time
+        </if>
+
+    </select>
+    <select id="getOne" resultType="com.crm.rely.backend.model.pojo.view.UserInfoView">
+        SELECT user_info.*,
+        user_group.`name` AS group_name,
+        user_group.en_name AS group_en_name,
+        user_role.`name` as role_name,user_role.department_id
+         FROM user_info
+        LEFT JOIN user_group ON user_group.id= user_info.group_id
+        LEFT JOIN user_role ON user_role.id =user_info.role_id
+        where user_info.id=#{id}
+    </select>
+
+    <select id="findAllByRoleCode"
+            parameterType="String"
+            resultType="com.crm.rely.backend.model.pojo.table.UserInfoTable">
+        select sales.id,sales.`name`,sales.email,sales.ib_no
+        from user_info sales
+        left join user_role role on sales.role_id=role.id
+        where role.`code`=#{roleCode}
+    </select>
+
+    <select id="getSuperAdminInfo" resultType="com.crm.rely.backend.model.pojo.table.UserInfoTable">
+        select *
+        from user_info where role_id is null
+        limit 0,1
+    </select>
+
+    <select id="findAllByStamp" parameterType="String" resultType="com.crm.rely.backend.model.pojo.table.UserInfoTable">
+        select *
+        from user_info
+        where stamp like binary concat(#{stamp},'%') and stamp != binary #{stamp}
+    </select>
+
+    <select id="getMaxStampByPid" parameterType="Long" resultType="String">
+        select MAX(binary stamp) from user_info where pid=#{pid}
+    </select>
+
+    <update id="updateUserStampByBatch" parameterType="java.util.List">
+        update user_info
+        <trim prefix="set" suffixOverrides=",">
+            <trim prefix="stamp = case " suffix="end,">
+                <foreach collection="list" item="item" index="idx">
+                    when id=#{item.id} then #{item.stamp}
+                </foreach>
+            </trim>
+            <trim prefix="p_stamp = case" suffix="end,">
+                <foreach collection="list" item="item" index="idx">
+                    when id=#{item.id} then #{item.pStamp}
+                </foreach>
+            </trim>
+        </trim>
+        <where>
+            and id in
+            <foreach collection="list" index="idx" item="item" separator="," open="(" close=")">
+                #{item.id}
+            </foreach>
+        </where>
+    </update>
+
+    <select id="findStampById" parameterType="Long" resultType="String">
+        select stamp
+        from user_info
+        where id=#{id}
+    </select>
+</mapper>

+ 55 - 0
crm-manager/src/main/resources/mapper/UserInfoMapper.xml

@@ -0,0 +1,55 @@
+<?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.crm.manager.dao.mapper.UserInfoMapper">
+
+    <!-- 根据ID更新user_info表的动态SQL -->
+    <update id="updateById">
+        UPDATE user_info
+        <set>
+            <if test="username != null and username != ''">username = #{username},</if>
+            <if test="password != null and password != ''">password = #{password},</if>
+            <if test="name != null">name = #{name},</if>
+            <if test="secretKey != null">secret_key = #{secretKey},</if>
+            <if test="nationality != null">nationality = #{nationality},</if>
+            <if test="roleId != null">role_id = #{roleId},</if>
+            <if test="lang != null">lang = #{lang},</if>
+            <if test="groupId != null">group_id = #{groupId},</if>
+            <if test="valid != null">valid = #{valid},</if>
+            <if test="userType != null">user_type = #{userType},</if>
+            <if test="ipLimit != null">ip_limit = #{ipLimit},</if>
+            <if test="limitIp != null">limit_ip = #{limitIp},</if>
+            <if test="inRate != null">in_rate = #{inRate},</if>
+            <if test="outRate != null">out_rate = #{outRate},</if>
+            <if test="inProfitRate != null">in_profit_rate = #{inProfitRate},</if>
+            <if test="outProfitRate != null">out_profit_rate = #{outProfitRate},</if>
+            <if test="lastTime != null">last_time = #{lastTime},</if>
+            <if test="lastIp != null">last_ip = #{lastIp},</if>
+            <if test="lastAddress != null">last_address = #{lastAddress},</if>
+            <if test="modifyTime != null">modify_time = #{modifyTime},</if>
+            <if test="modifyUser != null">modify_user = #{modifyUser},</if>
+            <if test="modifyIp != null">modify_ip = #{modifyIp},</if>
+            <if test="note != null">note = #{note},</if>
+            <if test="verified != null">verified = #{verified},</if>
+            <if test="addressLine != null">address_line = #{addressLine},</if>
+            <if test="areaCode != null">area_code = #{areaCode},</if>
+            <if test="birth != null">birth = #{birth},</if>
+            <if test="city != null">city = #{city},</if>
+            <if test="country != null">country = #{country},</if>
+            <if test="gender != null">gender = #{gender},</if>
+            <if test="identity != null">identity = #{identity},</if>
+            <if test="firstName != null">first_name = #{firstName},</if>
+            <if test="lastName != null">last_name = #{lastName},</if>
+            <if test="state != null">state = #{state},</if>
+            <if test="zipCode != null">zip_code = #{zipCode},</if>
+            <if test="cardType != null">card_type = #{cardType},</if>
+            <if test="authStatus != null">auth_status = #{authStatus},</if>
+            <if test="externalUserId != null">external_user_id = #{externalUserId},</if>
+            <if test="kycVerifyUrl != null">kyc_verify_url = #{kycVerifyUrl},</if>
+            <if test="status != null">status = #{status},</if>
+
+        </set>
+        WHERE id = #{id}
+    </update>
+</mapper>

+ 18 - 0
crm-manager/src/main/resources/mapper/UserRoleDetailMapper.xml

@@ -0,0 +1,18 @@
+<?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.crm.manager.dao.mapper.UserRoleDetailMapper">
+
+
+    <select id="findAllByRoleId" resultType="com.crm.rely.backend.core.pojo.table.UserRoleDetailTable">
+        select  * from  user_role_detail where role_id=#{roleId}
+    </select>
+
+    <delete id="delete" parameterType="com.crm.rely.backend.core.pojo.table.UserRoleDetailTable">
+        delete from user_role_detail where id in
+        <foreach collection="list" index="idx" item="item" separator="," open="(" close=")">
+            #{item.id}
+        </foreach>
+    </delete>
+</mapper>

+ 18 - 0
crm-manager/src/main/resources/mapper/UserRoleNodeMapper.xml

@@ -0,0 +1,18 @@
+<?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.crm.manager.dao.mapper.UserRoleNodeMapper">
+
+
+    <select id="findAllByRoleId" resultType="com.crm.rely.backend.core.pojo.table.UserRoleNodeTable">
+        select  * from  user_role_node where role_id=#{roleId}
+    </select>
+
+    <delete id="delete" parameterType="com.crm.rely.backend.core.pojo.table.UserRoleNodeTable">
+        delete from user_role_node where id in
+        <foreach collection="list" index="idx" item="item" separator="," open="(" close=")">
+            #{item.id}
+        </foreach>
+    </delete>
+</mapper>

+ 1 - 0
crm-manager/打包.bat

@@ -0,0 +1 @@
+mvn clean install -DskipTests

+ 1 - 0
crm-manager/打包依赖.bat

@@ -0,0 +1 @@
+mvn dependency:copy-dependencies

+ 30 - 0
crm-model/.gitignore

@@ -0,0 +1,30 @@
+/target/
+!.mvn/wrapper/maven-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/build/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+
+### maven ###
+/mvnw
+/mvnw.cmd
+/.mvn/*

+ 80 - 0
crm-model/pom.xml

@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.crm.model</groupId>
+    <artifactId>crm-model</artifactId>
+    <version>2.2.0</version>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.11.0</version>
+                <configuration>
+                    <source>17</source>
+                    <target>17</target>
+                </configuration>
+            </plugin>
+<!--            <plugin>-->
+<!--                <groupId>org.springframework.boot</groupId>-->
+<!--                <artifactId>spring-boot-maven-plugin</artifactId>-->
+<!--                <configuration>-->
+<!--                    <layout>ZIP</layout>-->
+<!--                    <includes>-->
+<!--                        <include>-->
+<!--                            <groupId>com.crm.core</groupId>-->
+<!--                            <artifactId>crm-core</artifactId>-->
+<!--                        </include>-->
+<!--                    </includes>-->
+<!--                </configuration>-->
+<!--            </plugin>-->
+        </plugins>
+    </build>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>17</java.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.crm.core</groupId>
+            <artifactId>crm-core</artifactId>
+            <version>2.1.0</version>
+        </dependency>
+
+        <!-- 导出 -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>3.17</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>3.17</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>1.1.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>26.0-jre</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.8.1</version>
+        </dependency>
+    </dependencies>
+</project>

+ 4 - 0
crm-model/src/main/java/com/crm/rely/backend/model/constant/ConfigConstants.java

@@ -0,0 +1,4 @@
+package com.crm.rely.backend.model.constant;
+
+public class ConfigConstants {
+}

+ 11 - 0
crm-model/src/main/java/com/crm/rely/backend/model/constant/CustomConstants.java

@@ -0,0 +1,11 @@
+package com.crm.rely.backend.model.constant;
+
+/**
+ * @program: crm-backend
+ * @description:
+ * @author: houn
+ * @create: 2022-02-18 18:09
+ */
+public class CustomConstants {
+
+}

+ 9 - 0
crm-model/src/main/java/com/crm/rely/backend/model/constant/EmailTemplateConstants.java

@@ -0,0 +1,9 @@
+package com.crm.rely.backend.model.constant;
+
+
+public class EmailTemplateConstants {
+
+    public static final String DEPOSIT_ACCEPTOR="DEPOSIT_ACCEPTOR";
+
+    public static final String WITHDRAW_SHOP="WITHDRAW_SHOP";
+}

+ 13 - 0
crm-model/src/main/java/com/crm/rely/backend/model/constant/ManagerConstants.java

@@ -0,0 +1,13 @@
+package com.crm.rely.backend.model.constant;
+
+/**
+ * @program: crm-backend
+ * @description:
+ * @author: houn
+ * @create: 2022-02-18 18:09
+ */
+public class ManagerConstants {
+    public static final String ROLE_USER_PREFIX = "CRM_PAY_";
+
+    public static final String ORDER_EXPIRE_TIME = "order_expire_time";
+}

+ 11 - 0
crm-model/src/main/java/com/crm/rely/backend/model/constant/PayConstants.java

@@ -0,0 +1,11 @@
+package com.crm.rely.backend.model.constant;
+
+/**
+ * @program: crm-backend
+ * @description:
+ * @author: houn
+ * @create: 2022-02-18 18:09
+ */
+public class PayConstants {
+
+}

+ 15 - 0
crm-model/src/main/java/com/crm/rely/backend/model/constant/PayTypeConstants.java

@@ -0,0 +1,15 @@
+package com.crm.rely.backend.model.constant;
+
+/**
+ * 支付类型
+ *
+ * @author: houn
+ */
+public class PayTypeConstants {
+
+
+    public static final String ALIPAY = "ALIPAY";
+
+    public static final String UNIONPAY = "UNIONPAY";
+
+}

+ 124 - 0
crm-model/src/main/java/com/crm/rely/backend/model/dto/custom/CustomInfoDto.java

@@ -0,0 +1,124 @@
+package com.crm.rely.backend.model.dto.custom;
+
+import com.crm.rely.backend.core.dto.custom.file.CustomFileDto;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+
+@Data
+public class CustomInfoDto {
+
+    private Long id;
+
+    private String firstName;
+
+    private String middle;
+
+    private String lastName;
+
+    private String nameEn;
+
+    private String lang;
+
+    private String nationality;
+    /**
+     * 邮箱(唯一)
+     */
+    private String email;
+
+    /**
+     * 区号
+     */
+    private String areaCode;
+
+    /**
+     * 手机(唯一)
+     */
+    private String phone;
+
+    /**
+     * 性别 1:男 2:女
+     */
+    private Integer gender;
+
+    /**
+     * 出生日期
+     */
+    private Date birth;
+
+    /**
+     * 身份证件号 身份证 护照等
+     */
+    private String identity;
+
+    /**
+     * 国家
+     */
+    private String country;
+
+    /**
+     * 国家中文名称
+     */
+    private String countryName;
+
+    /**
+     * 国家英文名称
+     */
+    private String countryEnName;
+
+    private String state;
+
+    private String city;
+
+    private String zipCode;
+
+    /**
+     * 详细地址
+     */
+    private List<String> addressLines;
+
+    private String taxNumber;
+
+    /**
+     * 是否验证邮箱 0:否 1:是
+     */
+    private Integer checkEmail;
+
+    /**
+     * 是否验证手机号码 0:否 1:是
+     */
+    private Integer checkPhone;
+
+    private Integer status;
+
+    private Integer applyRealStatus;
+    private Date applyRealTime;
+
+    /**
+     * 是否禁止登陆
+     */
+    private Integer valid;
+
+    private Date addTime;
+
+    private String headPicture;
+
+
+    private Date lastTime;
+
+    private String lastIp;
+
+    private String addIp;
+
+    private Long cId;
+
+    /**
+     * 文件信息
+     */
+    private List<CustomFileDto> files;
+
+    private Long agentId;
+}

+ 115 - 0
crm-model/src/main/java/com/crm/rely/backend/model/dto/custom/InfoDto.java

@@ -0,0 +1,115 @@
+package com.crm.rely.backend.model.dto.custom;
+
+import com.crm.rely.backend.core.dto.custom.file.CustomFileDto;
+import com.crm.rely.backend.core.entity.login.InfoEntity;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @program: crm-backend
+ * @description:
+ * @author: houn
+ * @create: 2019-07-25 16:02
+ */
+@Data
+public class InfoDto extends InfoEntity {
+
+    private String firstName;
+
+    private String middle;
+
+    private String lastName;
+    private String nameEn;
+    private String headPicture;
+
+    private String lang;
+
+    private Long cId;
+    /**
+     * 邮箱(唯一)
+     */
+    private String email;
+
+
+    /**
+     * 区号
+     */
+    private String areaCode;
+
+
+    /**
+     * 手机(唯一)
+     */
+    private String phone;
+
+    /**
+     * 性别 1:男 2:女
+     */
+    private Integer gender;
+
+    /**
+     * 出生日期
+     */
+    private Date birth;
+
+    /**
+     * 身份证件号 身份证 护照等
+     */
+    private String identity;
+
+    /**
+     * 国家
+     */
+    private String country;
+
+    /**
+     * 国家中文名称
+     */
+    private String countryName;
+
+    /**
+     * 国家英文名称
+     */
+    private String countryEnName;
+
+    private String state;
+
+    private String city;
+
+    private String zipCode;
+
+    /**
+     * 详细地址
+     */
+    private String addressLine;
+
+    private String taxNumber;
+
+
+    /**
+     * 是否禁止登陆
+     */
+    private Integer valid;
+
+
+    private Date lastTime;
+
+    private String lastIp;
+
+    private String lastAddress;
+    /**
+     * 代理ID
+     */
+    private Long agentId;
+
+    private Integer status;
+
+    private Integer applyRealStatus;
+    private Date applyRealTime;
+
+    private List<CustomFileDto> files;
+
+    private Long ibId;
+}

+ 34 - 0
crm-model/src/main/java/com/crm/rely/backend/model/dto/export/PayInfoBalanceHistoryExport.java

@@ -0,0 +1,34 @@
+package com.crm.rely.backend.model.dto.export;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.metadata.BaseRowModel;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class PayInfoBalanceHistoryExport extends BaseRowModel {
+
+    @ExcelProperty(value = "id", index = 0)
+    private Long id;
+
+    @ExcelProperty(value = "平台流水号", index = 1)
+    private String serial;
+
+
+    @ExcelProperty(value = "名称", index = 2)
+    private String name;
+    @ExcelProperty(value = "邮箱", index = 3)
+    private String email;
+    @ExcelProperty(value = "调整余额", index = 4)
+    private BigDecimal balance;
+    @ExcelProperty(value = "调整锁定金额", index = 5)
+    private BigDecimal balanceLocked;
+
+    @ExcelProperty(value = "添加时间", index = 6, format = "yyyy-MM-dd HH:mm:ss")
+    private Date addTime;
+
+    @ExcelProperty(value = "备注", index = 7)
+    private String remarks;
+}

Some files were not shown because too many files changed in this diff