24282 il y a 2 ans
Parent
commit
29fc461bff
100 fichiers modifiés avec 9456 ajouts et 0 suppressions
  1. 2 0
      .gitignore
  2. 10 0
      .idea/.gitignore
  3. 186 0
      .idea/compiler.xml
  4. 203 0
      .idea/encodings.xml
  5. 30 0
      .idea/jarRepositories.xml
  6. 12 0
      .idea/misc.xml
  7. 6 0
      .idea/vcs.xml
  8. 228 0
      bladex-saas-project/pom.xml
  9. 129 0
      bladex-saas-project/saas-business-tradeerp/pom.xml
  10. 21 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/BusinessTradeERPApplication.java
  11. 91 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/achievements/controller/AchievementsCommissionController.java
  12. 65 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/achievements/controller/AchievementsCommissionRuleController.java
  13. 30 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/achievements/mapper/AchievementsCommissionMapper.java
  14. 44 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/achievements/mapper/AchievementsCommissionMapper.xml
  15. 30 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/achievements/mapper/AchievementsCommissionRuleMapper.java
  16. 21 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/achievements/mapper/AchievementsCommissionRuleMapper.xml
  17. 37 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/achievements/service/IAchievementsCommissionRuleService.java
  18. 63 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/achievements/service/IAchievementsCommissionService.java
  19. 106 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/achievements/service/impl/AchievementsCommissionRuleServiceImpl.java
  20. 279 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/achievements/service/impl/AchievementsCommissionServiceImpl.java
  21. 100 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/aftersales/controller/ContractAftersalesController.java
  22. 37 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/aftersales/mapper/ContractAftersalesMapper.java
  23. 57 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/aftersales/mapper/ContractAftersalesMapper.xml
  24. 79 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/aftersales/service/IContractAftersalesService.java
  25. 183 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/aftersales/service/impl/ContractAftersalesServiceImpl.java
  26. 42 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/budget/controller/ProfitBudgetController.java
  27. 19 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/budget/mapper/ProfitBudgetMapper.java
  28. 29 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/budget/mapper/ProfitBudgetMapper.xml
  29. 38 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/budget/service/IProfitBudgetService.java
  30. 88 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/budget/service/impl/ProfitBudgetServiceImpl.java
  31. 94 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/calculator/controller/ProfitlossCalculatorController.java
  32. 30 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/calculator/mapper/ProfitlossCalculatorMapper.java
  33. 37 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/calculator/mapper/ProfitlossCalculatorMapper.xml
  34. 30 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/calculator/service/IProfitlossCalculatorService.java
  35. 34 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/calculator/service/impl/ProfitlossCalculatorServiceImpl.java
  36. 164 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/claim/controller/ClaimController.java
  37. 69 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/claim/mapper/ClaimMapper.java
  38. 193 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/claim/mapper/ClaimMapper.xml
  39. 120 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/claim/service/IClaimService.java
  40. 480 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/claim/service/impl/ClaimServiceImpl.java
  41. 37 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/common/controller/CommonController.java
  42. 55 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/common/feign/CommonApi.java
  43. 45 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/common/service/ICommonService.java
  44. 139 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/common/service/impl/CommonServiceImpl.java
  45. 101 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/controller/CompanyBankController.java
  46. 122 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/controller/CompanyBasicsController.java
  47. 114 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/controller/CompanyController.java
  48. 79 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/controller/CompanyPayPalController.java
  49. 95 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/mapper/CompanyBankMapper.java
  50. 142 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/mapper/CompanyBankMapper.xml
  51. 30 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/mapper/CompanyBasicsMapper.java
  52. 5 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/mapper/CompanyBasicsMapper.xml
  53. 95 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/mapper/CompanyMapper.java
  54. 279 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/mapper/CompanyMapper.xml
  55. 90 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/mapper/CompanyPayPalMapper.java
  56. 121 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/mapper/CompanyPayPalMapper.xml
  57. 75 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/service/ICompanyBankService.java
  58. 54 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/service/ICompanyBasicsService.java
  59. 69 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/service/ICompanyPayPalService.java
  60. 109 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/service/ICompanyService.java
  61. 113 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/service/impl/CompanyBankServiceImpl.java
  62. 177 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/service/impl/CompanyBasicsServiceImpl.java
  63. 103 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/service/impl/CompanyPayPalServiceImpl.java
  64. 231 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/service/impl/CompanyServiceImpl.java
  65. 121 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/controller/ContractChangeFlowController.java
  66. 61 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/controller/ContractChangeFlowControllerV2.java
  67. 162 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/controller/ContractController.java
  68. 85 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/controller/ContractFlowController.java
  69. 60 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/controller/ContractFlowControllerV2.java
  70. 48 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/controller/ContractFlowExtendController.java
  71. 86 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/controller/ContractProductController.java
  72. 38 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/controller/ContractProjectController.java
  73. 77 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/controller/ContractSampleConfirmLogController.java
  74. 85 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/controller/ContractSampleFlowController.java
  75. 61 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/controller/ContractSampleFlowControllerV2.java
  76. 39 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/controller/ContractTrackLogController.java
  77. 34 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/feign/ContractApi.java
  78. 37 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/feign/ContractProductApi.java
  79. 30 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/mapper/ContractFlowExtendMapper.java
  80. 22 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/mapper/ContractFlowExtendMapper.xml
  81. 407 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/mapper/ContractMapper.java
  82. 1014 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/mapper/ContractMapper.xml
  83. 82 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/mapper/ContractProductMapper.java
  84. 227 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/mapper/ContractProductMapper.xml
  85. 31 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/mapper/ContractProjectMapper.java
  86. 36 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/mapper/ContractProjectMapper.xml
  87. 32 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/mapper/ContractSampleConfirmLogMapper.java
  88. 39 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/mapper/ContractSampleConfirmLogMapper.xml
  89. 22 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/mapper/ContractTrackLogMapper.java
  90. 37 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/mapper/ContractTrackLogMapper.xml
  91. 87 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/service/IContractChangeFlowService.java
  92. 33 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/service/IContractChangeFlowServiceV2.java
  93. 48 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/service/IContractFlowExtendService.java
  94. 61 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/service/IContractFlowService.java
  95. 33 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/service/IContractFlowServiceV2.java
  96. 17 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/service/IContractPdfService.java
  97. 68 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/service/IContractProductService.java
  98. 28 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/service/IContractProjectService.java
  99. 51 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/service/IContractSampleConfirmLogService.java
  100. 61 0
      bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/service/IContractSampleFlowService.java

+ 2 - 0
.gitignore

@@ -23,3 +23,5 @@ dependency-reduced-pom.xml
 buildNumber.properties
 .mvn/timing.properties
 
+.idea
+

+ 10 - 0
.idea/.gitignore

@@ -0,0 +1,10 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
+# Zeppelin ignored files
+/ZeppelinRemoteNotebooks/

+ 186 - 0
.idea/compiler.xml

@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <annotationProcessing>
+      <profile name="Maven default annotation processors profile" enabled="true">
+        <sourceOutputDir name="target/generated-sources/annotations" />
+        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
+        <outputRelativeToContentRoot value="true" />
+        <module name="blade-auth" />
+        <module name="blade-flow" />
+        <module name="saas-common" />
+        <module name="saas-dingtalk" />
+        <module name="blade-starter-report" />
+        <module name="saas-system-business-api" />
+        <module name="blade-starter-social" />
+        <module name="blade-starter-tenant" />
+        <module name="blade-scope-api" />
+        <module name="blade-xxljob-admin" />
+        <module name="saas-business-api" />
+        <module name="saas-business" />
+        <module name="blade-starter-swagger" />
+        <module name="blade-desk" />
+        <module name="blade-starter-develop" />
+        <module name="saas-mail-api" />
+        <module name="blade-starter-oss" />
+        <module name="blade-flow-design" />
+        <module name="saas-customer-api" />
+        <module name="blade-resource" />
+        <module name="saas-socket-api" />
+        <module name="blade-user" />
+        <module name="blade-flow-api" />
+        <module name="blade-starter-metrics" />
+        <module name="blade-desk-api" />
+        <module name="blade-report" />
+        <module name="library-storage" />
+        <module name="blade-starter-trace" />
+        <module name="blade-core-boot" />
+        <module name="saas-system-business" />
+        <module name="blade-log" />
+        <module name="blade-dict-api" />
+        <module name="saas-mail-grad-online" />
+        <module name="blade-starter-ehcache" />
+        <module name="blade-core-launch" />
+        <module name="saas-wms" />
+        <module name="saas-socket" />
+        <module name="saas-rabbitmq" />
+        <module name="blade-starter-redis" />
+        <module name="blade-xxljob" />
+        <module name="blade-starter-http" />
+        <module name="blade-admin" />
+        <module name="saas-mail-grad-offline" />
+        <module name="blade-user-api" />
+        <module name="blade-gateway" />
+        <module name="saas-mail" />
+        <module name="blade-starter-log" />
+        <module name="blade-starter-actuate" />
+        <module name="blade-starter-excel" />
+        <module name="blade-develop" />
+        <module name="saas-wms-api" />
+        <module name="blade-starter-jwt" />
+        <module name="blade-starter-prometheus" />
+        <module name="blade-core-db" />
+        <module name="blade-core-log4j2" />
+        <module name="blade-common" />
+        <module name="blade-core-cloud" />
+        <module name="blade-swagger" />
+        <module name="blade-starter-cache" />
+        <module name="blade-starter-sms" />
+        <module name="service-flow-api" />
+        <module name="blade-starter-api-crypto" />
+        <module name="service-flow" />
+        <module name="blade-starter-datascope" />
+        <module name="blade-starter-ribbon" />
+        <module name="saas-entity" />
+        <module name="saas-common-api" />
+        <module name="blade-core-test" />
+        <module name="blade-turbine" />
+        <module name="saas-customer" />
+        <module name="saas-business-tradeerp" />
+        <module name="blade-system" />
+        <module name="blade-core-context" />
+        <module name="blade-starter-auth" />
+        <module name="blade-starter-mybatis" />
+        <module name="blade-core-tool" />
+        <module name="blade-system-api" />
+        <module name="saas-mail-grad-overseas" />
+        <module name="blade-resource-api" />
+        <module name="blade-starter-transaction" />
+        <module name="saas-mail-grab-write" />
+        <module name="saas-business-tradeerp-api" />
+        <module name="library-product" />
+        <module name="library-supply" />
+        <module name="blade-core-secure" />
+        <module name="blade-starter-mongo" />
+      </profile>
+      <profile name="Annotation profile for fjhx-cloud-saas" enabled="true">
+        <sourceOutputDir name="target/generated-sources/annotations" />
+        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
+        <outputRelativeToContentRoot value="true" />
+        <processorPath useClasspath="false">
+          <entry name="D:/relyOn/org/hibernate/validator/hibernate-validator-annotation-processor/6.0.13.Final/hibernate-validator-annotation-processor-6.0.13.Final.jar" />
+          <entry name="D:/relyOn/org/hibernate/validator/hibernate-validator/6.0.13.Final/hibernate-validator-6.0.13.Final.jar" />
+          <entry name="D:/relyOn/javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar" />
+          <entry name="D:/relyOn/org/jboss/logging/jboss-logging/3.3.2.Final/jboss-logging-3.3.2.Final.jar" />
+          <entry name="D:/relyOn/com/fasterxml/classmate/1.3.4/classmate-1.3.4.jar" />
+          <entry name="D:/relyOn/org/hibernate/validator/hibernate-validator-test-utils/6.0.13.Final/hibernate-validator-test-utils-6.0.13.Final.jar" />
+          <entry name="D:/relyOn/org/testng/testng/6.8/testng-6.8.jar" />
+          <entry name="D:/relyOn/junit/junit/4.10/junit-4.10.jar" />
+          <entry name="D:/relyOn/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar" />
+          <entry name="D:/relyOn/org/beanshell/bsh/2.0b4/bsh-2.0b4.jar" />
+          <entry name="D:/relyOn/com/beust/jcommander/1.27/jcommander-1.27.jar" />
+          <entry name="D:/relyOn/org/yaml/snakeyaml/1.6/snakeyaml-1.6.jar" />
+          <entry name="D:/relyOn/joda-time/joda-time/2.9.7/joda-time-2.9.7.jar" />
+          <entry name="D:/relyOn/javax/money/money-api/1.0.1/money-api-1.0.1.jar" />
+        </processorPath>
+        <module name="blade-core-auto" />
+      </profile>
+    </annotationProcessing>
+  </component>
+  <component name="JavacSettings">
+    <option name="ADDITIONAL_OPTIONS_OVERRIDE">
+      <module name="BladeX" options="-parameters" />
+      <module name="BladeX-Saas-Project" options="" />
+      <module name="blade-admin" options="-parameters" />
+      <module name="blade-auth" options="-parameters" />
+      <module name="blade-common" options="-parameters" />
+      <module name="blade-desk" options="-parameters" />
+      <module name="blade-desk-api" options="-parameters" />
+      <module name="blade-develop" options="-parameters" />
+      <module name="blade-dict-api" options="-parameters" />
+      <module name="blade-flow" options="-parameters" />
+      <module name="blade-flow-api" options="-parameters" />
+      <module name="blade-flow-design" options="-parameters" />
+      <module name="blade-gateway" options="-parameters" />
+      <module name="blade-log" options="-parameters" />
+      <module name="blade-ops" options="-parameters" />
+      <module name="blade-ops-api" options="-parameters" />
+      <module name="blade-plugin" options="-parameters" />
+      <module name="blade-plugin-api" options="-parameters" />
+      <module name="blade-report" options="-parameters" />
+      <module name="blade-resource" options="-parameters" />
+      <module name="blade-resource-api" options="-parameters" />
+      <module name="blade-scope-api" options="-parameters" />
+      <module name="blade-service" options="-parameters" />
+      <module name="blade-service-api" options="-parameters" />
+      <module name="blade-swagger" options="-parameters" />
+      <module name="blade-system" options="-parameters" />
+      <module name="blade-system-api" options="-parameters" />
+      <module name="blade-turbine" options="-parameters" />
+      <module name="blade-user" options="-parameters" />
+      <module name="blade-user-api" options="-parameters" />
+      <module name="blade-xxljob" options="-parameters" />
+      <module name="blade-xxljob-admin" options="-parameters" />
+      <module name="library-product" options="" />
+      <module name="library-storage" options="" />
+      <module name="library-supply" options="" />
+      <module name="saas-business" options="" />
+      <module name="saas-business-api" options="" />
+      <module name="saas-business-tradeerp" options="" />
+      <module name="saas-business-tradeerp-api" options="" />
+      <module name="saas-common" options="" />
+      <module name="saas-common-api" options="" />
+      <module name="saas-customer" options="" />
+      <module name="saas-customer-api" options="" />
+      <module name="saas-dingtalk" options="" />
+      <module name="saas-entity" options="" />
+      <module name="saas-feign-api" options="" />
+      <module name="saas-library" options="" />
+      <module name="saas-mail" options="" />
+      <module name="saas-mail-api" options="" />
+      <module name="saas-mail-grab-write" options="" />
+      <module name="saas-mail-grad-offline" options="" />
+      <module name="saas-mail-grad-online" options="" />
+      <module name="saas-mail-grad-overseas" options="" />
+      <module name="saas-rabbitmq" options="" />
+      <module name="saas-socket" options="" />
+      <module name="saas-socket-api" options="" />
+      <module name="saas-system-business" options="" />
+      <module name="saas-system-business-api" options="" />
+      <module name="saas-wms" options="" />
+      <module name="saas-wms-api" options="" />
+      <module name="service-flow" options="" />
+      <module name="service-flow-api" options="" />
+    </option>
+  </component>
+</project>

+ 203 - 0
.idea/encodings.xml

@@ -0,0 +1,203 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding">
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-business-tradeerp/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-business-tradeerp/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-business/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-business/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-common/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-common/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-customer/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-customer/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-dingtalk/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-dingtalk/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-entity/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-entity/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-feign-api/saas-business-api/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-feign-api/saas-business-api/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-feign-api/saas-business-tradeerp-api/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-feign-api/saas-business-tradeerp-api/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-feign-api/saas-common-api/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-feign-api/saas-common-api/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-feign-api/saas-customer-api/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-feign-api/saas-customer-api/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-feign-api/saas-mail-api/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-feign-api/saas-mail-api/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-feign-api/saas-socket-api/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-feign-api/saas-socket-api/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-feign-api/saas-system-business-api/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-feign-api/saas-system-business-api/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-feign-api/saas-wms-api/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-feign-api/saas-wms-api/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-feign-api/service-flow-api/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-feign-api/service-flow-api/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-feign-api/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-feign-api/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-library/library-product/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-library/library-product/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-library/library-storage/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-library/library-storage/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-library/library-supply/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-library/library-supply/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-library/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-library/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-mail-grab-write/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-mail-grab-write/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-mail-grad-offline/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-mail-grad-offline/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-mail-grad-online/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-mail-grad-online/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-mail-grad-overseas/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-mail-grad-overseas/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-mail/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-mail/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-rabbitmq/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-rabbitmq/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-socket/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-socket/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-system-business/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-system-business/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-wms/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/saas-wms/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/service-flow/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/service-flow/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-saas-project/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-bom/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-bom/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-core-auto/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-core-auto/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-core-boot/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-core-boot/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-core-cloud/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-core-cloud/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-core-context/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-core-context/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-core-db/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-core-db/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-core-launch/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-core-launch/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-core-log4j2/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-core-log4j2/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-core-secure/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-core-secure/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-core-test/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-core-test/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-core-tool/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-core-tool/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-actuate/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-actuate/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-api-crypto/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-api-crypto/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-auth/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-auth/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-cache/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-cache/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-datascope/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-datascope/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-develop/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-develop/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-ehcache/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-ehcache/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-excel/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-excel/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-http/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-http/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-jwt/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-jwt/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-log/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-log/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-metrics/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-metrics/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-mongo/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-mongo/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-mybatis/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-mybatis/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-oss/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-oss/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-prometheus/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-prometheus/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-redis/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-redis/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-report/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-report/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-ribbon/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-ribbon/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-sms/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-sms/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-social/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-social/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-swagger/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-swagger/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-tenant/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-tenant/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-trace/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-trace/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-transaction/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/blade-starter-transaction/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex-tool/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-auth/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-auth/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-common/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-common/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-gateway/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-gateway/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops-api/blade-flow-api/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops-api/blade-flow-api/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops-api/blade-resource-api/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops-api/blade-resource-api/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops-api/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops-api/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops/blade-admin/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops/blade-admin/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops/blade-develop/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops/blade-develop/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops/blade-flow-design/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops/blade-flow-design/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops/blade-flow/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops/blade-flow/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops/blade-log/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops/blade-log/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops/blade-report/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops/blade-report/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops/blade-resource/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops/blade-resource/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops/blade-swagger/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops/blade-swagger/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops/blade-turbine/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops/blade-turbine/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops/blade-xxljob-admin/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops/blade-xxljob-admin/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops/blade-xxljob/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops/blade-xxljob/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-ops/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-plugin-api/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-plugin-api/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-plugin/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-plugin/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-service-api/blade-desk-api/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-service-api/blade-desk-api/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-service-api/blade-dict-api/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-service-api/blade-dict-api/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-service-api/blade-scope-api/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-service-api/blade-scope-api/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-service-api/blade-system-api/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-service-api/blade-system-api/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-service-api/blade-user-api/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-service-api/blade-user-api/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-service-api/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-service-api/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-service/blade-desk/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-service/blade-desk/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-service/blade-system/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-service/blade-system/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-service/blade-user/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-service/blade-user/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-service/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/blade-service/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/bladex/src/main/resources" charset="UTF-8" />
+  </component>
+</project>

+ 30 - 0
.idea/jarRepositories.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RemoteRepositoriesConfiguration">
+    <remote-repository>
+      <option name="id" value="aliyun-repos" />
+      <option name="name" value="aliyun-repos" />
+      <option name="url" value="https://maven.aliyun.com/repository/public" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Maven Central repository" />
+      <option name="url" value="https://repo1.maven.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="blade-release" />
+      <option name="name" value="Release Repository" />
+      <option name="url" value="https://maven.aliyun.com/repository/public" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="jboss.community" />
+      <option name="name" value="JBoss Community repository" />
+      <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="https://maven.aliyun.com/repository/public" />
+    </remote-repository>
+  </component>
+</project>

+ 12 - 0
.idea/misc.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="corretto-1.8" project-jdk-type="JavaSDK" />
+</project>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="Git" />
+  </component>
+</project>

+ 228 - 0
bladex-saas-project/pom.xml

