kongxiangyang 2 недель назад
Сommit
607dd75892
100 измененных файлов с 7124 добавлено и 0 удалено
  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. 158 0
      crm-manager/pom.xml
  7. 24 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. 11 0
      crm-manager/src/main/java/com/crm/manager/configuration/GetCurrentUserInfo.java
  10. 71 0
      crm-manager/src/main/java/com/crm/manager/configuration/InterceptorRoleConfiguration.java
  11. 15 0
      crm-manager/src/main/java/com/crm/manager/configuration/WebConfig.java
  12. 120 0
      crm-manager/src/main/java/com/crm/manager/controller/AuthorityController.java
  13. 34 0
      crm-manager/src/main/java/com/crm/manager/controller/CommonController.java
  14. 30 0
      crm-manager/src/main/java/com/crm/manager/controller/OcrController.java
  15. 167 0
      crm-manager/src/main/java/com/crm/manager/controller/SysConfigController.java
  16. 97 0
      crm-manager/src/main/java/com/crm/manager/controller/SysIpLimitController.java
  17. 123 0
      crm-manager/src/main/java/com/crm/manager/controller/SysReasonsRefusalController.java
  18. 30 0
      crm-manager/src/main/java/com/crm/manager/controller/TruForController.java
  19. 316 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. 15 0
      crm-manager/src/main/java/com/crm/manager/dao/mapper/TransactionItemMapper.java
  27. 38 0
      crm-manager/src/main/java/com/crm/manager/dao/mapper/UserInfoDao.java
  28. 11 0
      crm-manager/src/main/java/com/crm/manager/dao/mapper/UserInfoMapper.java
  29. 16 0
      crm-manager/src/main/java/com/crm/manager/dao/mapper/UserRoleDetailMapper.java
  30. 17 0
      crm-manager/src/main/java/com/crm/manager/dao/mapper/UserRoleNodeMapper.java
  31. 27 0
      crm-manager/src/main/java/com/crm/manager/dao/repository/SysActionRepository.java
  32. 48 0
      crm-manager/src/main/java/com/crm/manager/dao/repository/SysConfigRepository.java
  33. 26 0
      crm-manager/src/main/java/com/crm/manager/dao/repository/SysIpLimitRepository.java
  34. 22 0
      crm-manager/src/main/java/com/crm/manager/dao/repository/SysNodeRepository.java
  35. 22 0
      crm-manager/src/main/java/com/crm/manager/dao/repository/SysReasonsRefusalRepository.java
  36. 18 0
      crm-manager/src/main/java/com/crm/manager/dao/repository/SysUserLoginHistoryRepository.java
  37. 19 0
      crm-manager/src/main/java/com/crm/manager/dao/repository/SysVaultodyConfigRepository.java
  38. 44 0
      crm-manager/src/main/java/com/crm/manager/dao/repository/UserDepartmentRepository.java
  39. 16 0
      crm-manager/src/main/java/com/crm/manager/dao/repository/UserGroupRepository.java
  40. 62 0
      crm-manager/src/main/java/com/crm/manager/dao/repository/UserInfoRepository.java
  41. 16 0
      crm-manager/src/main/java/com/crm/manager/dao/repository/UserRoleDetailRepository.java
  42. 16 0
      crm-manager/src/main/java/com/crm/manager/dao/repository/UserRoleNodeRepository.java
  43. 46 0
      crm-manager/src/main/java/com/crm/manager/dao/repository/UserRoleRepository.java
  44. 124 0
      crm-manager/src/main/java/com/crm/manager/interceptor/RoleInterceptor.java
  45. 18 0
      crm-manager/src/main/java/com/crm/manager/property/RoleConfigureProperty.java
  46. 25 0
      crm-manager/src/main/java/com/crm/manager/property/WebStaticsProperty.java
  47. 12 0
      crm-manager/src/main/java/com/crm/manager/repository/TransactionItemRepository.java
  48. 25 0
      crm-manager/src/main/java/com/crm/manager/service/AuthorityService.java
  49. 15 0
      crm-manager/src/main/java/com/crm/manager/service/CommonService.java
  50. 9 0
      crm-manager/src/main/java/com/crm/manager/service/OcrService.java
  51. 77 0
      crm-manager/src/main/java/com/crm/manager/service/SysConfigService.java
  52. 29 0
      crm-manager/src/main/java/com/crm/manager/service/SysIpLimitService.java
  53. 25 0
      crm-manager/src/main/java/com/crm/manager/service/SysReasonsRefusalService.java
  54. 9 0
      crm-manager/src/main/java/com/crm/manager/service/SysVaultodyConfigService.java
  55. 8 0
      crm-manager/src/main/java/com/crm/manager/service/TruForService.java
  56. 64 0
      crm-manager/src/main/java/com/crm/manager/service/UserDepartmentService.java
  57. 12 0
      crm-manager/src/main/java/com/crm/manager/service/UserGroupService.java
  58. 80 0
      crm-manager/src/main/java/com/crm/manager/service/UserInfoService.java
  59. 15 0
      crm-manager/src/main/java/com/crm/manager/service/UserRoleDetailService.java
  60. 17 0
      crm-manager/src/main/java/com/crm/manager/service/UserRoleNodeService.java
  61. 111 0
      crm-manager/src/main/java/com/crm/manager/service/UserRoleService.java
  62. 28 0
      crm-manager/src/main/java/com/crm/manager/service/VaultodyService.java
  63. 151 0
      crm-manager/src/main/java/com/crm/manager/service/impl/AuthorityServiceImpl.java
  64. 25 0
      crm-manager/src/main/java/com/crm/manager/service/impl/CommonServiceImpl.java
  65. 71 0
      crm-manager/src/main/java/com/crm/manager/service/impl/OcrServiceImpl.java
  66. 323 0
      crm-manager/src/main/java/com/crm/manager/service/impl/SysConfigServiceImpl.java
  67. 137 0
      crm-manager/src/main/java/com/crm/manager/service/impl/SysIpLimitServiceImpl.java
  68. 127 0
      crm-manager/src/main/java/com/crm/manager/service/impl/SysReasonsRefusalServiceImpl.java
  69. 43 0
      crm-manager/src/main/java/com/crm/manager/service/impl/SysVaultodyConfigServiceImpl.java
  70. 58 0
      crm-manager/src/main/java/com/crm/manager/service/impl/TruForServiceImpl.java
  71. 245 0
      crm-manager/src/main/java/com/crm/manager/service/impl/UserDepartmentServiceImpl.java
  72. 41 0
      crm-manager/src/main/java/com/crm/manager/service/impl/UserGroupServiceImpl.java
  73. 638 0
      crm-manager/src/main/java/com/crm/manager/service/impl/UserInfoServiceImpl.java
  74. 59 0
      crm-manager/src/main/java/com/crm/manager/service/impl/UserRoleDetailServiceImpl.java
  75. 64 0
      crm-manager/src/main/java/com/crm/manager/service/impl/UserRoleNodeServiceImpl.java
  76. 666 0
      crm-manager/src/main/java/com/crm/manager/service/impl/UserRoleServiceImpl.java
  77. 473 0
      crm-manager/src/main/java/com/crm/manager/service/impl/VaultodyServiceImpl.java
  78. 109 0
      crm-manager/src/main/java/com/crm/manager/service/impl/base/BaseUploadServiceImpl.java
  79. 20 0
      crm-manager/src/main/java/com/crm/manager/util/BlockchainUtils.java
  80. 40 0
      crm-manager/src/main/java/com/crm/manager/util/DateUtils.java
  81. 31 0
      crm-manager/src/main/resources/application-dev.yml
  82. 29 0
      crm-manager/src/main/resources/application-ho.yml
  83. 26 0
      crm-manager/src/main/resources/application-hu.yml
  84. 21 0
      crm-manager/src/main/resources/application-prod.yml
  85. 25 0
      crm-manager/src/main/resources/application-test.yml
  86. 31 0
      crm-manager/src/main/resources/application.yml
  87. 41 0
      crm-manager/src/main/resources/i18n/messages.properties
  88. 43 0
      crm-manager/src/main/resources/i18n/messages_en_US.properties
  89. 42 0
      crm-manager/src/main/resources/i18n/messages_vn_VN.properties
  90. 43 0
      crm-manager/src/main/resources/i18n/messages_zh_CN.properties
  91. 57 0
      crm-manager/src/main/resources/logback-dev.xml
  92. 57 0
      crm-manager/src/main/resources/logback-prod.xml
  93. 32 0
      crm-manager/src/main/resources/mapper/SysConfigMapper.xml
  94. 33 0
      crm-manager/src/main/resources/mapper/SysIpLimitMapper.xml
  95. 39 0
      crm-manager/src/main/resources/mapper/SysNodeMapper.xml
  96. 49 0
      crm-manager/src/main/resources/mapper/SysReasonsRefusalMapper.xml
  97. 51 0
      crm-manager/src/main/resources/mapper/TransactionItemMapper.xml
  98. 156 0
      crm-manager/src/main/resources/mapper/UserInfoDao.xml
  99. 55 0
      crm-manager/src/main/resources/mapper/UserInfoMapper.xml
  100. 18 0
      crm-manager/src/main/resources/mapper/UserRoleDetailMapper.xml

+ 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

+ 158 - 0
crm-manager/pom.xml

@@ -0,0 +1,158 @@
+<?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>
+    </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>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>
+
+
+    </dependencies>
+
+    <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>

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

@@ -0,0 +1,24 @@
+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.context.annotation.ComponentScan;
+import org.springframework.jms.annotation.EnableJms;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+/**
+ * @author houn
+ */
+@EnableJms
+@SpringBootApplication
+@EnableScheduling
+@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;
+    }
+}

+ 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);
+    }
+}

+ 30 - 0
crm-manager/src/main/java/com/crm/manager/controller/OcrController.java

@@ -0,0 +1,30 @@
+package com.crm.manager.controller;
+
+import com.crm.manager.service.OcrService;
+import com.crm.rely.backend.core.dto.base.BaseResultDto;
+import com.crm.rely.backend.model.entity.ocr.OcrCheckEntity;
+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;
+
+@RestController
+@RequestMapping("/ocr/")
+public class OcrController {
+
+    @Autowired
+    private OcrService ocrService;
+
+
+    /**
+     * ocr识别结果
+     * @param entity
+     * @return
+     */
+    @PostMapping("result")
+    public BaseResultDto result(@RequestBody OcrCheckEntity entity){
+        return ocrService.result(entity);
+    }
+
+}

+ 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);
+    }
+}

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

@@ -0,0 +1,123 @@
+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")
+    public BaseResultDto<Map<String, SysReasonsRefusalSearchDto>> customList(@RequestBody @Validated SysReasonsRefusalSearchEntity entity) throws Exception {
+
+        BaseResultDto<Map<String, SysReasonsRefusalSearchDto>> result = sysReasonsRefusalService.searchList(entity);
+
+        return result;
+    }
+}

+ 30 - 0
crm-manager/src/main/java/com/crm/manager/controller/TruForController.java

@@ -0,0 +1,30 @@
+package com.crm.manager.controller;
+
+import com.crm.manager.service.TruForService;
+import com.crm.rely.backend.core.dto.base.BaseResultDto;
+import com.crm.rely.backend.model.entity.trufor.TruForCheckEntity;
+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;
+
+@RestController
+@RequestMapping("/trufor/")
+public class TruForController {
+
+    @Autowired
+    private TruForService truForService;
+
+    /**
+     * 图像伪造检测
+     * @param entity
+     * @return
+     */
+    @PostMapping("result")
+    public BaseResultDto result(@RequestBody TruForCheckEntity entity){
+        return truForService.result(entity);
+    }
+
+
+}

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

@@ -0,0 +1,316 @@
+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);
+        }
+
+        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);
+}

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

@@ -0,0 +1,15 @@
+package com.crm.manager.dao.mapper;
+
+import com.crm.rely.backend.model.entity.vaultody.vaults.VaultTransactionsSearchEntity;
+import com.crm.rely.backend.model.pojo.table.TransactionItemTable;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface TransactionItemMapper {
+    Integer countList(@Param("entity") VaultTransactionsSearchEntity entity, @Param("startSecond") Long startSecond, @Param("endSecond") Long endSecond);
+
+    List<TransactionItemTable> pageList(@Param("entity") VaultTransactionsSearchEntity entity, @Param("startSecond") Long startSecond, @Param("endSecond") Long endSecond);
+}

+ 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> {
+
+
+}

+ 19 - 0
crm-manager/src/main/java/com/crm/manager/dao/repository/SysVaultodyConfigRepository.java

@@ -0,0 +1,19 @@
+package com.crm.manager.dao.repository;
+
+import com.crm.rely.backend.dao.repository.BaseRepository;
+import com.crm.rely.backend.model.pojo.table.SysVaultodyConfigTable;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface SysVaultodyConfigRepository extends BaseRepository<SysVaultodyConfigTable> {
+
+    /**
+     * 根据code 获取系统配置信息
+     *
+     * @param code code
+     * @return
+     */
+    SysVaultodyConfigTable getByCode(String code);
+
+
+}

+ 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;
+}

+ 12 - 0
crm-manager/src/main/java/com/crm/manager/repository/TransactionItemRepository.java

@@ -0,0 +1,12 @@
+package com.crm.manager.repository;
+
+import com.crm.rely.backend.dao.repository.BaseRepository;
+import com.crm.rely.backend.model.pojo.table.TransactionItemTable;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface TransactionItemRepository extends BaseRepository<TransactionItemTable> {
+    List<TransactionItemTable> findAllByVaultId(String vaultId);
+}

+ 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;
+}

+ 9 - 0
crm-manager/src/main/java/com/crm/manager/service/OcrService.java

@@ -0,0 +1,9 @@
+package com.crm.manager.service;
+
+import com.crm.rely.backend.core.dto.base.BaseResultDto;
+import com.crm.rely.backend.model.entity.ocr.OcrCheckEntity;
+
+public interface OcrService {
+
+    BaseResultDto result(OcrCheckEntity entity);
+}

+ 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;
+}

+ 9 - 0
crm-manager/src/main/java/com/crm/manager/service/SysVaultodyConfigService.java

@@ -0,0 +1,9 @@
+package com.crm.manager.service;
+
+import com.crm.rely.backend.model.pojo.table.SysVaultodyConfigTable;
+
+public interface SysVaultodyConfigService {
+
+    SysVaultodyConfigTable getByCode(String code);
+
+}

+ 8 - 0
crm-manager/src/main/java/com/crm/manager/service/TruForService.java

@@ -0,0 +1,8 @@
+package com.crm.manager.service;
+
+import com.crm.rely.backend.core.dto.base.BaseResultDto;
+import com.crm.rely.backend.model.entity.trufor.TruForCheckEntity;
+
+public interface TruForService {
+    BaseResultDto result(TruForCheckEntity entity);
+}

+ 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;
+
+
+}

+ 28 - 0
crm-manager/src/main/java/com/crm/manager/service/VaultodyService.java

@@ -0,0 +1,28 @@
+package com.crm.manager.service;
+
+import com.crm.rely.backend.core.dto.base.BaseResultDto;
+import com.crm.rely.backend.model.config.VaultodyConfig;
+import com.crm.rely.backend.model.dto.vaultody.vaults.TransactionItemDto;
+import com.crm.rely.backend.model.dto.vaultody.vaults.VaultTransaction;
+import com.crm.rely.backend.model.entity.vaultody.vaults.VaultTransactionsEntity;
+import com.crm.rely.backend.model.entity.vaultody.vaults.VaultTransactionsSearchEntity;
+import com.crm.rely.backend.model.pojo.table.TransactionItemTable;
+
+import java.util.List;
+
+public interface VaultodyService {
+
+    BaseResultDto vaultsList() throws Exception;
+
+    void batchSave(List<TransactionItemTable> tables);
+
+    List<TransactionItemTable> finAllByVaultId(String vaultId);
+
+    BaseResultDto searchList(VaultTransactionsSearchEntity entity) throws Exception;
+
+    List<TransactionItemDto> queryWithFilter(VaultodyConfig config) throws Exception;
+
+    VaultTransaction query3Items(VaultTransactionsEntity entity, VaultodyConfig config) throws Exception;
+
+    VaultodyConfig getVaultodyConfig();
+}

+ 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);
+    }
+
+}

+ 71 - 0
crm-manager/src/main/java/com/crm/manager/service/impl/OcrServiceImpl.java

@@ -0,0 +1,71 @@
+package com.crm.manager.service.impl;
+
+import com.alibaba.fastjson2.JSON;
+import com.crm.manager.service.OcrService;
+import com.crm.rely.backend.core.dto.base.BaseResultDto;
+import com.crm.rely.backend.model.entity.ocr.IdCardData;
+import com.crm.rely.backend.model.entity.ocr.OcrCheckEntity;
+import com.crm.rely.backend.model.entity.ocr.OcrResult;
+import org.jsoup.Connection;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static com.crm.rely.backend.util.HttpUtil.post;
+
+@Service
+public class OcrServiceImpl implements OcrService {
+
+
+    /**
+     * 获取OCR识别结果
+     *
+     * @param entity
+     * @return
+     */
+    @Override
+    public BaseResultDto result(OcrCheckEntity entity) {
+        return BaseResultDto.success(idCardOcr(entity.getImageBase64()));
+    }
+
+
+    /**
+     * OCR 身份证识别工具(Base64 方式调用)
+     *
+     * @param base64Image 图片 base64 字符串(不带前缀 data:image/png;base64,)
+     * @return IdCardData 识别后的身份证实体
+     */
+    public static IdCardData idCardOcr(String base64Image) {
+        try {
+            // 1. 接口地址
+            String url = "http://103.214.175.29:5000/ocr/idcard/base64";
+
+            // 2. 请求头
+            Map<String, String> headers = new HashMap<>();
+            headers.put("Content-Type", "application/json");
+
+            // 3. 请求参数
+            Map<String, String> data = new HashMap<>();
+            data.put("imageBase64", base64Image);
+
+            // 4. 调用你现有的 POST 方法(注意:OCR 接口是 POST 不是 GET)
+            Connection.Response response = post(url, headers, data);
+            String json = response.body();
+
+            // 5. 解析结果
+            OcrResult result = JSON.parseObject(json, OcrResult.class);
+
+            if (result.getCode() == 0) {
+                return result.getData();
+            } else {
+                System.err.println("OCR 识别失败:" + result.getMsg());
+                return null;
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+}

+ 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;
+    }
+}

+ 43 - 0
crm-manager/src/main/java/com/crm/manager/service/impl/SysVaultodyConfigServiceImpl.java

@@ -0,0 +1,43 @@
+
+package com.crm.manager.service.impl;
+
+import com.alibaba.fastjson2.JSON;
+import com.crm.manager.dao.repository.SysVaultodyConfigRepository;
+import com.crm.manager.service.SysVaultodyConfigService;
+import com.crm.rely.backend.core.constant.Constants;
+import com.crm.rely.backend.core.exception.ServiceException;
+import com.crm.rely.backend.model.pojo.table.SysVaultodyConfigTable;
+import com.crm.rely.backend.service.RedisService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service
+public class SysVaultodyConfigServiceImpl implements SysVaultodyConfigService {
+
+    @Autowired
+    private SysVaultodyConfigRepository vaultodyConfigRepository;
+    @Autowired
+    private RedisService redisService;
+
+    @Override
+    public SysVaultodyConfigTable getByCode(String code) {
+
+        SysVaultodyConfigTable cacheEntity = redisService.getEntity(code, SysVaultodyConfigTable.class);
+        SysVaultodyConfigTable sysConfigTable;
+        if (cacheEntity == null) {
+            sysConfigTable = vaultodyConfigRepository.getByCode(code);
+            if (sysConfigTable == null) {
+                throw ServiceException.exception(Constants.INFO_NOT_FOUND);
+            } else {
+                redisService.save(code, sysConfigTable, 24 * 60 * 60 * 1000);
+            }
+        } else {
+            sysConfigTable = cacheEntity;
+        }
+
+        SysVaultodyConfigTable resultTable = JSON.parseObject(JSON.toJSONString(sysConfigTable), SysVaultodyConfigTable.class);
+        return resultTable;
+    }
+}

+ 58 - 0
crm-manager/src/main/java/com/crm/manager/service/impl/TruForServiceImpl.java

@@ -0,0 +1,58 @@
+package com.crm.manager.service.impl;
+
+import com.alibaba.fastjson2.JSON;
+import com.crm.manager.service.TruForService;
+import com.crm.rely.backend.core.dto.base.BaseResultDto;
+import com.crm.rely.backend.model.entity.trufor.ImageDetectResult;
+import com.crm.rely.backend.model.entity.trufor.TruForCheckEntity;
+import org.jsoup.Connection;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static com.crm.rely.backend.util.HttpUtil.post;
+
+@Service
+public class TruForServiceImpl implements TruForService {
+
+    @Override
+    public BaseResultDto result(TruForCheckEntity entity) {
+        return BaseResultDto.success(imageForgedDetect(entity.getImageBase64()));
+    }
+
+
+    // ======================== 【图像伪造检测】调用方法 ========================
+    public static ImageDetectResult imageForgedDetect(String base64Image) {
+        try {
+            // 1. 你的API接口地址
+            String url = "http://103.214.175.29:9527/detect";
+
+            // 2. 请求头
+            Map<String, String> headers = new HashMap<>();
+            headers.put("Content-Type", "application/json");
+
+            // 3. 请求参数(imageBase64 你要的格式)
+            Map<String, String> data = new HashMap<>();
+            data.put("imageBase64", base64Image);
+
+            // 4. 调用你现有的 POST 方法(和OCR逻辑完全一致)
+            Connection.Response response = post(url, headers, data);
+            String json = response.body();
+
+            // 5. 解析结果(用我上一条给你的实体类)
+            ImageDetectResult result = JSON.parseObject(json, ImageDetectResult.class);
+
+            if (result.getCode() == 200) {
+                return result;
+            } else {
+                System.err.println("图像伪造检测失败:" + result.getMsg());
+                return null;
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+}

+ 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);
+    }
+}

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

@@ -0,0 +1,638 @@
+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());
+        }
+
+        /*
+            上级发生变动
+         */
+        //新上级
+        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();
+    }
+}

+ 473 - 0
crm-manager/src/main/java/com/crm/manager/service/impl/VaultodyServiceImpl.java

@@ -0,0 +1,473 @@
+package com.crm.manager.service.impl;
+
+import com.alibaba.fastjson2.JSON;
+import com.crm.manager.dao.mapper.TransactionItemMapper;
+import com.crm.manager.repository.TransactionItemRepository;
+import com.crm.manager.service.SysConfigService;
+import com.crm.manager.service.SysVaultodyConfigService;
+import com.crm.manager.service.VaultodyService;
+import com.crm.manager.util.DateUtils;
+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.exception.ServiceException;
+import com.crm.rely.backend.core.pojo.table.SysConfigTable;
+import com.crm.rely.backend.model.config.VaultodyConfig;
+import com.crm.rely.backend.model.constant.ConfigConstants;
+import com.crm.rely.backend.model.dto.vaultody.vaults.TransactionItemDto;
+import com.crm.rely.backend.model.dto.vaultody.vaults.VaultTransaction;
+import com.crm.rely.backend.model.dto.vaultody.vaults.VaultodyVaultsListDto;
+import com.crm.rely.backend.model.dto.vaultody.vaults.response.ResponseData;
+import com.crm.rely.backend.model.dto.vaultody.vaults.response.TransactionItem;
+import com.crm.rely.backend.model.dto.vaultody.vaults.response.TransactionResponse;
+import com.crm.rely.backend.model.dto.vaultody.vaults.response.VaultsListResponseDto;
+import com.crm.rely.backend.model.entity.vaultody.vaults.VaultTransactionsEntity;
+import com.crm.rely.backend.model.entity.vaultody.vaults.VaultTransactionsSearchEntity;
+import com.crm.rely.backend.model.pojo.table.SysVaultodyConfigTable;
+import com.crm.rely.backend.model.pojo.table.TransactionItemTable;
+import com.crm.rely.backend.util.AESUtil;
+import com.crm.rely.backend.util.HttpUtil;
+import com.crm.rely.backend.util.UUIDUtil;
+import com.google.common.collect.Lists;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.jsoup.Connection;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.ObjectUtils;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class VaultodyServiceImpl implements VaultodyService {
+
+    @Autowired
+    private SysVaultodyConfigService vaultodyConfigService;
+    @Autowired
+    private SysConfigService sysConfigService;
+    @Autowired
+    private TransactionItemRepository transactionItemRepository;
+    @Autowired
+    private TransactionItemMapper transactionItemMapper;
+
+    public static String getSignature(String message, String apiSecret) {
+        try {
+            byte[] decodedSecret = Base64.getDecoder().decode(apiSecret);
+            Mac mac = Mac.getInstance("HmacSHA256");
+            SecretKeySpec secretKeySpec = new SecretKeySpec(decodedSecret, "HmacSHA256");
+            mac.init(secretKeySpec);
+            byte[] hash = mac.doFinal(message.getBytes(StandardCharsets.UTF_8));
+
+            return Base64.getEncoder().encodeToString(hash);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static void main2(String[] args) {
+        String s = "{\n" +
+                "  \"apiKey\": \"6f3cc6caf513a5cde2df5d3ed805e3703d4d43b2\",\n" +
+                "  \"apiSecret\": \"MLjTUAYgxSM2dg==\",\n" +
+                "  \"passphrase\": \"7UGMi2*t0h\",\n" +
+                "  \"vaultId\": \"\",\n" +
+                "  \"baseUrl\": \"https://rest.vaultody.com\",\n" +
+                "  \"vaultsListUrl\": \"/vaults/test\",\n" +
+                "  \"network\": \"\",\n" +
+                "  \"vaultsTransactionsPathTemplate\": \"/vaults/%s/transactions\",\n" +
+                "  \"webhooksPassphrase\": \"\"\n" +
+                "}";
+        System.out.println(AESUtil.encrypt(s, "bfa5559109f94c78af615bcf00d52060"));
+        System.out.println(AESUtil.decrypt(AESUtil.encrypt(s, "bfa5559109f94c78af615bcf00d52060"), "bfa5559109f94c78af615bcf00d52060"));
+    }
+
+    public static void main(String[] args) {
+        String s = "{\n" +
+                "    \"apiKey\": \"6f3cc6caf513a5cde2df5d3ed805e3703d4d43b2\",\n" +
+                "    \"apiSecret\": \"MLjTUAYgxSM2dg==\",\n" +
+                "    \"passphrase\": \"7UGMi2*t0h\",\n" +
+                "    \"vaultId\": \"\",\n" +
+                "    \"baseUrl\": \"https://rest.vaultody.com\",\n" +
+                "    \"vaultsListUrl\": \"/vaults/%s\",\n" +
+                "    \"networkType\": \"test\",\n" +
+                "    \"vaultsTransactionsPathTemplate\": \"/vaults/%s/transactions\",\n" +
+                "    \"webhooksPassphrase\": \"\",\n" +
+                "    \"vaultodyList\": [\n" +
+                "        {\n" +
+                "            \"apiKey\": \"6f3cc6caf513a5cde2df5d3ed805e3703d4d43b2\",\n" +
+                "            \"apiSecret\": \"MLjTUAYgxSM2dg==\",\n" +
+                "            \"passphrase\": \"7UGMi2*t0h\",\n" +
+                "            \"vaultId\": \"69cb34038d64830006453c0c\",\n" +
+                "            \"baseUrl\": \"https://rest.vaultody.com\",\n" +
+                "            \"vaultsListUrl\": \"/vaults/%s\",\n" +
+                "            \"networkType\": \"test\",\n" +
+                "            \"vaultsTransactionsPathTemplate\": \"/vaults/%s/transactions\",\n" +
+                "            \"webhooksPassphrase\": \"\"\n" +
+                "        },\n" +
+                "        {\n" +
+                "            \"apiKey\": \"002key\",\n" +
+                "            \"apiSecret\": \"002pwd\",\n" +
+                "            \"passphrase\": \"7UGMi2*t0h\",\n" +
+                "            \"vaultId\": \"002\",\n" +
+                "            \"baseUrl\": \"https://rest.vaultody.com\",\n" +
+                "            \"vaultsListUrl\": \"/vaults/%s\",\n" +
+                "            \"networkType\": \"test\",\n" +
+                "            \"vaultsTransactionsPathTemplate\": \"/vaults/%s/transactions\",\n" +
+                "            \"webhooksPassphrase\": \"\"\n" +
+                "        }\n" +
+                "    ]\n" +
+                "}";
+        System.out.println(AESUtil.encrypt(s, "bfa5559109f94c78af615bcf00d52060"));
+        System.out.println(AESUtil.decrypt(AESUtil.encrypt(s, "bfa5559109f94c78af615bcf00d52060"), "bfa5559109f94c78af615bcf00d52060"));
+    }
+
+    /**
+     * Coin
+     */
+    public static void main1(String[] args) {
+        try {
+            List<VaultodyVaultsListDto> dtos = new ArrayList<>();
+            // ------------------ 配置 ------------------
+            String apiKey = "6f3cc6caf513a5cde2df5d3ed805e3703d4d43b2";
+            String apiSecret = "MLjTUAYgxSM2dg==";        // Base64编码的secret
+            String passphrase = "7UGMi2*t0h";
+            String method = "GET";
+            String requestPath = "/vaults/test";
+            String baseUrl = "https://rest.vaultody.com";
+
+            String query = "{}"; // POST 时 query 通常为空,否则按接口要求填写
+            String body = "{}"; // POST 时 query 通常为空,否则按接口要求填写
+
+            // ------------------ 时间戳(秒) ------------------
+            String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
+
+            // ------------------ 构建消息用于签名 ------------------
+            String message = timestamp + method + requestPath + body + query;
+            System.out.println("Message: " + message);
+
+            String signature = getSignature(message, apiSecret);
+            System.out.println("Signature: " + signature);
+            Map<String, String> headers = new HashMap<>();
+            headers.put("x-api-key", apiKey);
+            headers.put("x-api-sign", signature);
+            headers.put("x-api-timestamp", timestamp);
+            headers.put("x-api-passphrase", passphrase);
+            headers.put("Content-Type", "application/json");
+
+            try {
+                Connection.Response response = HttpUtil.get(baseUrl + requestPath, headers);
+                if (response.statusCode() != 200){
+                    System.out.println("Error: " + response.statusMessage());
+                }
+                VaultsListResponseDto responseDto = JSON.parseObject(response.body(), VaultsListResponseDto.class);
+                List<VaultsListResponseDto.Item> items = responseDto.getData().getItems();
+                for (VaultsListResponseDto.Item item : items){
+                    VaultodyVaultsListDto dto = new VaultodyVaultsListDto();
+                    BeanUtils.copyProperties(item, dto);
+                    dtos.add(dto);
+                }
+                System.out.println(JSON.toJSONString(dtos));
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 交易记录接口拼接url
+     */
+    public String getPath(String pathTemplate, String vaultId) {
+//        String pathTemplate = "/vaults/%s/transactions";
+        String actualPath = String.format(pathTemplate, vaultId);
+        return actualPath;
+    }
+    /**
+     * 交易记录接口拼接url
+     */
+    public String getVaultsPath(String pathTemplate, String networkType) {
+//        String pathTemplate = "/vaults/{networkType}";
+        String actualPath = String.format(pathTemplate, networkType);
+        return actualPath;
+    }
+
+    public VaultodyConfig getVaultodyConfig() {
+        SysVaultodyConfigTable configTable = vaultodyConfigService.getByCode(ConfigConstants.VAULTODY_MANAGER_CONFIG);
+        if (configTable == null) {
+            throw ServiceException.exception(Constants.SYSTEM_ERROR);
+        }
+        String aesKey = getPropertyKey();
+
+        String property = AESUtil.decrypt(configTable.getValue(), aesKey);
+        VaultodyConfig vaultodyConfig = JSON.parseObject(property, VaultodyConfig.class);
+        return vaultodyConfig;
+    }
+
+    public VaultodyConfig getVaultodyConfig(String vaultId) {
+        SysVaultodyConfigTable configTable = vaultodyConfigService.getByCode(ConfigConstants.VAULTODY_MANAGER_CONFIG);
+        if (configTable == null) {
+            throw ServiceException.exception(Constants.SYSTEM_ERROR);
+        }
+        String aesKey = getPropertyKey();
+
+        String property = AESUtil.decrypt(configTable.getValue(), aesKey);
+        VaultodyConfig vaultodyConfig = JSON.parseObject(property, VaultodyConfig.class);
+        List<VaultodyConfig> vaultodyList = vaultodyConfig.getVaultodyList();
+        if(CollectionUtils.isEmpty(vaultodyList)){
+            throw ServiceException.exception(Constants.NOT_PERMIT);
+        }
+
+        Map<String, VaultodyConfig> list = vaultodyList.stream().collect(Collectors.toMap(VaultodyConfig::getVaultId, v -> v));
+        VaultodyConfig config = new VaultodyConfig();
+        if(!list.containsKey(vaultId)){
+            throw ServiceException.exception(Constants.NOT_PERMIT);
+        }
+        config = list.get(vaultId);
+        return config;
+    }
+
+    private String getPropertyKey() throws ServiceException {
+        SysConfigTable table = sysConfigService.getByCode(ConfigConstants.VAULTODY_FINANCE_PROPERTY_KEY);
+        if (table == null) {
+            throw ServiceException.exception(Constants.SYSTEM_ERROR);
+        }
+        return table.getValue();
+    }
+
+
+    @Override
+    public BaseResultDto vaultsList() throws Exception {
+        List<VaultodyVaultsListDto> dtos = new ArrayList<>();
+        VaultodyConfig config = getVaultodyConfig();
+
+        String apiKey = config.getApiKey();
+        String apiSecret = config.getApiSecret();
+        String passphrase = config.getPassphrase();
+        String method = "GET";
+        String requestPath = getVaultsPath(config.getVaultsListUrl(), config.getNetworkType());
+        String baseUrl = config.getBaseUrl();
+
+        String query = "{}"; // POST 时 query 通常为空,否则按接口要求填写
+        String body = "{}";
+
+        // ------------------ 时间戳(秒) ------------------
+        String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
+
+        // ------------------ 构建消息用于签名 ------------------
+        String message = timestamp + method + requestPath + body + query;
+
+        String signature = getSignature(message, apiSecret);
+        System.out.println("Signature: " + signature);
+        Map<String, String> headers = new HashMap<>();
+        headers.put("x-api-key", apiKey);
+        headers.put("x-api-sign", signature);
+        headers.put("x-api-timestamp", timestamp);
+        headers.put("x-api-passphrase", passphrase);
+        headers.put("Content-Type", "application/json");
+
+        Connection.Response response = HttpUtil.get(baseUrl + requestPath, headers);
+        if (response.statusCode() != 200){
+            return BaseResultDto.error(response.statusMessage());
+        }
+        VaultsListResponseDto responseDto = JSON.parseObject(response.body(), VaultsListResponseDto.class);
+        List<VaultsListResponseDto.Item> items = responseDto.getData().getItems();
+        for (VaultsListResponseDto.Item item : items){
+            VaultodyVaultsListDto dto = new VaultodyVaultsListDto();
+            BeanUtils.copyProperties(item, dto);
+            dtos.add(dto);
+        }
+        return BaseResultDto.success(dtos);
+    }
+
+    public VaultTransaction query3Items(VaultTransactionsEntity entity,VaultodyConfig config) throws Exception{
+        String apiKey = config.getApiKey();
+        String apiSecret = config.getApiSecret();       // Base64编码的secret
+        String passphrase = config.getPassphrase();
+        String method = "GET";
+//        String requestPath = "/vaults/"+entity.getVaultId()+"/transactions";
+        String requestPath = getPath(config.getVaultsTransactionsPathTemplate(), entity.getVaultId());
+        String baseUrl = config.getBaseUrl();
+        String query = "{}";
+        Map<String, String> params = new HashMap();
+        if(!ObjectUtils.isEmpty(entity.getLimit())){
+            params.put("limit", String.valueOf(entity.getLimit()));
+        }
+        if(StringUtils.isNotBlank(entity.getStartingAfter())){
+            params.put("startingAfter", entity.getStartingAfter());
+        }
+        if (StringUtils.isNotBlank(entity.getContext())){
+            params.put("context", entity.getContext());
+        }
+        // ------------------ 时间戳(秒) ------------------
+        String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
+        // ------------------ 构建消息用于签名 ------------------
+        String message = timestamp + method + requestPath + query + JSON.toJSONString(params);
+        String signature = getSignature(message, apiSecret);
+        log.info("Signature: {}",signature);
+        Map<String, String> headers = new HashMap<>();
+        headers.put("x-api-key", apiKey);
+        headers.put("x-api-sign", signature);
+        headers.put("x-api-timestamp", timestamp);
+        headers.put("x-api-passphrase", passphrase);
+        headers.put("Content-Type", "application/json");
+        Connection.Response response = HttpUtil.get(baseUrl + requestPath, headers, params);
+        log.info("response.statusCode: {} , response.body: {}",response.statusCode() , response.body());
+        if (response.statusCode() != 200) {
+            log.error("response.statusCode() != 200,{}","3Item Error!");
+            throw ServiceException.exception(Constants.SYSTEM_ERROR);
+        }
+        TransactionResponse responseDto = JSON.parseObject(response.body(), TransactionResponse.class);
+        ResponseData data = responseDto.getData();
+        VaultTransaction vaultTransaction = getVaultTransaction(data);
+        return vaultTransaction;
+    }
+
+    private VaultTransaction getVaultTransaction(ResponseData data) {
+        VaultTransaction vaultTransaction = new VaultTransaction();
+        vaultTransaction.setHasMore(data.getHasMore());
+        vaultTransaction.setLimit(data.getLimit());
+        vaultTransaction.setStartingAfter(data.getStartingAfter());
+        List<TransactionItemDto> list = Lists.newArrayList();
+        for (TransactionItem item : data.getItems()) {
+            TransactionItemDto dto = new TransactionItemDto();
+            dto.setRequestId(UUIDUtil.getUUID());
+            dto.setId(item.getId());
+            dto.setTransactionId(item.getTransactionId());
+            dto.setStatus(item.getStatus());
+            dto.setCreatedTimestamp(item.getCreatedTimestamp());
+            dto.setSenderAddress(item.getSenders().get(0).getAddress());
+            dto.setSenderIsVaultAddress(item.getSenders().get(0).getIsVaultAddress());
+            dto.setSenderAmountUnit(item.getSenders().get(0).getAmountUnit());
+            dto.setSenderAmount(item.getSenders().get(0).getAmount());
+            dto.setRecipientAddress(item.getRecipients().get(0).getAddress());
+            dto.setRecipientIsVaultAddress(item.getRecipients().get(0).getIsVaultAddress());
+            dto.setRecipientAmountUnit(item.getRecipients().get(0).getAmountUnit());
+            dto.setRecipientAmount(item.getRecipients().get(0).getAmount());
+            dto.setBlockchain(item.getBlockchain());
+            dto.setMinedInBlockHeight(item.getMinedInBlockHeight());
+            dto.setFeeAmount(item.getTransactionFee().getAmount());
+            dto.setFeeAmountUnit(item.getTransactionFee().getAmountUnit());
+            dto.setSenderLabel(item.getSenders().get(0).getLabel());
+            dto.setRecipientLabel(item.getRecipients().get(0).getLabel());
+            list.add(dto);
+        }
+        vaultTransaction.setList(list);
+        return vaultTransaction;
+    }
+
+    @Override
+    public void batchSave(List<TransactionItemTable> tables) {
+        transactionItemRepository.saveAll(tables);
+    }
+
+    @Override
+    public List<TransactionItemTable> finAllByVaultId(String vaultId) {
+        return transactionItemRepository.findAllByVaultId(vaultId);
+    }
+
+    @Override
+    public BaseResultDto searchList(VaultTransactionsSearchEntity entity) throws Exception {
+        List<TransactionItemTable> tables = new LinkedList<>();
+        VaultodyConfig vaultodyConfig = getVaultodyConfig(entity.getVaultId());
+        List<TransactionItemDto> list = queryWithFilter(vaultodyConfig);
+        if(!CollectionUtils.isEmpty(list)){
+            for (TransactionItemDto transactionItemDto : list) {
+                TransactionItemTable table = new TransactionItemTable() ;
+                BeanUtils.copyProperties(transactionItemDto, table);
+                table.setVaultId(entity.getVaultId());
+                table.setItemId(transactionItemDto.getId());
+                tables.add(table);
+            }
+            batchSave(tables);
+        }
+
+        Long startSecond = null;
+        Long endSecond = null;
+
+        if(entity.getStartTime() != null){
+            startSecond = DateUtils.dateToSecondTimestamp(entity.getStartTime());
+        }
+        if (entity.getEndTime() != null){
+            endSecond = DateUtils.dateToSecondTimestamp(entity.getEndTime());
+        }
+
+        Integer count = transactionItemMapper.countList(entity,startSecond,endSecond);
+        if (count == null || count <= 0) {
+            return ResultWithPagerDto.success(new PageDto(), new ArrayList<>());
+        }
+        PageDto pageDto = PageDto.format(entity, count);
+        List<TransactionItemTable> dtos = transactionItemMapper.pageList(entity,startSecond,endSecond);
+
+        if (dtos == null || dtos.size() <= 0) {
+            throw new ServiceException(Constants.SYSTEM_ERROR);
+        }
+
+        return ResultWithPagerDto.success(pageDto, dtos);
+    }
+
+    public List<TransactionItemDto> queryWithFilter(VaultodyConfig config) throws Exception {
+        VaultTransactionsEntity entity = new VaultTransactionsEntity();
+        entity.setVaultId(config.getVaultId());
+        List<TransactionItemDto> result = new ArrayList<>();
+
+        // 先获取数据库中已存在的item ID列表
+        List<String> existingItemIds = recordByVaultId(config.getVaultId());
+        Set<String> existingIdSet = new HashSet<>(existingItemIds);
+        VaultTransaction vaultTransaction = query3Items(entity,config);
+
+        // 处理第一页数据
+        if (vaultTransaction.getList() != null && !vaultTransaction.getList().isEmpty()) {
+            List<TransactionItemDto> filteredList = filterExistingItems(vaultTransaction.getList(), existingIdSet);
+            result.addAll(filteredList);
+        }
+
+        // 分页查询剩余数据
+        while (Boolean.TRUE.equals(vaultTransaction.getHasMore())
+                && vaultTransaction.getList() != null
+                && !vaultTransaction.getList().isEmpty()) {
+
+            String lastId = vaultTransaction.getList().get(vaultTransaction.getList().size() - 1).getId();
+            entity.setStartingAfter(lastId);
+
+            vaultTransaction = query3Items(entity,config);
+
+            if (vaultTransaction.getList() != null && !vaultTransaction.getList().isEmpty()) {
+                List<TransactionItemDto> filteredList = filterExistingItems(vaultTransaction.getList(), existingIdSet);
+                result.addAll(filteredList);
+            } else {
+                break;
+            }
+        }
+
+        return result;
+    }
+
+    private List<TransactionItemDto> filterExistingItems(List<TransactionItemDto> items, Set<String> existingIdSet) {
+        if (items == null || items.isEmpty()) {
+            return Collections.emptyList();
+        }
+
+        return items.stream()
+                .filter(item -> item != null && item.getId() != null)
+                .filter(item -> !existingIdSet.contains(item.getId()))
+                .collect(Collectors.toList());
+    }
+
+    private List<String> recordByVaultId(String vaultId){
+        List<TransactionItemTable> list = finAllByVaultId(vaultId);
+        if(CollectionUtils.isEmpty(list)){
+            return new ArrayList<>();
+        }
+        return list.stream().map(TransactionItemTable::getItemId).toList();
+    }
+}

+ 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;
+    }
+}

+ 20 - 0
crm-manager/src/main/java/com/crm/manager/util/BlockchainUtils.java

@@ -0,0 +1,20 @@
+package com.crm.manager.util;
+
+public class BlockchainUtils {
+
+    public static String getTransactionUrl(String blockchain, String transactionId) {
+        String url = null;
+        switch (blockchain) {
+            case "ethereum":
+                url = "https://etherscan.io/tx/" + transactionId;
+                break;
+            case "tron":
+                url = "https://tronscan.org/#/transaction/" + transactionId;
+                break;
+            default:
+                break;
+        }
+        return url;
+    }
+
+}

+ 40 - 0
crm-manager/src/main/java/com/crm/manager/util/DateUtils.java

@@ -0,0 +1,40 @@
+package com.crm.manager.util;
+
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+
+public class DateUtils {
+
+    /**
+     * Date 转 秒级时间戳(数据库存的就是这个)
+     */
+    public static long dateToSecondTimestamp(Date date) {
+        if (date == null) {
+            return 0;
+        }
+        return date.getTime() / 1000; // 毫秒 → 秒(关键)
+    }
+
+    // 常用格式:yyyy-MM-dd HH:mm:ss
+    public static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+    /**
+     * 秒级时间戳 → 日期字符串
+     * @param secondTimestamp 秒级时间戳 (如 1735458266)
+     * @return yyyy-MM-dd HH:mm:ss
+     */
+    public static String secondToDateTimeStr(long secondTimestamp) {
+        if (secondTimestamp <= 0) {
+            return null;
+        }
+        // 秒级时间戳转 Instant
+        Instant instant = Instant.ofEpochSecond(secondTimestamp);
+        // 转东八区时间(中国时区)
+        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.of("Asia/Shanghai"));
+        // 格式化字符串
+        return localDateTime.format(FORMATTER);
+    }
+}

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

@@ -0,0 +1,31 @@
+spring:
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://103.214.175.29:28571/cwg_vaultody?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
+web:
+  front-path: ./front
+  upload-path: ../upload
+role:
+  excludePathPatterns:
+    /**
+
+ocr:
+  host: http://103.214.175.29:5000/ocr/idcard/base64
+#logging:
+#  config: classpath:logback-dev.xml
+

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

@@ -0,0 +1,29 @@
+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
+#role:
+#  excludePathPatterns:
+#    /**
+#login:
+#  excludePathPatterns:
+#    /**
+#logging:
+#  config: classpath:logback-dev.xml
+

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

@@ -0,0 +1,26 @@
+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
+#logging:
+#  config: classpath:logback-dev.xml
+

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

@@ -0,0 +1,21 @@
+spring:
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://localhost:13542/cwg_vaultody?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&allowMultiQueries=true&useSSL=false
+    username: vaultody_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
+login:
+  single-sign-on: true
+logging:
+  config: classpath:logback-prod.xml
+

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

@@ -0,0 +1,25 @@
+spring:
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://localhost:28571/cwg_vaultody?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
+login:
+  single-sign-on: true
+web:
+  upload-path: C:\server\cwg_crm\upload
+  export-path: C:\server\cwg_crm\export
+
+
+

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

@@ -0,0 +1,31 @@
+server:
+  port: 9300
+spring:
+  profiles:
+    active: dev
+  application:
+    name: ocr-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,
+    /user/display/*,
+    /**
+#  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,
+    /reasons/refusal/list,
+    /reasons/refusal/custom/list,
+    /common/upload

+ 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/vaultody"/>
+
+    <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/vaultody"/>
+
+    <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>

+ 51 - 0
crm-manager/src/main/resources/mapper/TransactionItemMapper.xml

@@ -0,0 +1,51 @@
+<?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.TransactionItemMapper">
+
+    <sql id="transactionItemWhere">
+        <where>
+            <if test="entity.senderAddress != null and entity.senderAddress != ''">
+                and ti.`sender_address` LIKE CONCAT('%', #{entity.senderAddress}, '%')
+            </if>
+            <if test="entity.recipientAddress != null and entity.recipientAddress != ''">
+                and ti.`recipient_address` LIKE CONCAT('%', #{entity.recipientAddress}, '%')
+            </if>
+            <if test="entity.senderLabel != null and entity.senderLabel != ''">
+                and ti.`sender_label` LIKE CONCAT('%', #{entity.senderLabel}, '%')
+            </if>
+            <if test="entity.recipientLabel != null and entity.recipientLabel != ''">
+                and ti.`recipient_label` LIKE CONCAT('%', #{entity.recipientLabel}, '%')
+            </if>
+            <if test="entity.vaultId != null and entity.vaultId != ''">
+                and ti.`vault_id` = #{entity.vaultId}
+            </if>
+            <if test="entity.blockchain != null and entity.blockchain != ''">
+                and ti.`blockchain` = #{entity.blockchain}
+            </if>
+            <if test="entity.unit != null and entity.unit != ''">
+                and ti.`recipient_amount_unit` = #{entity.unit}
+            </if>
+            <!-- 时间范围查询 -->
+            <if test="startSecond != null">
+                AND created_timestamp &gt;= #{startSecond}
+            </if>
+            <if test="endSecond != null">
+                AND created_timestamp &lt;= #{endSecond}
+            </if>
+        </where>
+    </sql>
+
+    <select id="countList" resultType="java.lang.Integer">
+        select count(*) from transaction_item ti
+        <include refid="transactionItemWhere"/>
+        order by ti.created_timestamp desc
+    </select>
+
+    <select id="pageList" resultType="com.crm.rely.backend.model.pojo.table.TransactionItemTable">
+        select * from transaction_item ti
+        <include refid="transactionItemWhere"/>
+        order by ti.created_timestamp desc
+    </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>

Некоторые файлы не были показаны из-за большого количества измененных файлов