@@ -0,0 +1,228 @@
+<?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>
+
+    <parent>
+        <artifactId>fjhx-cloud-saas</artifactId>
+        <groupId>com.fjhx</groupId>
+        <version>3.2.0</version>
+    </parent>
+
+    <groupId>com.fjhx</groupId>
+    <artifactId>BladeX-Saas-Project</artifactId>
+    <version>2.8.2.RELEASE</version>
+    <packaging>pom</packaging>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+
+        <bladex.project.version>2.8.2.RELEASE</bladex.project.version>
+
+        <java.version>1.8</java.version>
+        <maven.plugin.version>3.8.1</maven.plugin.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <netjson.version>2.4</netjson.version>
+        <flowable.version>6.4.2</flowable.version>
+
+        <spring.boot.version>2.3.12.RELEASE</spring.boot.version>
+        <spring.cloud.version>Hoxton.SR11</spring.cloud.version>
+        <spring.platform.version>Cairo-SR8</spring.platform.version>
+
+        <!-- 推荐使用Harbor -->
+        <docker.registry.url>192.168.0.157</docker.registry.url>
+        <docker.registry.host>http://${docker.registry.url}:2375</docker.registry.host>
+        <docker.username>admin</docker.username>
+        <docker.password>Harbor12345</docker.password>
+        <docker.namespace>blade</docker.namespace>
+        <docker.plugin.version>1.4.13</docker.plugin.version>
+    </properties>
+
+    <modules>
+        <module>saas-business</module>
+        <module>saas-common</module>
+		<module>saas-mail</module>
+        <module>saas-mail-grab-write</module>
+        <module>saas-mail-grad-overseas</module>
+        <module>saas-mail-grad-offline</module>
+        <module>saas-mail-grad-online</module>
+		<module>saas-feign-api</module>
+        <module>saas-entity</module>
+        <module>saas-system-business</module>
+        <module>saas-business-tradeerp</module>
+        <module>saas-customer</module>
+		<module>saas-socket</module>
+		<module>saas-rabbitmq</module>
+        <module>saas-dingtalk</module>
+        <module>saas-wms</module>
+        <module>saas-library</module>
+        <module>service-flow</module>
+    </modules>
+
+    <dependencyManagement>
+        <dependencies>
+            <!-- blade -->
+            <dependency>
+                <groupId>org.springblade.platform</groupId>
+                <artifactId>blade-bom</artifactId>
+                <version>${bladex.project.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+
+            <!-- spring -->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring.boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>${spring.cloud.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>io.spring.platform</groupId>
+                <artifactId>platform-bom</artifactId>
+                <version>${spring.platform.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <!-- blade -->
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-common</artifactId>
+            <version>${bladex.project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-starter-tenant</artifactId>
+            <version>${bladex.project.version}</version>
+        </dependency>
+
+        <!-- 引入feign api -->
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-user-api</artifactId>
+            <version>${bladex.project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-system-api</artifactId>
+            <version>${bladex.project.version}</version>
+        </dependency>
+
+        <!-- 工具 -->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <!--amqp-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
+
+        <!-- ip地址查询 -->
+        <dependency>
+            <groupId>com.maxmind.geoip2</groupId>
+            <artifactId>geoip2</artifactId>
+            <version>2.15.0</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>${project.name}</finalName>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+            </resource>
+            <resource>
+                <directory>src/main/java</directory>
+                <includes>
+                    <include>**/*.xml</include>
+                </includes>
+            </resource>
+        </resources>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-maven-plugin</artifactId>
+                    <version>${spring.boot.version}</version>
+                    <configuration>
+                        <fork>true</fork>
+                        <finalName>${project.build.finalName}</finalName>
+                    </configuration>
+                    <executions>
+                        <execution>
+                            <goals>
+                                <goal>repackage</goal>
+                            </goals>
+                        </execution>
+                    </executions>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-antrun-plugin</artifactId>
+                    <executions>
+                        <execution>
+                            <phase>package</phase>
+                            <goals>
+                                <goal>run</goal>
+                            </goals>
+                            <configuration>
+                                <tasks>
+                                    <!--suppress UnresolvedMavenProperty -->
+                                    <copy overwrite="true"
+                                          tofile="${session.executionRootDirectory}/target/${project.artifactId}.jar"
+                                          file="${project.build.directory}/${project.artifactId}.jar"/>
+                                </tasks>
+                            </configuration>
+                        </execution>
+                    </executions>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+
+    <repositories>
+        <repository>
+            <id>aliyun-repos</id>
+            <url>https://maven.aliyun.com/nexus/content/groups/public/</url>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </repository>
+        <repository>
+            <id>blade-release</id>
+            <name>Release Repository</name>
+            <url>http://nexus.bladex.vip/repository/maven-releases/</url>
+        </repository>
+    </repositories>
+
+    <pluginRepositories>
+        <pluginRepository>
+            <id>aliyun-plugin</id>
+            <url>https://maven.aliyun.com/nexus/content/groups/public/</url>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+
+</project>

+ 129 - 0
bladex-saas-project/saas-business-tradeerp/pom.xml

@@ -0,0 +1,129 @@
+<?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">
+    <parent>
+        <artifactId>BladeX-Saas-Project</artifactId>
+        <groupId>com.fjhx</groupId>
+        <version>2.8.2.RELEASE</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+
+	<groupId>com.fjhx</groupId>
+    <artifactId>saas-business-tradeerp</artifactId>
+    <name>${project.artifactId}</name>
+    <version>2.8.2.RELEASE</version>
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-core-boot</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-starter-excel</artifactId>
+        </dependency>
+
+        <!-- 引入feign api -->
+        <dependency>
+            <groupId>com.fjhx</groupId>
+            <artifactId>saas-business-api</artifactId>
+            <version>${bladex.project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fjhx</groupId>
+            <artifactId>saas-common-api</artifactId>
+            <version>${bladex.project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fjhx</groupId>
+            <artifactId>saas-system-business-api</artifactId>
+            <version>${bladex.project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fjhx</groupId>
+            <artifactId>saas-business-tradeerp-api</artifactId>
+            <version>${bladex.project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fjhx</groupId>
+            <artifactId>saas-customer-api</artifactId>
+            <version>${bladex.project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-resource-api</artifactId>
+            <version>${bladex.project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-dict-api</artifactId>
+            <version>${bladex.project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>net.sf.json-lib</groupId>
+            <artifactId>json-lib</artifactId>
+            <version>${netjson.version}</version>
+            <classifier>jdk15</classifier>
+        </dependency>
+        <dependency>
+            <groupId>com.fjhx</groupId>
+            <artifactId>saas-rabbitmq</artifactId>
+            <version>${bladex.project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fjhx</groupId>
+            <artifactId>saas-wms-api</artifactId>
+            <version>${bladex.project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fjhx</groupId>
+            <artifactId>service-flow-api</artifactId>
+            <version>2.8.2.RELEASE</version>
+        </dependency>
+
+        <!-- hutool -->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.5.8</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+
+                <configuration>
+                    <includeSystemScope>true</includeSystemScope>
+                    <mainClass>com.fjhx.BusinessTradeERPApplication</mainClass>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 21 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/BusinessTradeERPApplication.java

@@ -0,0 +1,21 @@
+package com.fjhx;
+
+import org.springblade.common.constant.ApiConstant;
+import org.springblade.core.cloud.feign.EnableBladeFeign;
+import org.springblade.core.launch.BladeApplication;
+import org.springframework.cloud.client.SpringCloudApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+/**
+ * 外贸业务模块启动器
+ */
+@EnableBladeFeign
+@SpringCloudApplication
+@ComponentScan({"org.springblade", "com.fjhx"})
+public class BusinessTradeERPApplication {
+
+    public static void main(String[] args) {
+        BladeApplication.run(ApiConstant.Server.BUSINESS_TRADEERP_SERVER_NAME, BusinessTradeERPApplication.class, args);
+    }
+
+}

+ 91 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/achievements/controller/AchievementsCommissionController.java

@@ -0,0 +1,91 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package com.fjhx.achievements.controller;
+
+import com.fjhx.achievements.entity.AchievementsCommission;
+import com.fjhx.achievements.service.IAchievementsCommissionService;
+import lombok.AllArgsConstructor;
+import org.springblade.common.constant.ApiConstant;
+import org.springblade.common.utils.ListPageMap;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+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 BladeX
+ * @since 2022-11-15
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping(ApiConstant.Project.SAAS_BUSINESS_TRADEERP_REQUEST_PREFIX + "/achievements/commission")
+public class AchievementsCommissionController extends BladeController {
+
+    private final IAchievementsCommissionService achievementsCommissionService;
+
+    /**
+     * 列表
+     *
+     * @param condition 查询条件
+     * @return
+     */
+    @PostMapping("/list")
+    public R getList(@RequestBody Map<String, Object> condition) {
+        ListPageMap.getListPageMap(condition);
+        return R.list(achievementsCommissionService.getList(condition));
+    }
+
+    /**
+     * 列表-总条数
+     *
+     * @param condition 查询条件
+     * @return
+     */
+    @PostMapping("/list/count")
+    public R getListCount(@RequestBody Map<String, Object> condition) {
+        return R.count(achievementsCommissionService.getListCount(condition));
+    }
+
+    /**
+     * 详情
+     *
+     * @param entity 查询条件
+     * @return
+     */
+    @PostMapping("/details")
+    public R details(@RequestBody AchievementsCommission entity) {
+        return R.details(achievementsCommissionService.getByContractFlowExtendId(entity.getId()));
+    }
+
+    /**
+     * 头部统计
+     *
+     * @param condition 查询条件
+     * @return
+     */
+    @PostMapping("/head/statistics")
+    public R headStatistics(@RequestBody Map<String, Object> condition) {
+        ListPageMap.getListPageMap(condition);
+        return R.details(achievementsCommissionService.getHeadStatistics(condition));
+    }
+}

+ 65 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/achievements/controller/AchievementsCommissionRuleController.java

@@ -0,0 +1,65 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package com.fjhx.achievements.controller;
+
+import com.fjhx.achievements.entity.AchievementsCommissionRule;
+import com.fjhx.achievements.service.IAchievementsCommissionRuleService;
+import lombok.AllArgsConstructor;
+import org.springblade.common.constant.ApiConstant;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+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;
+
+/**
+ * 业绩提成规则表 控制器
+ *
+ * @author BladeX
+ * @since 2022-11-15
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping(ApiConstant.Project.SAAS_BUSINESS_TRADEERP_REQUEST_PREFIX + "/achievements/commission/rule")
+public class AchievementsCommissionRuleController extends BladeController {
+
+    private final IAchievementsCommissionRuleService achievementsCommissionRuleService;
+
+    /**
+     * 根据合同ID查询
+     *
+     * @param entity
+     * @return
+     */
+    @PostMapping(value = "/get/by/contractId")
+    public R getByContractId(@RequestBody AchievementsCommissionRule entity) {
+        return R.details(achievementsCommissionRuleService.getByContractId(entity.getContractId()));
+    }
+
+    /**
+     * 保存
+     *
+     * @param entity
+     * @return
+     */
+    @PostMapping(value = "/save")
+    public R start(@RequestBody AchievementsCommissionRule entity) {
+        return R.status(achievementsCommissionRuleService.saveOrUpdate(entity));
+    }
+
+}

+ 30 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/achievements/mapper/AchievementsCommissionMapper.java

@@ -0,0 +1,30 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package com.fjhx.achievements.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fjhx.achievements.entity.AchievementsCommission;
+
+/**
+ * 业绩提成表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2022-11-15
+ */
+public interface AchievementsCommissionMapper extends BaseMapper<AchievementsCommission> {
+
+}

+ 44 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/achievements/mapper/AchievementsCommissionMapper.xml

@@ -0,0 +1,44 @@
+<?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.fjhx.achievements.mapper.AchievementsCommissionMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="achievementsCommissionResultMap" type="com.fjhx.achievements.entity.AchievementsCommission">
+        <id column="id" property="id"/>
+        <result column="tenant_id" property="tenantId"/>
+        <result column="user_id" property="userId"/>
+        <result column="user_name" property="userName"/>
+        <result column="contract_id" property="contractId"/>
+        <result column="contract_code" property="contractCode"/>
+        <result column="contract_amount" property="contractAmount"/>
+        <result column="tax_rate" property="taxRate"/>
+        <result column="to_rmb" property="toRmb"/>
+        <result column="tax_refund_amount" property="taxRefundAmount"/>
+        <result column="other_income" property="otherIncome"/>
+        <result column="purchase_amount" property="purchaseAmount"/>
+        <result column="pay_amount" property="payAmount"/>
+        <result column="trailer_fee" property="trailerFee"/>
+        <result column="customs_clearance_fee" property="customsClearanceFee"/>
+        <result column="agency_fee" property="agencyFee"/>
+        <result column="port_miscellaneous_fee" property="portMiscellaneousFee"/>
+        <result column="check_and_accept_fee" property="checkAndAcceptFee"/>
+        <result column="commission_fee" property="commissionFee"/>
+        <result column="testing_fee" property="testingFee"/>
+        <result column="freight" property="freight"/>
+        <result column="certificate_of_origin_fee" property="certificateOfOriginFee"/>
+        <result column="other_expenses" property="otherExpenses"/>
+        <result column="total_revenue" property="totalRevenue"/>
+        <result column="total_expenditure" property="totalExpenditure"/>
+        <result column="after_sales_amount" property="afterSalesAmount"/>
+        <result column="public_amount" property="publicAmount"/>
+        <result column="have_overall_amount" property="haveOverallAmount"/>
+        <result column="departmental_commission" property="departmentalCommission"/>
+        <result column="personal_commission" property="personalCommission"/>
+        <result column="is_enable" property="isEnable"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+</mapper>

+ 30 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/achievements/mapper/AchievementsCommissionRuleMapper.java

@@ -0,0 +1,30 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package com.fjhx.achievements.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fjhx.achievements.entity.AchievementsCommissionRule;
+
+/**
+ * 业绩提成规则表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2022-11-15
+ */
+public interface AchievementsCommissionRuleMapper extends BaseMapper<AchievementsCommissionRule> {
+
+}

+ 21 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/achievements/mapper/AchievementsCommissionRuleMapper.xml

@@ -0,0 +1,21 @@
+<?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.fjhx.achievements.mapper.AchievementsCommissionRuleMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="achievementsCommissionRuleResultMap" type="com.fjhx.achievements.entity.AchievementsCommissionRule">
+        <id column="id" property="id"/>
+        <result column="contract_id" property="contractId"/>
+        <result column="contract_code" property="contractCode"/>
+        <result column="after_sales_ratio" property="afterSalesRatio"/>
+        <result column="public_ratio" property="publicRatio"/>
+        <result column="have_overall_ratio" property="haveOverallRatio"/>
+        <result column="departmental_ratio" property="departmentalRatio"/>
+        <result column="personal_ratio" property="personalRatio"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+</mapper>

+ 37 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/achievements/service/IAchievementsCommissionRuleService.java

@@ -0,0 +1,37 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package com.fjhx.achievements.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fjhx.achievements.entity.AchievementsCommissionRule;
+
+/**
+ * 业绩提成规则表 服务类
+ *
+ * @author BladeX
+ * @since 2022-11-15
+ */
+public interface IAchievementsCommissionRuleService extends IService<AchievementsCommissionRule> {
+
+    /**
+     * 根据合同ID查询
+     *
+     * @param contractId 合同ID
+     * @return
+     */
+    AchievementsCommissionRule getByContractId(String contractId);
+}

+ 63 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/achievements/service/IAchievementsCommissionService.java

@@ -0,0 +1,63 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package com.fjhx.achievements.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fjhx.achievements.entity.AchievementsCommission;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 业绩提成表 服务类
+ *
+ * @author BladeX
+ * @since 2022-11-15
+ */
+public interface IAchievementsCommissionService extends IService<AchievementsCommission> {
+
+    /**
+     * 列表
+     *
+     * @param condition 查询条件
+     */
+    List<AchievementsCommission> getList(Map<String, Object> condition);
+
+    /**
+     * 列表-总条数
+     *
+     * @param condition 查询条件
+     */
+    Integer getListCount(Map<String, Object> condition);
+
+    /**
+     * 根据合同扩展ID查询
+     *
+     * @param contractFlowExtendId 合同扩展ID
+     * @return
+     */
+    AchievementsCommission getByContractFlowExtendId(String contractFlowExtendId);
+
+    /**
+     * 头部统计
+     *
+     * @param condition 查询条件
+     * @return
+     */
+    JSONObject getHeadStatistics(Map<String, Object> condition);
+}

+ 106 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/achievements/service/impl/AchievementsCommissionRuleServiceImpl.java

@@ -0,0 +1,106 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package com.fjhx.achievements.service.impl;
+
+import com.fjhx.achievements.entity.AchievementsCommission;
+import com.fjhx.achievements.entity.AchievementsCommissionRule;
+import com.fjhx.achievements.mapper.AchievementsCommissionRuleMapper;
+import com.fjhx.achievements.service.IAchievementsCommissionRuleService;
+import com.fjhx.achievements.service.IAchievementsCommissionService;
+import org.springblade.common.utils.DoubleUtil;
+import org.springblade.core.mp.base.BasicsServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.Optional;
+
+/**
+ * 业绩提成规则表 服务实现类
+ *
+ * @author BladeX
+ * @since 2022-11-15
+ */
+@Service
+public class AchievementsCommissionRuleServiceImpl extends BasicsServiceImpl<AchievementsCommissionRuleMapper, AchievementsCommissionRule> implements IAchievementsCommissionRuleService {
+
+    @Autowired
+    private IAchievementsCommissionService iAchievementsCommissionService;
+
+    /**
+     * 根据合同ID查询
+     *
+     * @param contractId 合同ID
+     * @return
+     */
+    @Override
+    public AchievementsCommissionRule getByContractId(String contractId) {
+        return lambdaQuery().eq(AchievementsCommissionRule::getContractId, contractId).one();
+    }
+
+    /**
+     * 新增或修改
+     *
+     * @param entity
+     * @return
+     */
+    @Transactional(rollbackFor = {Exception.class})
+    @Override
+    public synchronized boolean saveOrUpdate(AchievementsCommissionRule entity) {
+        //根据合同ID查询
+        AchievementsCommission commission = iAchievementsCommissionService.lambdaQuery().eq(AchievementsCommission::getContractId, entity.getContractId()).one();
+
+        if (entity.getAfterSalesRatio().compareTo(BigDecimal.ZERO) == 1) {
+            //计算售后金额:到账金额 * 售后占比
+            double afterSalesRatio = DoubleUtil.divNotRounding(entity.getAfterSalesRatio().doubleValue(), 100);
+            commission.setAfterSalesAmount(new BigDecimal(DoubleUtil.mul(Optional.ofNullable(commission.getClaimAmount()).orElse(new BigDecimal(BigDecimal.ZERO.intValue())).doubleValue(), afterSalesRatio, 2)));
+        }
+
+        if (entity.getPublicRatio().compareTo(BigDecimal.ZERO) == 1) {
+            //计算公共金额:到账金额 * 公共占比
+            double publicRatio = DoubleUtil.divNotRounding(entity.getPublicRatio().doubleValue(), 100);
+            commission.setPublicAmount(new BigDecimal(DoubleUtil.mul(Optional.ofNullable(commission.getClaimAmount()).orElse(new BigDecimal(BigDecimal.ZERO.intValue())).doubleValue(), publicRatio, 2)));
+        }
+
+        if (entity.getHaveOverallRatio().compareTo(BigDecimal.ZERO) == 1) {
+            //计算总办金额:到账金额 * 总办占比
+            double haveOverallRatio = DoubleUtil.divNotRounding(entity.getHaveOverallRatio().doubleValue(), 100);
+            commission.setHaveOverallAmount(new BigDecimal(DoubleUtil.mul(Optional.ofNullable(commission.getClaimAmount()).orElse(new BigDecimal(BigDecimal.ZERO.intValue())).doubleValue(), haveOverallRatio, 2)));
+        }
+
+        //净利:总收入 - 总支出 - 售后 - 公共 - 总办
+        commission.setNetProfit(new BigDecimal(commission.getTotalRevenue().doubleValue() - commission.getTotalExpenditure().doubleValue() - commission.getAfterSalesAmount().doubleValue() - commission.getPublicAmount().doubleValue() - commission.getHaveOverallAmount().doubleValue()));
+
+        if (entity.getDepartmentalRatio().compareTo(BigDecimal.ZERO) == 1) {
+            //计算部门提成金额:(总收入 - 总支出 - 售后 - 公共 - 总办) * 部门占比
+            double departmentalRatio = DoubleUtil.divNotRounding(entity.getDepartmentalRatio().doubleValue(), 100);
+            commission.setDepartmentalCommission(new BigDecimal(DoubleUtil.mul(commission.getTotalRevenue().doubleValue() - commission.getTotalExpenditure().doubleValue() - commission.getAfterSalesAmount().doubleValue() - commission.getPublicAmount().doubleValue() - commission.getHaveOverallAmount().doubleValue(), departmentalRatio, 2)));
+        }
+
+        if (entity.getPersonalRatio().compareTo(BigDecimal.ZERO) == 1) {
+            //计算个人提成金额:(总收入 - 总支出 - 售后 - 公共 - 总办) * 个人占比
+            double personalRatio = DoubleUtil.divNotRounding(entity.getPersonalRatio().doubleValue(), 100);
+            commission.setPersonalCommission(new BigDecimal(DoubleUtil.mul(commission.getTotalRevenue().doubleValue() - commission.getTotalExpenditure().doubleValue() - commission.getAfterSalesAmount().doubleValue() - commission.getPublicAmount().doubleValue() - commission.getHaveOverallAmount().doubleValue(), personalRatio, 2)));
+        }
+
+        //更新业绩提成
+        iAchievementsCommissionService.updateById(commission);
+
+        return super.saveOrUpdate(entity);
+    }
+}

+ 279 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/achievements/service/impl/AchievementsCommissionServiceImpl.java

@@ -0,0 +1,279 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package com.fjhx.achievements.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.achievements.entity.AchievementsCommission;
+import com.fjhx.achievements.mapper.AchievementsCommissionMapper;
+import com.fjhx.achievements.service.IAchievementsCommissionService;
+import com.fjhx.contract.entity.Contract;
+import com.fjhx.contract.entity.ContractFlowExtend;
+import com.fjhx.contract.service.IContractFlowExtendService;
+import com.fjhx.contract.service.IContractService;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springblade.common.entity.Pager;
+import org.springblade.common.enums.YesOrNoEnum;
+import org.springblade.common.utils.DoubleUtil;
+import org.springblade.common.utils.ListPageMap;
+import org.springblade.core.mp.base.BasicsServiceImpl;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tenant.annotation.TenantIgnore;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.system.constant.RoleConstant;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * 业绩提成表 服务实现类
+ *
+ * @author BladeX
+ * @since 2022-11-15
+ */
+@Service
+public class AchievementsCommissionServiceImpl extends BasicsServiceImpl<AchievementsCommissionMapper, AchievementsCommission> implements IAchievementsCommissionService {
+
+    @Lazy
+    @Autowired
+    private IContractFlowExtendService iContractFlowExtendService;
+
+    @Autowired
+    private IContractService iContractService;
+
+    /**
+     * 列表
+     *
+     * @param condition 查询条件
+     * @return
+     */
+    @TenantIgnore
+    @Override
+    public List<AchievementsCommission> getList(Map<String, Object> condition) {
+        //构建查询
+        QueryWrapper<AchievementsCommission> wrapper = getWrapper(condition);
+
+        //分页
+        Pager pager = (Pager) condition.get(ListPageMap.pager_key);
+        Page<AchievementsCommission> page = new Page<>(pager.getpageNum(), pager.getPageSize());
+
+        //根据时间倒序
+        wrapper.lambda().orderByDesc(AchievementsCommission::getCreateTime);
+
+        return baseMapper.selectPage(page, wrapper).getRecords();
+    }
+
+    /**
+     * 构建查询
+     *
+     * @param condition 查询条件
+     */
+    private QueryWrapper<AchievementsCommission> getWrapper(Map<String, Object> condition) {
+        QueryWrapper<AchievementsCommission> wrapper = new QueryWrapper<>();
+        wrapper.lambda().eq(AchievementsCommission::getIsEnable, YesOrNoEnum.YES.getKey());
+        wrapper.lambda().eq(AchievementsCommission::getTenantId, AuthUtil.getTenantId());
+        wrapper.lambda().eq(Func.isNotEmpty(condition.get("userId")), AchievementsCommission::getUserId, condition.get("userId").toString());
+        wrapper.apply(Func.isNotEmpty(condition.get("year")), "DATE_FORMAT(create_time, '%Y') = '" + condition.get("year") + "'");
+
+        //用户ID
+        String userId = AuthUtil.getUserIdStr();
+        //角色ID串
+        String[] roleIdArr = AuthUtil.getUserRoleId().split(",");
+        //如果是总经理和出纳,则查看所有数据
+        if (StringUtils.containsAny(String.valueOf(RoleConstant.RoleType.GENERAL_MANAGER), roleIdArr) || StringUtils.containsAny(String.valueOf(RoleConstant.RoleType.FINANCIAL_DIRECTOR), roleIdArr)) {
+            userId = null;
+        }
+        wrapper.lambda().eq(Func.isNotEmpty(userId), AchievementsCommission::getUserId, userId);
+
+        return wrapper;
+    }
+
+    /**
+     * 列表总数
+     *
+     * @param condition 查询条件
+     * @return
+     */
+    @TenantIgnore
+    @Override
+    public Integer getListCount(Map<String, Object> condition) {
+        //构建查询
+        QueryWrapper<AchievementsCommission> wrapper = getWrapper(condition);
+        return baseMapper.selectCount(wrapper);
+    }
+
+    /**
+     * 新增
+     *
+     * @param entity
+     * @return
+     */
+    @Transactional(rollbackFor = {Exception.class})
+    @Override
+    public synchronized boolean save(AchievementsCommission entity) {
+        //是否启用:0、否;1、是 (默认不启用)
+        entity.setIsEnable(YesOrNoEnum.NO.getKey());
+
+        //计算售后金额:到账金额 * 售后占比(使用默认占比:4%)
+        double afterSalesRatio = DoubleUtil.divNotRounding(new BigDecimal(4).doubleValue(), 100);
+        entity.setAfterSalesAmount(new BigDecimal(DoubleUtil.mul(Optional.ofNullable(entity.getClaimAmount()).orElse(new BigDecimal(BigDecimal.ZERO.intValue())).doubleValue(), afterSalesRatio, 2)));
+
+        //计算公共金额:到账金额 * 公共占比(使用默认占比:4%)
+        double publicRatio = DoubleUtil.divNotRounding(new BigDecimal(6).doubleValue(), 100);
+        entity.setPublicAmount(new BigDecimal(DoubleUtil.mul(Optional.ofNullable(entity.getClaimAmount()).orElse(new BigDecimal(BigDecimal.ZERO.intValue())).doubleValue(), publicRatio, 2)));
+
+        //计算总办金额:到账金额 * 总办占比(使用默认占比:4%)
+        double haveOverallRatio = DoubleUtil.divNotRounding(new BigDecimal(5).doubleValue(), 100);
+        entity.setHaveOverallAmount(new BigDecimal(DoubleUtil.mul(Optional.ofNullable(entity.getClaimAmount()).orElse(new BigDecimal(BigDecimal.ZERO.intValue())).doubleValue(), haveOverallRatio, 2)));
+
+        //净利:总收入 - 总支出 - 售后 - 公共 - 总办
+        entity.setNetProfit(new BigDecimal(entity.getTotalRevenue().doubleValue() - entity.getTotalExpenditure().doubleValue() - entity.getAfterSalesAmount().doubleValue() - entity.getPublicAmount().doubleValue() - entity.getHaveOverallAmount().doubleValue()));
+
+        //计算部门提成金额:(总收入 - 总支出 - 售后 - 公共 - 总办) * 部门占比(使用默认占比:33%)
+        double departmentalRatio = DoubleUtil.divNotRounding(new BigDecimal(33).doubleValue(), 100);
+        entity.setDepartmentalCommission(new BigDecimal(DoubleUtil.mul(entity.getTotalRevenue().doubleValue() - entity.getTotalExpenditure().doubleValue() - entity.getAfterSalesAmount().doubleValue() - entity.getPublicAmount().doubleValue() - entity.getHaveOverallAmount().doubleValue(), departmentalRatio, 2)));
+
+        //计算个人提成金额:(总收入 - 总支出 - 售后 - 公共 - 总办) * 个人占比(使用默认占比:17%)
+        double personalRatio = DoubleUtil.divNotRounding(new BigDecimal(17).doubleValue(), 100);
+        entity.setPersonalCommission(new BigDecimal(DoubleUtil.mul(entity.getTotalRevenue().doubleValue() - entity.getTotalExpenditure().doubleValue() - entity.getAfterSalesAmount().doubleValue() - entity.getPublicAmount().doubleValue() - entity.getHaveOverallAmount().doubleValue(), personalRatio, 2)));
+
+        return super.save(entity);
+    }
+
+    /**
+     * 根据合同扩展ID查询
+     *
+     * @param contractFlowExtendId 合同扩展ID
+     * @return
+     */
+    @Override
+    public AchievementsCommission getByContractFlowExtendId(String contractFlowExtendId) {
+        //先查合同扩展信息
+        ContractFlowExtend extend = iContractFlowExtendService.getById(contractFlowExtendId);
+        if (Func.isEmpty(extend)) {
+            return new AchievementsCommission();
+        }
+        AchievementsCommission commission = lambdaQuery().eq(AchievementsCommission::getContractId, extend.getContractId()).one();
+        if (Func.isNotEmpty(commission)) {
+            //查询合同详情
+            Contract contract = iContractService.getById(commission.getContractId());
+            if (Func.isNotEmpty(contract)) {
+                commission.setCurrencyType(contract.getCurrencyType());
+            }
+        }
+        return commission;
+    }
+
+    /**
+     * 头部统计
+     *
+     * @param condition 查询条件
+     * @return
+     */
+    @Override
+    public JSONObject getHeadStatistics(Map<String, Object> condition) {
+        //初始化数据结构
+        JSONObject object = new JSONObject();
+        //收入合计
+        object.put("totalRevenue", "0.00");
+        //支出合计
+        object.put("totalExpenditure", "0.00");
+        //售后
+        object.put("afterSalesAmount", "0.00");
+        //公共
+        object.put("publicAmount", "0.00");
+        //总办
+        object.put("haveOverallAmount", "0.00");
+        //毛利
+        object.put("profitLoss", "0.00");
+        //净利
+        object.put("netProfit", "0.00");
+        //部门提成
+        object.put("departmentalCommission", "0.00");
+        //个人提成
+        object.put("personalCommission", "0.00");
+
+        List<AchievementsCommission> list = this.getList(condition);
+        if (CollectionUtils.isEmpty(list)) {
+            return object;
+        }
+
+        //收入合计
+        BigDecimal totalRevenue = list.stream().filter(o -> Func.isNotEmpty(o.getTotalRevenue())).map(AchievementsCommission::getTotalRevenue).reduce(BigDecimal.ZERO, BigDecimal::add);
+        if (Func.isNotEmpty(totalRevenue)) {
+            object.put("totalRevenue", totalRevenue.toPlainString());
+        }
+
+        //支出合计
+        BigDecimal totalExpenditure = list.stream().filter(o -> Func.isNotEmpty(o.getTotalExpenditure())).map(AchievementsCommission::getTotalExpenditure).reduce(BigDecimal.ZERO, BigDecimal::add);
+        if (Func.isNotEmpty(totalExpenditure)) {
+            object.put("totalExpenditure", totalExpenditure.toPlainString());
+        }
+
+        //售后
+        BigDecimal afterSalesAmount = list.stream().filter(o -> Func.isNotEmpty(o.getAfterSalesAmount())).map(AchievementsCommission::getAfterSalesAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+        if (Func.isNotEmpty(afterSalesAmount)) {
+            object.put("afterSalesAmount", afterSalesAmount.toPlainString());
+        }
+
+        //公共
+        BigDecimal publicAmount = list.stream().filter(o -> Func.isNotEmpty(o.getPublicAmount())).map(AchievementsCommission::getPublicAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+        if (Func.isNotEmpty(publicAmount)) {
+            object.put("publicAmount", publicAmount.toPlainString());
+        }
+
+        //总办
+        BigDecimal haveOverallAmount = list.stream().filter(o -> Func.isNotEmpty(o.getHaveOverallAmount())).map(AchievementsCommission::getHaveOverallAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+        if (Func.isNotEmpty(haveOverallAmount)) {
+            object.put("haveOverallAmount", haveOverallAmount.toPlainString());
+        }
+
+        //毛利
+        BigDecimal profitLoss = list.stream().filter(o -> Func.isNotEmpty(o.getProfitLoss())).map(AchievementsCommission::getProfitLoss).reduce(BigDecimal.ZERO, BigDecimal::add);
+        if (Func.isNotEmpty(profitLoss)) {
+            object.put("profitLoss", profitLoss.toPlainString());
+        }
+
+        //净利
+        BigDecimal netProfit = list.stream().filter(o -> Func.isNotEmpty(o.getNetProfit())).map(AchievementsCommission::getNetProfit).reduce(BigDecimal.ZERO, BigDecimal::add);
+        if (Func.isNotEmpty(netProfit)) {
+            object.put("netProfit", netProfit.toPlainString());
+        }
+
+        //部门提成
+        BigDecimal departmentalCommission = list.stream().filter(o -> Func.isNotEmpty(o.getDepartmentalCommission())).map(AchievementsCommission::getDepartmentalCommission).reduce(BigDecimal.ZERO, BigDecimal::add);
+        if (Func.isNotEmpty(departmentalCommission)) {
+            object.put("departmentalCommission", departmentalCommission.toPlainString());
+        }
+
+        //个人提成
+        BigDecimal personalCommission = list.stream().filter(o -> Func.isNotEmpty(o.getPersonalCommission())).map(AchievementsCommission::getPersonalCommission).reduce(BigDecimal.ZERO, BigDecimal::add);
+        if (Func.isNotEmpty(personalCommission)) {
+            object.put("personalCommission", personalCommission.toPlainString());
+        }
+
+        return object;
+    }
+}

+ 100 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/aftersales/controller/ContractAftersalesController.java

@@ -0,0 +1,100 @@
+
+package com.fjhx.aftersales.controller;
+
+import com.fjhx.aftersales.entity.ContractAftersales;
+import com.fjhx.aftersales.service.IContractAftersalesService;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.AllArgsConstructor;
+import org.springblade.common.constant.ApiConstant;
+import org.springblade.common.utils.ListPageMap;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 合同售后表 控制器
+ *
+ * @author caozj
+ * @since 2022-03-04
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping(ApiConstant.Project.SAAS_BUSINESS_TRADEERP_REQUEST_PREFIX+"/contractaftersales")
+public class ContractAftersalesController extends BladeController {
+
+	private final IContractAftersalesService contractAftersalesService;
+
+	/**
+	 * 详情
+	 */
+	@GetMapping("/detail")
+	public R<ContractAftersales> detail(@RequestParam String id) {
+		ContractAftersales detail = contractAftersalesService.detailAfterSales(id);
+		return R.data(detail);
+	}
+
+	/**
+	 * 分页 合同售后表
+	 */
+	@PostMapping("/list")
+	public R list(@RequestBody Map<String,Object> condition) {
+		// 获取分页列表查询参数
+		ListPageMap.getListPageMap(condition);
+		List<ContractAftersales> list = contractAftersalesService.findPage(condition);
+		return R.list(list);
+	}
+	/**
+	 * 列表条数查询
+	 */
+	@PostMapping("/list/count")
+	public R count(@RequestBody Map<String,Object> condition) {
+		// 获取分页列表查询参数
+		ListPageMap.getListPageMap(condition);
+		return R.data(contractAftersalesService.findPageCount(condition));
+	}
+	/**
+	 * 新增 合同售后表
+	 */
+	@PostMapping("/save")
+	@ApiOperation(value = "新增", notes = "传入contractAftersales")
+	public R save(@Valid @RequestBody ContractAftersales contractAftersales) {
+		return R.status(contractAftersalesService.saveAfterSales(contractAftersales));
+	}
+
+	/**
+	 * 修改 合同售后表
+	 */
+	@PostMapping("/update")
+	public R update(@Valid @RequestBody ContractAftersales contractAftersales) {
+		return R.status(contractAftersalesService.editAfterSales(contractAftersales));
+	}
+	
+	/**
+	 * 删除 合同售后表
+	 */
+	@GetMapping("/remove")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String id) {
+		return R.status(contractAftersalesService.delAfterSales(id));
+	}
+
+	/**
+	 * 下拉合同列表
+	 */
+	@GetMapping("/select/contract")
+	public R selectContract(@RequestParam(value = "customer",defaultValue = "") String customer) {
+		return R.list(contractAftersalesService.selectContract(customer));
+	}
+
+	/**
+	 * 下拉产品
+	 */
+	@GetMapping("/select/Product")
+	public R selectProduct(@RequestParam(value = "contractId",defaultValue = "") String contractId) {
+		return R.list(contractAftersalesService.selectProduct(contractId));
+	}
+}

+ 37 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/aftersales/mapper/ContractAftersalesMapper.java

@@ -0,0 +1,37 @@
+package com.fjhx.aftersales.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fjhx.aftersales.entity.ContractAftersales;
+import org.springblade.core.tenant.annotation.TenantIgnore;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 合同表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2022-03-04
+ */
+@Repository
+public interface ContractAftersalesMapper extends BaseMapper<ContractAftersales> {
+
+
+    /**
+     * 列表查询
+     * @param condition
+     * @return
+     */
+    @TenantIgnore
+    List<ContractAftersales> selectContractAftersalesPage(Map<String,Object> condition);
+
+    /**
+     * 列表条数
+     * @param condition
+     * @return
+     */
+    @TenantIgnore
+    Integer selectContractAftersalesPageCount(Map<String,Object> condition);
+
+}

+ 57 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/aftersales/mapper/ContractAftersalesMapper.xml

@@ -0,0 +1,57 @@
+<?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.fjhx.aftersales.mapper.ContractAftersalesMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="contractAftersalesResultMap" type="com.fjhx.aftersales.entity.ContractAftersales">
+        <id column="id" property="id"/>
+        <result column="contract_id" property="contractId"/>
+        <result column="product_id" property="productId"/>
+        <result column="aftersales_cost" property="aftersalesCost"/>
+        <result column="aftersales_problem" property="aftersalesProblem"/>
+        <result column="aftersales_coordinate_scheme" property="aftersalesCoordinateScheme"/>
+        <result column="aftersales_status" property="aftersalesStatus"/>
+        <result column="aftersales_reserved" property="aftersalesReserved"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+
+    <select id="selectContractAftersalesPage" resultMap="contractAftersalesResultMap">
+        SELECT
+            t1.*,
+            t2.`code` AS contractCode,
+            t3.product_name AS productName
+        FROM
+            t_erp_contract_aftersales t1
+                LEFT JOIN t_erp_contract t2 ON t1.contract_id = t2.id
+                LEFT JOIN t_erp_contract_product t3 ON t1.product_id = t3.id
+        <include refid="getCondition"/>
+            ORDER BY t1.create_time desc
+        <include refid="Sql.sql_pager"/>
+    </select>
+    <sql id="getCondition">
+        <where>
+            t1.aftersales_status = 0
+            AND t1.customer_id = #{customerId}
+            <if test="productName neq null and productName neq ''">
+                AND INSTR(t3.product_name, #{productName}) > 0
+            </if>
+            <if test="contractCode neq null and contractCode neq ''">
+                AND INSTR(t2.`code`, #{contractCode}) > 0
+            </if>
+        </where>
+    </sql>
+
+    <select id="selectContractAftersalesPageCount" resultType="java.lang.Integer">
+        SELECT
+           COUNT(1)
+        FROM
+        t_erp_contract_aftersales t1
+        LEFT JOIN t_erp_contract t2 ON t1.contract_id = t2.id
+        LEFT JOIN t_erp_contract_product t3 ON t1.product_id = t3.id
+        <include refid="getCondition"/>
+    </select>
+</mapper>

+ 79 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/aftersales/service/IContractAftersalesService.java

@@ -0,0 +1,79 @@
+
+package com.fjhx.aftersales.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fjhx.aftersales.entity.ContractAftersales;
+import com.fjhx.contract.entity.Contract;
+import com.fjhx.contract.entity.ContractProduct;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 合同表 服务类
+ *
+ * @author BladeX
+ * @since 2022-03-04
+ */
+public interface IContractAftersalesService extends IService<ContractAftersales> {
+
+
+    /**
+     * 保存售后数据
+     * @param aftersales
+     * @return
+     */
+    Boolean saveAfterSales(ContractAftersales aftersales);
+
+    /**
+     * 详情
+     * @param id
+     * @return
+     */
+    ContractAftersales detailAfterSales(String id);
+
+    /**
+     * 修改
+     * @param aftersales
+     * @return
+     */
+    Boolean editAfterSales(ContractAftersales aftersales);
+
+    /**
+     * 删除
+     * @param id
+     * @return
+     */
+    Boolean delAfterSales(String id);
+
+
+    /**
+     * 列表查询
+     * @param condition
+     * @return
+     */
+    List<ContractAftersales> findPage(Map<String,Object> condition);
+
+    /**
+     * 列表条数查询
+     * @param condition
+     * @return
+     */
+    Integer findPageCount(Map<String,Object> condition);
+
+
+    /**
+     * 下拉合同列表
+     * @param customerId
+     * @return
+     */
+    List<Contract> selectContract(String customerId);
+
+    /**
+     * 下拉产品列表
+     * @param contractId
+     * @return
+     */
+    List<ContractProduct> selectProduct(String contractId);
+
+}

+ 183 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/aftersales/service/impl/ContractAftersalesServiceImpl.java

@@ -0,0 +1,183 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package com.fjhx.aftersales.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fjhx.aftersales.entity.ContractAftersales;
+import com.fjhx.aftersales.mapper.ContractAftersalesMapper;
+import com.fjhx.aftersales.service.IContractAftersalesService;
+import com.fjhx.common.attachment.IAttachmentApi;
+import com.fjhx.contract.entity.Contract;
+import com.fjhx.contract.entity.ContractProduct;
+import com.fjhx.contract.mapper.ContractMapper;
+import com.fjhx.contract.mapper.ContractProductMapper;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springblade.common.constant.AttachmentConstant;
+import org.springblade.core.mp.base.BasicsServiceImpl;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.utils.StringUtils;
+import org.springblade.system.attachment.entity.Attachment;
+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;
+import java.util.Map;
+
+/**
+ * 合同售后表 服务实现类
+ *
+ * @author BladeX
+ * @since 2022-03-04
+ */
+@Service
+public class ContractAftersalesServiceImpl extends BasicsServiceImpl<ContractAftersalesMapper, ContractAftersales> implements IContractAftersalesService {
+
+    @Autowired
+    private IAttachmentApi attachmentApi;
+
+    @Autowired
+    private ContractMapper contractMapper;
+
+    @Autowired
+    private ContractProductMapper productMapper;
+    /**
+     * 保存数据
+     * @param aftersales
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean saveAfterSales(ContractAftersales aftersales) {
+        String tenantId = AuthUtil.getTenantId();
+        aftersales.setTenantId(tenantId);
+        aftersales.setCreateUser(AuthUtil.getUserIdStr());
+        this.save(aftersales);
+        List<Attachment> attachmentList = aftersales.getAttachment();
+        if(CollectionUtils.isNotEmpty(attachmentList)){
+            for(Attachment m:attachmentList){
+                m.setBusiId(aftersales.getId());
+                m.setBusiType(AttachmentConstant.BusiType.OTHER);
+            }
+            attachmentApi.batchInsert(attachmentList);
+        }
+        return true;
+    }
+
+    /**
+     * 详情
+     * @param id
+     * @return
+     */
+    @Override
+    public ContractAftersales detailAfterSales(String id) {
+        ContractAftersales aftersales = this.getById(id);
+        if(StringUtils.isNull(aftersales)){
+            return new ContractAftersales();
+        }
+        List<Attachment> attachmentList = attachmentApi.getByBusiIdAndType(aftersales.getId(),AttachmentConstant.BusiType.OTHER);
+        aftersales.setAttachment(attachmentList);
+        return aftersales;
+    }
+
+    /**
+     * 修改
+     * @param aftersales
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean editAfterSales(ContractAftersales aftersales) {
+        aftersales.setUpdateUser(AuthUtil.getUserIdStr());
+        this.updateById(aftersales);
+        List<Attachment> attachmentList = aftersales.getAttachment();
+        if(CollectionUtils.isNotEmpty(attachmentList)){
+            //清空文件,在添加
+            attachmentApi.deleteByBusiId(aftersales.getId());
+            for(Attachment m:attachmentList){
+                m.setBusiId(aftersales.getId());
+                m.setBusiType(AttachmentConstant.BusiType.OTHER);
+            }
+            attachmentApi.batchInsert(attachmentList);
+        }
+        return true;
+    }
+
+    /**
+     * 删除
+     * @param id
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean delAfterSales(String id) {
+        this.remove(Wrappers.<ContractAftersales>update().lambda().
+                set(ContractAftersales::getAftersalesStatus,1).
+                eq(ContractAftersales::getId, id));
+        //删除文件
+        attachmentApi.deleteByBusiId(id);
+        return true;
+    }
+
+    /**
+     * 分页列表查询
+     * @param condition
+     * @return
+     */
+    @Override
+    public List<ContractAftersales> findPage(Map<String, Object> condition) {
+        List<ContractAftersales> list = baseMapper.selectContractAftersalesPage(condition);
+        if(CollectionUtils.isEmpty(list)){
+            return new ArrayList<>();
+        }
+        for(ContractAftersales c:list){
+            c.setAttachment(attachmentApi.getByBusiIdAndType(c.getId(),AttachmentConstant.BusiType.OTHER));
+        }
+        return list;
+    }
+
+    /**
+     * 列表条数查询
+     * @param condition
+     * @return
+     */
+    @Override
+    public Integer findPageCount(Map<String, Object> condition) {
+        return baseMapper.selectContractAftersalesPageCount(condition);
+    }
+
+    /**
+     * 下拉合同
+     * @param customerId
+     * @return
+     */
+    @Override
+    public List<Contract> selectContract(String customerId) {
+        return contractMapper.getContractSelect(AuthUtil.getTenantId(),customerId);
+    }
+
+    /**
+     * 下拉产品
+     * @param contractId
+     * @return
+     */
+    @Override
+    public List<ContractProduct> selectProduct(String contractId) {
+        return productMapper.selectProductByContractId(contractId);
+    }
+}

+ 42 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/budget/controller/ProfitBudgetController.java

@@ -0,0 +1,42 @@
+package com.fjhx.budget.controller;
+
+import com.fjhx.budget.entity.ProfitBudget;
+import com.fjhx.budget.service.IProfitBudgetService;
+import org.springblade.common.constant.ApiConstant;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+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(ApiConstant.Project.SAAS_BUSINESS_TRADEERP_REQUEST_PREFIX + "/profit/budget")
+public class ProfitBudgetController extends BladeController {
+
+    @Autowired
+    private IProfitBudgetService profitBudgetService;
+
+    /**
+     * 详情
+     */
+    @PostMapping("/detail")
+    public R<ProfitBudget> detail(@RequestBody ProfitBudget profitBudget) {
+        ProfitBudget detail = profitBudgetService.getById(profitBudget.getId());
+        return R.details(detail);
+    }
+
+    /**
+     * 新增
+     */
+    @PostMapping("/submit")
+    public R submit(@RequestBody ProfitBudget profitBudget) {
+        profitBudgetService.submit(profitBudget);
+        return R.success();
+    }
+
+}

+ 19 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/budget/mapper/ProfitBudgetMapper.java

@@ -0,0 +1,19 @@
+package com.fjhx.budget.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fjhx.budget.entity.ProfitBudget;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 利润预算
+ */
+public interface ProfitBudgetMapper extends BaseMapper<ProfitBudget> {
+
+    /**
+     * 通过合同id删除
+     *
+     * @param contractId
+     */
+    void deleteByContractId(@Param("contractId") String contractId);
+
+}

+ 29 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/budget/mapper/ProfitBudgetMapper.xml

@@ -0,0 +1,29 @@
+<?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.fjhx.budget.mapper.ProfitBudgetMapper">
+
+    <resultMap id="profitBudgetResultMap" type="com.fjhx.budget.entity.ProfitBudget">
+        <id column="id" property="id"/>
+        <result column="contract_id" property="contractId"/>
+        <result column="trailer_fee" property="trailerFee"/>
+        <result column="customs_fee" property="customsFee"/>
+        <result column="agency_fee" property="agencyFee"/>
+        <result column="port_mixed_fee" property="portMixedFee"/>
+        <result column="inspection_red_pack" property="inspectionRedPack"/>
+        <result column="commission" property="commission"/>
+        <result column="other" property="other"/>
+        <result column="sub_total" property="subTotal"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+    <delete id="deleteByContractId">
+        DELETE FROM t_erp_profit_budget
+        <where>
+            contract_id = #{contractId}
+        </where>
+    </delete>
+
+</mapper>

+ 38 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/budget/service/IProfitBudgetService.java

@@ -0,0 +1,38 @@
+package com.fjhx.budget.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fjhx.budget.entity.ProfitBudget;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 利润预算
+ */
+public interface IProfitBudgetService extends IService<ProfitBudget> {
+
+    /**
+     * 提交按钮--新增或者修改
+     *
+     * @param profitBudget
+     * @return
+     */
+    void submit(ProfitBudget profitBudget);
+
+    /**
+     * 根据合同ID查询树
+     *
+     * @param contractIds 合同ID集合
+     * @return
+     */
+    List<ProfitBudget> getByContractIds(List<String> contractIds);
+
+    /**
+     * 根据合同ID查询树
+     *
+     * @param contractIds 合同ID集合
+     * @return
+     */
+    Map<String, BigDecimal> getByContractIdsToMap(List<String> contractIds);
+}

+ 88 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/budget/service/impl/ProfitBudgetServiceImpl.java

@@ -0,0 +1,88 @@
+package com.fjhx.budget.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fjhx.budget.entity.ProfitBudget;
+import com.fjhx.budget.mapper.ProfitBudgetMapper;
+import com.fjhx.budget.service.IProfitBudgetService;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.mp.base.BasicsServiceImpl;
+import org.springblade.core.tool.utils.id.IdUtils;
+import org.springframework.stereotype.Service;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 利润预算
+ */
+@Service
+public class ProfitBudgetServiceImpl extends BasicsServiceImpl<ProfitBudgetMapper, ProfitBudget> implements IProfitBudgetService {
+
+    /**
+     * 根据 ID 查询
+     *
+     * @param id 主键ID
+     */
+    @Override
+    public ProfitBudget getById(Serializable id) {
+        if (id == null || id.toString().trim().length() <= 0) {
+            return null;
+        }
+        return super.getById(id);
+    }
+
+    /**
+     * 新增
+     *
+     * @param profitBudget
+     * @return
+     */
+    @Override
+    public void submit(ProfitBudget profitBudget) {
+        if (StringUtils.isBlank(profitBudget.getContractId())) {
+            throw new ServiceException("参数缺失");
+        }
+        //通过合同id删除
+        baseMapper.deleteByContractId(profitBudget.getContractId());
+
+        //新增
+        profitBudget.setId(IdUtils.fastSimpleUUID());
+        super.save(profitBudget);
+    }
+
+    /**
+     * 根据合同ID查询树
+     *
+     * @param contractIds 合同ID集合
+     * @return
+     */
+    @Override
+    public List<ProfitBudget> getByContractIds(List<String> contractIds) {
+        if (CollectionUtils.isEmpty(contractIds)) {
+            return new ArrayList<>();
+        }
+        return baseMapper.selectList(Wrappers.<ProfitBudget>query().lambda().in(ProfitBudget::getContractId, contractIds));
+    }
+
+    /**
+     * 根据合同ID查询树
+     *
+     * @param contractIds 合同ID集合
+     * @return
+     */
+    @Override
+    public Map<String, BigDecimal> getByContractIdsToMap(List<String> contractIds) {
+        List<ProfitBudget> list = getByContractIds(contractIds);
+        if (CollectionUtils.isEmpty(list)) {
+            return new HashMap<>();
+        }
+        return list.stream().collect(Collectors.toMap(ProfitBudget::getContractId, ProfitBudget::getSubTotal));
+    }
+}

+ 94 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/calculator/controller/ProfitlossCalculatorController.java

@@ -0,0 +1,94 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package com.fjhx.calculator.controller;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fjhx.calculator.entity.ProfitlossCalculator;
+import com.fjhx.calculator.service.IProfitlossCalculatorService;
+import io.swagger.annotations.ApiParam;
+import lombok.AllArgsConstructor;
+import org.springblade.common.constant.ApiConstant;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 交易盈亏计算器 控制器
+ *
+ * @author BladeX
+ * @since 2022-04-15
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping(ApiConstant.Project.SAAS_BUSINESS_TRADEERP_REQUEST_PREFIX+"/profitlosscalculator")
+public class ProfitlossCalculatorController extends BladeController {
+
+	private final IProfitlossCalculatorService profitlossCalculatorService;
+
+	/**
+	 * 详情
+	 */
+	@GetMapping("/detail")
+	public R<ProfitlossCalculator> detail(@RequestParam("productId") String productId) {
+		ProfitlossCalculator calculator = profitlossCalculatorService.getOne(Wrappers.<ProfitlossCalculator>query().lambda().eq(ProfitlossCalculator::getProductId, productId));
+		return R.data(calculator);
+	}
+
+	/**
+	 * 详情
+	 */
+	@GetMapping("/list")
+	public R<ProfitlossCalculator> list(@RequestParam("businessId") String businessId) {
+		List<ProfitlossCalculator> list = profitlossCalculatorService.list(Wrappers.<ProfitlossCalculator>query().lambda().eq(ProfitlossCalculator::getBusinessId, businessId));
+		return R.list(list);
+	}
+	/**
+	 * 新增 交易盈亏计算器
+	 */
+	@PostMapping("/save")
+	public R save(@Valid @RequestBody ProfitlossCalculator profitlossCalculator) {
+		profitlossCalculator.setCreateTime(new Date());
+		profitlossCalculator.setCreateUser(AuthUtil.getUserIdStr());
+		return R.status(profitlossCalculatorService.save(profitlossCalculator));
+	}
+
+	/**
+	 * 修改 交易盈亏计算器
+	 */
+	@PostMapping("/update")
+	public R update(@Valid @RequestBody ProfitlossCalculator profitlossCalculator) {
+		profitlossCalculator.setUpdateUser(AuthUtil.getUserIdStr());
+		profitlossCalculator.setUpdateTime(new Date());
+		return R.status(profitlossCalculatorService.updateById(profitlossCalculator));
+	}
+	
+	/**
+	 * 删除 交易盈亏计算器
+	 */
+	@PostMapping("/remove")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(profitlossCalculatorService.removeByIds(Func.toLongList(ids)));
+	}
+
+	
+}

+ 30 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/calculator/mapper/ProfitlossCalculatorMapper.java

@@ -0,0 +1,30 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package com.fjhx.calculator.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fjhx.calculator.entity.ProfitlossCalculator;
+
+/**
+ * 交易盈亏计算器 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2022-04-15
+ */
+public interface ProfitlossCalculatorMapper extends BaseMapper<ProfitlossCalculator> {
+
+}

+ 37 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/calculator/mapper/ProfitlossCalculatorMapper.xml

@@ -0,0 +1,37 @@
+<?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.fjhx.calculator.mapper.ProfitlossCalculatorMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="profitlossCalculatorResultMap" type="com.fjhx.calculator.entity.ProfitlossCalculator">
+        <id column="id" property="id"/>
+        <result column="business_id" property="businessId"/>
+        <result column="product_id" property="productId"/>
+        <result column="amount_remittance" property="amountRemittance"/>
+        <result column="exchange_rate" property="exchangeRate"/>
+        <result column="practical_amount_remittance" property="practicalAmountRemittance"/>
+        <result column="cost_invoiced_amount" property="costInvoicedAmount"/>
+        <result column="tax_rate" property="taxRate"/>
+        <result column="amount_refund_tax" property="amountRefundTax"/>
+        <result column="money_packaging" property="moneyPackaging"/>
+        <result column="money_packaging_freight" property="moneyPackagingFreight"/>
+        <result column="money_accessories" property="moneyAccessories"/>
+        <result column="money_hauling" property="moneyHauling"/>
+        <result column="money_port_charges" property="moneyPortCharges"/>
+        <result column="money_apack" property="moneyApack"/>
+        <result column="money_customs_charges" property="moneyCustomsCharges"/>
+        <result column="money_examine_goods" property="moneyExamineGoods"/>
+        <result column="money_other" property="moneyOther"/>
+        <result column="total_income" property="totalIncome"/>
+        <result column="spending_total" property="spendingTotal"/>
+        <result column="profit_loss" property="profitLoss"/>
+        <result column="gross_margin" property="grossMargin"/>
+        <result column="alternate_field" property="alternateField"/>
+        <result column="status" property="status"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+</mapper>

+ 30 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/calculator/service/IProfitlossCalculatorService.java

@@ -0,0 +1,30 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package com.fjhx.calculator.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fjhx.calculator.entity.ProfitlossCalculator;
+
+/**
+ * 交易盈亏计算器 服务类
+ *
+ * @author BladeX
+ * @since 2022-04-15
+ */
+public interface IProfitlossCalculatorService extends IService<ProfitlossCalculator> {
+
+}

+ 34 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/calculator/service/impl/ProfitlossCalculatorServiceImpl.java

@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package com.fjhx.calculator.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.calculator.entity.ProfitlossCalculator;
+import com.fjhx.calculator.mapper.ProfitlossCalculatorMapper;
+import com.fjhx.calculator.service.IProfitlossCalculatorService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 交易盈亏计算器 服务实现类
+ *
+ * @author BladeX
+ * @since 2022-04-15
+ */
+@Service
+public class ProfitlossCalculatorServiceImpl extends ServiceImpl<ProfitlossCalculatorMapper, ProfitlossCalculator> implements IProfitlossCalculatorService {
+
+}

+ 164 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/claim/controller/ClaimController.java

@@ -0,0 +1,164 @@
+package com.fjhx.claim.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fjhx.claim.entity.Claim;
+import com.fjhx.claim.service.IClaimService;
+import com.fjhx.fundAccount.FundAccountDetail;
+import com.fjhx.fundAccount.enums.FundDetailTypeEnum;
+import com.fjhx.fundAccount.service.IFundAccountDetailService;
+import com.fjhx.fundAccount.service.IFundAccountService;
+import org.springblade.common.constant.ApiConstant;
+import org.springblade.common.utils.ListPageMap;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+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;
+import java.util.Map;
+
+/**
+ * 到账认领
+ */
+@RestController
+@RequestMapping(ApiConstant.Project.SAAS_BUSINESS_TRADEERP_REQUEST_PREFIX + "/claim")
+public class ClaimController extends BladeController {
+
+    @Autowired
+    private IClaimService claimService;
+
+    @Autowired
+    private IFundAccountDetailService iFundAccountDetailService;
+
+    @Autowired
+    private IFundAccountService iFundAccountService;
+
+    /**
+     * 列表
+     *
+     * @param condition 查询条件
+     * @return
+     */
+    @PostMapping("/list")
+    public R getList(@RequestBody Map<String, Object> condition) {
+        ListPageMap.getListPageMap(condition);
+        List<Claim> list = claimService.getList(condition);
+        return R.list(list);
+    }
+
+    /**
+     * 列表货币类型总额(查询所有的人民币总额,美元总额,欧元总额)
+     *
+     * @param condition 查询条件
+     * @return
+     */
+    @PostMapping("/list/sum")
+    public R getListSum(@RequestBody Map<String, Object> condition) {
+        ListPageMap.getListPageMap(condition);
+        List<Map<String, Object>> list = claimService.getListSum(condition);
+        return R.success(list);
+    }
+
+
+    /**
+     * 列表-总条数
+     *
+     * @param condition 查询条件
+     * @return
+     */
+    @PostMapping("/list/count")
+    public R getListCount(@RequestBody Map<String, Object> condition) {
+        Integer count = claimService.getListCount(condition);
+        return R.count(count);
+    }
+
+    /**
+     * 详情
+     *
+     * @param claim
+     * @return
+     */
+    @PostMapping("/details")
+    public R details(@RequestBody Claim claim) {
+        claim = claimService.getById(claim.getId());
+        return R.details(claim);
+    }
+
+    /**
+     * 新增
+     *
+     * @param claim
+     * @return
+     */
+    @PostMapping("/insert")
+    public R insert(@RequestBody Claim claim) {
+        claimService.insert(claim);
+        return R.success();
+    }
+
+    /**
+     * 通过id修改
+     *
+     * @param claim
+     * @return
+     */
+    @PostMapping("/updateById")
+    public R updateById(@RequestBody Claim claim) {
+        claimService.update(claim);
+        return R.success();
+    }
+
+    /**
+     * 认领
+     *
+     * @param claim
+     * @return
+     */
+    @PostMapping("/confirm")
+    public R confirm(@RequestBody Claim claim) {
+        claimService.confirm(claim);
+        return R.success();
+    }
+
+    /**
+     * 删除
+     *
+     * @param claim
+     * @return
+     */
+    @PostMapping("/delete")
+    @Transactional(rollbackFor = Exception.class)
+    public R delete(@RequestBody Claim claim) {
+        claimService.removeById(claim.getId());
+        QueryWrapper<FundAccountDetail> query = Wrappers.query();
+        query.eq("bussiness_id", claim.getId());
+
+        //查询资金明细表的详情
+        FundAccountDetail fundAccountDetail = iFundAccountDetailService.getOne(query);
+
+        //删除的时候类型更新为支出:减去
+        fundAccountDetail.setType(FundDetailTypeEnum.EXPENDITURE.getKey());
+        //更新钱包
+        iFundAccountService.subFund(fundAccountDetail);
+
+        synchronized (this) {
+            //处理余额及流水明细
+            fundAccountDetail.setType(FundDetailTypeEnum.INCOME.getKey());
+            iFundAccountDetailService.handleBalanceAndDetails(fundAccountDetail, 3);
+
+            //删除流水明细
+            if (ObjectUtil.isNotEmpty(fundAccountDetail)) {
+                iFundAccountDetailService.removeById(fundAccountDetail.getId());
+            }
+        }
+
+        return R.success();
+    }
+
+}

+ 69 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/claim/mapper/ClaimMapper.java

@@ -0,0 +1,69 @@
+package com.fjhx.claim.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fjhx.claim.entity.Claim;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.core.tenant.annotation.TenantIgnore;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 到账认领
+ */
+public interface ClaimMapper extends BaseMapper<Claim> {
+
+    /**
+     * 列表
+     *
+     * @param condition
+     * @return
+     */
+    @TenantIgnore
+    List<Claim> getList(Map<String, Object> condition);
+
+    /**
+     * 列表-总条数
+     *
+     * @param condition
+     * @return
+     */
+    @TenantIgnore
+    Integer getListCount(Map<String, Object> condition);
+
+    /**
+     * 通过合同id判断是否是首次认领
+     *
+     * @param contractId 合同id
+     * @return
+     */
+    Integer getIsFirstClaim(@Param("contractId") String contractId);
+
+    /**
+     * 通过合同id查询已认领总金额
+     *
+     * @param contractId 合同id
+     * @return
+     */
+    BigDecimal getClaimAmountByContractId(@Param("contractId") String contractId);
+
+    /**
+     * 修改认领数据
+     *
+     * @param claim
+     */
+    void updateClaimById(Claim claim);
+
+    /**
+     * 根据用户ID查询款项已结清的合同数据
+     *
+     * @param userIds 业务员ID
+     * @param year    年度
+     * @return
+     */
+    @TenantIgnore
+    List<Claim> getByUserIds(@Param("userIds") List<String> userIds, @Param("year") String year);
+
+    List<Map<String, Object>> getListSum(Map<String, Object> condition);
+}

+ 193 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/claim/mapper/ClaimMapper.xml

@@ -0,0 +1,193 @@
+<?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.fjhx.claim.mapper.ClaimMapper">
+
+    <resultMap id="claimResultMap" type="com.fjhx.claim.entity.Claim">
+        <id column="id" property="id"/>
+        <result column="code" property="code"/>
+        <result column="channel_type" property="channelType"/>
+        <result column="collect_time" property="collectTime"/>
+        <result column="collect_amount" property="collectAmount"/>
+        <result column="currency_type" property="currencyType"/>
+        <result column="exchange_rate" property="exchangeRate"/>
+        <result column="exchange_rate_to_rmb" property="exchangeRateToRmb"/>
+        <result column="collect_bank_id" property="collectBankId"/>
+        <result column="collect_bank_name" property="collectBankName"/>
+        <result column="collect_bank_card" property="collectBankCard"/>
+        <result column="country_id" property="countryId"/>
+        <result column="remit_bank_name" property="remitBankName"/>
+        <result column="remit_bank_card" property="remitBankCard"/>
+        <result column="remit_bank_acc" property="remitBankAcc"/>
+        <result column="contract_id" property="contractId"/>
+        <result column="contract_code" property="contractCode"/>
+        <result column="contract_amount" property="contractAmount"/>
+        <result column="transfer_amount" property="transferAmount"/>
+        <result column="payment_type" property="paymentType"/>
+        <result column="claim_user_id" property="claimUserId"/>
+        <result column="claim_user_name" property="claimUserName"/>
+        <result column="claim_time" property="claimTime"/>
+        <result column="service_cost" property="serviceCost"/>
+        <result column="service_cost2" property="serviceCost2"/>
+        <result column="status" property="status"/>
+        <result column="remark" property="remark"/>
+        <result column="claim_remark" property="claimRemark"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+
+        <!-- 扩展字段 -->
+        <result column="country_name" property="countryName"/>
+        <result column="settledMoney" property="settledMoney"/>
+    </resultMap>
+
+    <sql id="sqlField">
+        SELECT * FROM t_erp_claim
+    </sql>
+
+    <select id="getList" resultMap="claimResultMap">
+        SELECT
+        t1.*,
+        t2.real_name AS claim_user_name,
+        t3.chinese_name AS country_name,
+        t4.name accountName,
+        t4.account_number accountNumber
+        FROM
+        t_erp_claim t1
+        LEFT JOIN blade_user t2 ON t1.claim_user_id = t2.id
+        LEFT JOIN t_pub_city t3 ON t1.country_id = t3.id
+        left join t_erp_fund_account t4 on t1.collect_bank_id = t4.id
+        <include refid="getListCondition"/>
+
+        <!-- 列表类型,1:待认领列表、2:已认领列表、3:认领选择合同查询历史列表 -->
+        <choose>
+            <when test="listType neq null and (listType eq 2 or listType eq 3)">
+                <!-- 如果是已认领列表按照认领时间排序 -->
+                ORDER BY
+                t1.claim_time DESC
+            </when>
+            <otherwise>
+                <!-- 如果是未认领列表按照创建时间排序 -->
+                ORDER BY
+                t1.create_time DESC
+            </otherwise>
+        </choose>
+
+        <include refid="Sql.sql_limit"/>
+    </select>
+
+    <select id="getListCount" resultType="java.lang.Integer">
+        SELECT
+        COUNT(*) AS c
+        FROM
+        t_erp_claim t1
+        LEFT JOIN blade_user t2 ON t1.claim_user_id = t2.id
+        LEFT JOIN t_pub_city t3 ON t1.country_id = t3.id
+        <include refid="getListCondition"/>
+    </select>
+
+    <sql id="getListCondition">
+        <where>
+            t1.tenant_id = #{tenantId}
+
+            <!-- 状态,0:未认领、1:已认领 -->
+            <!-- 待认领列表 -->
+            <if test="listType neq null and listType eq 1">
+                AND t1.status = 0
+            </if>
+
+            <!-- 已认领列表 -->
+            <if test="listType neq null and listType eq 2">
+                AND t1.status = 1
+            </if>
+
+            <!-- 认领选择合同查询历史列表 -->
+            <if test="listType neq null and listType eq 3">
+                AND t1.status = 1
+                AND t1.contract_code = #{contractCode}
+            </if>
+
+            <if test="contractCode neq null and contractCode neq ''">
+                AND (INSTR(t1.contract_code, #{contractCode}) > 0)
+            </if>
+        </where>
+    </sql>
+
+    <select id="getIsFirstClaim" resultType="java.lang.Integer">
+        SELECT
+        count (1)
+        FROM
+        t_erp_claim
+        <where>
+            contract_id = #{contractId}
+        </where>
+    </select>
+
+    <select id="getClaimAmountByContractId" resultType="java.math.BigDecimal">
+        SELECT
+        SUM(transfer_amount) AS c
+        FROM
+        t_erp_claim
+        <where>
+            `status` = 1
+            AND contract_id = #{contractId}
+        </where>
+    </select>
+
+    <update id="updateClaimById">
+        UPDATE t_erp_claim
+        <set>
+            contract_id = #{contractId},
+            contract_code = #{contractCode},
+            contract_amount = #{contractAmount},
+            transfer_amount = #{transferAmount},
+            payment_type = #{paymentType},
+            claim_user_id = #{claimUserId},
+            claim_remark = #{claimRemark},
+            claim_time = NOW(),
+            status = #{status},
+            update_user = #{updateUser},
+            update_time = NOW()
+        </set>
+        <where>
+            id = #{id}
+        </where>
+    </update>
+
+    <!-- 根据用户ID查询款项已结清的合同数据 -->
+    <select id="getByUserIds" resultType="com.fjhx.claim.entity.Claim">
+        SELECT
+        MAX( t1.create_time ) createTime,
+        t2.id contractId,
+        (t2.contract_price * IFNULL( t2.tax_rate, 0 )) 'contract.contractPrice',
+        t2.create_user 'contract.createUser',
+        t2.create_time 'contract.createTime'
+        FROM
+        t_erp_claim t1
+        INNER JOIN t_erp_contract t2 ON t1.contract_id = t2.id
+        WHERE
+        t2.data_type = 0
+        AND t2.is_change IN ( 0, 2 )
+        AND t2.`status` = 110
+        AND DATE_FORMAT( t1.create_time, '%Y' ) = #{year}
+        AND t2.create_user IN
+        <foreach collection="userIds" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+        GROUP BY
+        t1.contract_id
+    </select>
+    <select id="getListSum" resultType="java.util.Map">
+        SELECT
+        t1.currency_type currencyType,
+        SUM( t1.collect_amount ) collectAmount
+        FROM
+        t_erp_claim t1
+        LEFT JOIN blade_user t2 ON t1.claim_user_id = t2.id
+        LEFT JOIN t_pub_city t3 ON t1.country_id = t3.id
+        <include refid="getListCondition"/>
+        GROUP BY
+        t1.currency_type
+
+    </select>
+</mapper>

+ 120 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/claim/service/IClaimService.java

@@ -0,0 +1,120 @@
+package com.fjhx.claim.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fjhx.claim.entity.Claim;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 到账认领
+ */
+public interface IClaimService extends IService<Claim> {
+
+    /**
+     * 列表
+     *
+     * @param condition
+     * @return
+     */
+    List<Claim> getList(Map<String, Object> condition);
+
+    /**
+     * 列表-总条数
+     *
+     * @param condition
+     * @return
+     */
+    Integer getListCount(Map<String, Object> condition);
+
+    /**
+     * 通过合同id判断是否是首次认领
+     *
+     * @param contractId
+     * @return
+     */
+    boolean getIsFirstClaim(String contractId);
+
+    /**
+     * 通过合同id查询已认领总金额
+     *
+     * @param contractId 合同id
+     * @return
+     */
+    BigDecimal getClaimAmountByContractId(@Param("contractId") String contractId);
+
+    /**
+     * 新增
+     *
+     * @param claim
+     */
+    void insert(Claim claim);
+
+    /**
+     * 修改
+     *
+     * @param claim
+     */
+    void update(Claim claim);
+
+    /**
+     * 认领
+     *
+     * @param claim
+     */
+    void confirm(Claim claim);
+
+    /**
+     * 根据用户ID查询款项已结清的合同数据
+     *
+     * @param userIds 业务员ID
+     * @param year    年度
+     * @return
+     */
+    List<Claim> getByUserIds(List<String> userIds, String year);
+
+    /**
+     * 根据用户ID查询款项已结清的合同数据
+     *
+     * @param userIds 业务员ID
+     * @param year    年度
+     * @return
+     */
+    Map<String, List<Claim>> getByUserIdsToMap(List<String> userIds, String year);
+
+    List<Map<String, Object>> getListSum(Map<String, Object> condition);
+
+    /**
+     * 根据合同ID集合查询
+     *
+     * @param contractIds 合同ID集合
+     * @return
+     */
+    List<Claim> getByContractIds(List<String> contractIds);
+
+    /**
+     * 根据合同ID集合查询
+     *
+     * @param contractIds 合同ID集合
+     * @return
+     */
+    Map<String, List<Claim>> getByContractIdsToMap(List<String> contractIds);
+
+    /**
+     * 根据合同号集合查询
+     *
+     * @param contractCodes 合同号集合
+     * @return
+     */
+    List<Claim> getByContractCodes(List<String> contractCodes);
+
+    /**
+     * 根据合同ID集合查询
+     *
+     * @param contractCodes 合同号集合
+     * @return
+     */
+    Map<String, List<Claim>> getByContractCodesToMap(List<String> contractCodes);
+}

+ 480 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/claim/service/impl/ClaimServiceImpl.java

@@ -0,0 +1,480 @@
+package com.fjhx.claim.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.fjhx.claim.constant.ClaimConstant;
+import com.fjhx.claim.entity.Claim;
+import com.fjhx.claim.mapper.ClaimMapper;
+import com.fjhx.claim.service.IClaimService;
+import com.fjhx.common.attachment.IAttachmentApi;
+import com.fjhx.contract.constant.ContractTrackLogConstant;
+import com.fjhx.contract.entity.Contract;
+import com.fjhx.contract.enums.ContractStatusEnum;
+import com.fjhx.contract.enums.ContractTrackTypeEnum;
+import com.fjhx.contract.service.IContractService;
+import com.fjhx.contract.service.IContractTrackLogService;
+import com.fjhx.fundAccount.FundAccountDetail;
+import com.fjhx.fundAccount.enums.DataSourceEnum;
+import com.fjhx.fundAccount.enums.FundDetailTypeEnum;
+import com.fjhx.fundAccount.service.IFundAccountDetailService;
+import com.fjhx.message.constant.MessageNoticeConstant;
+import com.fjhx.message.enums.MessageNoticeEnum;
+import com.fjhx.message.service.IMessageNoticeService;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springblade.common.constant.AttachmentConstant;
+import org.springblade.common.constant.CurrencyTypeEnum;
+import org.springblade.common.constant.UserConstants;
+import org.springblade.common.enums.YesOrNoEnum;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.mp.base.BasicsServiceImpl;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tenant.annotation.TenantIgnore;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.system.attachment.entity.Attachment;
+import org.springblade.system.entity.Role;
+import org.springblade.system.feign.ISysClient;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * 到账认领
+ */
+@Service
+public class ClaimServiceImpl extends BasicsServiceImpl<ClaimMapper, Claim> implements IClaimService {
+
+    @Autowired
+    private IContractService contractService;
+
+    @Autowired
+    private IContractTrackLogService contractTrackLogService;
+
+    @Autowired
+    private IAttachmentApi attachmentApi;
+
+    @Autowired
+    private ISysClient iSysClient;
+
+    @Autowired
+    private IUserClient iUserClient;
+
+    @Autowired
+    private IMessageNoticeService iMessageNoticeService;
+
+    @Autowired
+    private IFundAccountDetailService iFundAccountDetailService;
+
+    /**
+     * 列表
+     *
+     * @param condition
+     * @return
+     */
+    @Override
+    public List<Claim> getList(Map<String, Object> condition) {
+        //拼接列表条件
+        getListCondition(condition);
+        List<Claim> list = baseMapper.getList(condition);
+        return list;
+    }
+
+    /**
+     * 列表-总条数
+     *
+     * @param condition
+     * @return
+     */
+    @Override
+    public Integer getListCount(Map<String, Object> condition) {
+        //拼接列表条件
+        getListCondition(condition);
+        Integer count = baseMapper.getListCount(condition);
+        return count;
+    }
+
+    /**
+     * 拼接列表条件
+     *
+     * @param condition
+     */
+    private void getListCondition(Map<String, Object> condition) {
+        //当前登入租户id
+        condition.put("tenantId", AuthUtil.getTenantId());
+    }
+
+    /**
+     * 通过合同id判断是否是首次认领
+     *
+     * @param contractId
+     * @return
+     */
+    @Override
+    public boolean getIsFirstClaim(String contractId) {
+        if (StringUtils.isBlank(contractId)) {
+            return false;
+        }
+        Integer count = baseMapper.getIsFirstClaim(contractId);
+        return count != null && count > 0;
+    }
+
+    /**
+     * 通过合同id查询已认领总金额
+     *
+     * @param contractId 合同id
+     * @return
+     */
+    @Override
+    public BigDecimal getClaimAmountByContractId(String contractId) {
+        if (contractId == null) {
+            return BigDecimal.ZERO;
+        }
+        BigDecimal amount = baseMapper.getClaimAmountByContractId(contractId);
+        return Optional.ofNullable(amount).orElse(BigDecimal.ZERO);
+    }
+
+    /**
+     * 新增
+     *
+     * @param claim
+     */
+    @Transactional(rollbackFor = {Exception.class})
+    @Override
+    public void insert(Claim claim) {
+        //租户id
+        String tenantId = AuthUtil.getTenantId();
+        if (StringUtils.isBlank(tenantId)) {
+            throw new ServiceException("当前登入租户为空");
+        }
+        claim.setTenantId(tenantId);
+        boolean result = super.save(claim);
+
+        //添加流水明细
+        FundAccountDetail fundAccountDetail = new FundAccountDetail();
+        fundAccountDetail.setBussinessId(claim.getId());
+        fundAccountDetail.setFromFundAccountId(claim.getCollectBankId());
+        fundAccountDetail.setMoney(claim.getCollectAmount());
+        fundAccountDetail.setType(FundDetailTypeEnum.INCOME.getKey());
+        fundAccountDetail.setCurrencyType(Integer.valueOf(claim.getCurrencyType()));
+        fundAccountDetail.setDataSource(DataSourceEnum.RECEIPT_CLAIM.getKey());
+        fundAccountDetail.setTaxRate(claim.getExchangeRate());
+        fundAccountDetail.setRemark(claim.getRemark());
+        fundAccountDetail.setMeansExchange(Integer.valueOf(claim.getChannelType()));
+        fundAccountDetail.setCreateTime(claim.getCollectTime());
+        fundAccountDetail.setBillType(0);
+        iFundAccountDetailService.saveDetail(fundAccountDetail);
+
+
+        if (result) {
+            // 根据角色别名查询对应的角色
+            List<String> roleAlias = new ArrayList<>();
+            roleAlias.add(UserConstants.USER_ROLE_KEY_SALESMAN);
+            roleAlias.add(UserConstants.PURCHASE_USER_ROLE_MK);
+            roleAlias.add(UserConstants.PURCHASE_USER_ROLE_OPERATE);
+            roleAlias.add(UserConstants.PURCHASE_USER_ROLE_SALESDIRECTOR);
+            List<Role> roles = iSysClient.getByRoleAlias(roleAlias);
+            if (CollectionUtils.isEmpty(roles)) {
+                return;
+            }
+
+            // 根据角色ID查询用户
+            List<String> roleIds = roles.stream().map(o -> String.valueOf(o.getId())).distinct().collect(Collectors.toList());
+            List<User> users = iUserClient.getByRoleIds(roleIds);
+            if (CollectionUtils.isEmpty(users)) {
+                return;
+            }
+            List<String> userIds = users.stream().map(o -> String.valueOf(o.getId())).distinct().collect(Collectors.toList());
+
+            // 拼接内容
+            String content = MessageNoticeConstant.MESSAGE_NOTICE_CONTENT_TEMPLATE_3;
+            content = MessageFormat.format(content, CurrencyTypeEnum.getNameByKey(claim.getCurrencyType()) + claim.getCollectAmount().toPlainString());
+
+            // 发送消息通知
+            iMessageNoticeService.send(claim.getId(), userIds, content, MessageNoticeEnum.MESSAGE_NOTICE_TYPE_3.getKey());
+        }
+    }
+
+    /**
+     * 修改
+     *
+     * @param claim
+     */
+    @Transactional(rollbackFor = {Exception.class})
+    @Override
+    public void update(Claim claim) {
+        if (StringUtils.isBlank(claim.getId())) {
+            throw new ServiceException("请选择要修改的数据");
+        }
+        super.update(claim, new UpdateWrapper<Claim>().eq("id", claim.getId()));
+    }
+
+    /**
+     * 根据 ID 删除
+     *
+     * @param id 主键ID
+     */
+    @Transactional(rollbackFor = {Exception.class})
+    @Override
+    public boolean removeById(Serializable id) {
+        if (id == null || id.toString().trim().length() <= 0) {
+            throw new ServiceException("请选择要删除的数据");
+        }
+        //删除附件
+        attachmentApi.deleteByBusiId(id.toString());
+        return super.removeById(id);
+    }
+
+    /**
+     * 认领
+     *
+     * @param claim
+     */
+    @Transactional(rollbackFor = {Exception.class})
+    @Override
+    public void confirm(Claim claim) {
+        if (StringUtils.isBlank(claim.getId())) {
+            throw new ServiceException("请选择要认领的数据");
+        }
+        if (StringUtils.isAnyBlank(claim.getContractId(), claim.getContractCode())) {
+            throw new ServiceException("请选择要认领的合同");
+        }
+        //认领信息
+        Claim info = super.getById(claim.getId());
+        if (info == null) {
+            throw new ServiceException("认领数据不存在");
+        }
+        if (info.getStatus() != ClaimConstant.Status.NO_CONFIRM) {
+            throw new ServiceException("认领单已被认领");
+        }
+        //合同信息
+        Contract contract = contractService.getById(claim.getContractId());
+        if (contract == null) {
+            throw new ServiceException("合同不存在");
+        }
+        if (contract.getContractPrice() == null) {
+            throw new ServiceException("合同总金额为空");
+        }
+        //添加日志
+        contractTrackLogService.addLog(contract.getId(), ContractTrackTypeEnum.ARRIVAL.getKey(), ContractTrackLogConstant.Status.SEND, new Date());
+
+        //通过合同id判断是否是首次认领
+        boolean isFirstClaim = getIsFirstClaim(claim.getContractId());
+
+        //修改认领数据
+        //状态=已认领
+        claim.setStatus(ClaimConstant.Status.CONFIRM);
+        claim.setClaimUserId(AuthUtil.getUserIdStr());
+        claim.setUpdateUser(claim.getClaimUserId());
+        baseMapper.updateClaimById(claim);
+
+        //保存附件
+        if (CollectionUtils.isNotEmpty(claim.getAttachments())) {
+            for (Attachment attachment : claim.getAttachments()) {
+                attachment.setBusiId(claim.getId());
+                //业务类型=其他
+                attachment.setBusiType(AttachmentConstant.BusiType.OTHER);
+            }
+            attachmentApi.batchInsert(claim.getAttachments());
+        }
+
+        //通过合同id查询已认领总金额
+        BigDecimal claimAmount = getClaimAmountByContractId(claim.getContractId());
+
+        //1.修改合同状态
+        //1.1:是否首次认领,则状态 = 【合同已付款】
+        //1.2:如果历史认领金额≥合同金额,则状态 = 【已结清】
+        //1.3:如果历史认领金额<合同金额 and 合同状态 < 合同已确认,则状态 = 【合同已付款】
+        if (isFirstClaim) {
+            //首次认领
+            UpdateWrapper<Contract> updateWrapper = new UpdateWrapper<>();
+            updateWrapper.eq("id", claim.getContractId());
+            //认领时间
+            updateWrapper.set("confirm_date", new Date());
+            if (claimAmount.compareTo(contract.getContractPrice()) >= 0) {
+                //认领金额≥合同金额 ==> 修改合同状态为:合同已结清,合同状态如果走到后面不能再回滚到前面
+                if (contract.getStatus() < ContractStatusEnum.SETTLE.getKey()) {
+                    updateWrapper.set("status", ContractStatusEnum.SETTLE.getKey());
+                }
+                //添加日志
+                contractTrackLogService.addLog(contract.getId(), ContractTrackTypeEnum.ARRIVAL.getKey(), ContractTrackLogConstant.Status.END, new Date());
+            } else {
+                //合同状态=合同已付款,合同状态如果走到后面不能再回滚到前面
+                if (contract.getStatus() < ContractStatusEnum.CONFIRM.getKey()) {
+                    updateWrapper.set("status", ContractStatusEnum.CONFIRM.getKey());
+                }
+            }
+            contractService.update(updateWrapper);
+        } else if (claimAmount.compareTo(contract.getContractPrice()) >= 0) {
+            //历史认领金额≥合同金额 ==> 修改合同状态为:合同已结清
+            UpdateWrapper<Contract> updateWrapper = new UpdateWrapper<>();
+            updateWrapper.eq("id", claim.getContractId());
+            //认领时间
+            updateWrapper.set("confirm_date", new Date());
+            //合同状态=合同已结清,合同状态如果走到后面不能再回滚到前面
+            if (contract.getStatus() < ContractStatusEnum.SETTLE.getKey()) {
+                updateWrapper.set("status", ContractStatusEnum.SETTLE.getKey());
+            }
+            contractService.update(updateWrapper);
+
+            //添加日志
+            contractTrackLogService.addLog(contract.getId(), ContractTrackTypeEnum.ARRIVAL.getKey(), ContractTrackLogConstant.Status.END, new Date());
+        } else if (claimAmount.compareTo(contract.getContractPrice()) == -1
+                && contract.getStatus() < ContractStatusEnum.CONFIRM.getKey()) {
+            //如果历史认领金额<合同金额 and 合同状态 < 合同已付款 ==> 修改合同状态为:合同已付款
+            UpdateWrapper<Contract> updateWrapper = new UpdateWrapper<>();
+            updateWrapper.eq("id", claim.getContractId());
+            //认领时间
+            updateWrapper.set("confirm_date", new Date());
+            //状态=合同已付款
+            updateWrapper.set("status", ContractStatusEnum.CONFIRM.getKey());
+            contractService.update(updateWrapper);
+        }
+
+        //通过业务ID修改流水明细表的数据
+        UpdateWrapper<FundAccountDetail> wrapper = new UpdateWrapper<>();
+        wrapper.lambda().set(FundAccountDetail::getContractId, contract.getId());
+        wrapper.lambda().set(FundAccountDetail::getContractCode, contract.getCode());
+        wrapper.lambda().set(FundAccountDetail::getBillType, 0);
+        wrapper.lambda().eq(FundAccountDetail::getBussinessId, claim.getId());
+        iFundAccountDetailService.update(wrapper);
+    }
+
+    /**
+     * 根据用户ID查询款项已结清的合同数据
+     *
+     * @param userIds 业务员ID
+     * @param year    年度
+     * @return
+     */
+    @Override
+    public List<Claim> getByUserIds(List<String> userIds, String year) {
+        if (CollectionUtils.isEmpty(userIds)) {
+            return new ArrayList<>();
+        }
+        return baseMapper.getByUserIds(userIds, year);
+    }
+
+    /**
+     * 根据用户ID查询款项已结清的合同数据
+     *
+     * @param userIds 业务员ID
+     * @param year    年度
+     * @return
+     */
+    @Override
+    public Map<String, List<Claim>> getByUserIdsToMap(List<String> userIds, String year) {
+        List<Claim> list = getByUserIds(userIds, year);
+        if (CollectionUtils.isEmpty(list)) {
+            return new HashMap<>();
+        }
+        return list.stream().collect(Collectors.groupingBy(o -> o.getContract().getCreateUser()));
+    }
+
+    @Override
+    public List<Map<String, Object>> getListSum(Map<String, Object> condition) {
+        //拼接列表条件
+        getListCondition(condition);
+        List<Map<String, Object>> list = baseMapper.getListSum(condition);
+        return list;
+    }
+
+    /**
+     * 根据合同ID集合查询
+     *
+     * @param contractIds 合同ID集合
+     * @return
+     */
+    @TenantIgnore
+    @Override
+    public List<Claim> getByContractIds(List<String> contractIds) {
+        if (CollectionUtils.isEmpty(contractIds)) {
+            return new ArrayList<>();
+        }
+        List<Claim> list = lambdaQuery().eq(Claim::getTenantId, AuthUtil.getTenantId()).eq(Claim::getStatus, YesOrNoEnum.YES.getKey()).in(Claim::getContractId, contractIds).list();
+        if (CollectionUtils.isNotEmpty(list)) {
+            //认领人ID集合
+            List<String> claimUserIds = list.stream().map(Claim::getClaimUserId).distinct().collect(Collectors.toList());
+            //查询用户信息
+            Map<String, User> userMap = iUserClient.userInfoByIdsToMap(claimUserIds);
+
+            for (Claim claim : list) {
+                if (MapUtils.isNotEmpty(userMap) && Func.isNotEmpty(userMap.get(claim.getClaimUserId()))) {
+                    User user = userMap.get(claim.getClaimUserId());
+                    claim.setClaimUserName(user.getRealName());
+                }
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 根据合同ID集合查询
+     *
+     * @param contractIds 合同ID集合
+     * @return
+     */
+    @Override
+    public Map<String, List<Claim>> getByContractIdsToMap(List<String> contractIds) {
+        List<Claim> list = getByContractIds(contractIds);
+        if (CollectionUtils.isEmpty(list)) {
+            return new HashMap<>();
+        }
+        return list.stream().collect(Collectors.groupingBy(Claim::getContractId));
+    }
+
+    /**
+     * 根据合同号集合查询
+     *
+     * @param contractCodes 合同号集合
+     * @return
+     */
+    @Override
+    public List<Claim> getByContractCodes(List<String> contractCodes) {
+        if (CollectionUtils.isEmpty(contractCodes)) {
+            return new ArrayList<>();
+        }
+        List<Claim> list = lambdaQuery().eq(Claim::getTenantId, AuthUtil.getTenantId()).eq(Claim::getStatus, YesOrNoEnum.YES.getKey()).in(Claim::getContractCode, contractCodes).list();
+        if (CollectionUtils.isNotEmpty(list)) {
+            //认领人ID集合
+            List<String> claimUserIds = list.stream().map(Claim::getClaimUserId).distinct().collect(Collectors.toList());
+            //查询用户信息
+            Map<String, User> userMap = iUserClient.userInfoByIdsToMap(claimUserIds);
+
+            for (Claim claim : list) {
+                if (MapUtils.isNotEmpty(userMap) && Func.isNotEmpty(userMap.get(claim.getClaimUserId()))) {
+                    User user = userMap.get(claim.getClaimUserId());
+                    claim.setClaimUserName(user.getRealName());
+                }
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 根据合同ID集合查询
+     *
+     * @param contractCodes 合同号集合
+     * @return
+     */
+    @Override
+    public Map<String, List<Claim>> getByContractCodesToMap(List<String> contractCodes) {
+        List<Claim> list = getByContractCodes(contractCodes);
+        if (CollectionUtils.isEmpty(list)) {
+            return new HashMap<>();
+        }
+        return list.stream().collect(Collectors.groupingBy(Claim::getContractCode));
+    }
+}

+ 37 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/common/controller/CommonController.java

@@ -0,0 +1,37 @@
+package com.fjhx.common.controller;
+
+import com.fjhx.common.service.ICommonService;
+import org.springblade.common.constant.ApiConstant;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+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;
+
+/**
+ * @Description: 公共业务 控制器
+ * @ClassName: CommonController
+ * @Author: linqt
+ * @Date: 2022/4/6 11:35
+ * @Version: 1.0
+ */
+@RestController
+@RequestMapping(ApiConstant.Project.SAAS_BUSINESS_TRADEERP_REQUEST_PREFIX + "/common/business")
+public class CommonController extends BladeController {
+
+    @Autowired
+    private ICommonService iCommonService;
+
+    /**
+     * 校验流程配置是否完善
+     *
+     * @param modelType 模型类型
+     * @return
+     */
+    @PostMapping(value = "/check/act/process/is/perfect")
+    public R checkActProcessIsPerfect(@RequestParam("modelType") String modelType) {
+        return iCommonService.checkActProcessIsPerfect(modelType);
+    }
+}

+ 55 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/common/feign/CommonApi.java

@@ -0,0 +1,55 @@
+package com.fjhx.common.feign;
+
+import com.fjhx.common.service.ICommonService;
+import com.fjhx.interestrate.feign.ICommonApi;
+import org.springblade.core.tenant.annotation.NonDS;
+import org.springblade.core.tool.api.R;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 公共业务处理 api
+ */
+@NonDS
+@RestController
+public class CommonApi implements ICommonApi {
+
+    @Autowired
+    private ICommonService iCommonService;
+
+    /**
+     * <p>交易模块:外销合同、报价单、样品单根据角色id获取列表权限<p/>
+     *
+     * <p>1、总经理、总监、财务:看所有数据<p/>
+     * <p>2、其他:查看自己的数据<p/>
+     *
+     * <p>true:看所有数据、false:查看自己的数据<p/>
+     *
+     * @return
+     */
+    @GetMapping(GET_TRANSACTION_LIST_AUTH)
+    @Override
+    public R<Boolean> getTransactionListAuth() {
+        boolean b = iCommonService.getTransactionListAuth();
+        return R.data(b);
+    }
+
+    /**
+     * 交易管理(外销合同、样品单、报价单),移交
+     *
+     * @param tenantId   租户id
+     * @param customerId 客户id,要移交的客户
+     * @param userId     业务员id,移交给新的业务员id
+     */
+    @GetMapping(TRANSFER)
+    @Override
+    public R transfer(@RequestParam("tenantId") String tenantId,
+                      @RequestParam("customerId") String customerId,
+                      @RequestParam("userId") String userId) {
+        iCommonService.transfer(tenantId, customerId, userId);
+        return R.success();
+    }
+
+}

+ 45 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/common/service/ICommonService.java

@@ -0,0 +1,45 @@
+package com.fjhx.common.service;
+
+import org.springblade.core.tool.api.R;
+
+/**
+ * 公共业务处理
+ */
+public interface ICommonService {
+
+    /**
+     * 获取华为云地址前缀
+     *
+     * @return
+     */
+    String getHuaWeiUrl();
+
+    /**
+     * <p>交易模块:外销合同、报价单、样品单根据角色id获取列表权限<p/>
+     *
+     * <p>1、总经理、总监、财务:看所有数据<p/>
+     * <p>2、其他:查看自己的数据<p/>
+     *
+     * <p>true:看所有数据、false:查看自己的数据<p/>
+     *
+     * @return
+     */
+    boolean getTransactionListAuth();
+
+    /**
+     * 交易管理(外销合同、样品单、报价单),移交
+     *
+     * @param tenantId   租户id
+     * @param customerId 客户id,要移交的客户
+     * @param userId     业务员id,移交给新的业务员id
+     */
+    void transfer(String tenantId, String customerId, String userId);
+
+    /**
+     * 校验流程配置是否完善
+     *
+     * @param modelType 模型类型
+     * @return
+     */
+    R checkActProcessIsPerfect(String modelType);
+}

+ 139 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/common/service/impl/CommonServiceImpl.java

@@ -0,0 +1,139 @@
+package com.fjhx.common.service.impl;
+
+import com.fjhx.activiti.feign.IActivitiApi;
+import com.fjhx.common.service.ICommonService;
+import com.fjhx.contract.service.IContractService;
+import com.fjhx.reportPrice.service.IReportPriceBillService;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.system.constant.DictConstant;
+import org.springblade.system.entity.Dict;
+import org.springblade.system.feign.IDictClient;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 公共业务处理
+ */
+@RefreshScope
+@Service
+public class CommonServiceImpl implements ICommonService {
+
+    //华为云地址前缀
+    @Value("${obs.url}")
+    private String huaWeiUrl;
+
+    @Lazy
+    @Autowired
+    private IContractService iContractService;
+
+    @Autowired
+    private IReportPriceBillService iReportPriceBillService;
+
+    @Autowired
+    private IUserClient iUserClient;
+
+    @Autowired
+    private IDictClient iDictClient;
+
+    @Autowired
+    private IActivitiApi iActivitiApi;
+
+    /**
+     * 获取华为云地址前缀
+     *
+     * @return
+     */
+    @Override
+    public String getHuaWeiUrl() {
+        return huaWeiUrl;
+    }
+
+    /**
+     * <p>交易模块:外销合同、报价单、样品单根据角色id获取列表权限<p/>
+     *
+     * <p>1、总经理、总监、财务:看所有数据<p/>
+     * <p>2、其他:查看自己的数据<p/>
+     *
+     * <p>true:看所有数据、false:查看自己的数据<p/>
+     *
+     * @return
+     */
+    @Override
+    public boolean getTransactionListAuth() {
+        //当前登入用户id
+        Long userId = AuthUtil.getUserId();
+        if (userId == null) {
+            return false;
+        }
+        //查询用户
+        R<User> r = iUserClient.userInfoById(userId);
+        if (!r.isSuccess()) {
+            return false;
+        }
+        User user = r.getData();
+        if (user == null || StringUtils.isBlank(user.getRoleId())) {
+            return false;
+        }
+        String[] split = StringUtils.split(user.getRoleId(), ",");
+        if (ArrayUtils.isEmpty(split)) {
+            return false;
+        }
+
+        //获取外销合同合同、报价、样品单列表角色权限id字典
+        R<List<Dict>> r2 = iDictClient.getList(DictConstant.MAKE_LIST_AUTH_ROLE_ID);
+        if (!r2.isSuccess() || CollectionUtils.isEmpty(r2.getData())) {
+            return false;
+        }
+        List<Dict> dicts = r2.getData();
+        //key=字典key
+        Map<String, Dict> dictMap = dicts.stream().collect(Collectors.toMap(Dict::getDictKey, obj -> obj));
+        for (String roleId : split) {
+            Dict dict = dictMap.get(roleId);
+            if (dict != null) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 交易管理(外销合同、样品单、报价单),移交
+     *
+     * @param tenantId   租户id
+     * @param customerId 客户id,要移交的客户
+     * @param userId     业务员id,移交给新的业务员id
+     */
+    @Transactional(rollbackFor = {Exception.class})
+    @Override
+    public void transfer(String tenantId, String customerId, String userId) {
+        //移交外销合同、样品单
+        iContractService.transfer(tenantId, customerId, userId);
+        //移交报价单
+        iReportPriceBillService.transfer(tenantId, customerId, userId);
+    }
+
+    /**
+     * 校验流程配置是否完善
+     *
+     * @param modelType 模型类型
+     * @return
+     */
+    @Override
+    public R checkActProcessIsPerfect(String modelType) {
+        return iActivitiApi.checkActProcessIsPerfect(modelType);
+    }
+}

+ 101 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/controller/CompanyBankController.java

@@ -0,0 +1,101 @@
+package com.fjhx.company.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fjhx.company.entity.CompanyBank;
+import com.fjhx.company.service.ICompanyBankService;
+import org.springblade.common.constant.ApiConstant;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 公司银行关联Controller
+ *
+ * @author linqt
+ * @date 2021-08-09
+ */
+@RestController
+@RequestMapping(ApiConstant.Project.SAAS_BUSINESS_TRADEERP_REQUEST_PREFIX + "/company/bank")
+public class CompanyBankController extends BladeController {
+
+    @Autowired
+    private ICompanyBankService companyBankService;
+
+    /**
+     * 查询公司银行关联列表
+     */
+    @PostMapping("/list")
+    public R list(@RequestBody HashMap<String, Object> condition) {
+        List<CompanyBank> list = companyBankService.selectCompanyBankList(condition);
+        return R.list(list);
+    }
+
+    /**
+     * 获取公司银行关联详细信息
+     */
+    @PostMapping(value = "/getInfo")
+    public R getInfo(@RequestBody CompanyBank companyBank) {
+        CompanyBank bank = companyBankService.selectCompanyBankById(companyBank.getId());
+        return R.details(bank);
+    }
+
+    /**
+     * 新增公司银行关联
+     */
+    @PostMapping(value = "/add")
+    public R add(@RequestBody CompanyBank companyBank) {
+        JSONObject jsonObject = new JSONObject();
+        String id = companyBankService.insertCompanyBank(companyBank);
+        jsonObject.put("bankId", id);
+        return R.details(jsonObject);
+    }
+
+    /**
+     * 修改公司银行关联
+     */
+    @PostMapping(value = "/update")
+    public R edit(@RequestBody CompanyBank companyBank) {
+        companyBankService.updateCompanyBank(companyBank);
+        return R.success();
+    }
+
+    /**
+     * 删除公司银行关联
+     */
+    @PostMapping(value = "/delete")
+    public R remove(@RequestBody HashMap<String, Object> condition) {
+        if (condition.get("ids") == null || condition.get("ids") == "") {
+            return fail("ID参数缺失!");
+        }
+        String[] idsArr = String.valueOf(condition.get("ids")).split(",");
+        companyBankService.deleteCompanyBankByIds(idsArr);
+        return R.success();
+    }
+
+    /**
+     * 获取所有企业银行
+     *
+     * @return
+     */
+    @PostMapping("/all")
+    public R all() {
+        List<CompanyBank> list = companyBankService.getAll();
+        return R.list(list);
+    }
+
+    /**
+     * 获取所有企业银行
+     *
+     * @return
+     */
+    @PostMapping("/getBank")
+    public R all(@RequestParam("companyId")String companyId) {
+        CompanyBank company = companyBankService.getOneCompany(companyId);
+        return R.data(company);
+    }
+
+}

+ 122 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/controller/CompanyBasicsController.java

@@ -0,0 +1,122 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package com.fjhx.company.controller;
+
+import com.fjhx.company.entity.CompanyBasics;
+import com.fjhx.company.service.ICompanyBasicsService;
+import lombok.AllArgsConstructor;
+import org.springblade.common.constant.ApiConstant;
+import org.springblade.common.utils.ListPageMap;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+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 BladeX
+ * @since 2023-01-11
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping(ApiConstant.Project.SAAS_BUSINESS_TRADEERP_REQUEST_PREFIX + "/company/basics")
+public class CompanyBasicsController extends BladeController {
+
+    private final ICompanyBasicsService companyBasicsService;
+
+    /**
+     * 列表
+     *
+     * @param condition 查询条件
+     * @return
+     */
+    @PostMapping("/list")
+    public R getList(@RequestBody Map<String, Object> condition) {
+        ListPageMap.getListPageMap(condition);
+        return R.list(companyBasicsService.getList(condition));
+    }
+
+    /**
+     * 列表-总条数
+     *
+     * @param condition 查询条件
+     * @return
+     */
+    @PostMapping("/list/count")
+    public R getListCount(@RequestBody Map<String, Object> condition) {
+        return R.count(companyBasicsService.getListCount(condition));
+    }
+
+    /**
+     * 详情
+     *
+     * @param entity 查询条件
+     * @return
+     */
+    @PostMapping("/details")
+    public R details(@RequestBody CompanyBasics entity) {
+        return R.details(companyBasicsService.getById(entity.getId()));
+    }
+
+    /**
+     * 新增
+     *
+     * @param entity
+     * @return
+     */
+    @PostMapping("/save")
+    public R save(@RequestBody CompanyBasics entity) {
+        return R.status(companyBasicsService.save(entity));
+    }
+
+    /**
+     * 修改
+     *
+     * @param entity
+     * @return
+     */
+    @PostMapping("/update")
+    public R update(@RequestBody CompanyBasics entity) {
+        return R.status(companyBasicsService.updateById(entity));
+    }
+
+    /**
+     * 删除
+     *
+     * @param entity
+     * @return
+     */
+    @PostMapping("/delete")
+    public R delete(@RequestBody CompanyBasics entity) {
+        return R.status(companyBasicsService.logicDeleteById(entity.getId()));
+    }
+
+    /**
+     * 下拉款
+     *
+     * @return
+     */
+    @PostMapping("/select")
+    public R select() {
+        return R.list(companyBasicsService.list());
+    }
+}

+ 114 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/controller/CompanyController.java

@@ -0,0 +1,114 @@
+package com.fjhx.company.controller;
+
+import com.fjhx.company.entity.Company;
+import com.fjhx.company.service.ICompanyService;
+import org.springblade.common.constant.ApiConstant;
+import org.springblade.common.utils.ListPageMap;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 企业信息
+ */
+@RestController
+@RequestMapping(ApiConstant.Project.SAAS_BUSINESS_TRADEERP_REQUEST_PREFIX + "/company")
+public class CompanyController extends BladeController {
+
+    @Autowired
+    private ICompanyService companyService;
+
+    /**
+     * 查询企业信息列表
+     *
+     * @param condition 查询参数
+     * @return
+     */
+    @PostMapping("/list")
+    public R list(@RequestBody HashMap<String, Object> condition) {
+        // 获取分页列表查询参数
+        ListPageMap.getListPageMap(condition);
+        List<Company> list = companyService.selectCompanyList(condition);
+        return R.list(list);
+    }
+
+    /**
+     * 查询企业信息列表总数
+     *
+     * @param condition 查询参数
+     * @return
+     */
+    @PostMapping("/list/count")
+    public R listCount(@RequestBody HashMap<String, Object> condition) {
+        // 获取分页列表查询参数
+        ListPageMap.getListPageMap(condition);
+        Integer count = companyService.selectCompanyListCount(condition);
+        return R.count(count);
+    }
+
+    /**
+     * 获取企业信息详细信息
+     */
+    @PostMapping(value = "/getInfo")
+    public R getInfo(@RequestBody Company company) {
+        return R.details(companyService.selectCompanyById(company.getId()));
+    }
+
+    /**
+     * 新增企业信息
+     */
+    @PostMapping(value = "/add")
+    public R add(@RequestBody Company company) {
+        companyService.insertCompany(company);
+        return R.success();
+    }
+
+    /**
+     * 修改企业信息
+     */
+    @PostMapping(value = "/update")
+    public R edit(@RequestBody Company company) {
+        companyService.updateCompany(company);
+        return R.success();
+    }
+
+    /**
+     * 删除企业信息
+     */
+    @PostMapping(value = "/delete")
+    public R remove(@RequestBody HashMap<String, Object> condition) {
+        if (condition.get("ids") == null || condition.get("ids") == "") {
+            return fail("ID参数缺失!");
+        }
+        String[] idsArr = String.valueOf(condition.get("ids")).split(",");
+        return R.status(companyService.deleteCompanyByIds(idsArr));
+    }
+
+    /**
+     * 设置为默认
+     *
+     * @param company 对象
+     * @return
+     */
+    @PostMapping(value = "/update/isDefault")
+    public R updateIsDefault(@RequestBody Company company) {
+        companyService.updateIsDefaultById(company);
+        return R.success();
+    }
+
+    /**
+     * 检索公司名称(中文)
+     *
+     * @param name 公司名称(中文)
+     * @return
+     */
+    @GetMapping(value = "/searchingName")
+    public R searchingName(@RequestParam String name) {
+        return R.list(companyService.searchChineseName(name));
+    }
+
+}

+ 79 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/controller/CompanyPayPalController.java

@@ -0,0 +1,79 @@
+package com.fjhx.company.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fjhx.company.entity.CompanyPayPal;
+import com.fjhx.company.service.ICompanyPayPalService;
+import org.springblade.common.constant.ApiConstant;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PathVariable;
+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.HashMap;
+import java.util.List;
+
+/**
+ * 公司PAYPAL账户
+ */
+@RestController
+@RequestMapping(ApiConstant.Project.SAAS_BUSINESS_TRADEERP_REQUEST_PREFIX + "/company/paypal")
+public class CompanyPayPalController extends BladeController {
+
+    @Autowired
+    private ICompanyPayPalService companyPayPalService;
+
+    /**
+     * 查询公司PAYPAL账户关联列表
+     */
+    @PostMapping("/list")
+    public R list(@RequestBody HashMap<String, Object> condition) {
+        List<CompanyPayPal> list = companyPayPalService.selectCompanyPayPalList(condition);
+        return R.list(list);
+    }
+
+    /**
+     * 获取公司PAYPAL账户关联详细信息
+     */
+    @PostMapping(value = "/{id}")
+    public R getInfo(@PathVariable("id") String id) {
+        return R.details(companyPayPalService.selectCompanyPayPalById(id));
+    }
+
+    /**
+     * 新增公司PAYPAL账户关联
+     */
+    @PostMapping(value = "/add")
+    public R add(@RequestBody CompanyPayPal companyPayPal) {
+        JSONObject jsonObject = new JSONObject();
+        String id = companyPayPalService.insertCompanyPayPal(companyPayPal);
+        jsonObject.put("paypalId", id);
+        return R.details(jsonObject);
+    }
+
+    /**
+     * 修改公司PAYPAL账户关联
+     */
+    @PostMapping(value = "/update")
+    public R edit(@RequestBody CompanyPayPal companyPayPal) {
+        companyPayPalService.updateCompanyPayPal(companyPayPal);
+        return R.success();
+    }
+
+    /**
+     * 删除公司PAYPAL账户关联
+     */
+    @PostMapping(value = "/delete")
+    public R remove(@RequestBody HashMap<String, Object> condition) {
+        if (condition.get("ids") == null || condition.get("ids") == "") {
+            return fail("ID参数缺失!");
+        }
+        String[] idsArr = String.valueOf(condition.get("ids")).split(",");
+        companyPayPalService.deleteCompanyPayPalByIds(idsArr);
+        return R.success();
+    }
+
+}

+ 95 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/mapper/CompanyBankMapper.java

@@ -0,0 +1,95 @@
+package com.fjhx.company.mapper;
+
+import com.fjhx.company.entity.Company;
+import com.fjhx.company.entity.CompanyBank;
+import org.springblade.core.mp.mapper.BladeMapper;
+import org.springframework.stereotype.Repository;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 公司银行
+ */
+@Repository
+public interface CompanyBankMapper extends BladeMapper<CompanyBank> {
+
+    /**
+     * 查询公司银行关联
+     *
+     * @param id 公司银行关联ID
+     * @return 公司银行关联
+     */
+    CompanyBank selectCompanyBankById(String id);
+
+    /**
+     * 查询公司银行关联列表
+     *
+     * @param condition 查询参数
+     * @return 公司银行关联集合
+     */
+    List<CompanyBank> selectCompanyBankList(HashMap<String, Object> condition);
+
+    /**
+     * 新增公司银行关联
+     *
+     * @param companyBank 公司银行关联
+     * @return 结果
+     */
+    int insertCompanyBank(CompanyBank companyBank);
+
+    /**
+     * 修改公司银行关联
+     *
+     * @param companyBank 公司银行关联
+     * @return 结果
+     */
+    int updateCompanyBank(CompanyBank companyBank);
+
+    /**
+     * 删除公司银行关联
+     *
+     * @param id 公司银行关联ID
+     * @return 结果
+     */
+    int deleteCompanyBankById(String id);
+
+    /**
+     * 批量删除公司银行关联
+     *
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    int deleteCompanyBankByIds(String[] ids);
+
+    /**
+     * 批量修改公司银行表公司id
+     *
+     * @param company 公司信息
+     * @return
+     */
+    int batchUpdateCompanyId(Company company);
+
+    /**
+     * 批量删除公司银行数据
+     *
+     * @param ids 公司id数组
+     * @return
+     */
+    int batchDeleteByCompanyId(String[] ids);
+
+    /**
+     * 获取所有企业银行
+     *
+     * @return
+     */
+    List<CompanyBank> getAll();
+
+    /**
+     * 根据公司ID获取公司所属银行
+     * @param companyId
+     * @return
+     */
+    CompanyBank selectCompanyBankByCompanyId(String companyId);
+
+}

+ 142 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/mapper/CompanyBankMapper.xml

@@ -0,0 +1,142 @@
+<?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.fjhx.company.mapper.CompanyBankMapper">
+
+    <resultMap type="com.fjhx.company.entity.CompanyBank" id="CompanyBankMap">
+        <result property="id" column="id"/>
+        <result property="name" column="name"/>
+        <result property="swiftCode" column="swift_code"/>
+        <result property="cardNumber" column="card_number"/>
+        <result property="address" column="address"/>
+        <result property="currencyType" column="currency_type"/>
+        <result property="companyId" column="company_id"/>
+        <result property="createTime" column="create_time"/>
+        <result property="companyNameCN" column="company_name_cn"/>
+        <result property="companyNameEN" column="company_name_en"/>
+    </resultMap>
+
+    <sql id="sqlField">
+        SELECT
+            *
+        FROM
+            t_erp_company_bank
+    </sql>
+
+    <select id="selectCompanyBankList" resultMap="CompanyBankMap">
+        <include refid="sqlField"/>
+        <where>
+            <!-- 公司id -->
+            <if test="companyId neq null and companyId neq ''">
+                AND company_id = #{companyId}
+            </if>
+        </where>
+
+        ORDER BY
+            create_time DESC
+    </select>
+
+    <select id="selectCompanyBankById" resultMap="CompanyBankMap">
+        <include refid="sqlField"/>
+        <where>
+            id = #{id}
+        </where>
+    </select>
+
+    <insert id="insertCompanyBank">
+        INSERT INTO t_erp_company_bank
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="name != null">name,</if>
+            <if test="swiftCode != null">swift_code,</if>
+            <if test="cardNumber != null">card_number,</if>
+            <if test="address != null">address,</if>
+            <if test="currencyType != null">currency_type,</if>
+            <if test="companyId != null">company_id,</if>
+            create_time
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="name != null">#{name},</if>
+            <if test="swiftCode != null">#{swiftCode},</if>
+            <if test="cardNumber != null">#{cardNumber},</if>
+            <if test="address != null">#{address},</if>
+            <if test="currencyType != null">#{currencyType},</if>
+            <if test="companyId != null">#{companyId},</if>
+            NOW()
+        </trim>
+    </insert>
+
+    <update id="updateCompanyBank">
+        UPDATE t_erp_company_bank
+        <set>
+            <if test="name != null">name = #{name},</if>
+            <if test="swiftCode != null">swift_code = #{swiftCode},</if>
+            <if test="cardNumber != null">card_number = #{cardNumber},</if>
+            <if test="address != null">address = #{address},</if>
+            <if test="currencyType != null">currency_type = #{currencyType},</if>
+            <if test="companyId != null">company_id = #{companyId},</if>
+        </set>
+        <where>
+            id = #{id}
+        </where>
+    </update>
+
+    <delete id="deleteCompanyBankById">
+        DELETE FROM t_erp_company_bank
+        <where>
+            id = #{id}
+        </where>
+    </delete>
+
+    <delete id="deleteCompanyBankByIds">
+        DELETE FROM t_erp_company_bank
+        <where>
+            id IN
+            <foreach item="id" collection="array" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        </where>
+    </delete>
+
+    <!-- 批量修改公司银行表公司id -->
+    <update id="batchUpdateCompanyId">
+        UPDATE t_erp_company_bank
+        <set>
+            company_id = #{id}
+        </set>
+        <where>
+            id IN
+            <foreach collection="params.bankIds.split(',')" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </where>
+    </update>
+
+    <!-- 批量删除公司银行数据 -->
+    <delete id="batchDeleteByCompanyId">
+        DELETE FROM t_erp_company_bank
+        <where>
+            company_id IN
+            <foreach collection="array" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </where>
+    </delete>
+
+    <select id="getAll" resultMap="CompanyBankMap">
+        SELECT
+            t1.*,
+            t2.name_chinese AS company_name_cn,
+            t2.name_english AS company_name_en
+        FROM
+            t_erp_company_bank t1
+        INNER JOIN t_erp_company t2 ON t1.company_id = t2.id
+    </select>
+
+    <select id="selectCompanyBankByCompanyId" resultMap="CompanyBankMap">
+        <include refid="sqlField"/>
+        <where>
+            company_id = #{companyId}
+        </where>
+    </select>
+</mapper>

+ 30 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/mapper/CompanyBasicsMapper.java

@@ -0,0 +1,30 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package com.fjhx.company.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fjhx.company.entity.CompanyBasics;
+
+/**
+ * 公司基础表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2023-01-11
+ */
+public interface CompanyBasicsMapper extends BaseMapper<CompanyBasics> {
+
+}

+ 5 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/mapper/CompanyBasicsMapper.xml

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

+ 95 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/mapper/CompanyMapper.java

@@ -0,0 +1,95 @@
+package com.fjhx.company.mapper;
+
+import com.fjhx.company.entity.Company;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.core.mp.mapper.BladeMapper;
+import org.springframework.stereotype.Repository;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 企业信息
+ */
+@Repository
+public interface CompanyMapper extends BladeMapper<Company> {
+
+    /**
+     * 查询企业信息
+     *
+     * @param id 企业信息ID
+     * @return 企业信息
+     */
+    Company selectCompanyById(String id);
+
+    /**
+     * 查询企业信息列表
+     *
+     * @param condition 查询参数
+     * @return 企业信息集合
+     */
+    List<Company> selectCompanyList(HashMap<String, Object> condition);
+
+    /**
+     * 查询企业信息列表
+     *
+     * @param condition 查询参数
+     * @return 企业信息集合
+     */
+    Integer selectCompanyListCount(HashMap<String, Object> condition);
+
+    /**
+     * 新增企业信息
+     *
+     * @param company 企业信息
+     * @return 结果
+     */
+    int insertCompany(Company company);
+
+    /**
+     * 修改企业信息
+     *
+     * @param company 企业信息
+     * @return 结果
+     */
+    int updateCompany(Company company);
+
+    /**
+     * 删除企业信息
+     *
+     * @param id 企业信息ID
+     * @return 结果
+     */
+    int deleteCompanyById(String id);
+
+    /**
+     * 批量删除企业信息
+     *
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    int deleteCompanyByIds(String[] ids);
+
+    /**
+     * 全部设置为非默认
+     *
+     * @return
+     */
+    Integer updateIsDefaultAll();
+
+    /**
+     * 设置为默认
+     *
+     * @param company 对象
+     * @return
+     */
+    Integer updateIsDefaultById(Company company);
+
+    /**
+     * 检索公司名称
+     * @param tenantId
+     * @param nameChinese
+     * @return
+     */
+    List<String> searchNameChinese(@Param("tenantId") String tenantId, @Param("nameChinese") String nameChinese);
+}

+ 279 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/mapper/CompanyMapper.xml

@@ -0,0 +1,279 @@
+<?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.fjhx.company.mapper.CompanyMapper">
+
+    <resultMap id="CompanyMap" type="com.fjhx.company.entity.Company">
+        <result property="id" column="id"/>
+        <result property="tenantId" column="tenant_id"/>
+        <result property="name" column="name"/>
+        <result property="companyBasicsId" column="company_basics_id"/>
+        <result property="nameChinese" column="name_chinese"/>
+        <result property="nameEnglish" column="name_english"/>
+        <result property="telephone" column="telephone"/>
+        <result property="fax" column="fax"/>
+        <result property="contacts" column="contacts"/>
+        <result property="mobile" column="mobile"/>
+        <result property="purchaseContacts" column="purchase_contacts"/>
+        <result property="purchaseMobile" column="purchase_mobile"/>
+        <result property="url" column="url"/>
+        <result property="logo" column="logo"/>
+        <result property="companySeal" column="company_seal"/>
+        <result property="legalPersonSeal" column="legal_person_seal"/>
+        <result property="billProveSeal" column="bill_prove_seal"/>
+        <result property="countryChinese" column="country_chinese"/>
+        <result property="provinceChinese" column="province_chinese"/>
+        <result property="cityChinese" column="city_chinese"/>
+        <result property="addressChinese" column="address_chinese"/>
+        <result property="zipCode" column="zip_code"/>
+        <result property="countryEnglish" column="country_english"/>
+        <result property="provinceEnglish" column="province_english"/>
+        <result property="cityEnglish" column="city_english"/>
+        <result property="addressEnglish" column="address_english"/>
+        <result property="invoicePrefix" column="invoice_prefix"/>
+        <result property="organizationCode" column="organization_code"/>
+        <result property="taxpayerNumber" column="taxpayer_number"/>
+        <result property="ineEnterpriseCode" column="ine_enterprise_code"/>
+        <result property="customsRegistrationCode" column="customs_registration_code"/>
+        <result property="isDefault" column="is_default"/>
+        <result property="isDeleted" column="is_deleted"/>
+        <result property="createUser" column="create_user"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateUser" column="update_user"/>
+        <result property="updateTime" column="update_time"/>
+    </resultMap>
+
+    <sql id="selectCompanyVo">
+        SELECT
+            *
+        FROM
+            t_erp_company
+    </sql>
+
+    <!-- 查询企业信息列表 -->
+    <select id="selectCompanyList" resultMap="CompanyMap">
+        <include refid="selectCompanyVo"/>
+
+        <!-- 查询条件 -->
+        <include refid="selectListCondition"/>
+
+        ORDER BY
+            create_time desc
+
+        <include refid="Sql.sql_pager"/>
+    </select>
+
+    <!-- 查询企业信息列表总数 -->
+    <select id="selectCompanyListCount" resultType="java.lang.Integer">
+        SELECT
+            COUNT(*)
+        FROM
+            t_erp_company
+
+        <!-- 查询条件 -->
+        <include refid="selectListCondition"/>
+    </select>
+
+    <!-- 列表查询条件 -->
+    <sql id="selectListCondition">
+        <where>
+            AND is_deleted = 0
+            <if test="nameChinese neq null and nameChinese neq ''">
+                AND (
+                    INSTR(name_chinese, #{nameChinese}) > 0
+                    OR
+                    INSTR(name_english, #{nameChinese}) > 0
+                )
+            </if>
+
+            <if test="tenantId neq null and tenantId neq ''">
+                AND tenant_id = #{tenantId}
+            </if>
+        </where>
+    </sql>
+
+    <select id="selectCompanyById" parameterType="String" resultMap="CompanyMap">
+        <include refid="selectCompanyVo"/>
+        <where>
+            id = #{id}
+        </where>
+    </select>
+
+    <insert id="insertCompany">
+        INSERT INTO t_erp_company
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="tenantId != null">tenant_id,</if>
+            <if test="name != null">`name`,</if>
+            <if test="companyBasicsId != null">company_basics_id,</if>
+            <if test="nameChinese != null">name_chinese,</if>
+            <if test="nameEnglish != null">name_english,</if>
+            <if test="telephone != null">telephone,</if>
+            <if test="fax != null">fax,</if>
+            <if test="contacts != null">contacts,</if>
+            <if test="mobile != null">mobile,</if>
+            <if test="purchaseContacts != null">purchase_contacts,</if>
+            <if test="purchaseMobile != null">purchase_mobile,</if>
+            <if test="url != null">url,</if>
+            <if test="logo != null">logo,</if>
+            <if test="companySeal != null">company_seal,</if>
+            <if test="legalPersonSeal != null">legal_person_seal,</if>
+            <if test="countryChinese != null">country_chinese,</if>
+            <if test="billProveSeal != null">bill_prove_seal,</if>
+            <if test="provinceChinese != null">province_chinese,</if>
+            <if test="cityChinese != null">city_chinese,</if>
+            <if test="addressChinese != null">address_chinese,</if>
+            <if test="zipCode != null">zip_code,</if>
+            <if test="countryEnglish != null">country_english,</if>
+            <if test="provinceEnglish != null">province_english,</if>
+            <if test="cityEnglish != null">city_english,</if>
+            <if test="addressEnglish != null">address_english,</if>
+            <if test="invoicePrefix != null">invoice_prefix,</if>
+            <if test="organizationCode != null">organization_code,</if>
+            <if test="taxpayerNumber != null">taxpayer_number,</if>
+            <if test="ineEnterpriseCode != null">ine_enterprise_code,</if>
+            <if test="customsRegistrationCode != null">customs_registration_code,</if>
+            <if test="isDefault != null">is_default,</if>
+            <if test="isDeleted != null">is_deleted,</if>
+            <if test="createUser != null">create_user,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateUser != null">update_user,</if>
+            <if test="updateTime != null">update_time,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="tenantId != null">#{tenantId},</if>
+            <if test="name != null">#{name},</if>
+            <if test="companyBasicsId != null">#{companyBasicsId},</if>
+            <if test="nameChinese != null">#{nameChinese},</if>
+            <if test="nameEnglish != null">#{nameEnglish},</if>
+            <if test="telephone != null">#{telephone},</if>
+            <if test="fax != null">#{fax},</if>
+            <if test="contacts != null">#{contacts},</if>
+            <if test="mobile != null">#{mobile},</if>
+            <if test="purchaseContacts != null">#{purchaseContacts},</if>
+            <if test="purchaseMobile != null">#{purchaseMobile},</if>
+            <if test="url != null">#{url},</if>
+            <if test="logo != null">#{logo},</if>
+            <if test="companySeal != null">#{companySeal},</if>
+            <if test="legalPersonSeal != null">#{legalPersonSeal},</if>
+            <if test="countryChinese != null">#{countryChinese},</if>
+            <if test="billProveSeal != null">#{billProveSeal},</if>
+            <if test="provinceChinese != null">#{provinceChinese},</if>
+            <if test="cityChinese != null">#{cityChinese},</if>
+            <if test="addressChinese != null">#{addressChinese},</if>
+            <if test="zipCode != null">#{zipCode},</if>
+            <if test="countryEnglish != null">#{countryEnglish},</if>
+            <if test="provinceEnglish != null">#{provinceEnglish},</if>
+            <if test="cityEnglish != null">#{cityEnglish},</if>
+            <if test="addressEnglish != null">#{addressEnglish},</if>
+            <if test="invoicePrefix != null">#{invoicePrefix},</if>
+            <if test="organizationCode != null">#{organizationCode},</if>
+            <if test="taxpayerNumber != null">#{taxpayerNumber},</if>
+            <if test="ineEnterpriseCode != null">#{ineEnterpriseCode},</if>
+            <if test="customsRegistrationCode != null">#{customsRegistrationCode},</if>
+            <if test="isDefault != null">#{isDefault},</if>
+            <if test="isDeleted != null">#{isDeleted},</if>
+            <if test="createUser != null">#{createUser},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateUser != null">#{updateUser},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+        </trim>
+    </insert>
+
+    <update id="updateCompany">
+        UPDATE t_erp_company
+        <set>
+            <if test="tenantId != null">tenant_id = #{tenantId},</if>
+            <if test="name != null">`name` = #{name},</if>
+            <if test="companyBasicsId != null">company_basics_id = #{companyBasicsId},</if>
+            <if test="nameChinese != null">name_chinese = #{nameChinese},</if>
+            <if test="nameEnglish != null">name_english = #{nameEnglish},</if>
+            <if test="telephone != null">telephone = #{telephone},</if>
+            <if test="fax != null">fax = #{fax},</if>
+            <if test="contacts != null">contacts = #{contacts},</if>
+            <if test="mobile != null">mobile = #{mobile},</if>
+            <if test="purchaseContacts != null">purchase_contacts = #{purchaseContacts},</if>
+            <if test="purchaseMobile != null">purchase_mobile = #{purchaseMobile},</if>
+            <if test="url != null">url = #{url},</if>
+            <if test="logo != null">logo = #{logo},</if>
+            <if test="companySeal != null">company_seal = #{companySeal},</if>
+            <if test="legalPersonSeal != null">legal_person_seal = #{legalPersonSeal},</if>
+            <if test="billProveSeal != null">bill_prove_seal = #{billProveSeal},</if>
+            <if test="countryChinese != null">country_chinese = #{countryChinese},</if>
+            <if test="provinceChinese != null">province_chinese = #{provinceChinese},</if>
+            <if test="cityChinese != null">city_chinese = #{cityChinese},</if>
+            <if test="addressChinese != null">address_chinese = #{addressChinese},</if>
+            <if test="zipCode != null">zip_code = #{zipCode},</if>
+            <if test="countryEnglish != null">country_english = #{countryEnglish},</if>
+            <if test="provinceEnglish != null">province_english = #{provinceEnglish},</if>
+            <if test="cityEnglish != null">city_english = #{cityEnglish},</if>
+            <if test="addressEnglish != null">address_english = #{addressEnglish},</if>
+            <if test="invoicePrefix != null">invoice_prefix = #{invoicePrefix},</if>
+            <if test="organizationCode != null">organization_code = #{organizationCode},</if>
+            <if test="taxpayerNumber != null">taxpayer_number = #{taxpayerNumber},</if>
+            <if test="ineEnterpriseCode != null">ine_enterprise_code = #{ineEnterpriseCode},</if>
+            <if test="customsRegistrationCode != null">customs_registration_code = #{customsRegistrationCode},</if>
+            <if test="isDefault != null">is_default = #{isDefault},</if>
+            <if test="isDeleted != null">is_deleted = #{isDeleted},</if>
+            <if test="createUser != null">create_user = #{createUser},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateUser != null">update_user = #{updateUser},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </set>
+        <where>
+            id = #{id}
+        </where>
+    </update>
+
+    <delete id="deleteCompanyById">
+        DELETE FROM t_erp_company
+        <where>
+            id = #{id}
+        </where>
+    </delete>
+
+    <delete id="deleteCompanyByIds">
+        DELETE FROM t_erp_company
+        <where>
+            <foreach item="id" collection="array" open="id IN(" separator="," close=")">
+                #{id}
+            </foreach>
+        </where>
+    </delete>
+
+    <!-- 全部设置为非默认 -->
+    <update id="updateIsDefaultAll">
+        UPDATE t_erp_company
+        <set>
+            is_default = 0
+        </set>
+    </update>
+
+    <!-- 设置为默认 -->
+    <update id="updateIsDefaultById">
+        UPDATE t_erp_company
+        <set>
+            is_default = #{isDefault}
+        </set>
+        <where>
+            id = #{id}
+        </where>
+    </update>
+
+    <!--检索公司名称-->
+    <select id="searchNameChinese" resultType="java.lang.String">
+        SELECT
+            name_chinese
+        FROM
+            t_erp_company
+        <where>
+            tenant_id = #{tenantId}
+            AND is_deleted = 0
+            <if test="nameChinese != null and nameChinese != ''">
+                AND INSTR(name_chinese, #{nameChinese}) > 0
+            </if>
+        </where>
+        LIMIT
+            10
+    </select>
+</mapper>

+ 90 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/mapper/CompanyPayPalMapper.java

@@ -0,0 +1,90 @@
+package com.fjhx.company.mapper;
+
+import com.fjhx.company.entity.Company;
+import com.fjhx.company.entity.CompanyPayPal;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.core.mp.mapper.BladeMapper;
+import org.springframework.stereotype.Repository;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 公司PAYPAL账户
+ */
+@Repository
+public interface CompanyPayPalMapper extends BladeMapper<CompanyPayPal> {
+
+    /**
+     * 查询公司PAYPAL账户关联
+     *
+     * @param id 公司PAYPAL账户关联ID
+     * @return 公司PAYPAL账户关联
+     */
+    CompanyPayPal selectCompanyPayPalById(String id);
+
+    /**
+     * 查询公司PAYPAL账户关联列表
+     *
+     * @param condition 查询参数
+     * @return 公司PAYPAL账户关联集合
+     */
+    List<CompanyPayPal> selectCompanyPayPalList(HashMap<String, Object> condition);
+
+    /**
+     * 新增公司PAYPAL账户关联
+     *
+     * @param companyPayPal 公司PAYPAL账户关联
+     * @return 结果
+     */
+    int insertCompanyPayPal(CompanyPayPal companyPayPal);
+
+    /**
+     * 修改公司PAYPAL账户关联
+     *
+     * @param companyPayPal 公司PAYPAL账户关联
+     * @return 结果
+     */
+    int updateCompanyPayPal(CompanyPayPal companyPayPal);
+
+    /**
+     * 删除公司PAYPAL账户关联
+     *
+     * @param id 公司PAYPAL账户关联ID
+     * @return 结果
+     */
+    int deleteCompanyPayPalById(String id);
+
+    /**
+     * 批量删除公司PAYPAL账户关联
+     *
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    int deleteCompanyPayPalByIds(String[] ids);
+
+    /**
+     * 批量修改公司银行表公司id
+     *
+     * @param company 公司信息
+     * @return
+     */
+    int batchUpdateCompanyId(Company company);
+
+    /**
+     * 批量删除公司银行数据
+     *
+     * @param ids 公司id数组
+     * @return
+     */
+    int batchDeleteByCompanyId(String[] ids);
+
+    /**
+     * 查询公司PAYPAL账户关联
+     *
+     * @param companyId 公司ID
+     * @return 公司PAYPAL账户关联
+     */
+    CompanyPayPal selectPayPalNameByCompanyId(@Param("companyId") String companyId);
+
+}

+ 121 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/mapper/CompanyPayPalMapper.xml

@@ -0,0 +1,121 @@
+<?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.fjhx.company.mapper.CompanyPayPalMapper">
+
+    <resultMap id="CompanyPayPalMap" type="com.fjhx.company.entity.CompanyPayPal" >
+        <result property="id" column="id"/>
+        <result property="name" column="name"/>
+        <result property="companyId" column="company_id"/>
+        <result property="createUser" column="create_user"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateUser" column="update_user"/>
+        <result property="updateTime" column="update_time"/>
+    </resultMap>
+
+    <sql id="sqlField">
+        SELECT * FROM t_erp_company_paypal
+    </sql>
+
+    <select id="selectCompanyPayPalList" resultMap="CompanyPayPalMap">
+        <include refid="sqlField"/>
+        <where>
+            <!-- 公司id -->
+            <if test="companyId neq null and companyId neq ''">
+                AND company_id = #{companyId}
+            </if>
+        </where>
+        ORDER BY
+            create_time DESC
+    </select>
+
+    <select id="selectCompanyPayPalById" resultMap="CompanyPayPalMap">
+        <include refid="sqlField"/>
+        <where>
+            id = #{id}
+        </where>
+    </select>
+
+    <insert id="insertCompanyPayPal">
+        INSERT INTO t_erp_company_paypal
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="name != null">name,</if>
+            <if test="companyId != null">company_id,</if>
+            <if test="createUser != null">create_user,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateUser != null">update_user,</if>
+            <if test="updateTime != null">update_time,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="name != null">#{name},</if>
+            <if test="companyId != null">#{companyId},</if>
+            <if test="createUser != null">#{createUser},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateUser != null">#{updateUser},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+        </trim>
+    </insert>
+
+    <update id="updateCompanyPayPal">
+        UPDATE t_erp_company_paypal
+        <set>
+            <if test="name != null">name = #{name},</if>
+            <if test="companyId != null">company_id = #{companyId},</if>
+            <if test="createUser != null">create_user = #{createUser},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateUser != null">update_user = #{updateUser},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </set>
+        <where>
+            id = #{id}
+        </where>
+    </update>
+
+    <delete id="deleteCompanyPayPalById">
+        DELETE FROM t_erp_company_paypal
+        <where>
+            id = #{id}
+        </where>
+    </delete>
+
+    <delete id="deleteCompanyPayPalByIds">
+        DELETE FROM t_erp_company_paypal
+        <where>
+            <foreach item="id" collection="array" open="id IN(" separator="," close=")">
+                #{id}
+            </foreach>
+        </where>
+    </delete>
+
+    <!-- 批量修改公司银行表公司id -->
+    <update id="batchUpdateCompanyId">
+        UPDATE t_erp_company_paypal
+        <set>
+            company_id = #{id}
+        </set>
+        <where>
+            <foreach collection="params.paypalIds.split(',')" item="item" open="id IN(" separator="," close=")">
+                #{item}
+            </foreach>
+        </where>
+    </update>
+
+    <!-- 批量删除公司银行数据 -->
+    <delete id="batchDeleteByCompanyId">
+        DELETE FROM t_erp_company_paypal
+        <where>
+            <foreach collection="array" item="item" open="company_id IN(" separator="," close=")">
+                #{item}
+            </foreach>
+        </where>
+    </delete>
+
+    <select id="selectPayPalNameByCompanyId" parameterType="String" resultMap="CompanyPayPalMap">
+        <include refid="sqlField"/>
+        <where>
+            company_id = #{companyId}
+        </where>
+    </select>
+
+</mapper>

+ 75 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/service/ICompanyBankService.java

@@ -0,0 +1,75 @@
+package com.fjhx.company.service;
+
+import com.fjhx.company.entity.CompanyBank;
+import org.springblade.core.mp.base.BaseService;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 公司银行
+ */
+public interface ICompanyBankService extends BaseService<CompanyBank> {
+
+    /**
+     * 查询公司银行关联
+     *
+     * @param id 公司银行关联ID
+     * @return 公司银行关联
+     */
+    CompanyBank selectCompanyBankById(String id);
+
+    /**
+     * 查询公司银行关联列表
+     *
+     * @param condition 查询参数
+     * @return 公司银行关联集合
+     */
+    List<CompanyBank> selectCompanyBankList(HashMap<String, Object> condition);
+
+    /**
+     * 新增公司银行关联
+     *
+     * @param companyBank 公司银行关联
+     * @return 结果
+     */
+    String insertCompanyBank(CompanyBank companyBank);
+
+    /**
+     * 修改公司银行关联
+     *
+     * @param companyBank 公司银行关联
+     * @return 结果
+     */
+    int updateCompanyBank(CompanyBank companyBank);
+
+    /**
+     * 批量删除公司银行关联
+     *
+     * @param ids 需要删除的公司银行关联ID
+     * @return 结果
+     */
+    int deleteCompanyBankByIds(String[] ids);
+
+    /**
+     * 删除公司银行关联信息
+     *
+     * @param id 公司银行关联ID
+     * @return 结果
+     */
+    int deleteCompanyBankById(String id);
+
+    /**
+     * 获取所有企业银行
+     *
+     * @return
+     */
+    List<CompanyBank> getAll();
+
+    /**
+     * 获取公司银行信息
+     * @param companyId
+     * @return
+     */
+    CompanyBank getOneCompany(String companyId);
+}

+ 54 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/service/ICompanyBasicsService.java

@@ -0,0 +1,54 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package com.fjhx.company.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fjhx.company.entity.CompanyBasics;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 公司基础表 服务类
+ *
+ * @author BladeX
+ * @since 2023-01-11
+ */
+public interface ICompanyBasicsService extends IService<CompanyBasics> {
+
+    /**
+     * 列表
+     *
+     * @param condition 查询条件
+     */
+    List<CompanyBasics> getList(Map<String, Object> condition);
+
+    /**
+     * 列表-总条数
+     *
+     * @param condition 查询条件
+     */
+    Integer getListCount(Map<String, Object> condition);
+
+    /**
+     * 逻辑删除
+     *
+     * @param id 公司ID
+     * @return
+     */
+    boolean logicDeleteById(String id);
+}

+ 69 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/service/ICompanyPayPalService.java

@@ -0,0 +1,69 @@
+package com.fjhx.company.service;
+
+import com.fjhx.company.entity.CompanyPayPal;
+import org.springblade.core.mp.base.BaseService;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 公司PAYPAL账户
+ */
+public interface ICompanyPayPalService extends BaseService<CompanyPayPal> {
+
+    /**
+     * 查询公司PAYPAL账户关联
+     *
+     * @param id 公司PAYPAL账户关联ID
+     * @return 公司PAYPAL账户关联
+     */
+    CompanyPayPal selectCompanyPayPalById(String id);
+
+    /**
+     * 查询公司PAYPAL账户关联列表
+     *
+     * @param condition 查询参数
+     * @return 公司PAYPAL账户关联集合
+     */
+    List<CompanyPayPal> selectCompanyPayPalList(HashMap<String, Object> condition);
+
+    /**
+     * 新增公司PAYPAL账户关联
+     *
+     * @param companyPayPal 公司PAYPAL账户关联
+     * @return 结果
+     */
+    String insertCompanyPayPal(CompanyPayPal companyPayPal);
+
+    /**
+     * 修改公司PAYPAL账户关联
+     *
+     * @param companyPayPal 公司PAYPAL账户关联
+     * @return 结果
+     */
+    int updateCompanyPayPal(CompanyPayPal companyPayPal);
+
+    /**
+     * 批量删除公司PAYPAL账户关联
+     *
+     * @param ids 需要删除的公司PAYPAL账户关联ID
+     * @return 结果
+     */
+    int deleteCompanyPayPalByIds(String[] ids);
+
+    /**
+     * 删除公司PAYPAL账户关联信息
+     *
+     * @param id 公司PAYPAL账户关联ID
+     * @return 结果
+     */
+    int deleteCompanyPayPalById(String id);
+
+    /**
+     * 查询公司PAYPAL账户关联
+     *
+     * @param companyId 公司ID
+     * @return 公司PAYPAL账户关联
+     */
+    CompanyPayPal selectPayPalNameByCompanyId(String companyId);
+}

+ 109 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/service/ICompanyService.java

@@ -0,0 +1,109 @@
+package com.fjhx.company.service;
+
+import com.fjhx.company.entity.Company;
+import org.springblade.core.mp.base.BaseService;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 企业信息
+ */
+public interface ICompanyService extends BaseService<Company> {
+
+    /**
+     * 查询企业信息
+     *
+     * @param id 企业信息ID
+     * @return 企业信息
+     */
+    Company selectCompanyById(String id);
+
+    /**
+     * 查询企业信息列表
+     *
+     * @param condition 查询参数
+     * @return 企业信息集合
+     */
+    List<Company> selectCompanyList(HashMap<String, Object> condition);
+
+    /**
+     * 查询企业信息列表总数
+     *
+     * @param condition 查询参数
+     * @return 企业信息集合
+     */
+    Integer selectCompanyListCount(HashMap<String, Object> condition);
+
+    /**
+     * 新增企业信息
+     *
+     * @param company 企业信息
+     * @return 结果
+     */
+    int insertCompany(Company company);
+
+    /**
+     * 修改企业信息
+     *
+     * @param company 企业信息
+     * @return 结果
+     */
+    int updateCompany(Company company);
+
+    /**
+     * 批量删除企业信息
+     *
+     * @param ids 需要删除的企业信息ID
+     * @return 结果
+     */
+    boolean deleteCompanyByIds(String[] ids);
+
+    /**
+     * 删除企业信息信息
+     *
+     * @param id 企业信息ID
+     * @return 结果
+     */
+    int deleteCompanyById(String id);
+
+    /**
+     * 设置为默认
+     *
+     * @param company 对象
+     * @return
+     */
+    Integer updateIsDefaultById(Company company);
+
+    /**
+     * 检索公司名称
+     *
+     * @param name 公司名称(中文)
+     * @return
+     */
+    List<String> searchChineseName(String name);
+
+    /**
+     * 获取租户下第一个公司
+     *
+     * @return
+     */
+    Company getOneByTenantId();
+
+    /**
+     * 根据ID查询
+     *
+     * @param ids 公司ID集合
+     * @return
+     */
+    List<Company> getByIds(List<String> ids);
+
+    /**
+     * 根据ID查询
+     *
+     * @param ids 公司ID集合
+     * @return
+     */
+    Map<String, Company> getByIdsToMap(List<String> ids);
+}

+ 113 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/service/impl/CompanyBankServiceImpl.java

@@ -0,0 +1,113 @@
+package com.fjhx.company.service.impl;
+
+import com.fjhx.company.entity.CompanyBank;
+import com.fjhx.company.mapper.CompanyBankMapper;
+import com.fjhx.company.service.ICompanyBankService;
+import org.springblade.core.mp.base.BasicsServiceImpl;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.utils.id.IdUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 公司银行
+ */
+@Service
+public class CompanyBankServiceImpl extends BasicsServiceImpl<CompanyBankMapper, CompanyBank> implements ICompanyBankService {
+
+    /**
+     * 查询公司银行关联
+     *
+     * @param id 公司银行关联ID
+     * @return 公司银行关联
+     */
+    @Override
+    public CompanyBank selectCompanyBankById(String id) {
+        return baseMapper.selectCompanyBankById(id);
+    }
+
+    /**
+     * 查询公司银行关联列表
+     *
+     * @param condition 查询参数
+     * @return 公司银行关联集合
+     */
+    @Override
+    public List<CompanyBank> selectCompanyBankList(HashMap<String, Object> condition) {
+        return baseMapper.selectCompanyBankList(condition);
+    }
+
+    /**
+     * 新增公司银行关联
+     *
+     * @param companyBank 公司银行关联
+     * @return 结果
+     */
+    @Override
+    public String insertCompanyBank(CompanyBank companyBank) {
+        companyBank.setId(IdUtils.fastSimpleUUID());
+        companyBank.setCreateUser(AuthUtil.getUserIdStr());
+        companyBank.setCreateTime(new Date());
+        baseMapper.insertCompanyBank(companyBank);
+        return companyBank.getId();
+    }
+
+    /**
+     * 修改公司银行关联
+     *
+     * @param companyBank 公司银行关联
+     * @return 结果
+     */
+    @Override
+    public int updateCompanyBank(CompanyBank companyBank) {
+        companyBank.setUpdateUser(AuthUtil.getUserIdStr());
+        companyBank.setUpdateTime(new Date());
+        return baseMapper.updateCompanyBank(companyBank);
+    }
+
+    /**
+     * 批量删除公司银行关联
+     *
+     * @param ids 需要删除的公司银行关联ID
+     * @return 结果
+     */
+    @Override
+    public int deleteCompanyBankByIds(String[] ids) {
+        return baseMapper.deleteCompanyBankByIds(ids);
+    }
+
+    /**
+     * 删除公司银行关联信息
+     *
+     * @param id 公司银行关联ID
+     * @return 结果
+     */
+    @Override
+    public int deleteCompanyBankById(String id) {
+        return baseMapper.deleteCompanyBankById(id);
+    }
+
+    /**
+     * 获取所有企业银行
+     *
+     * @return
+     */
+    @Override
+    public List<CompanyBank> getAll() {
+        return baseMapper.getAll();
+    }
+
+    /**
+     * 获取公司银行卡信息
+     * @param companyId
+     * @return
+     */
+    @Override
+    public CompanyBank getOneCompany(String companyId) {
+        return baseMapper.selectCompanyBankByCompanyId(companyId);
+    }
+
+}

+ 177 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/service/impl/CompanyBasicsServiceImpl.java

@@ -0,0 +1,177 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package com.fjhx.company.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.company.entity.Company;
+import com.fjhx.company.entity.CompanyBasics;
+import com.fjhx.company.mapper.CompanyBasicsMapper;
+import com.fjhx.company.service.ICompanyBasicsService;
+import com.fjhx.company.service.ICompanyService;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springblade.common.entity.Pager;
+import org.springblade.common.enums.YesOrNoEnum;
+import org.springblade.common.utils.ListPageMap;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.mp.base.BasicsServiceImpl;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 公司基础表 服务实现类
+ *
+ * @author BladeX
+ * @since 2023-01-11
+ */
+@Service
+public class CompanyBasicsServiceImpl extends BasicsServiceImpl<CompanyBasicsMapper, CompanyBasics> implements ICompanyBasicsService {
+
+    @Autowired
+    private ICompanyService iCompanyService;
+
+    /**
+     * 列表
+     *
+     * @param condition 查询条件
+     * @return
+     */
+    @Override
+    public List<CompanyBasics> getList(Map<String, Object> condition) {
+        //构建查询
+        QueryWrapper<CompanyBasics> wrapper = getWrapper(condition);
+
+        //分页
+        Pager pager = (Pager) condition.get(ListPageMap.pager_key);
+        Page<CompanyBasics> page = new Page<>(pager.getpageNum(), pager.getPageSize());
+
+        //根据时间倒序
+        wrapper.lambda().orderByDesc(CompanyBasics::getCreateTime);
+
+        return baseMapper.selectPage(page, wrapper).getRecords();
+    }
+
+    /**
+     * 构建查询
+     *
+     * @param condition 查询条件
+     */
+    private QueryWrapper<CompanyBasics> getWrapper(Map<String, Object> condition) {
+        QueryWrapper<CompanyBasics> wrapper = new QueryWrapper<>();
+        wrapper.and(Func.isNotEmpty(condition.get("name")), o -> o.apply("instr(name_chinese, '" + condition.get("name") + "') > 0").or().apply("instr(name_english, '" + condition.get("name") + "') > 0"));
+        return wrapper;
+    }
+
+    /**
+     * 列表总数
+     *
+     * @param condition 查询条件
+     * @return
+     */
+    @Override
+    public Integer getListCount(Map<String, Object> condition) {
+        //构建查询
+        QueryWrapper<CompanyBasics> wrapper = getWrapper(condition);
+        return baseMapper.selectCount(wrapper);
+    }
+
+    /**
+     * 保存
+     *
+     * @param entity 查询条件
+     * @return
+     */
+    @Override
+    public boolean save(CompanyBasics entity) {
+        //校验是否已存在
+        this.checkIsExists(entity);
+
+        return super.save(entity);
+    }
+
+    /**
+     * 修改
+     *
+     * @param entity 查询条件
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean updateById(CompanyBasics entity) {
+        //校验是否已存在
+        this.checkIsExists(entity);
+
+        super.updateById(entity);
+
+        //同步更新公司模板数据
+        iCompanyService.lambdaUpdate()
+                .set(Company::getNameChinese, entity.getNameChinese())
+                .set(Company::getNameEnglish, entity.getNameEnglish())
+                .set(Company::getInvoicePrefix, entity.getInvoicePrefix())
+                .set(Company::getOrganizationCode, entity.getOrganizationCode())
+                .set(Company::getTaxpayerNumber, entity.getTaxpayerNumber())
+                .set(Company::getIneEnterpriseCode, entity.getIneEnterpriseCode())
+                .set(Company::getCustomsRegistrationCode, entity.getCustomsRegistrationCode())
+                .eq(Company::getCompanyBasicsId, entity.getId())
+                .update();
+
+        return true;
+    }
+
+    /**
+     * 校验是否已存在
+     *
+     * @param entity 公司信息
+     */
+    private void checkIsExists(CompanyBasics entity) {
+        List<CompanyBasics> list = lambdaQuery()
+                .ne(StringUtils.isNotEmpty(entity.getId()), CompanyBasics::getId, entity.getId())
+                .and(o -> o.eq(CompanyBasics::getNameChinese, entity.getNameChinese())
+                        .or().eq(CompanyBasics::getNameEnglish, entity.getNameChinese())
+                        .or().eq(CompanyBasics::getNameChinese, entity.getNameEnglish())
+                        .or().eq(CompanyBasics::getNameEnglish, entity.getNameEnglish()))
+                .list();
+
+        if (CollectionUtils.isNotEmpty(list)) {
+            throw new ServiceException("公司名称已存在,请更换。");
+        }
+    }
+
+    /**
+     * 逻辑删除
+     *
+     * @param id 公司ID
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean logicDeleteById(String id) {
+        //删除公司基础表
+        lambdaUpdate().set(CompanyBasics::getIsDeleted, YesOrNoEnum.YES.getKey()).eq(CompanyBasics::getId, id).update();
+
+        //删除公司模板表
+        iCompanyService.lambdaUpdate().set(Company::getIsDeleted, YesOrNoEnum.YES.getKey()).eq(Company::getCompanyBasicsId, id).update();
+
+        return true;
+    }
+}

+ 103 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/service/impl/CompanyPayPalServiceImpl.java

@@ -0,0 +1,103 @@
+package com.fjhx.company.service.impl;
+
+import com.fjhx.company.entity.CompanyPayPal;
+import com.fjhx.company.mapper.CompanyPayPalMapper;
+import com.fjhx.company.service.ICompanyPayPalService;
+import org.springblade.core.mp.base.BasicsServiceImpl;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.utils.id.IdUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 公司PAYPAL账户
+ */
+@Service
+public class CompanyPayPalServiceImpl extends BasicsServiceImpl<CompanyPayPalMapper, CompanyPayPal> implements ICompanyPayPalService {
+
+    /**
+     * 查询公司PAYPAL账户关联
+     *
+     * @param id 公司PAYPAL账户关联ID
+     * @return 公司PAYPAL账户关联
+     */
+    @Override
+    public CompanyPayPal selectCompanyPayPalById(String id) {
+        return baseMapper.selectCompanyPayPalById(id);
+    }
+
+    /**
+     * 查询公司PAYPAL账户关联列表
+     *
+     * @param condition 查询参数
+     * @return 公司PAYPAL账户关联集合
+     */
+    @Override
+    public List<CompanyPayPal> selectCompanyPayPalList(HashMap<String, Object> condition) {
+        return baseMapper.selectCompanyPayPalList(condition);
+    }
+
+    /**
+     * 新增公司PAYPAL账户关联
+     *
+     * @param companyPayPal 公司PAYPAL账户关联
+     * @return 结果
+     */
+    @Override
+    public String insertCompanyPayPal(CompanyPayPal companyPayPal) {
+        companyPayPal.setId(IdUtils.fastSimpleUUID());
+        companyPayPal.setCreateUser(AuthUtil.getUserIdStr());
+        companyPayPal.setCreateTime(new Date());
+        baseMapper.insertCompanyPayPal(companyPayPal);
+        return companyPayPal.getId();
+    }
+
+    /**
+     * 修改公司PAYPAL账户关联
+     *
+     * @param companyPayPal 公司PAYPAL账户关联
+     * @return 结果
+     */
+    @Override
+    public int updateCompanyPayPal(CompanyPayPal companyPayPal) {
+        companyPayPal.setUpdateUser(AuthUtil.getUserIdStr());
+        companyPayPal.setUpdateTime(new Date());
+        return baseMapper.updateCompanyPayPal(companyPayPal);
+    }
+
+    /**
+     * 批量删除公司PAYPAL账户关联
+     *
+     * @param ids 需要删除的公司PAYPAL账户关联ID
+     * @return 结果
+     */
+    @Override
+    public int deleteCompanyPayPalByIds(String[] ids) {
+        return baseMapper.deleteCompanyPayPalByIds(ids);
+    }
+
+    /**
+     * 删除公司PAYPAL账户关联信息
+     *
+     * @param id 公司PAYPAL账户关联ID
+     * @return 结果
+     */
+    @Override
+    public int deleteCompanyPayPalById(String id) {
+        return baseMapper.deleteCompanyPayPalById(id);
+    }
+
+    /**
+     * 查询公司PAYPAL账户关联
+     *
+     * @param companyId 公司ID
+     * @return
+     */
+    @Override
+    public CompanyPayPal selectPayPalNameByCompanyId(String companyId) {
+        return baseMapper.selectPayPalNameByCompanyId(companyId);
+    }
+}

+ 231 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/company/service/impl/CompanyServiceImpl.java

@@ -0,0 +1,231 @@
+package com.fjhx.company.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fjhx.company.entity.Company;
+import com.fjhx.company.mapper.CompanyBankMapper;
+import com.fjhx.company.mapper.CompanyMapper;
+import com.fjhx.company.mapper.CompanyPayPalMapper;
+import com.fjhx.company.service.ICompanyService;
+import com.fjhx.western.service.ICompanyWesternService;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.MapUtils;
+import org.springblade.common.enums.YesOrNoEnum;
+import org.springblade.core.mp.base.BasicsServiceImpl;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tenant.annotation.TenantIgnore;
+import org.springblade.core.tool.utils.id.IdUtils;
+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.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 企业信息
+ */
+@Service
+public class CompanyServiceImpl extends BasicsServiceImpl<CompanyMapper, Company> implements ICompanyService {
+
+    @Autowired
+    private CompanyBankMapper companyBankMapper;
+
+    @Autowired
+    private CompanyPayPalMapper companyPayPalMapper;
+
+    @Autowired
+    private ICompanyWesternService companyWesternService;
+
+    /**
+     * 查询企业信息
+     *
+     * @param id 企业信息ID
+     * @return 企业信息
+     */
+    @Override
+    public Company selectCompanyById(String id) {
+        return baseMapper.selectCompanyById(id);
+    }
+
+    /**
+     * 查询企业信息列表
+     *
+     * @param condition 查询参数
+     * @return 企业信息集合
+     */
+    @Override
+    public List<Company> selectCompanyList(HashMap<String, Object> condition) {
+        condition.put("tenantId", AuthUtil.getTenantId());
+        return baseMapper.selectCompanyList(condition);
+    }
+
+    /**
+     * 查询企业信息列表总数
+     *
+     * @param condition 查询参数
+     * @return 企业信息集合
+     */
+    @Override
+    public Integer selectCompanyListCount(HashMap<String, Object> condition) {
+        condition.put("tenantId", AuthUtil.getTenantId());
+        return baseMapper.selectCompanyListCount(condition);
+    }
+
+    /**
+     * 新增企业信息
+     *
+     * @param company 企业信息
+     * @return 结果
+     */
+    @Transactional(rollbackFor = {Exception.class})
+    @Override
+    public int insertCompany(Company company) {
+        company.setId(IdUtils.fastSimpleUUID());
+        company.setCreateUser(AuthUtil.getUserIdStr());
+        company.setCreateTime(new Date());
+        company.setTenantId(AuthUtil.getTenantId());
+        int result = baseMapper.insertCompany(company);
+        if (result > 0 && MapUtils.isNotEmpty(company.getParams())) {
+            if (company.getParams().get("bankIds") != null && company.getParams().get("bankIds") != "") {
+                // 批量修改公司银行表公司id
+                companyBankMapper.batchUpdateCompanyId(company);
+            }
+            if (company.getParams().get("paypalIds") != null && company.getParams().get("paypalIds") != "") {
+                // 批量修改公司PayPal表公司id
+                companyPayPalMapper.batchUpdateCompanyId(company);
+            }
+        }
+        //批量提交西联汇款
+        companyWesternService.submit(company.getCompanyWesternList(), company.getId());
+        return result;
+    }
+
+    /**
+     * 修改企业信息
+     *
+     * @param company 企业信息
+     * @return 结果
+     */
+    @Override
+    public int updateCompany(Company company) {
+        company.setUpdateUser(AuthUtil.getUserIdStr());
+        company.setUpdateTime(new Date());
+        return baseMapper.updateCompany(company);
+    }
+
+    /**
+     * 批量删除企业信息
+     *
+     * @param ids 需要删除的企业信息ID
+     * @return 结果
+     */
+    @Transactional(rollbackFor = {Exception.class})
+    @Override
+    public boolean deleteCompanyByIds(String[] ids) {
+//        int result = baseMapper.deleteCompanyByIds(ids);
+//        if (result > 0) {
+//            // 批量删除公司银行数据
+//            companyBankMapper.batchDeleteByCompanyId(ids);
+//
+//            // 批量删除公司银行数据
+//            companyPayPalMapper.batchDeleteByCompanyId(ids);
+//
+//            //批量删除西联汇款数据
+//            companyWesternService.remove(Wrappers.<CompanyWestern>query().lambda().in(CompanyWestern::getCompanyId, Arrays.asList(ids)));
+//        }
+
+        return lambdaUpdate().set(Company::getIsDeleted, YesOrNoEnum.YES.getKey()).in(Company::getId, Arrays.asList(ids)).update();
+    }
+
+    /**
+     * 删除企业信息信息
+     *
+     * @param id 企业信息ID
+     * @return 结果
+     */
+    @Override
+    public int deleteCompanyById(String id) {
+        return baseMapper.deleteCompanyById(id);
+    }
+
+    /**
+     * 设置为默认
+     *
+     * @param company 对象
+     * @return
+     */
+    @Transactional(rollbackFor = {Exception.class})
+    @Override
+    public Integer updateIsDefaultById(Company company) {
+        // 先把所有的企业设置为非默认
+        int result = baseMapper.updateIsDefaultAll();
+        if (result > 0) {
+            // 再设置当前id的企业为默认
+            baseMapper.updateIsDefaultById(company);
+        }
+        return result;
+    }
+
+    /**
+     * 检索公司名称
+     *
+     * @param name 公司名称(中文)
+     * @return
+     */
+    @Override
+    public List<String> searchChineseName(String name) {
+        return baseMapper.searchNameChinese(AuthUtil.getTenantId(), name);
+    }
+
+    /**
+     * 获取租户下第一个公司
+     *
+     * @return
+     */
+    @TenantIgnore
+    @Override
+    public Company getOneByTenantId() {
+        QueryWrapper<Company> wrapper = new QueryWrapper<>();
+        wrapper.lambda().eq(Company::getTenantId, AuthUtil.getTenantId());
+        wrapper.lambda().orderByAsc(Company::getCreateTime);
+        wrapper.last(" limit 1");
+        return baseMapper.selectOne(wrapper);
+    }
+
+    /**
+     * 根据ID查询
+     *
+     * @param ids 公司ID集合
+     * @return
+     */
+    @Override
+    public List<Company> getByIds(List<String> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return new ArrayList<>();
+        }
+        return lambdaQuery()
+                .in(Company::getId, ids)
+                .list();
+    }
+
+    /**
+     * 根据ID查询
+     *
+     * @param ids 公司ID集合
+     * @return
+     */
+    @Override
+    public Map<String, Company> getByIdsToMap(List<String> ids) {
+        List<Company> list = this.getByIds(ids);
+        if (CollectionUtils.isEmpty(list)) {
+            return new HashMap<>();
+        }
+        return list.stream().collect(Collectors.toMap(Company::getId, Function.identity(), (key1, key2) -> key2));
+    }
+}

+ 121 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/controller/ContractChangeFlowController.java

@@ -0,0 +1,121 @@
+package com.fjhx.contract.controller;
+
+import com.fjhx.activiti.SubmitFlowCondition;
+import com.fjhx.contract.entity.Contract;
+import com.fjhx.contract.service.IContractChangeFlowService;
+import org.springblade.common.constant.ApiConstant;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+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(ApiConstant.Project.SAAS_BUSINESS_TRADEERP_REQUEST_PREFIX + "/contract/change/flow")
+public class ContractChangeFlowController extends BladeController {
+
+    @Autowired
+    private IContractChangeFlowService contractChangeFlowService;
+
+    /**
+     * 开始流程
+     *
+     * @param contract
+     * @return
+     */
+    @PostMapping(value = "/start")
+    public R start(@RequestBody Contract contract) {
+        contractChangeFlowService.start(contract);
+        return R.success();
+    }
+
+    /**
+     * 采购员核算
+     *
+     * @param contract
+     * @return
+     */
+    @PostMapping("/purchase/check")
+    public R purchaseCheck(@RequestBody Contract contract) {
+        contractChangeFlowService.purchaseCheck(contract);
+        return R.success();
+    }
+
+    /**
+     * 业务总监确认
+     *
+     * @param contract
+     * @return
+     */
+    @PostMapping("/chief/inspector/confirm")
+    public R chiefInspectorConfirm(@RequestBody Contract contract) {
+        contractChangeFlowService.chiefInspectorConfirm(contract);
+        return R.success();
+    }
+
+    /**
+     * 总经理确认
+     *
+     * @param contract
+     * @return
+     */
+    @PostMapping("/general/manager/confirm")
+    public R generalManagerConfirm(@RequestBody Contract contract) {
+        contractChangeFlowService.generalManagerConfirm(contract);
+        return R.success();
+    }
+
+    /**
+     * 业务员确认
+     *
+     * @param contract
+     * @return
+     */
+    @PostMapping("/business/user/confirm")
+    public R businessUserConfirm(@RequestBody Contract contract) {
+        contractChangeFlowService.businessUserConfirm(contract);
+        return R.success();
+    }
+
+    /**
+     * 业务员作废
+     *
+     * @param contract
+     * @return
+     */
+    @PostMapping("/business/user/invalid")
+    public R businessUserInvalid(@RequestBody Contract contract) {
+        contractChangeFlowService.businessUserInvalid(contract);
+        return R.success();
+    }
+
+    /**
+     * 回退
+     *
+     * @param condition
+     * @return
+     */
+    @PostMapping(value = "/reject")
+    public R reject(@RequestBody SubmitFlowCondition condition) {
+        contractChangeFlowService.reject(condition);
+        return R.success();
+    }
+
+    /**
+     * 删除流程
+     *
+     * @param condition
+     * @return
+     */
+    @PostMapping(value = "/delete")
+    public R delete(@RequestBody SubmitFlowCondition condition) {
+        contractChangeFlowService.delete(condition);
+        return R.success();
+    }
+
+}

+ 61 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/controller/ContractChangeFlowControllerV2.java

@@ -0,0 +1,61 @@
+package com.fjhx.contract.controller;
+
+import com.fjhx.activiti.SubmitFlowCondition;
+import com.fjhx.contract.entity.Contract;
+import com.fjhx.contract.service.IContractChangeFlowServiceV2;
+import org.springblade.common.constant.ApiConstant;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+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(ApiConstant.Project.SAAS_BUSINESS_TRADEERP_REQUEST_PREFIX + "/contract/change/flow/v2")
+public class ContractChangeFlowControllerV2 extends BladeController {
+
+    @Autowired
+    private IContractChangeFlowServiceV2 iContractChangeFlowServiceV2;
+
+    /**
+     * 开始流程
+     *
+     * @param contract
+     * @return
+     */
+    @PostMapping(value = "/start")
+    public R start(@RequestBody Contract contract) {
+        iContractChangeFlowServiceV2.start(contract);
+        return R.success();
+    }
+
+    /**
+     * 审核
+     *
+     * @param condition
+     * @return
+     */
+    @PostMapping(value = "/examine")
+    public R examine(@RequestBody SubmitFlowCondition condition) {
+        iContractChangeFlowServiceV2.examine(condition);
+        return R.success();
+    }
+
+    /**
+     * 删除流程
+     *
+     * @param entity
+     * @return
+     */
+    @PostMapping(value = "/delete")
+    public R delete(@RequestBody Contract entity) {
+        iContractChangeFlowServiceV2.delete(entity);
+        return R.success();
+    }
+
+}

+ 162 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/controller/ContractController.java

@@ -0,0 +1,162 @@
+package com.fjhx.contract.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fjhx.contract.entity.Contract;
+import com.fjhx.contract.service.IContractPdfService;
+import com.fjhx.contract.service.IContractSamplePdfService;
+import com.fjhx.contract.service.IContractService;
+import com.fjhx.utils.Assert;
+import org.springblade.common.constant.ApiConstant;
+import org.springblade.common.utils.ListPageMap;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.mp.base.BasicsEntity;
+import org.springblade.core.tool.api.R;
+import org.springblade.system.attachment.entity.Attachment;
+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;
+import java.util.Map;
+
+/**
+ * 外销合同
+ */
+@RestController
+@RequestMapping(ApiConstant.Project.SAAS_BUSINESS_TRADEERP_REQUEST_PREFIX + "/contract")
+public class ContractController extends BladeController {
+
+    @Autowired
+    private IContractService contractService;
+
+    @Autowired
+    private IContractPdfService contractPdfService;
+
+    @Autowired
+    private IContractSamplePdfService contractSamplePdfService;
+
+    /**
+     * 列表
+     *
+     * @param condition 查询条件
+     * @return
+     */
+    @PostMapping("/list")
+    public R getList(@RequestBody Map<String, Object> condition) {
+        ListPageMap.getListPageMap(condition);
+        List<Contract> list = contractService.getList(condition);
+        return R.list(list);
+    }
+
+    /**
+     * 列表-总条数
+     *
+     * @param condition 查询条件
+     * @return
+     */
+    @PostMapping("/list/count")
+    public R getListCount(@RequestBody Map<String, Object> condition) {
+        Integer count = contractService.getListCount(condition);
+        return R.count(count);
+    }
+
+    @PostMapping("/list/byCode")
+    public R getListByCode(@RequestBody Map<String, Object> condition) {
+        Assert.notEmpty(condition.get("code"), "合同编号不能为为空");
+        Assert.notEmpty(condition.get("id"), "合同id不能为为空");
+
+        List<Contract> list = contractService.list(Wrappers.<Contract>lambdaQuery()
+                .eq(Contract::getCode, condition.get("code"))
+                .ne(BasicsEntity::getId, condition.get("id")));
+
+        return R.list(list);
+    }
+
+    /**
+     * 详情
+     *
+     * @param contract
+     * @return
+     */
+    @PostMapping("/details")
+    public R details(@RequestBody Contract contract) {
+        return R.details(contractService.getById(contract.getId()));
+    }
+
+    /**
+     * 根据id删除
+     *
+     * @param contract
+     * @return
+     */
+    @PostMapping("/delete")
+    public R delete(@RequestBody Contract contract) {
+        contractService.removeById(contract.getId());
+        return R.success();
+    }
+
+    /**
+     * 客户画像:销售分析列表
+     *
+     * @param condition 查询条件
+     * @return
+     */
+    @PostMapping("/sales/analysis/list")
+    public R getSalesAnalysisList(@RequestBody Map<String, Object> condition) {
+        ListPageMap.getListPageMap(condition);
+        JSONObject object = contractService.getSalesAnalysisList(condition);
+        return R.details(object);
+    }
+
+    /**
+     * 客户画像:销售分析列表总数
+     *
+     * @param condition 查询条件
+     * @return
+     */
+    @PostMapping("/sales/analysis/list/count")
+    public R getSalesAnalysisListCount(@RequestBody Map<String, Object> condition) {
+        Integer count = contractService.getSalesAnalysisListCount(condition);
+        return R.count(count);
+    }
+
+    /**
+     * 通过客户id查询列表
+     *
+     * @param condition
+     * @return
+     */
+    @PostMapping("/getByCustomerId")
+    public R getByCustomerId(@RequestBody Map<String, Object> condition) {
+        List<Contract> list = contractService.getByCustomerId(condition);
+        return R.list(list);
+    }
+
+    /**
+     * 生成外销合同pdf
+     *
+     * @param contract
+     * @return
+     */
+    @PostMapping(value = "/pdf")
+    public R generatePdf(@RequestBody Contract contract) {
+        Attachment attachment = contractPdfService.generate(contract.getId());
+        return R.details(attachment);
+    }
+
+    /**
+     * 生成合同样品单pdf
+     *
+     * @param contract
+     * @return
+     */
+    @PostMapping(value = "/sample/pdf")
+    public R generateSamplePdf(@RequestBody Contract contract) {
+        Attachment attachment = contractSamplePdfService.generate(contract.getId());
+        return R.details(attachment);
+    }
+
+}

+ 85 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/controller/ContractFlowController.java

@@ -0,0 +1,85 @@
+package com.fjhx.contract.controller;
+
+import com.fjhx.activiti.SubmitFlowCondition;
+import com.fjhx.contract.entity.Contract;
+import com.fjhx.contract.service.IContractFlowService;
+import com.fjhx.interestrate.service.IInterestRateService;
+import org.springblade.common.constant.ApiConstant;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+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(ApiConstant.Project.SAAS_BUSINESS_TRADEERP_REQUEST_PREFIX + "/contract/flow")
+public class ContractFlowController extends BladeController {
+
+    @Autowired
+    private IContractFlowService contractFlowService;
+
+    /**
+     * 保存草稿
+     *
+     * @param contract
+     * @return
+     */
+    @PostMapping(value = "/draft")
+    public R saveDraft(@RequestBody Contract contract) {
+        contractFlowService.saveOrUpdateDraft(contract);
+        return R.success();
+    }
+
+    /**
+     * 开始流程
+     *
+     * @param contract
+     * @return
+     */
+    @PostMapping(value = "/start")
+    public R start(@RequestBody Contract contract) {
+        contractFlowService.start(contract);
+        return R.success();
+    }
+
+    /**
+     * 审核
+     *
+     * @param condition
+     * @return
+     */
+    @PostMapping(value = "/examine")
+    public R examine(@RequestBody SubmitFlowCondition condition) {
+        contractFlowService.examine(condition);
+        return R.success();
+    }
+
+    /**
+     * 回退
+     *
+     * @param condition
+     * @return
+     */
+    @PostMapping(value = "/reject")
+    public R reject(@RequestBody SubmitFlowCondition condition) {
+        contractFlowService.reject(condition);
+        return R.success();
+    }
+
+    /**
+     * 删除流程
+     *
+     * @param condition
+     * @return
+     */
+    @PostMapping(value = "/delete")
+    public R delete(@RequestBody SubmitFlowCondition condition) {
+        contractFlowService.delete(condition);
+        return R.success();
+    }
+}

+ 60 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/controller/ContractFlowControllerV2.java

@@ -0,0 +1,60 @@
+package com.fjhx.contract.controller;
+
+import com.fjhx.activiti.SubmitFlowCondition;
+import com.fjhx.contract.entity.Contract;
+import com.fjhx.contract.service.IContractFlowServiceV2;
+import org.springblade.common.constant.ApiConstant;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+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(ApiConstant.Project.SAAS_BUSINESS_TRADEERP_REQUEST_PREFIX + "/contract/flow/v2")
+public class ContractFlowControllerV2 extends BladeController {
+
+    @Autowired
+    private IContractFlowServiceV2 iContractFlowServiceV2;
+
+    /**
+     * 开始流程
+     *
+     * @param contract
+     * @return
+     */
+    @PostMapping(value = "/start")
+    public R start(@RequestBody Contract contract) {
+        iContractFlowServiceV2.start(contract);
+        return R.success();
+    }
+
+    /**
+     * 审核
+     *
+     * @param condition
+     * @return
+     */
+    @PostMapping(value = "/examine")
+    public R examine(@RequestBody SubmitFlowCondition condition) {
+        iContractFlowServiceV2.examine(condition);
+        return R.success();
+    }
+
+    /**
+     * 删除流程
+     *
+     * @param entity
+     * @return
+     */
+    @PostMapping(value = "/delete")
+    public R delete(@RequestBody Contract entity) {
+        iContractFlowServiceV2.delete(entity);
+        return R.success();
+    }
+}

+ 48 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/controller/ContractFlowExtendController.java

@@ -0,0 +1,48 @@
+package com.fjhx.contract.controller;
+
+import com.fjhx.activiti.SubmitFlowCondition;
+import com.fjhx.contract.entity.ContractFlowExtend;
+import com.fjhx.contract.service.IContractFlowExtendService;
+import org.springblade.common.constant.ApiConstant;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+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(ApiConstant.Project.SAAS_BUSINESS_TRADEERP_REQUEST_PREFIX + "/contract/flow/extend")
+public class ContractFlowExtendController extends BladeController {
+
+    @Autowired
+    private IContractFlowExtendService iContractFlowExtendService;
+
+    /**
+     * 开始流程
+     *
+     * @param contract
+     * @return
+     */
+    @PostMapping(value = "/start")
+    public R start(@RequestBody ContractFlowExtend contract) {
+        iContractFlowExtendService.start(contract);
+        return R.success();
+    }
+
+    /**
+     * 审核
+     *
+     * @param condition
+     * @return
+     */
+    @PostMapping(value = "/examine")
+    public R examine(@RequestBody SubmitFlowCondition condition) {
+        iContractFlowExtendService.examine(condition);
+        return R.success();
+    }
+}

+ 86 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/controller/ContractProductController.java

@@ -0,0 +1,86 @@
+package com.fjhx.contract.controller;
+
+import com.fjhx.contract.entity.ContractProduct;
+import com.fjhx.contract.service.IContractProductService;
+import org.springblade.common.constant.ApiConstant;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+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(ApiConstant.Project.SAAS_BUSINESS_TRADEERP_REQUEST_PREFIX + "/contract/product")
+public class ContractProductController extends BladeController {
+
+    @Autowired
+    private IContractProductService contractProductService;
+
+    /**
+     * 通过id查询
+     *
+     * @param contractProduct
+     * @return
+     */
+    @PostMapping("/getById")
+    public R getById(@RequestBody ContractProduct contractProduct) {
+        ContractProduct product = contractProductService.getById(contractProduct.getId());
+        return R.details(product);
+    }
+
+    /**
+     * 通过合同id查询列表
+     *
+     * @param contractProduct
+     * @return
+     */
+    @PostMapping("/getByContractId")
+    public R getByContractId(@RequestBody ContractProduct contractProduct) {
+        List<ContractProduct> list = contractProductService.getByContractId(contractProduct.getContractId());
+        return R.list(list);
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param ids id集合
+     * @return
+     */
+    @PostMapping("/getByIds")
+    public R getByIds(@RequestBody List<String> ids) {
+        List<ContractProduct> list = contractProductService.getByIds(ids);
+        return R.list(list);
+    }
+
+    /**
+     * 通过父级id查询
+     *
+     * @param parentIds
+     * @return
+     */
+    @PostMapping("/getByParentId")
+    public R getByParentId(@RequestBody List<String> parentIds) {
+        List<ContractProduct> list = contractProductService.getByParentId(parentIds);
+        return R.list(list);
+    }
+
+    /**
+     * 通过父级id查询辅材、配件产品采购数量
+     *
+     * @param parentIds
+     * @return
+     */
+    @PostMapping("/getPurchaseInfoByParentId")
+    public R getPurchaseInfoByParentId(@RequestBody List<String> parentIds) {
+        List<ContractProduct> list = contractProductService.getPurchaseInfoByParentId(parentIds);
+        return R.list(list);
+    }
+
+}

+ 38 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/controller/ContractProjectController.java

@@ -0,0 +1,38 @@
+package com.fjhx.contract.controller;
+
+import com.fjhx.contract.entity.ContractProject;
+import com.fjhx.contract.service.IContractProjectService;
+import org.springblade.common.constant.ApiConstant;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+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(ApiConstant.Project.SAAS_BUSINESS_TRADEERP_REQUEST_PREFIX + "/contract/project")
+public class ContractProjectController extends BladeController {
+
+    @Autowired
+    private IContractProjectService contractProjectService;
+
+    /**
+     * 通过合同id查询列表
+     *
+     * @param contractProject
+     * @return
+     */
+    @PostMapping("/getByContractId")
+    public R getByContractId(@RequestBody ContractProject contractProject) {
+        List<ContractProject> list = contractProjectService.getByContractId(contractProject.getContractId());
+        return R.list(list);
+    }
+
+}

+ 77 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/controller/ContractSampleConfirmLogController.java

@@ -0,0 +1,77 @@
+package com.fjhx.contract.controller;
+
+import com.fjhx.contract.entity.ContractSampleConfirmLog;
+import com.fjhx.contract.service.IContractSampleConfirmLogService;
+import org.springblade.common.constant.ApiConstant;
+import org.springblade.common.utils.ListPageMap;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+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;
+import java.util.Map;
+
+/**
+ * 合同样品单确认记录
+ */
+@RestController
+@RequestMapping(ApiConstant.Project.SAAS_BUSINESS_TRADEERP_REQUEST_PREFIX + "/contract/sample/confirm/log")
+public class ContractSampleConfirmLogController extends BladeController {
+
+    @Autowired
+    private IContractSampleConfirmLogService contractSampleConfirmLogService;
+
+    /**
+     * 列表
+     *
+     * @param condition 查询条件
+     * @return
+     */
+    @PostMapping("/list")
+    public R getList(@RequestBody Map<String, Object> condition) {
+        ListPageMap.getListPageMap(condition);
+        List<ContractSampleConfirmLog> list = contractSampleConfirmLogService.getList(condition);
+        return R.list(list);
+    }
+
+    /**
+     * 新增
+     *
+     * @param confirmLog
+     * @return
+     */
+    @PostMapping("/insert")
+    public R insert(@RequestBody ContractSampleConfirmLog confirmLog) {
+        contractSampleConfirmLogService.insert(confirmLog);
+        return R.success();
+    }
+
+    /**
+     * 修改
+     *
+     * @param confirmLog
+     * @return
+     */
+    @PostMapping("/update")
+    public R update(@RequestBody ContractSampleConfirmLog confirmLog) {
+        contractSampleConfirmLogService.update(confirmLog);
+        return R.success();
+    }
+
+    /**
+     * 删除
+     *
+     * @param confirmLog
+     * @return
+     */
+    @PostMapping("/deleteById")
+    public R deleteById(@RequestBody ContractSampleConfirmLog confirmLog) {
+        contractSampleConfirmLogService.deleteById(confirmLog.getId());
+        return R.success();
+    }
+
+}

+ 85 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/controller/ContractSampleFlowController.java

@@ -0,0 +1,85 @@
+package com.fjhx.contract.controller;
+
+import com.fjhx.activiti.SubmitFlowCondition;
+import com.fjhx.contract.entity.Contract;
+import com.fjhx.contract.service.IContractSampleFlowService;
+import org.springblade.common.constant.ApiConstant;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+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(ApiConstant.Project.SAAS_BUSINESS_TRADEERP_REQUEST_PREFIX + "/contract/sample/flow")
+public class ContractSampleFlowController extends BladeController {
+
+    @Autowired
+    private IContractSampleFlowService contractSampleFlowService;
+
+    /**
+     * 保存草稿
+     *
+     * @param contract
+     * @return
+     */
+    @PostMapping(value = "/draft")
+    public R saveDraft(@RequestBody Contract contract) {
+        contractSampleFlowService.saveOrUpdateDraft(contract);
+        return R.success();
+    }
+
+    /**
+     * 开始流程
+     *
+     * @param contract
+     * @return
+     */
+    @PostMapping(value = "/start")
+    public R start(@RequestBody Contract contract) {
+        contractSampleFlowService.start(contract);
+        return R.success();
+    }
+
+    /**
+     * 审核
+     *
+     * @param condition
+     * @return
+     */
+    @PostMapping(value = "/examine")
+    public R examine(@RequestBody SubmitFlowCondition condition) {
+        contractSampleFlowService.examine(condition);
+        return R.success();
+    }
+
+    /**
+     * 回退
+     *
+     * @param condition
+     * @return
+     */
+    @PostMapping(value = "/reject")
+    public R reject(@RequestBody SubmitFlowCondition condition) {
+        contractSampleFlowService.reject(condition);
+        return R.success();
+    }
+
+    /**
+     * 删除流程
+     *
+     * @param condition
+     * @return
+     */
+    @PostMapping(value = "/delete")
+    public R delete(@RequestBody SubmitFlowCondition condition) {
+        contractSampleFlowService.delete(condition);
+        return R.success();
+    }
+
+}

+ 61 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/controller/ContractSampleFlowControllerV2.java

@@ -0,0 +1,61 @@
+package com.fjhx.contract.controller;
+
+import com.fjhx.activiti.SubmitFlowCondition;
+import com.fjhx.contract.entity.Contract;
+import com.fjhx.contract.service.IContractSampleFlowServiceV2;
+import org.springblade.common.constant.ApiConstant;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+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(ApiConstant.Project.SAAS_BUSINESS_TRADEERP_REQUEST_PREFIX + "/contract/sample/flow/v2")
+public class ContractSampleFlowControllerV2 extends BladeController {
+
+    @Autowired
+    private IContractSampleFlowServiceV2 iContractSampleFlowServiceV2;
+
+    /**
+     * 开始流程
+     *
+     * @param contract
+     * @return
+     */
+    @PostMapping(value = "/start")
+    public R start(@RequestBody Contract contract) {
+        iContractSampleFlowServiceV2.start(contract);
+        return R.success();
+    }
+
+    /**
+     * 审核
+     *
+     * @param condition
+     * @return
+     */
+    @PostMapping(value = "/examine")
+    public R examine(@RequestBody SubmitFlowCondition condition) {
+        iContractSampleFlowServiceV2.examine(condition);
+        return R.success();
+    }
+
+    /**
+     * 删除流程
+     *
+     * @param entity
+     * @return
+     */
+    @PostMapping(value = "/delete")
+    public R delete(@RequestBody Contract entity) {
+        iContractSampleFlowServiceV2.delete(entity);
+        return R.success();
+    }
+
+}

+ 39 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/controller/ContractTrackLogController.java

@@ -0,0 +1,39 @@
+package com.fjhx.contract.controller;
+
+import com.fjhx.contract.entity.ContractTrackLog;
+import com.fjhx.contract.service.IContractTrackLogService;
+import org.springblade.common.constant.ApiConstant;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+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;
+import java.util.Map;
+
+/**
+ * 合同跟进日志记录
+ */
+@RestController
+@RequestMapping(ApiConstant.Project.SAAS_BUSINESS_TRADEERP_REQUEST_PREFIX + "/contract/track/log")
+public class ContractTrackLogController extends BladeController {
+
+    @Autowired
+    private IContractTrackLogService contractTrackLogService;
+
+    /**
+     * 列表
+     *
+     * @param condition 查询条件
+     * @return
+     */
+    @PostMapping("/list")
+    public R getList(@RequestBody Map<String, Object> condition) {
+        List<ContractTrackLog> list = contractTrackLogService.getList(condition);
+        return R.list(list);
+    }
+
+}

+ 34 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/feign/ContractApi.java

@@ -0,0 +1,34 @@
+package com.fjhx.contract.feign;
+
+import com.fjhx.contract.service.IContractService;
+import com.fjhx.interestrate.feign.IContractApi;
+import org.springblade.core.tenant.annotation.NonDS;
+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.RestController;
+
+import java.util.Map;
+
+/**
+ * 合同 feign api 实现类
+ */
+@NonDS
+@RestController
+public class ContractApi implements IContractApi {
+
+    @Autowired
+    private IContractService iContractService;
+
+
+    /**
+     * 修改对应的业务员
+     *
+     * @param condition 参数
+     */
+    @PostMapping(UPDATE_USER_ID_BY_USER_ID_AND_CUSTOMER_IDS)
+    @Override
+    public void updateUserIdByUserIdAndCustomerIds(@RequestBody Map<String, Object> condition) {
+        iContractService.updateUserIdByUserIdAndCustomerIds(condition);
+    }
+}

+ 37 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/feign/ContractProductApi.java

@@ -0,0 +1,37 @@
+package com.fjhx.contract.feign;
+
+import com.fjhx.contract.entity.ContractProduct;
+import com.fjhx.contract.service.IContractProductService;
+import com.fjhx.interestrate.feign.IContractProductApi;
+import com.fjhx.interestrate.feign.ITradeerpTemplateApi;
+import com.fjhx.template.entity.Template;
+import com.fjhx.template.service.ITemplateService;
+import org.springblade.core.tenant.annotation.NonDS;
+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.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 合同产品 feign api
+ */
+@NonDS
+@RestController
+public class ContractProductApi implements IContractProductApi {
+
+    @Autowired
+    private IContractProductService iContractProductService;
+
+    /**
+     * 保存合同产品
+     * @param contractProduct
+     */
+    @PostMapping(SAVE)
+    @Override
+    public void saveContractProduct(@RequestBody List<ContractProduct> contractProduct) {
+        iContractProductService.saveBatch(contractProduct);
+    }
+}

+ 30 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/mapper/ContractFlowExtendMapper.java

@@ -0,0 +1,30 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package com.fjhx.contract.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fjhx.contract.entity.ContractFlowExtend;
+
+/**
+ * 合同流程扩展表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2022-11-04
+ */
+public interface ContractFlowExtendMapper extends BaseMapper<ContractFlowExtend> {
+
+}

+ 22 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/mapper/ContractFlowExtendMapper.xml

@@ -0,0 +1,22 @@
+<?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.fjhx.contract.mapper.ContractFlowExtendMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="contractFlowExtendResultMap" type="com.fjhx.contract.entity.ContractFlowExtend">
+        <id column="id" property="id"/>
+        <result column="contract_id" property="contractId"/>
+        <result column="tenant_id" property="tenantId"/>
+        <result column="type" property="type"/>
+        <result column="status" property="status"/>
+        <result column="process_instance_id" property="processInstanceId"/>
+        <result column="process_instance_name" property="processInstanceName"/>
+        <result column="process_instance_user_id" property="processInstanceUserId"/>
+        <result column="process_instance_user_name" property="processInstanceUserName"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+</mapper>

+ 407 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/mapper/ContractMapper.java

@@ -0,0 +1,407 @@
+package com.fjhx.contract.mapper;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fjhx.contract.entity.Contract;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.core.mp.mapper.BladeMapper;
+import org.springblade.core.tenant.annotation.TenantIgnore;
+import org.springframework.stereotype.Repository;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 外销合同
+ */
+@Repository
+public interface ContractMapper extends BladeMapper<Contract> {
+
+    /**
+     * 列表
+     *
+     * @param condition
+     * @return
+     */
+    @TenantIgnore
+    List<Contract> getList(Map<String, Object> condition);
+
+    /**
+     * 列表-总条数
+     *
+     * @param condition
+     * @return
+     */
+    @TenantIgnore
+    Integer getListCount(Map<String, Object> condition);
+
+    /**
+     * 修改合同状态(合同状态如果走到后面不允许回滚)
+     *
+     * @param ids
+     * @param status
+     * @param updateUser
+     * @return
+     */
+    int updateStatusById(@Param("ids") List<String> ids,
+                         @Param("status") Integer status,
+                         @Param("updateUser") String updateUser);
+
+    /**
+     * 根据合同号获取下一个版本号
+     *
+     * @param code
+     * @return
+     */
+    Integer getNextVersionByCode(@Param("code") String code);
+
+    /**
+     * 客户画像:销售分析列表
+     *
+     * @param condition 查询条件
+     * @return
+     */
+    List<Contract> getSalesAnalysisList(Map<String, Object> condition);
+
+    /**
+     * 客户画像:销售分析列表总数
+     *
+     * @param condition 查询条件
+     * @return
+     */
+    Integer getSalesAnalysisListCount(Map<String, Object> condition);
+
+    /**
+     * 客户画像:销售分析下拉合同列表
+     *
+     * @param tenantId customerId 查询条件
+     * @return
+     */
+    List<Contract> getContractSelect(@Param("tenantId") String tenantId,
+                                     @Param("customerId") String customerId);
+
+
+    /**
+     * 通过客户id查询列表
+     *
+     * @param condition
+     * @return
+     */
+    @TenantIgnore
+    List<Contract> getByCustomerId(Map<String, Object> condition);
+
+    /**
+     * 统计--柱状图
+     *
+     * @param tenantId         租户ID
+     * @param customerId       客户ID
+     * @param contractStartStr 开始时间
+     * @param contractEndStr   结束时间
+     * @return
+     */
+    @TenantIgnore
+    List<Contract> getByCustomerIdAndDWM(@Param("tenantId") String tenantId,
+                                         @Param("customerId") String customerId,
+                                         @Param("contractStartStr") String contractStartStr,
+                                         @Param("contractEndStr") String contractEndStr
+    );
+
+    /**
+     * 统计--销售额和订单数
+     *
+     * @param tenantId         租户ID
+     * @param customerId       客户ID
+     * @param contractStartStr 开始时间
+     * @param contractEndStr   结束时间
+     * @return
+     */
+    @TenantIgnore
+    List<Contract> getByCustomerIdSumDWM(@Param("tenantId") String tenantId,
+                                         @Param("customerId") String customerId,
+                                         @Param("contractStartStr") String contractStartStr,
+                                         @Param("contractEndStr") String contractEndStr,
+                                         @Param("type") Integer type
+    );
+
+    /**
+     * 统计-单天订单总数和销售额
+     *
+     * @param tenantId         租户ID
+     * @param customerId       客户ID
+     * @param contractStartStr 开始时间
+     * @param contractEndStr   结束时间
+     * @return
+     */
+    @TenantIgnore
+    List<Contract> getByCustomerIdSumDayDWM(@Param("tenantId") String tenantId,
+                                            @Param("customerId") String customerId,
+                                            @Param("contractStartStr") String contractStartStr,
+                                            @Param("contractEndStr") String contractEndStr,
+                                            @Param("type") Integer type
+
+    );
+
+    /**
+     * 客户画像--样品单-外销合同列表查询
+     *
+     * @param condition
+     * @return
+     */
+    @TenantIgnore
+    List<Contract> getHuaXList(Map<String, Object> condition);
+
+    /**
+     * 客户画像--样品单-外销合同列表查询-总条数
+     *
+     * @param condition
+     * @return
+     */
+    @TenantIgnore
+    Integer getHuaXListCount(Map<String, Object> condition);
+
+    /**
+     * 领导看板--统计全球-获取经纬度坐标
+     *
+     * @param condition
+     * @return
+     */
+    @TenantIgnore
+    List<Contract> getContractGlobal(Map<String, Object> condition);
+
+    /**
+     * 领导看板--统计国家
+     *
+     * @param condition
+     * @return
+     */
+    @TenantIgnore
+    List<Contract> getContractCountry(Map<String, Object> condition);
+
+    /**
+     * 领导看板--统计客户
+     *
+     * @param condition
+     * @return
+     */
+    @TenantIgnore
+    List<Contract> getContractCustomer(Map<String, Object> condition);
+
+    /**
+     * 领导看板--统计业务员
+     *
+     * @param condition
+     * @return
+     */
+    @TenantIgnore
+    List<Contract> getContractUser(Map<String, Object> condition);
+
+    /**
+     * 领导看板--统计产品
+     *
+     * @param condition
+     * @return
+     */
+    @TenantIgnore
+    List<Contract> getContractProductPrice(Map<String, Object> condition);
+
+    /**
+     * 领导看板--统计产品数量
+     *
+     * @param condition
+     * @return
+     */
+    @TenantIgnore
+    List<Contract> getContractProductOrder(Map<String, Object> condition);
+
+    /**
+     * 领导看板--订单分析-订单增长
+     *
+     * @param tenantId         租户ID
+     * @param contractStartStr 开始时间
+     * @param contractEndStr   结束时间
+     * @return
+     */
+    @TenantIgnore
+    List<Contract> getSumBoardDayYMD(@Param("tenantId") String tenantId,
+                                     @Param("customerId") String customerId,
+                                     @Param("contractStartStr") String contractStartStr,
+                                     @Param("contractEndStr") String contractEndStr,
+                                     @Param("type") Integer type
+
+    );
+
+    /**
+     * 领导看板--订单分析-统计总订单量-销售额
+     *
+     * @param tenantId         租户ID
+     * @param contractStartStr 开始时间
+     * @param contractEndStr   结束时间
+     * @return
+     */
+    @TenantIgnore
+    List<Contract> getSumBoardOrder(@Param("tenantId") String tenantId,
+                                    @Param("contractStartStr") String contractStartStr,
+                                    @Param("contractEndStr") String contractEndStr,
+                                    @Param("type") Integer type
+
+    );
+
+
+    /**
+     * 领导看板--订单分析-订单增长
+     *
+     * @param tenantId         租户ID
+     * @param contractStartStr 开始时间
+     * @param contractEndStr   结束时间
+     * @return
+     */
+    @TenantIgnore
+    List<Contract> getSumBoardStatusDayYMD(@Param("tenantId") String tenantId,
+                                           @Param("contractStartStr") String contractStartStr,
+                                           @Param("contractEndStr") String contractEndStr,
+                                           @Param("type") Integer type
+
+    );
+
+    /**
+     * 移交
+     *
+     * @param tenantId   租户id
+     * @param customerId 客户id,要移交的客户
+     * @param userId     业务员id,移交给新的业务员id
+     */
+    void transfer(@Param("tenantId") String tenantId,
+                  @Param("customerId") String customerId,
+                  @Param("userId") String userId);
+
+    /**
+     * 查询总条数
+     */
+    @TenantIgnore
+    List<Contract> getSumContractByYMD(Map<String, Object> condition);
+
+    /**
+     * 查询金额
+     */
+    @TenantIgnore
+    Double getSumContractPriceByYMD(Map<String, Object> condition);
+
+
+    /**
+     * 统计总销售额
+     */
+    @TenantIgnore
+    String getContractSumPrice(Map<String, Object> condition);
+
+    /**
+     * 统计下单客户数
+     */
+    @TenantIgnore
+    Integer getContractSumCustomer(Map<String, Object> condition);
+
+    /**
+     * 统计订单数
+     */
+    @TenantIgnore
+    String getContractSumOrder(Map<String, Object> condition);
+
+    /**
+     * 查询总条数
+     */
+    @TenantIgnore
+    List<Contract> getDailyContract(@RequestParam("tenantId") String tenantId,
+                                    @RequestParam("dataType") Integer dataType,
+                                    @RequestParam("createUser") String createUser);
+
+    /**
+     * 查询总条数
+     */
+    @TenantIgnore
+    Integer getDailyContractCount(@RequestParam("tenantId") String tenantId,
+                                  @RequestParam("dataType") Integer dataType,
+                                  @RequestParam("createUser") String createUser);
+
+    /**
+     * 查询总条数
+     */
+    @TenantIgnore
+    Integer getUserDailyContractCount(Map<String, Object> condition);
+
+
+    /**
+     * 总览-订单跟踪-统计总额
+     */
+    @TenantIgnore
+    List<Contract> getOrderTailAfterSum(@RequestParam("tenantId") String tenantId,
+                                        @RequestParam("userId") String userId);
+
+    /**
+     * 总览-订单跟踪-统计总额
+     */
+    @TenantIgnore
+    List<Contract> getOrderTailAfterSumStaus(@RequestParam("tenantId") String tenantId,
+                                             @RequestParam("userId") String userId);
+
+    /**
+     * 根据用户ID查询
+     *
+     * @param userIds  业务员ID集合
+     * @param year     年度
+     * @param dataType 数据类型
+     * @return
+     */
+    @TenantIgnore
+    List<Contract> getByUserIds(@RequestParam("userIds") List<String> userIds, @RequestParam("year") String year, @RequestParam("dataType") int dataType);
+
+    /**
+     * 根据用户ID查询
+     *
+     * @param userIds  业务员ID集合
+     * @param year     年度
+     * @param dataType 数据类型
+     * @return
+     */
+    @TenantIgnore
+    List<Contract> getByUserIdsJoin(@RequestParam("userIds") List<String> userIds, @RequestParam("year") String year, @RequestParam("dataType") int dataType);
+
+    /**
+     * 根据子编号前缀代码统计
+     *
+     * @param prefixCode 子编号前缀代码
+     * @param countryId  国家ID
+     * @param customerId 客户ID
+     * @param productId  产品ID
+     * @param tenantId   租户ID
+     * @param userId     用户ID
+     * @param dataType   数据类型:0、外销合同;1、样品单
+     * @return
+     */
+    @TenantIgnore
+    Integer getCount(
+            @RequestParam("prefixCode") int prefixCode,
+            @RequestParam("countryId") String countryId,
+            @RequestParam("customerId") String customerId,
+            @RequestParam("productId") String productId,
+            @RequestParam("tenantId") String tenantId,
+            @RequestParam("userId") String userId,
+            @RequestParam("dataType") int dataType
+    );
+
+    /**
+     * 查询销售信息
+     *
+     * @param condition 查询条件
+     * @return
+     */
+    @TenantIgnore
+    List<JSONObject> getOrderSale(Map<String, Object> condition);
+
+    /**
+     * 查询销售合同ID
+     *
+     * @param condition 查询条件
+     * @return
+     */
+    @TenantIgnore
+    List<Contract> getContractIds(Map<String, Object> condition);
+}

+ 1014 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/mapper/ContractMapper.xml

@@ -0,0 +1,1014 @@
+<?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.fjhx.contract.mapper.ContractMapper">
+
+    <resultMap id="contractResultMap" type="com.fjhx.contract.entity.Contract">
+        <id column="id" property="id"/>
+        <result column="code" property="code"/>
+        <result column="invoice_code" property="invoiceCode"/>
+        <result column="customer_id" property="customerId"/>
+        <result column="customer_name" property="customerName"/>
+        <result column="customer_lastname" property="customerLastname"/>
+        <result column="customer_second_name" property="customerSecondName"/>
+        <result column="customer_company_name" property="customerCompanyName"/>
+        <result column="customer_country_id" property="customerCountryId"/>
+        <result column="customer_country_name" property="customerCountryName"/>
+        <result column="customer_state" property="customerState"/>
+        <result column="customer_city_id" property="customerCityId"/>
+        <result column="customer_city_name" property="customerCityName"/>
+        <result column="customer_addr" property="customerAddr"/>
+        <result column="customer_tel" property="customerTel"/>
+        <result column="customer_zip_code" property="customerZipCode"/>
+        <result column="customer_po" property="customerPo"/>
+        <result column="customer_other_msg" property="customerOtherMsg"/>
+        <result column="longitude" property="longitude"/>
+        <result column="latitude" property="latitude"/>
+        <result column="company_id" property="companyId"/>
+        <result column="company_bank_id" property="companyBankId"/>
+        <result column="company_bank_name" property="companyBankName"/>
+        <result column="company_bank_card" property="companyBankCard"/>
+        <result column="company_bank_swift_code" property="companyBankSwiftCode"/>
+        <result column="company_bank_addr" property="companyBankAddr"/>
+        <result column="company_bank_type" property="companyBankType"/>
+        <result column="coll_name" property="collName"/>
+        <result column="coll_address" property="collAddress"/>
+        <result column="pay_way" property="payWay"/>
+        <result column="pre_pay_ratio" property="prePayRatio"/>
+        <result column="transfer_bank_name" property="transferBankName"/>
+        <result column="transfer_bank_swift_code" property="transferBankSwiftCode"/>
+        <result column="trade_mode_id" property="tradeModeId"/>
+        <result column="payment_id" property="paymentId"/>
+        <result column="payment_remark" property="paymentRemark"/>
+        <result column="valid_time" property="validTime"/>
+        <result column="delivery_day" property="deliveryDay"/>
+        <result column="shipping_type" property="shippingType"/>
+        <result column="express_id" property="expressId"/>
+        <result column="wharf" property="wharf"/>
+        <result column="currency_type" property="currencyType"/>
+        <result column="contract_price" property="contractPrice"/>
+        <result column="contract_price_en" property="contractPriceEn"/>
+        <result column="status" property="status"/>
+        <result column="approved_date" property="approvedDate"/>
+        <result column="confirm_date" property="confirmDate"/>
+        <result column="warranty_day" property="warrantyDay"/>
+        <result column="join_type" property="joinType"/>
+        <result column="join_id" property="joinId"/>
+        <result column="process_instance_id" property="processInstanceId"/>
+        <result column="process_instance_name" property="processInstanceName"/>
+        <result column="process_instance_user_id" property="processInstanceUserId"/>
+        <result column="process_instance_user_name" property="processInstanceUserName"/>
+        <result column="source" property="source"/>
+        <result column="remark" property="remark"/>
+        <result column="is_change" property="isChange"/>
+        <result column="change_cost" property="changeCost"/>
+        <result column="change_cost2" property="changeCost2"/>
+        <result column="change_cost3" property="changeCost3"/>
+        <result column="change_remark" property="changeRemark"/>
+        <result column="pre_contract_id" property="preContractId"/>
+        <result column="version" property="version"/>
+        <result column="data_type" property="dataType"/>
+        <result column="action_type" property="actionType"/>
+        <result column="contract_sample_confirm" property="contractSampleConfirm"/>
+        <result column="tax_rate" property="taxRate"/>
+        <result column="is_complete" property="isComplete"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+
+        <!-- 扩展字段 -->
+        <result column="create_user_name" property="createUserName"/>
+        <result column="create_date" property="createDate"/>
+        <result column="order_count" property="orderCount"/>
+        <result column="sumContractPrice" property="sumContractPrice"/>
+        <result column="sumOrder" property="sumOrder"/>
+        <result column="dayTime" property="dayTime"/>
+        <result column="product_id" property="productId"/>
+    </resultMap>
+
+    <sql id="sqlField">
+        SELECT * FROM t_erp_contract
+    </sql>
+
+    <select id="getList" resultMap="contractResultMap">
+        SELECT
+            t1.id,
+            t1.type,
+            t1.`code`,
+            t1.`status`,
+            t1.version,
+            t1.source,
+            t1.create_time,
+            t1.customer_id,
+            t1.customer_company_name,
+            t1.customer_name,
+            t1.contract_price,
+            t1.currency_type,
+            t1.is_change,
+            t1.contract_sample_confirm,
+            t1.process_instance_id,
+            t1.is_complete,
+            t1.company_id,
+            t2.real_name AS create_user_name
+        FROM
+            t_erp_contract t1
+            LEFT JOIN blade_user t2 ON t1.create_user = t2.id
+
+        <include refid="getListCondition" />
+
+        <!-- 列表类型,1:外销合同管理列表、2:邮件-右侧外销合同列表、3:成单样品合同列表、4:到账认领选择合同、5:邮件-右侧成单样品合同列表 -->
+        <choose>
+            <when test="listType neq null and (listType eq 1 or listType eq 3 or listType eq 4)">
+                ORDER BY
+                    t1.code DESC
+            </when>
+            <otherwise>
+                ORDER BY
+                    t1.create_time DESC
+            </otherwise>
+        </choose>
+
+        <include refid="Sql.sql_limit" />
+    </select>
+
+    <select id="getListCount" resultType="java.lang.Integer">
+        SELECT
+            COUNT(*) AS c
+        FROM
+            t_erp_contract t1
+            LEFT JOIN blade_user t2 ON t1.create_user = t2.id
+        <include refid="getListCondition" />
+    </select>
+
+    <sql id="getListCondition">
+        <where>
+            t1.tenant_id = #{tenantId}
+
+            <!-- 列表类型,1:外销合同管理列表、2:邮件-右侧外销合同列表、3:成单样品合同列表、4:到账认领选择合同、5:邮件-右侧成单样品合同列表 -->
+            <!-- data_type数据类型,0:外销合同、1:成单样品 -->
+            <choose>
+                <when test="listType neq null and (listType eq 1 or listType eq 2)">
+                    AND t1.data_type = 0
+                </when>
+                <when test="listType neq null and (listType eq 3 or listType eq 5)">
+                    AND t1.data_type = 1
+                </when>
+                <when test="listType neq null and listType eq 4">
+                    <!-- 未确认 and 未结清 -->
+                    <![CDATA[ AND t1.`status` >= 30 AND t1.`status` <= 110 ]]>
+
+                    <!-- 是否处于变更中,0、不存在变更;1:本身为变更数据(表示从元数据被发起变更后的新数据);2:存在变更数据(表示元数据被发起变更) -->
+                    AND t1.is_change IN(0, 2)
+                </when>
+            </choose>
+
+            <choose>
+                <when test="listType neq null and listType eq 2">
+                    AND t1.status != 999
+
+                    <!-- 是否处于变更中,0、不存在变更;1:本身为变更数据(表示从元数据被发起变更后的新数据);2:存在变更数据(表示元数据被发起变更) -->
+                    AND t1.is_change IN(0, 2)
+                </when>
+                <otherwise>
+                    AND t1.status != 999
+                </otherwise>
+            </choose>
+
+            <if test="userId neq null and userId neq ''">
+                AND t1.create_user = #{userId}
+            </if>
+
+            <if test="status neq null and status neq ''">
+                AND t1.status = #{status}
+            </if>
+
+            <!-- 钉钉使用 -->
+            <if test="statusRange neq null and statusRange neq ''">
+                AND t1.status >= #{statusRange}
+            </if>
+
+            <if test="source neq null and source neq ''">
+                AND t1.source = #{source}
+            </if>
+
+            <if test="code neq null and code neq ''">
+                AND (INSTR(t1.`code`, #{code}) > 0)
+            </if>
+
+            <if test="customerCompanyName neq null and customerCompanyName neq ''">
+                AND (INSTR(t1.customer_company_name, #{customerCompanyName}) > 0)
+            </if>
+
+            <if test="customerName neq null and customerName neq ''">
+                AND (INSTR(t1.customer_name, #{customerName}) > 0)
+            </if>
+
+            <if test="createUserName neq null and createUserName neq ''">
+                AND (
+                INSTR(t2.`name`, #{createUserName}) > 0
+                OR
+                INSTR(t2.real_name, #{createUserName}) > 0
+                )
+            </if>
+
+            <if test="keyWord neq null and keyWord neq ''">
+                AND (
+                INSTR(t1.`code`, #{keyWord}) > 0
+                OR
+                INSTR(t1.customer_company_name, #{keyWord}) > 0
+                )
+            </if>
+
+            <if test="customerIds neq null and customerIds.size() > 0">
+                <foreach collection="customerIds" item="customerId" open="AND t1.customer_id IN (" separator=","
+                         close=")">
+                    #{customerId}
+                </foreach>
+            </if>
+
+            <if test="customerId neq null and customerId neq ''">
+                AND t1.customer_id = #{customerId}
+            </if>
+
+            <!-- 关联类型(制作合同时使用),1:关联成单样品 -->
+            <if test="joinType neq null and joinType eq 1">
+                <!-- 排除已被关联的数据 -->
+                AND NOT EXISTS (
+                SELECT
+                1
+                FROM
+                t_erp_contract t3
+                <where>
+                    t3.tenant_id = #{tenantId}
+                    AND t3.join_id = t1.id
+                </where>
+                )
+            </if>
+
+            <!-- 日历统计使用 -->
+            <if test="beginDate neq null and beginDate neq '' and endDate neq null and endDate neq ''">
+                <if test="listType neq null and listType eq 1">
+                    AND t1.`status` >= 30
+                    <![CDATA[ AND t1.`status` < 110 ]]>
+                </if>
+
+                AND EXISTS (
+                SELECT
+                1
+                FROM
+                t_erp_shipment_detailed t3
+                WHERE
+                t1.id = t3.business_id
+                AND DATE_FORMAT( t3.shipment_time, '%Y-%m-%d' ) >= #{beginDate}
+                <![CDATA[ AND DATE_FORMAT( t3.shipment_time, '%Y-%m-%d' ) <= #{endDate} ]]>
+                )
+            </if>
+
+            <!-- 数据看板 二级清单 -->
+            <if test="ids neq null and ids.size > 0">
+                AND t1.id IN
+                <foreach collection="ids" item="item" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
+
+            <if test="isComplete neq null and isComplete neq ''">
+                AND t1.is_complete = #{isComplete}
+            </if>
+
+            <if test="type neq null and type neq ''">
+                AND t1.type=#{type}
+            </if>
+
+        </where>
+    </sql>
+
+    <update id="updateStatusById">
+        UPDATE t_erp_contract
+        <set>
+            <if test="status neq null">status = #{status},</if>
+            <if test="updateUser neq null">update_user = #{updateUser},</if>
+            update_time = NOW()
+        </set>
+        <where>
+            id IN
+            <foreach collection="ids" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+
+            <!-- 合同状态如果走到后面不允许回滚到前面的状态,com.ruoyi.common.enums.ContractStatusEnum -->
+            <![CDATA[
+                AND `status` < #{status}
+            ]]>
+        </where>
+    </update>
+
+    <select id="getNextVersionByCode" resultType="java.lang.Integer">
+        SELECT
+            MAX(t1.version) AS version
+        FROM
+            t_erp_contract t1
+        <where>
+            <!-- 有效的合同 -->
+            t1.`status` != 999
+            AND t1.`code` = #{code}
+        </where>
+    </select>
+
+    <!-- 客户画像:销售分析列表 -->
+    <select id="getSalesAnalysisList" resultMap="contractResultMap">
+        SELECT
+            <!-- 时间条件类型:非年度查询 -->
+            <if test="timeConditionType eq 0">
+                DATE_FORMAT( create_time, '%Y-%m-%d' ) create_date,
+            </if>
+
+            <!-- 时间条件类型:年度查询 -->
+            <if test="timeConditionType eq 1">
+                DATE_FORMAT( create_time, '%Y-%m' ) create_date,
+            </if>
+            count( id ) order_count,
+            SUM( contract_price ) contract_price
+        FROM
+            t_erp_contract
+
+        <!-- 客户画像:销售分析列表条件 -->
+        <include refid="getSalesAnalysisListCondition" />
+
+        ORDER BY
+            create_time ASC
+
+        <include refid="Sql.sql_limit" />
+    </select>
+
+    <!-- 客户画像:销售分析列表总数 -->
+    <select id="getSalesAnalysisListCount" resultType="java.lang.Integer">
+        SELECT
+            count(*) count
+        FROM
+        (
+            SELECT
+                DATE_FORMAT( create_time, '%Y-%m-%d' ) create_date
+            FROM
+                t_erp_contract
+
+            <!-- 客户画像:销售分析列表条件 -->
+            <include refid="getSalesAnalysisListCondition" />
+        ) t
+    </select>
+
+    <!-- 客户画像:销售分析列表条件 -->
+    <sql id="getSalesAnalysisListCondition">
+        <where>
+            customer_id = #{customerId}
+
+            <!-- 时间条件类型:非年度查询 -->
+            <if test="timeConditionType eq 0">
+                <if test="startDate neq null and startDate neq ''">
+                    AND DATE_FORMAT(create_time, '%Y-%m-%d') >= #{startDate}
+                </if>
+
+                <if test="endDate neq null and endDate neq ''">
+                    <![CDATA[ AND DATE_FORMAT(create_time, '%Y-%m-%d') <= #{endDate} ]]>
+                </if>
+            </if>
+
+            <!-- 时间条件类型:年度查询 -->
+            <if test="timeConditionType eq 1">
+                <if test="startDate neq null and startDate neq ''">
+                    AND DATE_FORMAT(create_time, '%Y-%m') >= #{startDate}
+                </if>
+
+                <if test="endDate neq null and endDate neq ''">
+                    <![CDATA[ AND DATE_FORMAT(create_time, '%Y-%m') <= #{endDate} ]]>
+                </if>
+            </if>
+        </where>
+        GROUP BY
+            create_date
+    </sql>
+
+    <select id="getByCustomerId" resultMap="contractResultMap">
+        SELECT
+            t1.id,
+            t1.`code`
+        FROM
+            t_erp_contract t1
+        <where>
+            t1.tenant_id = #{tenantId}
+            AND t1.customer_id = #{customerId}
+        </where>
+    </select>
+
+    <!--客户画像,销售统计柱状图-->
+    <select id="getByCustomerIdAndDWM" resultMap="contractResultMap">
+        SELECT
+            t1.contract_price ,
+            t1.create_time
+        FROM
+        t_erp_contract t1
+        <include refid="getcondition"/>
+    </select>
+    <!--客户画像,售后合同下拉框-->
+    <select id="getContractSelect" resultMap="contractResultMap">
+        SELECT
+            id,
+            `code`
+        FROM
+            t_erp_contract
+        WHERE
+            customer_id = #{customerId}
+          AND tenant_id = #{tenantId}
+          AND `status` BETWEEN 20 AND 998
+    </select>
+    <!--客户画像,统计总销售额和订单数-->
+    <select id="getByCustomerIdSumDWM" resultMap="contractResultMap">
+        SELECT
+            CONVERT(IFNULL(sum( t1.contract_price*t1.tax_rate ),0),decimal(10,2)) as sumContractPrice,
+            count(1) as sumOrder
+        FROM
+            t_erp_contract t1
+        <include refid="getcondition"/>
+    </select>
+    <!--客户画像,统计本周、本月、本年总销售额和订单数-->
+    <select id="getByCustomerIdSumDayDWM" resultMap="contractResultMap">
+        SELECT
+            CONVERT(IFNULL(sum( t1.contract_price*t1.tax_rate ),0),decimal(10,2)) as sumContractPrice,
+            count(1) as sumOrder,
+            DATE_FORMAT(create_time,'%Y-%m-%d') as dayTime
+        FROM
+            t_erp_contract t1
+        <include refid="getcondition"/>
+
+    </select>
+    <sql id="getcondition">
+        <where>
+            t1.tenant_id = #{tenantId}
+            <if test="customerId neq null and customerId neq ''">
+                AND t1.customer_id = #{customerId}
+            </if>
+            <choose>
+                <!--本周-->
+                <when test="type neq null and type neq '' and type eq 1 ">
+                    AND YEARWEEK(date_format(create_time,'%Y-%m-%d')) = YEARWEEK(now())
+                    GROUP BY DATE_FORMAT(create_time,'%m-%d')
+                </when>
+                <!--本月-->
+                <when test="type neq null and type neq '' and type eq 2 ">
+                    AND DATE_FORMAT( create_time, '%Y%m' ) = DATE_FORMAT( CURDATE() , '%Y%m' )
+                    GROUP BY DATE_FORMAT(create_time,'%m-%d')
+                </when>
+                <!--本年-->
+                <when test="type neq null and type neq '' and type eq 3 ">
+                    AND YEAR(create_time)=YEAR(NOW())
+                    GROUP BY DATE_FORMAT(create_time,'%Y-%m')
+                </when>
+                <otherwise>
+                    <if test="contractStartStr neq null and contractStartStr neq '' and
+                                contractEndStr neq null and contractEndStr neq ''">
+                        and t1.create_time between #{contractStartStr,jdbcType=VARCHAR} and #{contractEndStr,jdbcType=VARCHAR}
+                        GROUP BY DATE_FORMAT(create_time,'%m-%d')
+                    </if>
+                </otherwise>
+            </choose>
+        </where>
+    </sql>
+    <sql id="getSumCondition">
+        <where>
+            t1.tenant_id = #{tenantId}
+            <choose>
+                <!--本周-->
+                <when test="type neq null and type neq '' and type eq 1 ">
+                    AND YEARWEEK(date_format(create_time,'%Y-%m-%d')) = YEARWEEK(now())
+                </when>
+                <!--本月-->
+                <when test="type neq null and type neq '' and type eq 2 ">
+                    AND DATE_FORMAT( create_time, '%Y%m' ) = DATE_FORMAT( CURDATE() , '%Y%m' )
+                </when>
+                <!--本年-->
+                <when test="type neq null and type neq '' and type eq 3 ">
+                    AND YEAR(create_time)=YEAR(NOW())
+                </when>
+                <otherwise>
+                    <if test="contractStartStr neq null and contractStartStr neq '' and
+                                contractEndStr neq null and contractEndStr neq ''">
+                        and t1.create_time between #{contractStartStr,jdbcType=VARCHAR} and #{contractEndStr,jdbcType=VARCHAR}
+                    </if>
+                </otherwise>
+            </choose>
+        </where>
+    </sql>
+    <!--外销合同-样品单查询-->
+    <select id="getHuaXList" resultMap="contractResultMap">
+        SELECT
+            t1.id,
+            t1.`code`,
+            t1.`status`,
+            t1.version,
+            t1.source,
+            t1.create_time,
+            t1.customer_company_name,
+            t1.customer_name,
+            t1.contract_price,
+            t1.currency_type,
+            t1.is_change,
+            t1.contract_sample_confirm,
+            t1.process_instance_id,
+            t2.real_name AS create_user_name
+        FROM
+            t_erp_contract t1
+        LEFT JOIN blade_user t2 ON t1.create_user = t2.id
+        <include refid="getListHuaXCondition" />
+        <!-- 列表类型-1:外销合同管理列表 2:成单样品合同列表-->
+        ORDER BY
+        t1.code DESC
+        <include refid="Sql.sql_limit" />
+    </select>
+    <!--外销合同-样品单条数查询-->
+    <select id="getHuaXListCount" resultType="java.lang.Integer">
+        SELECT
+            COUNT(*) AS c
+        FROM
+            t_erp_contract t1
+        LEFT JOIN blade_user t2 ON t1.create_user = t2.id
+        <include refid="getListHuaXCondition" />
+    </select>
+    <sql id="getListHuaXCondition">
+        <where>
+            t1.tenant_id = #{tenantId}
+            <if test="customerId neq null and customerId neq ''">
+                AND t1.`customer_id` = #{customerId}
+            </if>
+            <!-- data_type数据类型,0:外销合同、1:成单样品 -->
+
+            <if test="listType neq null and (listType eq 1)">
+                AND t1.data_type = 0
+            </if>
+
+            <if test="listType neq null and (listType eq 3)">
+                AND t1.data_type = 1
+            </if>
+            <if test="status neq null and status neq ''">
+                AND t1.status = #{status}
+            </if>
+            <if test="createUserName neq null and createUserName neq ''">
+                AND (
+                INSTR(t2.`name`, #{createUserName}) > 0
+                OR
+                INSTR(t2.real_name, #{createUserName}) > 0
+                )
+            </if>
+            <if test="contractStartStr neq null and contractStartStr neq '' and
+                  contractEndStr neq null and contractEndStr neq ''">
+                and t1.create_time between #{contractStartStr,jdbcType=VARCHAR} and #{contractEndStr,jdbcType=VARCHAR}
+            </if>
+        </where>
+    </sql>
+
+    <!--领导看板-统计总销售额-->
+    <select id="getContractSumPrice" resultType="java.lang.String">
+        SELECT
+            CONVERT (
+            IFNULL( SUM( t1.contract_price * t1.tax_rate ), 0 ),
+            DECIMAL ( 10, 2 )) AS sumContractPrice
+        FROM
+        t_erp_contract t1
+        <include refid="getBoardCondition" />
+    </select>
+    <!--领导看板-统计下单数-->
+    <select id="getContractSumOrder" resultType="java.lang.String">
+        SELECT
+            COUNT(1)
+        FROM
+            t_erp_contract t1
+        <include refid="getBoardCondition" />
+    </select>
+    <!--领导看板-下单客户数-->
+    <select id="getContractSumCustomer" resultType="java.lang.Integer">
+        SELECT
+            COUNT(1)
+        FROM(
+            SELECT
+            COUNT(1)
+            FROM
+            t_erp_contract t1
+            <include refid="getBoardCondition" />
+            GROUP BY
+            customer_id
+        ) AS a
+    </select>
+    <!--领导看板-统计全球-获取经纬度坐标-->
+    <select id="getContractGlobal" resultMap="contractResultMap">
+        SELECT
+            longitude,
+            latitude
+        FROM
+        t_erp_contract t1
+        <include refid="getBoardCondition" />
+    </select>
+    <!--领导看板-统计国家-->
+    <select id="getContractCountry" resultMap="contractResultMap">
+        SELECT
+            t1.customer_country_id,
+            CONVERT(IFNULL(sum( t1.contract_price*t1.tax_rate ),0),decimal(10,2)) as sumContractPrice,
+            COUNT(t1.customer_country_id) as sumOrder
+        FROM
+            t_erp_contract t1
+        <include refid="getBoardCondition" />
+        GROUP BY customer_country_id
+        ORDER BY sumContractPrice DESC
+        LIMIT 10
+    </select>
+    <!--领导看板-统计客户TOP10-->
+    <select id="getContractCustomer" resultMap="contractResultMap">
+          SELECT
+              t1.customer_id,
+              CONVERT(IFNULL(SUM( t1.contract_price*t1.tax_rate ),0),decimal(10,2)) AS sumContractPrice
+          FROM
+              t_erp_contract t1
+          <include refid="getBoardCondition" />
+          GROUP BY
+              customer_id
+          ORDER BY sumContractPrice DESC
+          LIMIT 10
+    </select>
+    <!--领导看板-统计业务员-->
+    <select id="getContractUser" resultMap="contractResultMap">
+        SELECT
+            *
+        FROM
+            (SELECT
+                t2.real_name AS create_user_name,
+                CONVERT(IFNULL(SUM( t1.contract_price*t1.tax_rate ),0),decimal(10,2)) AS sumContractPrice
+            FROM
+                blade_user t2
+            LEFT JOIN (
+                SELECT * FROM
+                    t_erp_contract t1
+                    <include refid="getBoardCondition"/> ) t1
+                ON t2.id = t1.create_user
+                WHERE
+                    t2.tenant_id = #{tenantId}
+                    AND t2.role_id regexp #{roleId}
+                GROUP BY
+                    t2.id
+            ) AS a
+        ORDER BY
+            a.sumContractPrice DESC
+    </select>
+    <!--领导看板-统计产品金额-->
+    <select id="getContractProductPrice" resultMap="contractResultMap">
+        SELECT
+            t2.product_id,
+            t2.product_name AS create_user_name,
+            CONVERT (
+                    IFNULL( SUM( t2.sum_price * t1.tax_rate ), 0 ),
+                    DECIMAL ( 10, 2 )) AS sumContractPrice
+        FROM
+            t_erp_contract_product t2
+                LEFT JOIN t_erp_contract t1 ON t2.contract_id = t1.id
+       <include refid="getBoardCondition"/>
+        GROUP BY
+            t2.product_id
+        ORDER BY
+            sumContractPrice DESC
+            LIMIT 10
+    </select>
+    <!--领导看板-统计产品数量-->
+    <select id="getContractProductOrder" resultMap="contractResultMap">
+        SELECT
+            t2.product_id,
+            t2.product_name AS create_user_name,
+            IFNULL( SUM( t2.quantity ), 0 ) AS sumOrder
+        FROM
+            t_erp_contract_product t2
+        LEFT JOIN  t_erp_contract t1  on t2.contract_id=t1.id
+        <include refid="getBoardCondition"/>
+        GROUP BY
+            t2.product_id
+        ORDER BY
+            sumOrder DESC
+        LIMIT 30
+    </select>
+    <sql id="getBoardCondition">
+        <where>
+            t1.is_change in(0,2)
+            AND t1.tenant_id = #{tenantId}
+            AND t1.`status` >= 40
+            <![CDATA[ AND t1.`status` < 999 ]]>
+            AND t1.data_type = 0
+            <if test="startTime neq null and startTime neq '' and
+                  endTime neq null and endTime neq ''">
+                and t1.create_time between #{startTime,jdbcType=VARCHAR} and #{endTime,jdbcType=VARCHAR}
+            </if>
+        </where>
+    </sql>
+
+    <!--领导看板,订单分析-统计本周、本月、本年总销售额和订单数-->
+    <select id="getSumBoardDayYMD" resultMap="contractResultMap">
+        SELECT
+            CONVERT(IFNULL(sum( t1.contract_price*t1.tax_rate ),0),decimal(10,2)) as sumContractPrice,
+            count(1) as sumOrder,
+            DATE_FORMAT(create_time,'%Y-%m-%d') as dayTime
+        FROM
+            t_erp_contract t1
+        <include refid="getcondition"/>
+    </select>
+    <!--领导看板,订单分析-统计本周、本月、本年总销售额和订单数-->
+    <select id="getSumBoardOrder" resultMap="contractResultMap">
+        SELECT
+            CONVERT(IFNULL(sum( t1.contract_price*t1.tax_rate ),0),decimal(10,2)) as sumContractPrice,
+            count(1) as sumOrder
+        FROM
+        t_erp_contract t1
+        <include refid="getSumCondition"/>
+    </select>
+    <!--领导看板,订单分析-订单跟进-->
+    <select id="getSumBoardStatusDayYMD" resultMap="contractResultMap">
+        select
+            count(1) as sumOrder,
+            t1.`status` as status
+        from t_erp_contract t1
+        <include refid="getBoardOrderCondition"/>
+        GROUP BY t1.`status`
+    </select>
+
+    <sql id="getBoardOrderCondition">
+        <where>
+            t1.tenant_id = #{tenantId}
+            <choose>
+                <!--本周-->
+                <when test="type neq null and type neq '' and type eq 1 ">
+                    AND YEARWEEK(date_format(create_time,'%Y-%m-%d')) = YEARWEEK(now())
+                </when>
+                <!--本月-->
+                <when test="type neq null and type neq '' and type eq 2 ">
+                    AND DATE_FORMAT( create_time, '%Y%m' ) = DATE_FORMAT( CURDATE() , '%Y%m' )
+                </when>
+                <!--本年-->
+                <when test="type neq null and type neq '' and type eq 3 ">
+                    AND YEAR(create_time)=YEAR(NOW())
+                </when>
+                <otherwise>
+                    <if test="contractStartStr neq null and contractStartStr neq '' and
+                                contractEndStr neq null and contractEndStr neq ''">
+                        and t1.create_time between #{contractStartStr,jdbcType=VARCHAR} and #{contractEndStr,jdbcType=VARCHAR}
+                    </if>
+                </otherwise>
+            </choose>
+        </where>
+    </sql>
+
+    <update id="transfer">
+        UPDATE t_erp_contract
+        <set>
+            create_user = #{userId}
+        </set>
+        <where>
+            tenant_id = #{tenantId}
+            AND customer_id = #{customerId}
+        </where>
+    </update>
+
+    <!--根据条件查询样品单和外销合同总条数-->
+    <select id="getSumContractByYMD" resultMap="contractResultMap">
+        select count(data_type) as sumOrder,data_type from t_erp_contract t1
+        <include refid="getBoardCondition"/>
+        <if test="createUser neq null and createUser neq ''">
+            and t1.create_user = #{createUser}
+        </if>
+        GROUP BY data_type
+    </select>
+    <!--根据条件查询样品单和外销合同总条数-->
+    <select id="getSumContractPriceByYMD" resultType="java.lang.Double">
+        select SUM(contract_price*tax_rate) as sumContractPrice from t_erp_contract t1
+        <include refid="getBoardCondition"/>
+        <if test="createUser neq null and createUser neq ''">
+            and t1.create_user = #{createUser}
+        </if>
+        GROUP BY create_user
+    </select>
+    <!--获取员工日报右侧合同与样品单列表-->
+    <select id="getDailyContract" resultMap="contractResultMap">
+        select
+            *
+        from t_erp_contract t1
+         <include refid="getDailyCondition"/>
+    </select>
+    <select id="getDailyContractCount" resultType="java.lang.Integer">
+        select
+            count(1)
+        from t_erp_contract t1
+        <include refid="getDailyCondition"/>
+    </select>
+    <sql id="getDailyCondition">
+        <where>
+            t1.tenant_id = #{tenantId}
+            AND `status` BETWEEN 20 and 998
+            AND data_type = #{dataType}
+            AND TO_DAYS(create_time) = TO_DAYS(NOW())
+            AND create_user = #{createUser}
+        </where>
+    </sql>
+    <select id="getUserDailyContractCount" resultType="java.lang.Integer">
+        select
+            count(1)
+        from t_erp_contract t1
+        <include refid="getUserDailyCondition"/>
+    </select>
+    <sql id="getUserDailyCondition">
+        <where>
+            t1.tenant_id = #{tenantId}
+            AND `status` BETWEEN 20 and 998
+            AND data_type = #{dataType}
+            AND DATE_FORMAT(create_time,'%Y-%m-%d') = #{date}
+            AND create_user = #{userId}
+        </where>
+    </sql>
+    <!--总览-订单跟踪-统计总额-->
+    <select id="getOrderTailAfterSum" resultMap="contractResultMap">
+        SELECT
+           CONVERT(IFNULL( sum( contract_price * tax_rate ), 0 ),DECIMAL ( 10, 2 )) AS sumContractPrice,
+           count( 1 ) AS sumOrder
+        FROM
+            t_erp_contract
+        <include refid="pandect_condition"/>
+        AND `status` BETWEEN 40 AND 110
+    </select>
+    <!--总览-订单跟踪-统计分类-->
+    <select id="getOrderTailAfterSumStaus" resultMap="contractResultMap">
+        SELECT
+           CONVERT(IFNULL( sum( contract_price * tax_rate ), 0 ),DECIMAL ( 10, 2 )) AS sumContractPrice,
+           count( 1 ) AS sumOrder,
+           `status` AS STATUS
+        FROM
+            t_erp_contract
+        <include refid="pandect_condition"/>
+        GROUP BY `status`
+    </select>
+    <sql id="pandect_condition">
+        <where>
+            tenant_id = #{tenantId}
+            <if test="userId neq null and userId neq ''">
+                AND create_user = #{userId}
+            </if>
+            AND is_change IN ( 0, 2 )
+            AND data_type = 0
+        </where>
+    </sql>
+
+    <!-- 查询用户ID查询 -->
+    <select id="getByUserIds" resultMap="contractResultMap">
+        select
+            id,
+            (contract_price * IFNULL(tax_rate, 0)) contract_price,
+            create_user,
+            create_time
+        from
+            t_erp_contract
+        <where>
+            `status` >= 30
+            <![CDATA[ and `status` < 999 ]]>
+            and is_change in (0,2)
+            and data_type = #{dataType}
+            and create_user in
+            <foreach collection="userIds" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+            and DATE_FORMAT( create_time, '%Y' ) = #{year}
+        </where>
+        order by
+            create_time asc
+    </select>
+
+    <!-- 查询用户ID查询 -->
+    <select id="getByUserIdsJoin" resultMap="contractResultMap">
+        select
+            t2.id,
+            t2.customer_id,
+            t2.create_user,
+            t1.create_time
+        from
+            t_erp_claim t1
+            INNER JOIN t_erp_contract t2 on t1.contract_code = t2.`code`
+        <where>
+            t2.`status` >= 30
+            <![CDATA[ and t2.`status` < 999 ]]>
+            and t2.is_change in (0,2)
+            and t2.data_type = #{dataType}
+            and t2.create_user in
+            <foreach collection="userIds" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+            and DATE_FORMAT( t1.create_time, '%Y' ) = #{year}
+        </where>
+        order by
+            t1.create_time asc
+    </select>
+
+    <!-- 根据子编号前缀代码统计 -->
+    <select id="getCount" resultType="java.lang.Integer">
+        select
+            count(DISTINCT t1.`code`) count
+        from
+            t_erp_contract t1
+        <where>
+            t1.tenant_id = #{tenantId}
+            and t1.`status` > 10
+            and t1.data_type = #{dataType}
+
+            <!-- 数据类型:0、外销合同 -->
+            <if test="dataType eq 0">
+                and t1.is_change in (0, 2)
+            </if>
+
+            <!-- 年份编号 -->
+            <if test="prefixCode eq 1">
+                and DATE_FORMAT( t1.create_time, '%y' ) = DATE_FORMAT( SYSDATE(), '%y')
+            </if>
+
+            <!-- 国家代码 -->
+            <if test="prefixCode eq 3">
+                and t1.customer_country_id = #{countryId}
+            </if>
+
+            <!-- 业务员代码 -->
+            <if test="prefixCode eq 4">
+                and t1.create_user = #{userId}
+            </if>
+
+            <!-- 客户代码 -->
+            <if test="prefixCode eq 5">
+                and t1.customer_id = #{customerId}
+            </if>
+
+            <!-- 产品代码 -->
+            <if test="prefixCode eq 6">
+                and EXISTS (
+                    select
+                        1
+                    from
+                        t_erp_contract_product t2
+                    <where>
+                        t1.id = t2.contract_id
+                        and t2.product_id = #{productId}
+                    </where>
+                    GROUP BY
+                        t2.contract_id
+                )
+            </if>
+        </where>
+    </select>
+
+    <!-- 查询销售信息 -->
+    <select id="getOrderSale" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+            tt.product_id productId,
+            count( DISTINCT t.id ) orderCount,
+            SUM( tt.quantity) quantity,
+            SUM( tt.sum_price * tax_rate) sumPrice,
+            MIN(tt.price * tax_rate) minPrice,
+            MAX(tt.price * tax_rate) maxPrice
+        FROM
+            t_erp_contract t
+            INNER JOIN t_erp_contract_product tt ON t.id = tt.contract_id
+        <where>
+            t.data_type = 0
+            AND t.`status` > 20
+            <![CDATA[ AND t.`status` < 999 ]]>
+            AND t.is_change != 1
+            AND t.tenant_id = #{tenantId}
+            AND t.create_time >= #{startTime}
+            <![CDATA[ AND t.create_time <= #{endTime} ]]>
+            AND tt.product_id IN
+            <foreach collection="productIds" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </where>
+        GROUP BY
+            tt.product_id
+    </select>
+
+    <!-- 查询销售合同ID -->
+    <select id="getContractIds" resultMap="contractResultMap">
+        SELECT
+            t.id,
+            tt.product_id
+        FROM
+            t_erp_contract t
+            INNER JOIN t_erp_contract_product tt ON t.id = tt.contract_id
+        <where>
+            t.data_type = 0
+            AND t.`status` > 20
+            <![CDATA[ AND t.`status` < 999 ]]>
+            AND t.is_change != 1
+            AND t.tenant_id = #{tenantId}
+            AND t.create_time >= #{startTime}
+            <![CDATA[ AND t.create_time <= #{endTime} ]]>
+            AND tt.product_id IN
+            <foreach collection="productIds" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </where>
+    </select>
+</mapper>

+ 82 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/mapper/ContractProductMapper.java

@@ -0,0 +1,82 @@
+package com.fjhx.contract.mapper;
+
+import com.fjhx.contract.entity.ContractProduct;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.core.mp.mapper.BladeMapper;
+import org.springblade.core.tenant.annotation.TenantIgnore;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 合同产品
+ */
+@Repository
+public interface ContractProductMapper extends BladeMapper<ContractProduct> {
+
+    /**
+     * 通过合同id查询列表,只查询一级产品
+     *
+     * @param contractId
+     * @return
+     */
+    @TenantIgnore
+    List<ContractProduct> getByContractId(@Param("contractId") String contractId);
+
+    /**
+     * 根据id查询
+     *
+     * @param ids
+     * @return
+     */
+    @TenantIgnore
+    List<ContractProduct> getByIds(@Param("ids") List<String> ids);
+
+    /**
+     * 通过父级id查询
+     *
+     * @param parentIds
+     * @return
+     */
+    @TenantIgnore
+    List<ContractProduct> getByParentId(@Param("parentIds") List<String> parentIds);
+
+    /**
+     * 通过父级id查询辅材、配件产品采购数量
+     *
+     * @param tenantId
+     * @param parentIds
+     * @return
+     */
+    @TenantIgnore
+    List<ContractProduct> getPurchaseInfoByParentId(@Param("tenantId") String tenantId,
+                                                    @Param("parentIds") List<String> parentIds);
+
+    /**
+     * 通过合同id删除
+     *
+     * @param contractId
+     */
+    void deleteByContractId(@Param("contractId") String contractId);
+
+    /**
+     * 获取可装箱产品列表
+     *
+     * @param condition 查询条件
+     * @return
+     */
+    @TenantIgnore
+    List<ContractProduct> getNotPackingProductSelect(Map<String, Object> condition);
+
+
+    /**
+     * 根据合同id获取产品
+     *
+     * @param contractId 合同ID
+     * @return
+     */
+    @TenantIgnore
+    List<ContractProduct> selectProductByContractId(@Param("contractId") String contractId);
+
+}

+ 227 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/mapper/ContractProductMapper.xml

@@ -0,0 +1,227 @@
+<?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.fjhx.contract.mapper.ContractProductMapper">
+
+    <resultMap id="contractProductResultMap" type="com.fjhx.contract.entity.ContractProduct">
+        <id column="id" property="id"/>
+        <result column="parent_id" property="parentId"/>
+        <result column="contract_id" property="contractId"/>
+        <result column="product_id" property="productId"/>
+        <result column="product_name" property="productName"/>
+        <result column="product_name_en" property="productNameEn"/>
+        <result column="product_main_img" property="productMainImg"/>
+        <result column="product_logo" property="productLogo"/>
+        <result column="product_long" property="productLong"/>
+        <result column="product_wide" property="productWide"/>
+        <result column="product_high" property="productHigh"/>
+        <result column="packag_long" property="packagLong"/>
+        <result column="packag_wide" property="packagWide"/>
+        <result column="packag_high" property="packagHigh"/>
+        <result column="quantity" property="quantity"/>
+        <result column="packag_quantity" property="packagQuantity"/>
+        <result column="price" property="price"/>
+        <result column="sum_price" property="sumPrice"/>
+        <result column="send_sample_count" property="sendSampleCount"/>
+        <result column="customs_code" property="customsCode"/>
+        <result column="declared_price" property="declaredPrice"/>
+        <result column="inner_pack_method" property="innerPackMethod"/>
+        <result column="outer_pack_method" property="outerPackMethod"/>
+        <result column="product_model" property="productModel"/>
+        <result column="remark" property="remark"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+
+        <!-- 扩展字段 -->
+        <result column="page_count" property="pageCount"/>
+        <result column="product_un_count" property="productUnCount"/>
+
+        <result column="code" property="code"/>
+        <result column="contract_id" property="contractId"/>
+
+        <result column="material" property="material"/>
+        <result column="unit" property="unit"/>
+        <result column="customer_id" property="customerId"/>
+        <result column="customer_name" property="customerName"/>
+    </resultMap>
+
+    <sql id="sqlField">
+        SELECT
+            t1.id,
+            t1.parent_id,
+            t1.contract_id,
+            t1.product_id,
+            t1.product_name,
+            t1.product_name_en,
+            t1.product_logo,
+            t1.quantity,
+            t1.price,
+            t1.sum_price,
+            t1.packag_quantity,
+            t1.send_sample_count,
+            t1.remark,
+            t1.create_time,
+            t2.product_long,
+            t2.product_wide,
+            t2.product_high,
+            t2.packag_long,
+            t2.packag_wide,
+            t2.packag_high,
+            t2.inner_pack_method,
+            t2.outer_pack_method,
+            t2.net_weight,
+            t2.gross_weight,
+            t2.customs_code,
+            t2.product_model,
+            t2.material,
+            t2.unit,
+            t2.`code`
+        FROM
+             t_erp_contract_product t1
+        LEFT JOIN t_erp_product t2 ON t1.product_id = t2.id
+    </sql>
+
+    <select id="getByContractId" resultMap="contractProductResultMap">
+        <include refid="sqlField" />
+        <where>
+            t1.contract_id = #{contractId}
+            <!-- 父级id,0:代表一级,不查询子产品数据 -->
+            AND t1.parent_id = '0'
+        </where>
+        ORDER BY
+            t1.create_time ASC
+    </select>
+
+    <select id="getByIds" resultMap="contractProductResultMap">
+        <include refid="sqlField" />
+        <where>
+            <foreach collection="ids" item="id" open="t1.id IN(" separator="," close=")">
+                #{id}
+            </foreach>
+        </where>
+        ORDER BY
+            t1.create_time ASC
+    </select>
+
+    <select id="getByParentId" resultMap="contractProductResultMap">
+        <include refid="sqlField" />
+        <where>
+            <foreach collection="parentIds" item="parentId" open="t1.parent_id IN(" separator="," close=")">
+               #{parentId}
+            </foreach>
+        </where>
+        ORDER BY
+            t1.create_time ASC
+    </select>
+
+    <select id="getPurchaseInfoByParentId" resultMap="contractProductResultMap">
+        SELECT
+            t1.code,
+            t1.id AS contract_id,
+            t2.id,
+            t2.product_name,
+            t2.product_name_en,
+            t2.quantity,
+            IFNULL(t2.quantity, 0) - IFNULL(t3.purchase_count, 0) AS product_un_count
+        FROM
+            t_erp_contract t1
+        INNER JOIN t_erp_contract_product t2 ON t2.contract_id = t1.id AND t2.parent_id != '0'
+        LEFT JOIN (
+            SELECT
+                t2.contract_product_id,
+                SUM(IFNULL(t2.quantity, 0)) AS purchase_count
+            FROM
+                t_erp_purchase_contract t1
+            INNER JOIN t_erp_purchase_contract_product t2 ON t2.purchase_contract_id = t1.id
+            INNER JOIN t_erp_contract_product t3 ON t2.contract_product_id = t3.id AND t3.parent_id != '0'
+            <where>
+                t1.tenant_id = #{tenantId}
+
+                <!-- 数据类型:1、成品采购;2、辅材、配件采购;99、其他 -->
+                AND t1.data_type = 2
+
+                <!-- 采购状态:0、草稿;10、审批中;20、采购中;30、已采购;999、无效 -->
+                <![CDATA[ AND t1.purchase_status > 0 AND t1.purchase_status < 999 ]]>
+
+                <foreach collection="parentIds" item="contractProductId" open="AND t3.parent_id IN(" separator="," close=")">
+                    #{contractProductId}
+                </foreach>
+            </where>
+            GROUP BY
+                t2.contract_product_id
+        ) t3 ON t3.contract_product_id = t2.id
+        <where>
+            t1.tenant_id = #{tenantId}
+            <foreach collection="parentIds" item="contractProductId" open="AND t2.parent_id IN(" separator="," close=")">
+                #{contractProductId}
+            </foreach>
+        </where>
+    </select>
+
+    <delete id="deleteByContractId">
+        DELETE FROM t_erp_contract_product
+        <where>
+            contract_id = #{contractId}
+        </where>
+    </delete>
+
+    <select id="selectProductByContractId" resultMap="contractProductResultMap">
+        SELECT
+            id,
+            product_id,
+            product_name,
+            product_name_en
+        FROM t_erp_contract_product
+        <where>
+            contract_id = #{contractId}
+        </where>
+    </select>
+    <!-- 获取可装箱产品下拉框 -->
+    <select id="getNotPackingProductSelect" resultMap="contractProductResultMap">
+        SELECT
+            t7.*
+        FROM (
+                SELECT
+                    t5.*,
+                    <!-- 可装箱数量 = 合同产品订购总数量 - 产品已装箱总数量 -->
+                    t5.already_testing - SUM(IFNULL(t6.quantity, 0) * IFNULL(sp.total_boxes, 0)) AS page_count
+                FROM (
+                        SELECT
+                            t3.*,
+                            t4.code AS contract_code,
+                            t4.create_time AS contract_create_time,
+                            <!-- 合同产品订购总数量 -->
+                            SUM(IFNULL(t3.quantity, 0)) AS already_testing,
+                            t4.customer_id,
+                            t4.customer_name
+                        FROM
+                            t_erp_contract_product t3
+                            INNER JOIN t_erp_contract t4 ON t3.contract_id = t4.id
+                        <where>
+                            t4.tenant_id = #{tenantId}
+                            AND t4.is_change in (0,2)
+                            <![CDATA[ AND t4.`status` >= 30 AND t4.`status` <= 110 ]]>
+                            <if test="contractProductIds neq null and contractProductIds.size > 0">
+                                AND t3.id IN
+                                <foreach collection="contractProductIds" item="item" open="(" separator="," close=")">
+                                    #{item}
+                                </foreach>
+                            </if>
+                        </where>
+                        GROUP BY
+                            t3.id
+                    ) AS t5
+                    LEFT JOIN t_erp_shipment_packing_product t6 ON t5.id = t6.contract_product_id
+                    LEFT JOIN t_erp_shipment_packing sp ON t6.shipment_packing_id = sp.id
+                GROUP BY
+                    t5.id
+            ) t7
+        <where>
+            t7.page_count > 0
+        </where>
+        ORDER BY
+            t7.contract_create_time DESC
+    </select>
+
+</mapper>

+ 31 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/mapper/ContractProjectMapper.java

@@ -0,0 +1,31 @@
+package com.fjhx.contract.mapper;
+
+import com.fjhx.contract.entity.ContractProject;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.core.mp.mapper.BladeMapper;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * 合同收费项目
+ */
+@Repository
+public interface ContractProjectMapper extends BladeMapper<ContractProject> {
+
+    /**
+     * 通过合同id查询列表
+     *
+     * @param contractId
+     * @return
+     */
+    List<ContractProject> getByContractId(@Param("contractId") String contractId);
+
+    /**
+     * 通过合同id删除
+     *
+     * @param contractId
+     */
+    void deleteByContractId(@Param("contractId") String contractId);
+
+}

+ 36 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/mapper/ContractProjectMapper.xml

@@ -0,0 +1,36 @@
+<?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.fjhx.contract.mapper.ContractProjectMapper">
+
+    <resultMap id="contractProjectResultMap" type="com.fjhx.contract.entity.ContractProject">
+        <id column="id" property="id"/>
+        <result column="contract_id" property="contractId"/>
+        <result column="charge_project_id" property="chargeProjectId"/>
+        <result column="project_name" property="projectName"/>
+        <result column="project_price" property="projectPrice"/>
+        <result column="remark" property="remark"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+    <sql id="sqlField">
+        SELECT * FROM t_erp_contract_project
+    </sql>
+
+    <select id="getByContractId" resultMap="contractProjectResultMap">
+        <include refid="sqlField" />
+        <where>
+            contract_id = #{contractId}
+        </where>
+    </select>
+
+    <delete id="deleteByContractId">
+        DELETE FROM t_erp_contract_project
+        <where>
+            contract_id = #{contractId}
+        </where>
+    </delete>
+
+</mapper>

+ 32 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/mapper/ContractSampleConfirmLogMapper.java

@@ -0,0 +1,32 @@
+package com.fjhx.contract.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fjhx.contract.entity.ContractSampleConfirmLog;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 合同样品单确认记录
+ */
+@Repository
+public interface ContractSampleConfirmLogMapper extends BaseMapper<ContractSampleConfirmLog> {
+
+    /**
+     * 列表
+     *
+     * @param condition
+     * @return
+     */
+    List<ContractSampleConfirmLog> getList(Map<String, Object> condition);
+
+    /**
+     * 通过合同id查询是否存在合格数据
+     *
+     * @param contractId
+     * @return
+     */
+    Integer getIsExistQualifiedByContractId(String contractId);
+
+}

+ 39 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/mapper/ContractSampleConfirmLogMapper.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.fjhx.contract.mapper.ContractSampleConfirmLogMapper">
+
+    <resultMap id="contractSampleConfirmLogResultMap" type="com.fjhx.contract.entity.ContractSampleConfirmLog">
+        <id column="id" property="id"/>
+        <result column="contract_id" property="contractId"/>
+        <result column="status" property="status"/>
+        <result column="confirm_time" property="confirmTime"/>
+        <result column="remark" property="remark"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+    <sql id="sqlField">
+        SELECT * FROM t_erp_contract_sample_confirm_log
+    </sql>
+
+    <select id="getList" resultMap="contractSampleConfirmLogResultMap">
+        <include refid="sqlField" />
+        <where>
+            contract_id = #{contractId}
+        </where>
+    </select>
+
+    <select id="getIsExistQualifiedByContractId" resultType="java.lang.Integer">
+        SELECT
+            1
+        FROM
+             t_erp_contract_sample_confirm_log
+        <where>
+            status = 1
+        </where>
+        LIMIT 1
+    </select>
+
+</mapper>

+ 22 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/mapper/ContractTrackLogMapper.java

@@ -0,0 +1,22 @@
+package com.fjhx.contract.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fjhx.contract.entity.ContractTrackLog;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 合同跟进日志记录
+ */
+public interface ContractTrackLogMapper extends BaseMapper<ContractTrackLog> {
+
+    /**
+     * 列表
+     *
+     * @param condition
+     * @return
+     */
+    List<ContractTrackLog> getList(Map<String, Object> condition);
+
+}

+ 37 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/mapper/ContractTrackLogMapper.xml

@@ -0,0 +1,37 @@
+<?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.fjhx.contract.mapper.ContractTrackLogMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="contractTrackLogResultMap" type="com.fjhx.contract.entity.ContractTrackLog">
+        <id column="id" property="id"/>
+        <result column="contract_id" property="contractId"/>
+        <result column="track_type" property="trackType"/>
+        <result column="status" property="status"/>
+        <result column="track_time" property="trackTime"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+    <sql id="sqlField">
+        SELECT * FROM t_erp_contract_track_log
+    </sql>
+
+    <select id="getList" resultMap="contractTrackLogResultMap">
+        <include refid="sqlField" />
+        <include refid="getListCondition" />
+        ORDER BY
+            track_type ASC,
+            status ASC,
+            track_time ASC
+    </select>
+
+    <sql id="getListCondition">
+        <where>
+            contract_id = #{contractId}
+        </where>
+    </sql>
+
+</mapper>

+ 87 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/service/IContractChangeFlowService.java

@@ -0,0 +1,87 @@
+package com.fjhx.contract.service;
+
+import com.fjhx.activiti.SubmitFlowCondition;
+import com.fjhx.contract.entity.Contract;
+
+/**
+ * 外销合同 - 变更流程
+ */
+public interface IContractChangeFlowService {
+
+    /**
+     * 开始流程
+     *
+     * @param contract
+     */
+    void start(Contract contract);
+
+    /**
+     * 采购员核算
+     *
+     * @param contract
+     * @return
+     */
+    void purchaseCheck(Contract contract);
+
+    /**
+     * 业务总监确认
+     *
+     * @param contract
+     * @return
+     */
+    void chiefInspectorConfirm(Contract contract);
+
+    /**
+     * 总经理确认
+     *
+     * @param contract
+     * @return
+     */
+    void generalManagerConfirm(Contract contract);
+
+    /**
+     * 业务员确认
+     *
+     * @param contract
+     * @return
+     */
+    void businessUserConfirm(Contract contract);
+
+    /**
+     * 业务员作废
+     *
+     * @param contract
+     * @return
+     */
+    void businessUserInvalid(Contract contract);
+
+    /**
+     * 驳回
+     *
+     * @param condition
+     */
+    void reject(SubmitFlowCondition condition);
+
+    /**
+     * 删除流程
+     *
+     * @param condition
+     * @return
+     */
+    void delete(SubmitFlowCondition condition);
+
+    /**
+     * 新增
+     *
+     * @param contract
+     */
+    void save(Contract contract);
+
+    /**
+     * 修改
+     *
+     * @param contract
+     */
+    void update(Contract contract);
+
+}

+ 33 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/service/IContractChangeFlowServiceV2.java

@@ -0,0 +1,33 @@
+package com.fjhx.contract.service;
+
+import com.fjhx.activiti.SubmitFlowCondition;
+import com.fjhx.contract.entity.Contract;
+
+/**
+ * 外销合同 - 变更流程
+ */
+public interface IContractChangeFlowServiceV2 {
+
+    /**
+     * 开始流程
+     *
+     * @param contract
+     */
+    void start(Contract contract);
+
+    /**
+     * 审核
+     *
+     * @param condition
+     */
+    void examine(SubmitFlowCondition condition);
+
+    /**
+     * 删除流程
+     *
+     * @param entity
+     * @return
+     */
+    void delete(Contract entity);
+
+}

+ 48 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/service/IContractFlowExtendService.java

@@ -0,0 +1,48 @@
+package com.fjhx.contract.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fjhx.activiti.SubmitFlowCondition;
+import com.fjhx.contract.entity.ContractFlowExtend;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 外销合同流程扩展
+ */
+public interface IContractFlowExtendService extends IService<ContractFlowExtend> {
+
+    /**
+     * 开始流程
+     *
+     * @param contract
+     */
+    void start(ContractFlowExtend contract);
+
+    /**
+     * 审核
+     *
+     * @param condition
+     */
+    void examine(SubmitFlowCondition condition);
+
+    /**
+     * 根据合同ID查询数据
+     *
+     * @param contractIds 合同ID集合
+     * @param type        类型
+     * @param status      状态
+     * @return
+     */
+    List<ContractFlowExtend> getByContractIds(List<String> contractIds, Integer type, Integer status);
+
+    /**
+     * 根据合同ID查询数据
+     *
+     * @param contractIds 合同ID集合
+     * @param type        类型
+     * @param status      状态
+     * @return
+     */
+    Map<String, List<ContractFlowExtend>> getByContractIdsToMap(List<String> contractIds, Integer type, Integer status);
+}

+ 61 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/service/IContractFlowService.java

@@ -0,0 +1,61 @@
+package com.fjhx.contract.service;
+
+import com.fjhx.activiti.SubmitFlowCondition;
+import com.fjhx.contract.entity.Contract;
+
+/**
+ * 外销合同 - 流程
+ */
+public interface IContractFlowService {
+
+    /**
+     * 新增、编辑草稿
+     *
+     * @param contract
+     */
+    void saveOrUpdateDraft(Contract contract);
+
+    /**
+     * 开始流程
+     *
+     * @param contract
+     */
+    void start(Contract contract);
+
+    /**
+     * 审核
+     *
+     * @param condition
+     */
+    void examine(SubmitFlowCondition condition);
+
+    /**
+     * 驳回
+     *
+     * @param condition
+     */
+    void reject(SubmitFlowCondition condition);
+
+    /**
+     * 删除流程
+     *
+     * @param condition
+     * @return
+     */
+    void delete(SubmitFlowCondition condition);
+
+    /**
+     * 新增
+     *
+     * @param contract
+     */
+    void save(Contract contract);
+
+    /**
+     * 修改
+     *
+     * @param contract
+     */
+    void update(Contract contract);
+
+}

+ 33 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/service/IContractFlowServiceV2.java

@@ -0,0 +1,33 @@
+package com.fjhx.contract.service;
+
+import com.fjhx.activiti.SubmitFlowCondition;
+import com.fjhx.contract.entity.Contract;
+
+/**
+ * 外销合同 - 流程
+ */
+public interface IContractFlowServiceV2 {
+
+    /**
+     * 开始流程
+     *
+     * @param contract
+     */
+    void start(Contract contract);
+
+    /**
+     * 审核
+     *
+     * @param condition
+     */
+    void examine(SubmitFlowCondition condition);
+
+    /**
+     * 删除流程
+     *
+     * @param entity
+     * @return
+     */
+    void delete(Contract entity);
+
+}

+ 17 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/service/IContractPdfService.java

@@ -0,0 +1,17 @@
+package com.fjhx.contract.service;
+
+import org.springblade.system.attachment.entity.Attachment;
+
+/**
+ * 生成外销合同pdf
+ */
+public interface IContractPdfService {
+
+    /**
+     * 生成pdf
+     *
+     * @param id
+     */
+    Attachment generate(String id);
+
+}

+ 68 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/service/IContractProductService.java

@@ -0,0 +1,68 @@
+package com.fjhx.contract.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fjhx.contract.entity.ContractProduct;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 合同产品
+ */
+public interface IContractProductService extends IService<ContractProduct> {
+
+    /**
+     * 通过合同id查询列表,只查询一级产品
+     *
+     * @param contractId
+     * @return
+     */
+    List<ContractProduct> getByContractId(String contractId);
+
+    /**
+     * 通过父级id查询
+     *
+     * @param parentIds
+     * @return
+     */
+    List<ContractProduct> getByParentId(List<String> parentIds);
+
+    /**
+     * 通过父级id查询辅材、配件产品采购数量
+     *
+     * @param parentIds
+     * @return
+     */
+    List<ContractProduct> getPurchaseInfoByParentId(List<String> parentIds);
+
+    /**
+     * 通过父级id查询,key=父级id
+     *
+     * @param parentIds
+     * @return
+     */
+    Map<String, List<ContractProduct>> getByParentIdToMap(List<String> parentIds);
+
+    /**
+     * 通过合同id删除
+     *
+     * @param contractId
+     */
+    void deleteByContractId(String contractId);
+
+    /**
+     * 通过id查询
+     *
+     * @param ids id集合
+     * @return
+     */
+    List<ContractProduct> getByIds(List<String> ids);
+
+    /**
+     * 获取可装箱产品列表
+     *
+     * @param condition 查询条件
+     * @return
+     */
+    List<ContractProduct> getNotPackingProductSelect(Map<String, Object> condition);
+}

+ 28 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/service/IContractProjectService.java

@@ -0,0 +1,28 @@
+package com.fjhx.contract.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fjhx.contract.entity.ContractProject;
+
+import java.util.List;
+
+/**
+ * 合同收费项目
+ */
+public interface IContractProjectService extends IService<ContractProject> {
+
+    /**
+     * 通过合同id查询列表
+     *
+     * @param contractId
+     * @return
+     */
+    List<ContractProject> getByContractId(String contractId);
+
+    /**
+     * 通过合同id删除
+     *
+     * @param contractId
+     */
+    void deleteByContractId(String contractId);
+
+}

+ 51 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/service/IContractSampleConfirmLogService.java

@@ -0,0 +1,51 @@
+package com.fjhx.contract.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fjhx.contract.entity.ContractSampleConfirmLog;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 合同样品单确认记录
+ */
+public interface IContractSampleConfirmLogService extends IService<ContractSampleConfirmLog> {
+
+    /**
+     * 列表
+     *
+     * @param condition
+     * @return
+     */
+    List<ContractSampleConfirmLog> getList(Map<String, Object> condition);
+
+    /**
+     * 新增
+     *
+     * @param confirmLog
+     */
+    void insert(ContractSampleConfirmLog confirmLog);
+
+    /**
+     * 修改
+     *
+     * @param confirmLog
+     */
+    void update(ContractSampleConfirmLog confirmLog);
+
+    /**
+     * 删除
+     *
+     * @param id
+     */
+    void deleteById(String id);
+
+    /**
+     * 通过合同id查询是否存在合格数据
+     *
+     * @param contractId
+     * @return
+     */
+    boolean getIsExistQualifiedByContractId(String contractId);
+
+}

+ 61 - 0
bladex-saas-project/saas-business-tradeerp/src/main/java/com/fjhx/contract/service/IContractSampleFlowService.java

@@ -0,0 +1,61 @@
+package com.fjhx.contract.service;
+
+import com.fjhx.activiti.SubmitFlowCondition;
+import com.fjhx.contract.entity.Contract;
+
+/**
+ * 合同样品单 - 流程
+ */
+public interface IContractSampleFlowService {
+
+    /**
+     * 新增、编辑草稿
+     *
+     * @param contract
+     */
+    void saveOrUpdateDraft(Contract contract);
+
+    /**
+     * 开始流程
+     *
+     * @param contract
+     */
+    void start(Contract contract);
+
+    /**
+     * 审核
+     *
+     * @param condition
+     */
+    void examine(SubmitFlowCondition condition);
+
+    /**
+     * 驳回
+     *
+     * @param condition
+     */
+    void reject(SubmitFlowCondition condition);
+
+    /**
+     * 删除流程
+     *
+     * @param condition
+     * @return
+     */
+    void delete(SubmitFlowCondition condition);
+
+    /**
+     * 新增
+     *
+     * @param contract
+     */
+    void save(Contract contract);
+
+    /**
+     * 修改
+     *
+     * @param contract
+     */
+    void update(Contract contract);
+
+}

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff