Kaynağa Gözat

Merge remote-tracking branch 'origin/test' into test

Qchen 9 ay önce
ebeveyn
işleme
f42b001974
100 değiştirilmiş dosya ile 4752 ekleme ve 1025 silme
  1. 1 6
      .gitignore
  2. 0 107
      insagent.ipr
  3. 0 266
      insagent.iws
  4. 13 0
      pom.xml
  5. 78 0
      src/main/java/com/ydtech/components/DistributedLockComponent.java
  6. 37 0
      src/main/java/com/ydtech/components/SendSmsComponents.java
  7. 20 2
      src/main/java/com/ydtech/components/aliyun/AliyunApiProperties.java
  8. 8 7
      src/main/java/com/ydtech/components/aliyun/AliyunSendSmsComponents.java
  9. 1 1
      src/main/java/com/ydtech/components/aliyun/SendSmsEnum.java
  10. 32 0
      src/main/java/com/ydtech/components/baidu/BaiduApiProperties.java
  11. 48 0
      src/main/java/com/ydtech/components/baidu/BaiduSendSmsComponents.java
  12. 28 0
      src/main/java/com/ydtech/components/tencent/TencentApiProperties.java
  13. 88 0
      src/main/java/com/ydtech/components/tencent/TencentSendSmsComponents.java
  14. 3 3
      src/main/java/com/ydtech/handler/CreateAndUpdateMetaObjectHandler.java
  15. 4 1
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/request/CustomerSendMsgOnEventRequest.java
  16. 1 1
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/response/CustomerSyncMsgResponse.java
  17. 3 0
      src/main/java/com/ydtech/modules/admin/constants/SwitchConfig.java
  18. 12 0
      src/main/java/com/ydtech/modules/admin/controller/SysAgencyFeeApprovalController.java
  19. 12 0
      src/main/java/com/ydtech/modules/admin/controller/SysDeptController.java
  20. 25 11
      src/main/java/com/ydtech/modules/admin/controller/SysLoginController.java
  21. 7 0
      src/main/java/com/ydtech/modules/admin/controller/SysUserAccountController.java
  22. 247 3
      src/main/java/com/ydtech/modules/admin/controller/SysUserController.java
  23. 2 2
      src/main/java/com/ydtech/modules/admin/controller/wechat/WechatCustomerController.java
  24. 4 0
      src/main/java/com/ydtech/modules/admin/dao/SysPartnerAccountMapper.java
  25. 2 0
      src/main/java/com/ydtech/modules/admin/dao/SysUserAccountMapper.java
  26. 9 0
      src/main/java/com/ydtech/modules/admin/dao/SysUserMapper.java
  27. 18 0
      src/main/java/com/ydtech/modules/admin/dao/WorkScheduleConfigMapper.java
  28. 20 0
      src/main/java/com/ydtech/modules/admin/model/SysPartnerAccount.java
  29. 23 0
      src/main/java/com/ydtech/modules/admin/model/SysUser.java
  30. 3 0
      src/main/java/com/ydtech/modules/admin/model/dto/AgentUserDto.java
  31. 4 0
      src/main/java/com/ydtech/modules/admin/model/dto/AgentUserNewDto.java
  32. 3 0
      src/main/java/com/ydtech/modules/admin/model/dto/SysUserDto.java
  33. 113 0
      src/main/java/com/ydtech/modules/admin/model/po/WorkScheduleConfig.java
  34. 11 0
      src/main/java/com/ydtech/modules/admin/model/vo/AppUserInfoVo.java
  35. 2 0
      src/main/java/com/ydtech/modules/admin/model/vo/SysUserInfoQuery.java
  36. 22 0
      src/main/java/com/ydtech/modules/admin/service/IWorkScheduleConfigService.java
  37. 2 0
      src/main/java/com/ydtech/modules/admin/service/SysAgencyFeeApprovalService.java
  38. 2 0
      src/main/java/com/ydtech/modules/admin/service/SysDeptService.java
  39. 2 0
      src/main/java/com/ydtech/modules/admin/service/SysUserAccountService.java
  40. 19 15
      src/main/java/com/ydtech/modules/admin/service/SysUserService.java
  41. 12 0
      src/main/java/com/ydtech/modules/admin/service/SysWechatCustomerService.java
  42. 8 1
      src/main/java/com/ydtech/modules/admin/service/WechatCustomerService.java
  43. 67 1
      src/main/java/com/ydtech/modules/admin/service/impl/SysAgencyFeeApprovalServiceImpl.java
  44. 2 1
      src/main/java/com/ydtech/modules/admin/service/impl/SysAmountAuditingServiceImpl.java
  45. 54 0
      src/main/java/com/ydtech/modules/admin/service/impl/SysDeptServiceImpl.java
  46. 66 3
      src/main/java/com/ydtech/modules/admin/service/impl/SysUserAccountServiceImpl.java
  47. 623 5
      src/main/java/com/ydtech/modules/admin/service/impl/SysUserServiceImpl.java
  48. 22 0
      src/main/java/com/ydtech/modules/admin/service/impl/SysWechatCustomerServiceImpl.java
  49. 196 43
      src/main/java/com/ydtech/modules/admin/service/impl/WechatCustomerServiceImpl.java
  50. 47 0
      src/main/java/com/ydtech/modules/admin/service/impl/WorkScheduleConfigServiceImpl.java
  51. 47 0
      src/main/java/com/ydtech/modules/admin/utils/WorkdayUtils.java
  52. 14 0
      src/main/java/com/ydtech/modules/fee/dto/vo/RuleAttrMappingVo.java
  53. 1 0
      src/main/java/com/ydtech/modules/fee/service/FeeRuleSchemeNewService.java
  54. 3 2
      src/main/java/com/ydtech/modules/fee/service/FeeRuleSchemeService.java
  55. 9 3
      src/main/java/com/ydtech/modules/fee/service/impl/FeeRuleSchemeServiceImpl.java
  56. 495 444
      src/main/java/com/ydtech/modules/fee/service/impl/FeeRuleSchemeServiceNewImpl.java
  57. 117 75
      src/main/java/com/ydtech/modules/fnc/service/impl/InsFeeAuditServiceImpl.java
  58. 3 0
      src/main/java/com/ydtech/modules/ins/model/vo/QuoteRespVo.java
  59. 17 1
      src/main/java/com/ydtech/modules/ins/model/yc/accident/Accident.java
  60. 0 1
      src/main/java/com/ydtech/modules/order/components/InsCrawlerOrderComponents.java
  61. 6 0
      src/main/java/com/ydtech/modules/order/controller/InsCrawlerOrderController.java
  62. 2 0
      src/main/java/com/ydtech/modules/order/controller/QrCodeController.java
  63. 6 0
      src/main/java/com/ydtech/modules/order/controller/QuoteController.java
  64. 6 0
      src/main/java/com/ydtech/modules/order/entity/InsAreaCompany.java
  65. 8 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/InsurePremiumRequest.java
  66. 8 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/SubmitVerifyRequest.java
  67. 46 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/InsurePremiumResponse.java
  68. 13 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/UnderwritingResultResponse.java
  69. 3 1
      src/main/java/com/ydtech/modules/order/entity/crawler/request/CrawlerQuoteRequest.java
  70. 7 0
      src/main/java/com/ydtech/modules/order/entity/crawler/response/CrawlerQuoteResponse.java
  71. 12 0
      src/main/java/com/ydtech/modules/order/entity/vo/AuditExportVo.java
  72. 36 15
      src/main/java/com/ydtech/modules/order/service/impl/ChengTaiOrderApiServiceImpl.java
  73. 10 0
      src/main/java/com/ydtech/modules/order/service/impl/ExcelExportServiceImpl.java
  74. 14 1
      src/main/java/com/ydtech/modules/order/service/impl/InsCrawlerOrderServiceImpl.java
  75. 106 0
      src/main/java/com/ydtech/modules/order/service/impl/InsOrdersServiceImpl.java
  76. 19 0
      src/main/java/com/ydtech/modules/order/service/impl/YongchengOrderApiServiceImpl.java
  77. 3 3
      src/main/java/com/ydtech/modules/order/service/impl/ZijinOrderApiServiceImpl.java
  78. 51 0
      src/main/java/com/ydtech/modules/partner/controller/ExpiredCommissionController.java
  79. 497 0
      src/main/java/com/ydtech/modules/partner/controller/NewAppPartnerController.java
  80. 37 0
      src/main/java/com/ydtech/modules/partner/controller/PartnerCommissionController.java
  81. 46 0
      src/main/java/com/ydtech/modules/partner/controller/PartnerCommissionDetailsController.java
  82. 167 0
      src/main/java/com/ydtech/modules/partner/controller/PartnerExtractHistoryController.java
  83. 37 0
      src/main/java/com/ydtech/modules/partner/controller/PartnerKickbackChangeController.java
  84. 88 0
      src/main/java/com/ydtech/modules/partner/controller/PartnerLiftingRecordController.java
  85. 55 0
      src/main/java/com/ydtech/modules/partner/controller/PartnerRuleController.java
  86. 207 0
      src/main/java/com/ydtech/modules/partner/controller/PartnerUserController.java
  87. 61 0
      src/main/java/com/ydtech/modules/partner/controller/PurchaseRecordController.java
  88. 25 0
      src/main/java/com/ydtech/modules/partner/dao/PartnerAttributeMapper.java
  89. 9 0
      src/main/java/com/ydtech/modules/partner/dao/PartnerCommissionMapper.java
  90. 16 0
      src/main/java/com/ydtech/modules/partner/dao/PartnerExpiredCommissionMapper.java
  91. 10 0
      src/main/java/com/ydtech/modules/partner/dao/PartnerExtractHistoryMapper.java
  92. 34 0
      src/main/java/com/ydtech/modules/partner/dao/PartnerKickbackChangeMapper.java
  93. 40 0
      src/main/java/com/ydtech/modules/partner/dao/PartnerLiftingRecordMapper.java
  94. 26 0
      src/main/java/com/ydtech/modules/partner/dao/PartnerPartnerAccountMapper.java
  95. 59 0
      src/main/java/com/ydtech/modules/partner/dao/PartnerPremiumDetailsMapper.java
  96. 9 0
      src/main/java/com/ydtech/modules/partner/dao/PartnerRatioMapper.java
  97. 10 0
      src/main/java/com/ydtech/modules/partner/dao/PartnerRecordApperMapper.java
  98. 13 0
      src/main/java/com/ydtech/modules/partner/dao/PartnerRuleMapper.java
  99. 10 0
      src/main/java/com/ydtech/modules/partner/dao/PartnerRulesRatioMapper.java
  100. 208 0
      src/main/java/com/ydtech/modules/partner/dao/PartnerUserMapper.java

+ 1 - 6
.gitignore

@@ -6,9 +6,4 @@ target
 
 *.iml
 *.ipr
-*.iws
-
-application-dev.yml
-application-local.yml
-logback-spring-dev.xml
-aSql
+*.iws

+ 0 - 107
insagent.ipr

@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<project version="4" relativePaths="false"> 
-  <component name="ProjectRootManager" version="2" assert-keyword="true" project-jdk-name="15." jdk-15="true"/>  
-  <component name="CodeStyleManager"> 
-    <option name="USE_DEFAULT_CODE_STYLE_SCHEME" value="true"/>  
-    <option name="CODE_STYLE_SCHEME" value=""/> 
-  </component>  
-  <component name="libraryTable"/>  
-  <component name="CompilerConfiguration"> 
-    <option name="DEFAULT_COMPILER" value="Javac"/>  
-    <option name="CLEAR_OUTPUT_DIRECTORY" value="false"/>  
-    <!--
-    <wildcardResourcePatterns>
-      <entry name="${wildcardResourcePattern}"/>
-    </wildcardResourcePatterns>
-    -->  
-    <wildcardResourcePatterns>
-      <entry name="!?*.java"/>
-    </wildcardResourcePatterns>
-  </component>  
-  <component name="JavacSettings"> 
-    <option name="DEBUGGING_INFO" value="true"/>  
-    <option name="GENERATE_NO_WARNINGS" value="false"/>  
-    <option name="DEPRECATION" value="true"/>  
-    <option name="ADDITIONAL_OPTIONS_STRING" value=""/>  
-    <option name="MAXIMUM_HEAP_SIZE" value="128"/>  
-    <option name="USE_GENERICS_COMPILER" value="false"/> 
-  </component>  
-  <component name="JikesSettings"> 
-    <option name="DEBUGGING_INFO" value="true"/>  
-    <option name="DEPRECATION" value="true"/>  
-    <option name="GENERATE_NO_WARNINGS" value="false"/>  
-    <option name="GENERATE_MAKE_FILE_DEPENDENCIES" value="false"/>  
-    <option name="DO_FULL_DEPENDENCE_CHECK" value="false"/>  
-    <option name="IS_INCREMENTAL_MODE" value="false"/>  
-    <option name="IS_EMACS_ERRORS_MODE" value="true"/>  
-    <option name="ADDITIONAL_OPTIONS_STRING" value=""/>  
-    <option name="MAXIMUM_HEAP_SIZE" value="128"/> 
-  </component>  
-  <component name="AntConfiguration"> 
-    <option name="IS_AUTOSCROLL_TO_SOURCE" value="false"/>  
-    <option name="FILTER_TARGETS" value="false"/> 
-  </component>  
-  <component name="JavadocGenerationManager"> 
-    <option name="OUTPUT_DIRECTORY"/>  
-    <option name="OPTION_SCOPE" value="protected"/>  
-    <option name="OPTION_HIERARCHY" value="false"/>  
-    <option name="OPTION_NAVIGATOR" value="false"/>  
-    <option name="OPTION_INDEX" value="false"/>  
-    <option name="OPTION_SEPARATE_INDEX" value="false"/>  
-    <option name="OPTION_USE_1_1" value="false"/>  
-    <option name="OPTION_DOCUMENT_TAG_USE" value="false"/>  
-    <option name="OPTION_DOCUMENT_TAG_AUTHOR" value="false"/>  
-    <option name="OPTION_DOCUMENT_TAG_VERSION" value="false"/>  
-    <option name="OPTION_DOCUMENT_TAG_DEPRECATED" value="false"/>  
-    <option name="OPTION_DEPRECATED_LIST" value="false"/>  
-    <option name="OTHER_OPTIONS"/>  
-    <option name="HEAP_SIZE"/>  
-    <option name="OPEN_IN_BROWSER" value="false"/> 
-  </component>  
-  <component name="JUnitProjectSettings"> 
-    <option name="TEST_RUNNER" value="UI"/> 
-  </component>  
-  <component name="EntryPointsManager"> 
-    <entry_points/> 
-  </component>  
-  <component name="DataSourceManager"/>  
-  <component name="ExportToHTMLSettings"> 
-    <option name="PRINT_LINE_NUMBERS" value="false"/>  
-    <option name="OPEN_IN_BROWSER" value="false"/>  
-    <option name="OUTPUT_DIRECTORY"/> 
-  </component>  
-  <component name="ImportConfiguration"> 
-    <option name="VENDOR"/>  
-    <option name="RELEASE_TAG"/>  
-    <option name="LOG_MESSAGE"/>  
-    <option name="CHECKOUT_AFTER_IMPORT" value="true"/> 
-  </component>  
-  <component name="ProjectModuleManager"> 
-    <modules> 
-      <!-- module filepath="$$PROJECT_DIR$$/${pom.artifactId}.iml"/ -->  
-      <module filepath="$PROJECT_DIR$/insagent.iml"/>
-    </modules> 
-  </component>  
-  <UsedPathMacros> 
-    <!--<macro name="cargo"></macro>--> 
-  </UsedPathMacros> 
-</project>

+ 0 - 266
insagent.iws

@@ -1,266 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="AutoImportSettings">
-    <option name="autoReloadType" value="SELECTIVE" />
-  </component>
-  <component name="ChangeListManager">
-    <list default="true" id="53f4ce76-8f52-4619-adfd-07826e7111a7" name="Changes" comment="代理人app开发">
-      <change beforePath="$PROJECT_DIR$/insagent.iws" beforeDir="false" afterPath="$PROJECT_DIR$/insagent.iws" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/ydtech/modules/order/controller/ChengTaiOrderApiController.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/ydtech/modules/order/controller/ChengTaiOrderApiController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/ydtech/modules/order/controller/QuoteController.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/ydtech/modules/order/controller/QuoteController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/InsurePremiumRequest.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/InsurePremiumRequest.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/InsurePremiumResponse.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/InsurePremiumResponse.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/ydtech/modules/order/entity/vo/ct/CtQuoteAccidentVo.java" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/ydtech/modules/order/service/ChengTaiOrderApiService.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/ydtech/modules/order/service/ChengTaiOrderApiService.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/ydtech/modules/order/service/impl/ChengTaiOrderApiServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/ydtech/modules/order/service/impl/ChengTaiOrderApiServiceImpl.java" afterDir="false" />
-    </list>
-    <list id="bc6cb0c2-9167-463c-ac43-267792d14a4c" name="New changelist" comment="New changelist">
-      <change afterPath="$PROJECT_DIR$/qodana.yaml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/insagent.ipr" beforeDir="false" afterPath="$PROJECT_DIR$/insagent.ipr" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/insagent.iws" beforeDir="false" afterPath="$PROJECT_DIR$/insagent.iws" afterDir="false" />
-    </list>
-    <option name="SHOW_DIALOG" value="false" />
-    <option name="HIGHLIGHT_CONFLICTS" value="true" />
-    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
-    <option name="LAST_RESOLUTION" value="IGNORE" />
-  </component>
-  <component name="Git.Settings">
-    <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
-  </component>
-  <component name="KubernetesApiPersistence">{}</component>
-  <component name="KubernetesApiProvider">{
-  &quot;isMigrated&quot;: true
-}</component>
-  <component name="LineStatusTrackerManager">
-    <file path="$PROJECT_DIR$/insagent.iws">
-      <ranges>
-        <range start1="1" end1="417" start2="1" end2="265" changelist="53f4ce76-8f52-4619-adfd-07826e7111a7" />
-        <range start1="418" end1="419" start2="266" end2="266" changelist="bc6cb0c2-9167-463c-ac43-267792d14a4c" />
-      </ranges>
-    </file>
-  </component>
-  <component name="MavenImportPreferences">
-    <option name="generalSettings">
-      <MavenGeneralSettings>
-        <option name="customMavenHome" value="D:\apache-maven-3.9.8" />
-        <option name="localRepository" value="D:\apache-maven-3.9.8\repo" />
-        <option name="mavenHomeTypeForPersistence" value="CUSTOM" />
-        <option name="userSettingsFile" value="D:\apache-maven-3.9.8\conf\settings.xml" />
-      </MavenGeneralSettings>
-    </option>
-  </component>
-  <component name="ProblemsViewState">
-    <option name="selectedTabId" value="CurrentFile" />
-  </component>
-  <component name="ProjectColorInfo">{
-  &quot;associatedIndex&quot;: 2
-}</component>
-  <component name="ProjectId" id="2oXovegNMCtkb5nu9fEuukn588V" />
-  <component name="ProjectViewState">
-    <option name="hideEmptyMiddlePackages" value="true" />
-    <option name="showLibraryContents" value="true" />
-  </component>
-  <component name="PropertiesComponent"><![CDATA[{
-  "keyToString": {
-    "Application.SpringInsApplication.executor": "Debug",
-    "Maven.SpringInsApplication.executor": "Debug",
-    "Maven.insagent [clean,install,--non-recursive].executor": "Run",
-    "Maven.insagent [clean].executor": "Run",
-    "Maven.insagent [install,--non-recursive].executor": "Run",
-    "Maven.insagent [install].executor": "Run",
-    "Maven.insagent [package].executor": "Run",
-    "RunOnceActivity.ShowReadmeOnStart": "true",
-    "git-widget-placeholder": "test",
-    "kotlin-language-version-configured": "true",
-    "last_opened_file_path": "D:/ideaiu_project/dxService",
-    "node.js.detected.package.eslint": "true",
-    "node.js.selected.package.eslint": "(autodetect)",
-    "node.js.selected.package.tslint": "(autodetect)",
-    "nodejs_package_manager_path": "npm",
-    "project.structure.last.edited": "Global Libraries",
-    "project.structure.proportion": "0.15",
-    "project.structure.side.proportion": "0.41479635",
-    "settings.editor.selected.configurable": "project.propCompiler",
-    "vue.rearranger.settings.migration": "true"
-  }
-}]]></component>
-  <component name="ReactorSettings">
-    <option name="notificationShown" value="true" />
-  </component>
-  <component name="RunManager">
-    <configuration name="SpringInsApplication" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
-      <option name="MAIN_CLASS_NAME" value="com.ydtech.SpringInsApplication" />
-      <module name="insagent" />
-      <extension name="coverage">
-        <pattern>
-          <option name="PATTERN" value="com.ydtech.*" />
-          <option name="ENABLED" value="true" />
-        </pattern>
-      </extension>
-      <method v="2">
-        <option name="Make" enabled="true" />
-      </method>
-    </configuration>
-    <configuration default="true" type="JetRunConfigurationType">
-      <method v="2">
-        <option name="Make" enabled="true" />
-      </method>
-    </configuration>
-    <configuration default="true" type="KotlinStandaloneScriptRunConfigurationType">
-      <option name="filePath" />
-      <method v="2">
-        <option name="Make" enabled="true" />
-      </method>
-    </configuration>
-    <recent_temporary>
-      <list>
-        <item itemvalue="Application.SpringInsApplication" />
-      </list>
-    </recent_temporary>
-  </component>
-  <component name="SharedIndexes">
-    <attachedChunks>
-      <set>
-        <option value="bundled-jdk-9823dce3aa75-b114ca120d71-intellij.indexing.shared.core-IU-242.20224.387" />
-        <option value="bundled-js-predefined-d6986cc7102b-410509235cf1-JavaScript-IU-242.20224.387" />
-      </set>
-    </attachedChunks>
-  </component>
-  <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
-  <component name="TaskManager">
-    <task active="true" id="Default" summary="Default task">
-      <changelist id="53f4ce76-8f52-4619-adfd-07826e7111a7" name="Changes" comment="" />
-      <changelist id="bc6cb0c2-9167-463c-ac43-267792d14a4c" name="New changelist" comment="" />
-      <created>1731025512826</created>
-      <option name="number" value="Default" />
-      <option name="presentableId" value="Default" />
-      <updated>1731025512826</updated>
-      <workItem from="1731025513988" duration="2700000" />
-      <workItem from="1731028251317" duration="37000" />
-      <workItem from="1731028294472" duration="3000" />
-      <workItem from="1731028308592" duration="371000" />
-      <workItem from="1731028689773" duration="136000" />
-      <workItem from="1731028834493" duration="17128000" />
-      <workItem from="1731284394559" duration="28432000" />
-      <workItem from="1731371502249" duration="24475000" />
-      <workItem from="1731457864520" duration="15321000" />
-      <workItem from="1731556015076" duration="8482000" />
-      <workItem from="1731630850533" duration="13069000" />
-      <workItem from="1731888634067" duration="15457000" />
-    </task>
-    <task id="LOCAL-00001" summary="代理人app开发">
-      <option name="closed" value="true" />
-      <created>1731458148781</created>
-      <option name="number" value="00001" />
-      <option name="presentableId" value="LOCAL-00001" />
-      <option name="project" value="LOCAL" />
-      <updated>1731458148781</updated>
-    </task>
-    <option name="localTasksCounter" value="2" />
-    <servers />
-  </component>
-  <component name="TypeScriptGeneratedFilesManager">
-    <option name="version" value="3" />
-  </component>
-  <component name="UnknownFeatures">
-    <option featureType="dependencySupport" implementationName="java:org.springframework:spring-core" />
-    <option featureType="dependencySupport" implementationName="java:jakarta.validation:jakarta.validation-api" />
-    <option featureType="dependencySupport" implementationName="java:org.seleniumhq.selenium:selenium-java" />
-    <option featureType="dependencySupport" implementationName="java:io.projectreactor:reactor-core" />
-    <option featureType="dependencySupport" implementationName="java:org.springframework.data:spring-data-commons" />
-    <option featureType="dependencySupport" implementationName="executable:kubectl" />
-    <option featureType="dependencySupport" implementationName="java:org.hibernate.validator:hibernate-validator" />
-    <option featureType="dependencySupport" implementationName="java:javax.validation:validation-api" />
-    <option featureType="dependencySupport" implementationName="java:org.springframework:spring-webmvc" />
-    <option featureType="dependencySupport" implementationName="java:org.projectlombok:lombok" />
-    <option featureType="dependencySupport" implementationName="java:org.springframework:spring-websocket" />
-    <option featureType="dependencySupport" implementationName="executable:docker" />
-    <option featureType="dependencySupport" implementationName="java:io.reactivex.rxjava3:rxjava" />
-    <option featureType="dependencySupport" implementationName="java:org.thymeleaf:thymeleaf" />
-    <option featureType="dependencySupport" implementationName="java:org.springframework:spring-messaging" />
-    <option featureType="dependencySupport" implementationName="java:org.springframework.boot:spring-boot" />
-  </component>
-  <component name="Vcs.Log.History.Properties">
-    <option name="COLUMN_ID_ORDER">
-      <list>
-        <option value="Default.Root" />
-        <option value="Default.Author" />
-        <option value="Default.Date" />
-        <option value="Default.Subject" />
-        <option value="GitHub.CommitStatus" />
-      </list>
-    </option>
-  </component>
-  <component name="Vcs.Log.Tabs.Properties">
-    <option name="RECENT_FILTERS">
-      <map>
-        <entry key="User">
-          <value>
-            <list>
-              <RecentGroup>
-                <option name="FILTER_VALUES">
-                  <option value="Qchen" />
-                </option>
-              </RecentGroup>
-              <RecentGroup>
-                <option name="FILTER_VALUES">
-                  <option value="*" />
-                </option>
-              </RecentGroup>
-            </list>
-          </value>
-        </entry>
-      </map>
-    </option>
-    <option name="TAB_STATES">
-      <map>
-        <entry key="MAIN">
-          <value>
-            <State />
-          </value>
-        </entry>
-      </map>
-    </option>
-  </component>
-  <component name="VcsManagerConfiguration">
-    <MESSAGE value="代理人app开发" />
-    <MESSAGE value="New changelist" />
-    <option name="LAST_COMMIT_MESSAGE" value="New changelist" />
-  </component>
-  <component name="XDebuggerManager">
-    <breakpoint-manager>
-      <breakpoints>
-        <line-breakpoint enabled="true" type="java-line">
-          <url>file://$PROJECT_DIR$/src/main/java/com/ydtech/modules/esm/service/impl/EsmUserReferrerServiceImpl.java</url>
-          <line>346</line>
-          <option name="timeStamp" value="1" />
-        </line-breakpoint>
-        <line-breakpoint enabled="true" type="java-line">
-          <url>file://$PROJECT_DIR$/src/main/java/com/ydtech/modules/esm/service/impl/EsmUserReferrerServiceImpl.java</url>
-          <line>356</line>
-          <option name="timeStamp" value="2" />
-        </line-breakpoint>
-        <line-breakpoint enabled="true" type="java-line">
-          <url>file://$PROJECT_DIR$/src/main/java/com/ydtech/modules/admin/components/UnionPayRequestApiComponent.java</url>
-          <line>283</line>
-          <option name="timeStamp" value="3" />
-        </line-breakpoint>
-        <line-breakpoint enabled="true" type="java-line">
-          <url>file://$PROJECT_DIR$/src/main/java/com/ydtech/modules/admin/components/UnionPayRequestApiComponent.java</url>
-          <line>189</line>
-          <option name="timeStamp" value="5" />
-        </line-breakpoint>
-        <line-breakpoint enabled="true" type="java-line">
-          <url>file://$PROJECT_DIR$/src/main/java/com/ydtech/modules/admin/components/UnionPayRequestApiComponent.java</url>
-          <line>187</line>
-          <option name="timeStamp" value="6" />
-        </line-breakpoint>
-        <line-breakpoint enabled="true" type="java-line">
-          <url>file://$PROJECT_DIR$/src/main/java/com/ydtech/modules/order/controller/QuoteController.java</url>
-          <line>228</line>
-          <option name="timeStamp" value="14" />
-        </line-breakpoint>
-      </breakpoints>
-    </breakpoint-manager>
-  </component>
-</project>

+ 13 - 0
pom.xml

@@ -684,6 +684,19 @@
             <artifactId>spring-boot-starter-amqp</artifactId>
         </dependency>
 
+        <!-- 百度云短信 -->
+        <dependency>
+            <groupId>com.baidubce</groupId>
+            <artifactId>bce-java-sdk</artifactId>
+            <version>0.10.393</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.tencentcloudapi</groupId>
+            <artifactId>tencentcloud-sdk-java-sms</artifactId>
+            <version>3.1.1281</version>
+        </dependency>
+
     </dependencies>
 
 

+ 78 - 0
src/main/java/com/ydtech/components/DistributedLockComponent.java

@@ -0,0 +1,78 @@
+package com.ydtech.components;
+
+import lombok.RequiredArgsConstructor;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
+
+/**
+ * @description: 分布式锁封装
+ * @author: wenks
+ * @date: 2025/3/24 15:08
+ **/
+@Component
+@RequiredArgsConstructor
+public class DistributedLockComponent {
+
+    private final RedissonClient redissonClient;
+
+    // 默认配置(单位:秒)
+    private static final int DEFAULT_WAIT_TIME = 3;
+
+    private static final int DEFAULT_LEASE_TIME = 30;
+
+    /**
+     * 带返回值的锁操作
+     *
+     * @param lockName  锁名称
+     * @param supplier  业务逻辑
+     * @param waitTime  获取锁等待时间
+     * @param leaseTime 锁持有时间
+     * @return 业务执行结果
+     */
+    public <T> T executeWithLock(String lockName, Supplier<T> supplier, long waitTime, long leaseTime) throws Exception {
+        RLock lock = redissonClient.getLock(lockName);
+        boolean isLocked = false;
+        try {
+            // 尝试获取锁
+            isLocked = lock.tryLock(waitTime, leaseTime, TimeUnit.SECONDS);
+            if (isLocked) {
+                // 执行业务逻辑
+                return supplier.get();
+            }
+            throw new RuntimeException("Acquire lock failed: " + lockName);
+        } finally {
+            if (isLocked && lock.isHeldByCurrentThread()) {
+                lock.unlock();
+            }
+        }
+    }
+
+    /**
+     * 快速失败(带默认参数)
+     */
+    public <T> T fastFailExecute(String lockName, Supplier<T> supplier) throws Exception {
+        return executeWithLock(lockName, supplier, 0, DEFAULT_LEASE_TIME);
+    }
+
+    /**
+     * 阻塞等待锁(带默认参数)
+     */
+    public <T> T blockingExecute(String lockName, Supplier<T> supplier) throws Exception {
+        return executeWithLock(lockName, supplier, DEFAULT_WAIT_TIME, -1);
+    }
+
+    /**
+     * 无返回值操作
+     */
+    public void executeWithLock(String lockName, Runnable runnable, long waitTime, long leaseTime) throws Exception {
+        executeWithLock(lockName, () -> {
+            runnable.run();
+            return null;
+        }, waitTime, leaseTime);
+    }
+}
+

+ 37 - 0
src/main/java/com/ydtech/components/SendSmsComponents.java

@@ -0,0 +1,37 @@
+package com.ydtech.components;
+
+
+import com.alibaba.fastjson.JSON;
+import com.ydtech.components.aliyun.AliyunSendSmsComponents;
+import com.ydtech.components.aliyun.SMSVerificationCode;
+import com.ydtech.components.aliyun.SendSmsEnum;
+import com.ydtech.components.baidu.BaiduSendSmsComponents;
+import com.ydtech.components.tencent.TencentSendSmsComponents;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class SendSmsComponents {
+
+    private final AliyunSendSmsComponents aliyunSendSmsComponents;
+
+    private final TencentSendSmsComponents tencentSendSmsComponents;
+
+    private final BaiduSendSmsComponents baiduSendSmsComponents;
+
+    public void sendSms(String phoneNumber, String captcha) throws Exception {
+        // 阿里云
+        aliyunSendSmsComponents.sendSms(phoneNumber, captcha);
+//         腾讯云
+//        tencentSendSmsComponents.sendSms(phoneNumber, captcha);
+//        // 百度
+//        baiduSendSmsComponents.sendSms(phoneNumber, captcha);
+    }
+
+
+}

+ 20 - 2
src/main/java/com/ydtech/components/aliyun/AliyunApiProperties.java

@@ -10,10 +10,28 @@ import org.springframework.stereotype.Component;
 @ConfigurationProperties(prefix = "aliyun.api")
 public class AliyunApiProperties {
 
-    //
+    /**
+     *
+     */
     private String accessKeyId;
 
-    //
+    /**
+     *
+     */
     private String accessKeySecret;
 
+    /**
+     * 链接
+     */
+    private String endpoint;
+
+    /**
+     * 签名
+     */
+    private String signName;
+
+    /**
+     * 模版
+     */
+    private String templateId;
 }

+ 8 - 7
src/main/java/com/ydtech/components/aliyun/SendSmsComponents.java → src/main/java/com/ydtech/components/aliyun/AliyunSendSmsComponents.java

@@ -1,12 +1,11 @@
 package com.ydtech.components.aliyun;
 
 
+import com.alibaba.fastjson.JSON;
 import com.aliyun.dysmsapi20170525.Client;
 import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
 import com.aliyun.tea.TeaException;
 import com.aliyun.teaopenapi.models.Config;
-import com.aliyun.teautil.models.RuntimeOptions;
-import com.ydtech.exception.SystemException;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
@@ -15,7 +14,7 @@ import org.springframework.stereotype.Component;
 @Slf4j
 @Component
 @RequiredArgsConstructor
-public class SendSmsComponents {
+public class AliyunSendSmsComponents {
 
     private final AliyunApiProperties properties;
 
@@ -38,13 +37,15 @@ public class SendSmsComponents {
         return new Client(config);
     }
 
-    public void sendSms(String phoneNumber, SendSmsEnum sendSmsEnum, String templateParam) throws Exception {
+    public void sendSms(String phoneNumber, String captcha) throws Exception {
+        SMSVerificationCode smsVerificationCode = new SMSVerificationCode(String.valueOf(captcha));
+        String jsonString = JSON.toJSONString(smsVerificationCode);
         Client client = createClient();
         SendSmsRequest sendSmsRequest = new SendSmsRequest()
                 .setPhoneNumbers(phoneNumber)
-                .setSignName(sendSmsEnum.getSignName())
-                .setTemplateCode(sendSmsEnum.getCode())
-                .setTemplateParam(templateParam);
+                .setSignName(properties.getSignName())
+                .setTemplateCode(properties.getTemplateId())
+                .setTemplateParam(jsonString);
 
         sendSmsData(client, sendSmsRequest);
     }

+ 1 - 1
src/main/java/com/ydtech/components/aliyun/SendSmsEnum.java

@@ -9,7 +9,7 @@ import lombok.Getter;
 public enum SendSmsEnum {
 
     SMS_220650023("SMS_220650023", "山西掌柜鼎科技", "验证码短信"),
-    SMS_481735501("SMS_481735501", "晋掌柜", "验证码短信");
+    SMS_496835079("SMS_496835079", "山西掌柜鼎科技", "验证码");
 
     private final String code;
 

+ 32 - 0
src/main/java/com/ydtech/components/baidu/BaiduApiProperties.java

@@ -0,0 +1,32 @@
+package com.ydtech.components.baidu;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "baidu.api")
+public class BaiduApiProperties {
+
+    /**
+     * AccessKeyID
+     */
+    private String accessKeyId;
+    /**
+     * AccessKeySecret
+     */
+    private String accessKeySecret;
+    /**
+     * 链接
+     */
+    private String endpoint;
+    /**
+     * 签名
+     */
+    private String signatureId;
+    /**
+     * 模版
+     */
+    private String template;
+}

+ 48 - 0
src/main/java/com/ydtech/components/baidu/BaiduSendSmsComponents.java

@@ -0,0 +1,48 @@
+package com.ydtech.components.baidu;
+
+
+import com.baidubce.auth.DefaultBceCredentials;
+import com.baidubce.services.sms.SmsClient;
+import com.baidubce.services.sms.SmsClientConfiguration;
+import com.baidubce.services.sms.model.SendMessageV3Request;
+import com.baidubce.services.sms.model.SendMessageV3Response;
+import com.ydtech.exception.SystemException;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class BaiduSendSmsComponents {
+
+    private final BaiduApiProperties baiduApiProperties;
+
+    public void sendSms(String phoneNumber, String code) {
+        String ENDPOINT = "http://smsv3.bj.baidubce.com";
+
+        SmsClientConfiguration config = new SmsClientConfiguration();
+        config.setCredentials(new DefaultBceCredentials(baiduApiProperties.getAccessKeyId(), baiduApiProperties.getAccessKeySecret()));
+        config.setEndpoint(ENDPOINT);
+        SmsClient smsClient = new SmsClient(config);
+
+        SendMessageV3Request request = new SendMessageV3Request();
+        request.setMobile(phoneNumber);
+        request.setSignatureId("sms-signQxkiwz88470");
+        request.setTemplate("sms-tmpl-awKvRY85349");
+        Map<String, String> contentVar = new HashMap<>();
+        contentVar.put("code", code);
+        request.setContentVar(contentVar);
+        SendMessageV3Response response = smsClient.sendMessage(request);
+        // 解析请求响应 response.isSuccess()为true 表示成功
+        if (response != null && response.isSuccess()) {
+            return;
+        } else {
+            throw new SystemException("发送失败");
+        }
+
+    }
+}

+ 28 - 0
src/main/java/com/ydtech/components/tencent/TencentApiProperties.java

@@ -0,0 +1,28 @@
+package com.ydtech.components.tencent;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "tencent.api")
+public class TencentApiProperties {
+
+    // SecretId
+    private String secretId;
+
+    // SecretKey
+    private String secretKey;
+
+    private String region;
+
+    private String endpoint;
+
+    private String sdkAppId;
+
+    private String signName;
+
+    private String templateId;
+
+}

+ 88 - 0
src/main/java/com/ydtech/components/tencent/TencentSendSmsComponents.java

@@ -0,0 +1,88 @@
+package com.ydtech.components.tencent;
+
+
+import com.tencentcloudapi.common.Credential;
+import com.tencentcloudapi.common.exception.TencentCloudSDKException;
+import com.tencentcloudapi.common.profile.ClientProfile;
+import com.tencentcloudapi.common.profile.HttpProfile;
+import com.tencentcloudapi.sms.v20210111.SmsClient;
+import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
+import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
+import com.tencentcloudapi.sms.v20210111.models.SendStatus;
+import com.ydtech.exception.SystemException;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.retry.annotation.Retryable;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class TencentSendSmsComponents {
+
+    private final TencentApiProperties tencentApiProperties;
+
+    /**
+     * 发送短信
+     *
+     * @param phoneNumber   手机号数组(需包含国际区号,例如 "+8613711112222")
+     * @param templateParam 模板参数数组,需要与模板内容变量一一对应
+     * @return 发送请求ID,可用于日志追踪;发送失败时返回null。
+     */
+    public String sendSms(String phoneNumber, String templateParam) {
+        phoneNumber = "+86" + phoneNumber;
+        String[] phoneNumberSet = new String[]{phoneNumber};
+        String[] templateParamSet = new String[]{templateParam};
+        SmsClient client = getSmsClient();
+        SendSmsRequest req = new SendSmsRequest();
+        // 使用注入的配置设置参数
+        req.setSmsSdkAppId(tencentApiProperties.getSdkAppId());
+        req.setSignName(tencentApiProperties.getSignName());
+        req.setTemplateId(tencentApiProperties.getTemplateId());
+        req.setTemplateParamSet(templateParamSet);
+        req.setPhoneNumberSet(phoneNumberSet);
+        req.setSessionContext("");
+        req.setExtendCode("");
+        req.setSenderId("");
+        try {
+            log.info("尝试发送短信,目标手机号:{}", Arrays.toString(phoneNumberSet));
+            SendSmsResponse res = client.SendSms(req);
+            log.debug("腾讯云短信接口原始响应:{}", SendSmsResponse.toJsonString(res));
+
+            // 检查发送结果
+            if (res.getSendStatusSet() != null && res.getSendStatusSet().length > 0) {
+                SendStatus status = res.getSendStatusSet()[0];
+                if ("Ok".equals(status.getCode())) {
+                    log.info("短信发送成功!请求ID:{}, 序列号:{}", res.getRequestId(), status.getSerialNo());
+                    return res.getRequestId(); // 返回请求ID用于追踪
+                } else {
+                    log.error("短信发送失败。错误码:{}, 错误信息:{}", status.getCode(), status.getMessage());
+                }
+            }
+            return null;
+
+        } catch (TencentCloudSDKException e) {
+            log.error("调用腾讯云短信服务SDK失败,错误信息:{}", e.getMessage(), e);
+            // 重试后仍失败,抛出运行时异常或自定义异常
+            throw new SystemException("短信服务暂时不可用,请稍后重试" + e.getMessage());
+        }
+    }
+
+    private SmsClient getSmsClient() {
+        Credential cred = new Credential(tencentApiProperties.getSecretId(), tencentApiProperties.getSecretKey());
+        HttpProfile httpProfile = new HttpProfile();
+        httpProfile.setEndpoint(tencentApiProperties.getEndpoint());
+        httpProfile.setReqMethod("GET");
+        httpProfile.setConnTimeout(10);
+        httpProfile.setWriteTimeout(10);
+        httpProfile.setReadTimeout(10);
+        ClientProfile clientProfile = new ClientProfile();
+        clientProfile.setSignMethod("HmacSHA256");
+        clientProfile.setHttpProfile(httpProfile);
+        // 使用注入的配置创建客户端
+        return new SmsClient(cred, tencentApiProperties.getRegion(), clientProfile);
+    }
+
+}

+ 3 - 3
src/main/java/com/ydtech/handler/CreateAndUpdateMetaObjectHandler.java

@@ -13,7 +13,7 @@ import org.apache.ibatis.reflection.MetaObject;
 import java.util.Date;
 
 /**
- *  MP注入处理器  抄来的
+ * MP注入处理器  抄来的
  *
  * @author: lig
  * @date: 2023年06月30日 0030
@@ -55,7 +55,7 @@ public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler {
 //                baseEntity.setUpdateBy(username);
             }
         } catch (Exception e) {
-            throw new SystemException(StringUtils.toString(HttpStatus.HTTP_UNAUTHORIZED),"自动注入异常 => " + e.getMessage());
+            log.error(StringUtils.toString(HttpStatus.HTTP_UNAUTHORIZED), "自动注入异常 => " + e.getMessage());
         }
     }
 
@@ -77,7 +77,7 @@ public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler {
                 }
             }
         } catch (Exception e) {
-            throw new SystemException(StringUtils.toString(HttpStatus.HTTP_UNAUTHORIZED),"自动注入异常 => " + e.getMessage());
+            log.error(StringUtils.toString(HttpStatus.HTTP_UNAUTHORIZED), "自动注入异常 => " + e.getMessage());
         }
     }
 }

+ 4 - 1
src/main/java/com/ydtech/modules/admin/components/wechat/customer/request/CustomerSendMsgOnEventRequest.java

@@ -55,9 +55,12 @@ public class CustomerSendMsgOnEventRequest extends CustomerBaseRequest {
     }
 
 
-    public static CustomerSendMsgOnEventRequest sendMsgOnEvent(SysUser sysUser, String msgid, String code) {
+    public static CustomerSendMsgOnEventRequest sendMsgOnEvent(SysUser sysUser, String code, boolean workingHours) {
         String messages = "你好!" + sysUser.getName() + "(" + sysUser.getId() + ")" + "很高兴为你服务";
         // 发送欢迎信息
+        if (!workingHours) {
+            messages = "您好" + sysUser.getName() + "(" + sysUser.getId() + ")" + "~当前客服暂时不在服务时间,服务时间为:周一至周五:8:30-12:00,14:00-18:30,周六至周日:9:00-12:00,14:00-18:00,当前未到服务时间,请您在服务时段内咨询~";
+        }
         CustomerSendMsgOnEventRequest customerSendMsgOnEventRequest = new CustomerSendMsgOnEventRequest();
         customerSendMsgOnEventRequest.setMsgtype("text");
         customerSendMsgOnEventRequest.setCode(code);

+ 1 - 1
src/main/java/com/ydtech/modules/admin/components/wechat/customer/response/CustomerSyncMsgResponse.java

@@ -40,7 +40,7 @@ public class CustomerSyncMsgResponse extends CustomerBaseResponse{
         private String msgid;
 
         @JsonProperty("send_time")
-        private Integer sendTime;
+        private long sendTime;
 
         @JsonProperty("origin")
         private Integer origin;

+ 3 - 0
src/main/java/com/ydtech/modules/admin/constants/SwitchConfig.java

@@ -40,6 +40,9 @@ public enum SwitchConfig {
 
     CT_DISCOUNT_01("ctDiscountFlag", "诚泰自动调整折扣"),
 
+    VIRTUAL_WITHDRAWAL("virtualWithdrawal", "虚拟提现"),
+
+
     CUSTOMER("customer", "客服功能")
     ;
 

+ 12 - 0
src/main/java/com/ydtech/modules/admin/controller/SysAgencyFeeApprovalController.java

@@ -80,6 +80,18 @@ public class SysAgencyFeeApprovalController extends BaseController {
         return this.sysAgencyFeeApprovalService.insert(sysAgencyFeeApprovalAddDto);
     }
 
+
+    /**
+     * (新APP提现申请保存)
+     * @param sysAgencyFeeApprovalAddDto 实体
+     * @return 新增结果
+     */
+    @ApiOperation(value = "提现申请保存")
+    @PostMapping("/partnerAccount")
+    public HttpResult partnerAccount(@RequestBody SysAgencyFeeApprovalAddDto sysAgencyFeeApprovalAddDto) {
+        return this.sysAgencyFeeApprovalService.partnerAccount(sysAgencyFeeApprovalAddDto);
+    }
+
     /**
      * 编辑数据
      *

+ 12 - 0
src/main/java/com/ydtech/modules/admin/controller/SysDeptController.java

@@ -247,6 +247,18 @@ public class SysDeptController extends BaseController {
     }
 
 
+    /**
+     * 新合伙人管理机构树
+     * @return
+     */
+    @ApiOperation(value = "新合伙人管理机构树")
+    @GetMapping(value = "/newGetPartnerDeptTree")
+    public HttpResult<List<SysDeptTreeVo>> newGetPartnerDeptTree() {
+
+        return HttpResult.ok(sysDeptService.newGetPartnerDeptTree());
+    }
+
+
     /**
      * 数据权限机构数
      * @return

+ 25 - 11
src/main/java/com/ydtech/modules/admin/controller/SysLoginController.java

@@ -3,14 +3,15 @@ package com.ydtech.modules.admin.controller;
 import cn.dev33.satoken.session.SaSession;
 import cn.dev33.satoken.session.TokenSign;
 import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.extra.spring.SpringUtil;
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.code.kaptcha.Producer;
+import com.ydtech.components.SendSmsComponents;
 import com.ydtech.components.aliyun.SMSVerificationCode;
-import com.ydtech.components.aliyun.SendSmsComponents;
+import com.ydtech.components.aliyun.AliyunSendSmsComponents;
 import com.ydtech.components.aliyun.SendSmsEnum;
 import com.ydtech.config.MasterPasswordConfig;
 import com.ydtech.constants.SysConstants;
@@ -26,6 +27,9 @@ import com.ydtech.modules.admin.model.po.SysUserLinkSys;
 import com.ydtech.modules.admin.model.vo.*;
 import com.ydtech.modules.admin.service.*;
 import com.ydtech.modules.base.controller.BaseController;
+import com.ydtech.modules.partner.utils.ExpiredCommissionUtils;
+import com.ydtech.modules.partner.utils.UpdateRatioUtils;
+import com.ydtech.modules.partner.service.PartnerUserService;
 import com.ydtech.security.utils.PasswordUtils;
 import com.ydtech.utils.IPUtil;
 import com.ydtech.utils.RedisUtils;
@@ -93,6 +97,8 @@ public class SysLoginController {
 
     private final SysLoginService sysLoginService;
 
+    private final PartnerUserService partnerUserService;
+
     @GetMapping("captcha.jpg")
     @ApiOperation(value = "获取验证码", produces = "application/octet-stream")
     public void captcha(HttpServletResponse response, HttpServletRequest request) throws IOException {
@@ -231,6 +237,7 @@ public class SysLoginController {
         //校验登录用户是否为合伙人或者是机构负责人
         boolean a = sysPartnerService.checkPartner(user.getId());
         boolean b = sysAgencyLeaderService.checkUserId(user.getId());
+        boolean isPartner = partnerUserService.selectByUserIdList(user.getId());
         if (a) {
             SysPartner sysPartner = sysPartnerMapper.selectOne(new LambdaQueryWrapper<SysPartner>().eq(SysPartner::getUserId, user.getId()));
             //类型:1.合伙人;2机构负责人
@@ -238,8 +245,12 @@ public class SysLoginController {
             aapLoginVo.setLevel(sysPartner.getType());
         } else if (b) {
             aapLoginVo.setType(2);
-        } else {
-            throw new SystemException("该用户无权限登录AAP,只能合伙人或者机构负责人才能登录!");
+        } else if(isPartner){
+            SpringUtil.getBean(UpdateRatioUtils.class).loginBefore(user.getId());
+            SpringUtil.getBean(UpdateRatioUtils.class).loginChange(user.getId());
+            aapLoginVo.setType(1);
+        }else {
+            throw new SystemException("该用户无权限登录APP,只能合伙人或者机构负责人才能登录!");
 
         }
 
@@ -292,6 +303,7 @@ public class SysLoginController {
         String token = StpUtil.createLoginSession(user.getId());
         StpUtil.getSessionByLoginId(user.getId()).set(SaSession.USER, user);
         aapLoginVo.setToken(token);
+        SpringUtil.getBean(ExpiredCommissionUtils.class).initializeExpirationTime(user.getId());
         return HttpResult.ok("登录成功", aapLoginVo);
 
     }
@@ -315,13 +327,18 @@ public class SysLoginController {
         //校验登录用户是否为合伙人或者是机构负责人
         boolean a = sysPartnerService.checkPartner(user.getId());
         boolean b = sysAgencyLeaderService.checkUserId(user.getId());
+        boolean isPartner = partnerUserService.selectByUserIdList(user.getId());
         if (a) {
             //类型:1.合伙人;2机构负责人
             aapLoginVo.setType(1);
         } else if (b) {
             aapLoginVo.setType(2);
+        } else if(isPartner){
+            SpringUtil.getBean(UpdateRatioUtils.class).loginBefore(user.getId());
+            SpringUtil.getBean(UpdateRatioUtils.class).loginChange(user.getId());
+            aapLoginVo.setType(1);
         } else {
-            throw new SystemException("该用户无权限登录AAP,只能合伙人或者机构负责人才能登录!");
+            throw new SystemException("该用户无权限登录APP,只能合伙人或者机构负责人才能登录!");
 
         }
         String msg = redisTemplate.opsForValue().get(PHONE_VERIFICATION_CODE_KEY + phone);
@@ -428,8 +445,8 @@ public class SysLoginController {
 //    }
 
 
-    @Autowired
-    private SendSmsComponents sendSms;
+
+    private final SendSmsComponents sendSms;
 
     /**
      * 短信发送
@@ -453,11 +470,8 @@ public class SysLoginController {
         redisTemplate.opsForValue()
                 .set(PHONE_VERIFICATION_CODE_KEY + phone, String.valueOf(randNumber), PHONE_VERIFICATION_CODE_KEY_TIME
                         , TimeUnit.MINUTES);
-
         try {
-            SMSVerificationCode smsVerificationCode = new SMSVerificationCode(String.valueOf(randNumber));
-            String jsonString = JSON.toJSONString(smsVerificationCode);
-            sendSms.sendSms(phone, SendSmsEnum.SMS_220650023, jsonString);
+            sendSms.sendSms(phone, String.valueOf(randNumber));
             return HttpResult.ok("发送成功");
         } catch (Exception e) {
             e.printStackTrace();

+ 7 - 0
src/main/java/com/ydtech/modules/admin/controller/SysUserAccountController.java

@@ -51,6 +51,13 @@ public class SysUserAccountController extends BaseController {
         return HttpResult.ok("success", result);
     }
 
+    @PostMapping("/querySum")
+    @ApiOperation(value = "用户账户统计")
+    public HttpResult<SysUserAccount> querySum(@RequestBody SysUserAccountVo sysUserAccountVo) {
+        SysUserAccount result = sysUserAccountService.querySum(sysUserAccountVo);
+        return HttpResult.ok("success", result);
+    }
+
 
     @PostMapping("/insert")
     @ApiOperation("提交")

+ 247 - 3
src/main/java/com/ydtech/modules/admin/controller/SysUserController.java

@@ -40,6 +40,9 @@ import com.ydtech.modules.message.constants.MessageTypeConstants;
 import com.ydtech.modules.message.service.MessageSecretaryService;
 import com.ydtech.modules.order.entity.po.InsUploadFiles;
 import com.ydtech.modules.order.service.InsUploadFilesService;
+import com.ydtech.modules.partner.utils.UpdateRatioUtils;
+import com.ydtech.modules.partner.dao.PartnerUserMapper;
+import com.ydtech.modules.partner.model.PartnerUser;
 import com.ydtech.modules.protocol.utils.AssertionUtils;
 import com.ydtech.security.utils.PasswordUtils;
 import com.ydtech.utils.StringUtils;
@@ -59,6 +62,7 @@ import org.springframework.util.ObjectUtils;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.util.*;
 
@@ -106,6 +110,7 @@ public class SysUserController extends BaseController {
 
     private final UnionPayRequestApiComponent unionPayRequestApiComponent;
 
+    private final PartnerUserMapper partnerUserMapper;
 
     //    @PreAuthorize("hasAuthority('sys:user:delete')")
     @ApiOperation(value = "逻辑删除")
@@ -540,6 +545,13 @@ public class SysUserController extends BaseController {
         return HttpResult.ok(sysUserService.getFinanceUser());
     }
 
+
+    @ApiOperation(value = "合伙人审核查询分页")
+    @PostMapping(value = "/findPartnerUserList")
+    public HttpResult findPartnerUserList(@RequestBody SysUserDto sysUserDto) {
+        return HttpResult.ok(sysUserService.findPartnerUserList(sysUserDto));
+    }
+
     @ApiOperation(value = "后线用户查询不分页(编辑时查询领导人)")
     @PostMapping(value = "/findBackUserList1")
     public HttpResult findBackUserList1(@RequestBody SysUserDto sysUserDto) {
@@ -571,7 +583,9 @@ public class SysUserController extends BaseController {
         SysUser sysUser = sysUserService.getById(userId);
         if (Objects.equals(sysUser.getStatus(), UserWorkStatus.UWS_2.getCode())) {
             sysUser.setStatus(UserWorkStatus.UWS_1.getCode());
-            sysUserService.addInfo(sysUser);
+            if (4 != sysUser.getType()){
+                sysUserService.addInfo(sysUser);
+            }
         } else if (Objects.equals(sysUser.getStatus(), UserWorkStatus.UWS_4.getCode())) {
             sysUser.setIdentity(sysUser.getIdentity() + "-1");
             sysUser.setMobile(sysUser.getMobile() + "-1");
@@ -583,7 +597,9 @@ public class SysUserController extends BaseController {
         SysUserTrack sysUserTrack = new SysUserTrack(sysUser);
 
         sysUserTrackService.save(sysUserTrack);
-
+        if (1 == sysUser.getNewApp()){
+            SpringUtil.getBean(UpdateRatioUtils.class).addChangeRecord(sysUser.getId());
+        }
         return HttpResult.ok("审批成功",sysUserService.updateById(sysUser));
     }
 
@@ -854,7 +870,11 @@ public class SysUserController extends BaseController {
             sysUser.setLeaderId(leaderUser.getLeaderId());
             sysUser.setLeaderName(leaderUser.getLeaderName());
         }
-
+        //  新APP 用户 渠道个代邀请代理人
+        if (1 == recommender.getNewApp()){
+            sysUser.setType(4);
+        }
+        sysUser.setNewApp(recommender.getNewApp());
         sysUserService.save(sysUser);
         sysUserRoleService.save(userRole);
 
@@ -866,10 +886,31 @@ public class SysUserController extends BaseController {
         if ("2".equals(dto.getFlag())) {
             esmUserReferrerService.addReferrer(dto.getReferrerId(), nextPK);
         }
+        //  新APP 渠道个代邀请代理人
+        addPartner(sysUser,recommenderid,recommender);
         return HttpResult.ok("保存成功", sysUser.getId());
     }
 
 
+    public void addPartner(SysUser sysUser,String referrerId,SysUser recommender){
+        if (null == recommender){
+            return;
+        }
+        if (1 == recommender.getNewApp()){
+            Integer max = partnerUserMapper.selectByUserIdMax(referrerId);
+            PartnerUser partnerUser = new PartnerUser();
+            partnerUser.setName(sysUser.getName());
+            partnerUser.setMobile(sysUser.getMobile());
+            partnerUser.setUserId(sysUser.getId());
+            partnerUser.setDeptId(sysUser.getDeptId());
+            partnerUser.setDeptName(sysUser.getDeptName());
+            partnerUser.setGrade(max + 1);
+            partnerUser.setReferrerId(referrerId);
+            partnerUserMapper.insert(partnerUser);
+        }
+    }
+
+
     @GetMapping(value = "/findUserInfo/{userId}")
     @ApiOperation(value = "获取用户信息")
     @ApiImplicitParams({
@@ -984,6 +1025,209 @@ public class SysUserController extends BaseController {
         return sysUserService.saveUserInfoByPartner(sysUserVo);
     }
 
+
+
+    @ApiOperation(value = "(新PP端)保存合伙人、管理员用户基本详情信息")
+    @PostMapping(value = "/newSaveUserInfoByPartner")
+    public HttpResult newSaveUserInfoByPartner(@RequestBody SysUser2Vo sysUserVo) {
+        log.info("添加合伙人入参:{}", sysUserVo);
+        //by gws 21	团队长 20	代理人 必须归属团队
+        // 22	后线人员 必须归属部门
+        SysUser sysUser = sysUserVo.getSysUser();
+        sysUser.setNewApp(1);
+        sysUser.setType(4);
+        SysUserInfo sysUserInfo = new SysUserInfo();
+        SysUser sysUser1 = sysUserService.getById(sysUserVo.getSysUser().getReferrerId());
+        if (Objects.isNull(sysUser1)){
+            return HttpResult.error("推荐人信息不存在");
+        }
+        sysUser.setDeptId(partnerUserMapper.queryDeptIdByUserId(sysUser1.getId(),sysUserVo.getSysUser().getGrade()));
+        sysUser.setStatus(2); //直接默认为入司待审核
+        LocalDate birthday = LocalDate.parse(sysUser.getIdentity().substring(6, 10) + "-" + sysUser.getIdentity().substring(10, 12) + "-" + sysUser.getIdentity().substring(12, 14));
+        sysUserInfo.setBirthday(birthday);
+        sysUserVo.setSysUserInfo(sysUserInfo);
+        if (StringUtils.isNullOrEmpty(sysUser)) {
+            return HttpResult.error("用户信息不能为空");
+        }
+        if (StringUtils.isNullOrEmpty(sysUser.getDeptId())) {
+            return HttpResult.error("机构ID不能为空");
+        }
+        if (StringUtils.isNullOrEmpty(sysUser.getRoleId())) {
+            throw new SystemException("角色id不能为空");
+        }
+        //获取机构层级
+//        int deptLevel = sysUserService.getDeptLevel(sysUserVo);
+//        if (!StringUtils.isNullOrEmpty(sysUser.getRoleId())) {
+//            if (RoleConstants.R21.getCode().equals(sysUser.getRoleId())
+//                    || RoleConstants.R20.getCode().equals(sysUser.getRoleId())
+//                    || RoleConstants.R19.getCode().equals(sysUser.getRoleId())) {//19 出单员 21	团队长 20	代理人
+//
+//                if (deptLevel != 6) {
+//                    throw new SystemException("团队长、代理人、出单员只能归属团队中");
+//                }
+//                //如果为团队长,判断是否已经存在团队长,存在不允许添加   add by  hxl  2024-05-07  ============begin
+//                if (RoleConstants.R21.getCode().equals(sysUser.getRoleId())) {
+//                    int count = sysUserService.getCountByDeptAndRoleId(sysUser);
+//                    if (count > 0) {
+//                        throw new SystemException("该机构已存在团队长,不允许再添加!!");
+//                    }
+//                }
+//                // =========================add by hxl   end ====================
+//            } else if (RoleConstants.R18.getCode().equals(sysUser.getRoleId())) { // 42 门店长
+//                if (deptLevel != 5) {
+//                    throw new SystemException("机构管理员只能归属机构中");
+//                }
+//            } else if (RoleConstants.R17.getCode().equals(sysUser.getRoleId())) {
+//                if (deptLevel != 4) {
+//                    throw new SystemException("部长只能归属于4级");
+//                }
+//            }
+//
+//        }
+        return sysUserService.newSaveUserInfoByPartner(sysUserVo);
+    }
+
+
+    @ApiOperation(value = "(新合伙人页面)新保存合伙人")
+    @PostMapping(value = "/saveByPartner")
+    public HttpResult saveByPartner(@RequestBody SysUser2Vo sysUser2Vo) {
+        log.info("添加合伙人入参:{}", sysUser2Vo);
+        //by gws 21	团队长 20	代理人 必须归属团队
+        // 22	后线人员 必须归属部门
+        SysUser sysUser = sysUser2Vo.getSysUser();
+        sysUser.setNewApp(1);
+        if (StringUtils.isNullOrEmpty(sysUser)) {
+            return HttpResult.error("用户信息不能为空");
+        }
+        if (StringUtils.isNullOrEmpty(sysUser.getDeptId())) {
+            return HttpResult.error("机构ID不能为空");
+        }
+        if (StringUtils.isNullOrEmpty(sysUser.getRoleId())) {
+            throw new SystemException("角色id不能为空");
+        }
+        //获取机构层级
+        int deptLevel = sysUserService.getDeptLevel1(sysUser.getDeptId());
+        if (!StringUtils.isNullOrEmpty(sysUser.getRoleId())) {
+            if (RoleConstants.R21.getCode().equals(sysUser.getRoleId())
+                    || RoleConstants.R20.getCode().equals(sysUser.getRoleId())
+                    || RoleConstants.R19.getCode().equals(sysUser.getRoleId())) {//19 出单员 21	团队长 20	代理人
+
+                if (deptLevel != 6) {
+                    throw new SystemException("团队长、代理人、出单员只能归属团队中");
+                }
+                //如果为团队长,判断是否已经存在团队长,存在不允许添加   add by  hxl  2024-05-07  ============begin
+                if (RoleConstants.R21.getCode().equals(sysUser.getRoleId())) {
+                    int count = sysUserService.getCountByDeptAndRoleId(sysUser);
+                    if (count > 0) {
+                        throw new SystemException("该机构已存在团队长,不允许再添加!!");
+                    }
+                }
+                // =========================add by hxl   end ====================
+            } else if (RoleConstants.R18.getCode().equals(sysUser.getRoleId())) { // 42 门店长
+                if (deptLevel != 5) {
+                    throw new SystemException("机构管理员只能归属机构中");
+                }
+            } else if (RoleConstants.R17.getCode().equals(sysUser.getRoleId())) {
+                if (deptLevel != 4) {
+                    throw new SystemException("部长只能归属于4级");
+                }
+            }
+
+        }
+        return sysUserService.saveByPartner(sysUser2Vo);
+    }
+
+
+
+    @ApiOperation(value = "(新合伙人页面)新合伙人用户详情信息")
+    @PostMapping(value = "/updateByPartner/{userId}")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "userId", value = "用户信息", required = true, dataType = "String")
+    })
+    @Transactional
+    public HttpResult updateByPartner(@PathVariable String userId, @RequestBody SysUser2Vo sysUser2Vo) {
+        return sysUserService.updateByPartner(userId, sysUser2Vo);
+    }
+
+
+    @ApiOperation(value = "(新合伙人页面)获取用户")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "userId", required = true, value = "用户ID")
+    })
+    @GetMapping(value = "/queryPartnerByUserId/{userId}")
+    public HttpResult queryPartnerByUserId(@PathVariable String userId) {
+        SysUserInfoQuery sysUserVo = new SysUserInfoQuery();
+        // 查询用户
+        SysUser sysUser = sysUserService.getById(userId);
+        // 查询角色
+        SysUserRole sysUserRole = sysUserRoleService.selectByUserId(userId);
+//        SysUserRole sysUserRole = sysUserRoleService.getById(userId);
+        if (!ObjectUtils.isEmpty(sysUserRole)) {
+            sysUser.setRoleId(StringUtils.toString(sysUserRole.getRoleId()));
+        }
+        //查询 机构的上级
+        SysDept sysDept = sysDeptService.getById(sysUser.getDeptId());
+        sysUser.setPdeptId(sysDept.getParentId());
+        if ("19".equals(sysUser.getRoleId())) {
+            SysUser operator = sysUserService.getById(sysUser.getOperatorCode());
+            sysUser.setReferrerId(operator != null ? operator.getId() : "");
+            sysUser.setReferrerName(operator != null ? operator.getName() : "");
+            sysUserVo.setSysUser(sysUser);
+            List<EsmUserImageQueryVo> esmUserImageQueryVo = esmUserImageService.getEsmUserImageQueryVo(userId);
+            sysUserVo.setEsmUserImageVo(esmUserImageQueryVo);
+            sysUserVo.setSysUserInfo(sysUserInfoService.getById(userId));
+            SpringUtil.getBean(RecordUserUtils.class).addRecord(userId, BaseController.getUserName());
+            return HttpResult.ok(sysUserVo);
+        }
+        // 查询推荐人
+        EsmUserReferrer referrer = esmUserReferrerService.getById(userId);
+        if (ObjectUtils.isEmpty(referrer)) {
+            sysUser.setReferrerId(null);
+            sysUser.setReferrerName(null);
+        } else {
+            sysUser.setReferrerId(referrer.getReferrerId());
+            sysUser.setReferrerName(referrer.getReferrerName());
+        }
+        //查询详情信息
+        SysUserInfo userInfo = sysUserInfoService.getById(userId);
+
+        String addr = Optional.ofNullable(userInfo).map(SysUserInfo::getLiveAddress).orElse(null);
+        if (StringUtils.isNotEmpty(addr)) {
+            userInfo.setLiveAddressString(addr.split(","));
+        }
+
+        //查询用户绑定的银行卡信息
+        SysUserBankCard queryBank = new SysUserBankCard();
+        queryBank.setUserId(userId);
+        queryBank.setAuditStatus("1");
+        HttpResult<List<SysUserBankCard>> userBankList = sysUserBankCardService.getUserBankListByQueryParam(queryBank);
+        if (!Objects.isNull(userInfo)) {
+            if (userBankList.getData().isEmpty()) {
+                userInfo.setBankName(null);
+                userInfo.setAccountno(null);
+            } else {
+                userInfo.setBankName(userBankList.getData().get(0).getBankAccount());
+                userInfo.setAccountno(userBankList.getData().get(0).getBankNumber());
+            }
+        }
+
+
+        List<EsmUserImageQueryVo> esmUserImageQueryVo = esmUserImageService.getEsmUserImageQueryVo(userId);
+
+        sysUserVo.setSysUser(sysUser);
+        sysUserVo.setSysUserInfo(userInfo);
+        sysUserVo.setEsmUserImageVo(esmUserImageQueryVo);
+//        List<PartnerUserGrade> partnerUserGrades = gradeMapper.selectList(new LambdaQueryWrapper<>(PartnerUserGrade.class).eq(PartnerUserGrade::getUserId, userId));
+//        List<String> collect = partnerUserGrades.stream().map(partnerUserGrade -> partnerUserGrade.getGrade()).collect(Collectors.toList());
+        sysUserVo.setGradeList(new ArrayList<>());
+        //初始化添加人员修改记录
+        SpringUtil.getBean(RecordUserUtils.class).addRecord(userId, null);
+        return HttpResult.ok(sysUserVo);
+
+    }
+
+
+
     @ApiOperation(value = "保存团队长用户基本详情信息")
     @PostMapping(value = "/saveTeamLeader")
     public HttpResult saveTeamLeader(@RequestBody SysUser2Vo sysUserVo) {

+ 2 - 2
src/main/java/com/ydtech/modules/admin/controller/wechat/WechatCustomerController.java

@@ -36,8 +36,8 @@ public class WechatCustomerController {
 
     @PostMapping(path = "/callback", consumes = MediaType.TEXT_XML_VALUE, produces = MediaType.TEXT_XML_VALUE)
     @ApiOperation(value = "客服回调(处理事件发送欢迎语)")
-    public HttpResult<String> customerCallback(@RequestBody String wechatEncrypt) throws JsonProcessingException, WxErrorException {
-        customerService.callbackSendMsgOnEvent(wechatEncrypt);
+    public HttpResult<String> customerCallback(@RequestBody String wechatEncrypt) throws Exception {
+        customerService.callbackSendMsgOnEventOld(wechatEncrypt);
         return HttpResult.ok();
     }
 

+ 4 - 0
src/main/java/com/ydtech/modules/admin/dao/SysPartnerAccountMapper.java

@@ -10,4 +10,8 @@ public interface SysPartnerAccountMapper extends BaseMapper<SysPartnerAccount> {
 
     SysPartnerAccount getByDeptBalanceDto(DeptBalanceDto itemLeader);
 
+
+    SysPartnerAccount selectFee(String userId);
+
+
 }

+ 2 - 0
src/main/java/com/ydtech/modules/admin/dao/SysUserAccountMapper.java

@@ -22,6 +22,8 @@ public interface SysUserAccountMapper extends BaseMapper<SysUserAccount> {
 
     Page<SysUserAccount> queryPageOrder1(@Param("page") Page page,@Param("sysUserAccountVo") SysUserAccountVo sysUserAccountVo);
 
+    List<SysUserAccount> querySum(@Param("sysUserAccountVo") SysUserAccountVo sysUserAccountVo);
+
     SysUserAccount getById(String userId);
     /**
      *  @version

+ 9 - 0
src/main/java/com/ydtech/modules/admin/dao/SysUserMapper.java

@@ -573,6 +573,15 @@ public interface SysUserMapper extends BaseMapper<SysUser> {
      * @Description: 查询所有的人员
      */
     Page<SysUserBaseVO> findAllUsers(@Param("page") Page<SysUserBaseVO> page, @Param("user") SysUserDto sysUserDto);
+
+
+    Page<SysUserBaseVO> findPartnerUserList(@Param("page") Page<SysUserBaseVO> page, @Param("user") SysUserDto user);
+
+    @Select(" SELECT id FROM sys_user WHERE `status` = 1 and internal_id = 1 ")
+    List<String> queryInternalNumber();
+
+    @Select("SELECT COUNT(r.role_id) FROM sys_user u LEFT JOIN sys_user_role r ON u.id = r.user_id WHERE u.mobile = #{mobile} AND r.role_id = #{roleId}")
+    int countTeamLeader(@Param("mobile")String mobile,@Param("roleId") String roleId);
 }
 
 

+ 18 - 0
src/main/java/com/ydtech/modules/admin/dao/WorkScheduleConfigMapper.java

@@ -0,0 +1,18 @@
+package com.ydtech.modules.admin.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ydtech.modules.admin.model.po.WorkScheduleConfig;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 工作时间配置表 Mapper 接口
+ * </p>
+ *
+ * @author author
+ * @since 2024-01-01
+ */
+@Mapper
+public interface WorkScheduleConfigMapper extends BaseMapper<WorkScheduleConfig> {
+
+}

+ 20 - 0
src/main/java/com/ydtech/modules/admin/model/SysPartnerAccount.java

@@ -1,6 +1,7 @@
 package com.ydtech.modules.admin.model;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
@@ -52,4 +53,23 @@ public class SysPartnerAccount {
     private Date createTime;
 
 
+    @TableField(exist = false)
+    private BigDecimal unreportedAmount;
+
+    @ApiModelProperty(value = "已转入金额")
+    @TableField(exist = false)
+    private BigDecimal transferAmount;
+
+    @ApiModelProperty(value = "已过期金额")
+    @TableField(exist = false)
+    private BigDecimal expiredAmount;
+
+    @ApiModelProperty(value = "总佣金")
+    @TableField(exist = false)
+    private BigDecimal totalAmount;
+
+    @ApiModelProperty(value = "冻结")
+    @TableField(exist = false)
+    private BigDecimal frozenAmount;
+
 }

+ 23 - 0
src/main/java/com/ydtech/modules/admin/model/SysUser.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.google.gson.annotations.SerializedName;
 import com.ydtech.exception.SystemException;
 import com.ydtech.modules.base.model.BaseEntity;
 import io.swagger.annotations.ApiModel;
@@ -104,6 +105,12 @@ public class SysUser extends BaseEntity {
     @TableField(value = "alipay")
     private String alipay;
 
+    /**
+     * 微信客服id
+     */
+    @SerializedName("external_userid")
+    private String externalUserId;
+
     /**
      * 审批意见
      */
@@ -250,6 +257,22 @@ public class SysUser extends BaseEntity {
     @ApiModelProperty(value = "是否判断锁定状态 0.否 1. 是 默认判断")
     private Integer isLock = 1;
 
+    @ApiModelProperty("合伙人等级")
+    @TableField(exist = false)
+    private List<String> gradeList;
+
+    @ApiModelProperty("二维码邀请合伙人等级")
+    @TableField(exist = false)
+    private Integer grade;
+
+    @ApiModelProperty("0-旧版本APP;1-新版APP")
+    @TableField(value = "new_app")
+    private int newApp;
+
+    @ApiModelProperty("是否内部工号0-否;1-是")
+    @TableField(value = "internal_id")
+    private boolean internalId;
+
     /**
      * 验证用户
      *

+ 3 - 0
src/main/java/com/ydtech/modules/admin/model/dto/AgentUserDto.java

@@ -42,4 +42,7 @@ public class AgentUserDto {
     @ApiModelProperty(value = "个代、出单员标识:2个代、1出单员",required = true)
     private String flag;
 
+    @ApiModelProperty(value = "0-旧版本APP;1-新版APP",required = true)
+    private String newApp;
+
 }

+ 4 - 0
src/main/java/com/ydtech/modules/admin/model/dto/AgentUserNewDto.java

@@ -37,4 +37,8 @@ public class AgentUserNewDto {
     @NotBlank(message = "个代、出单员标识不能为空")
     @ApiModelProperty(value = "个代、出单员标识:2个代、1出单员",required = true)
     private String flag;
+
+    @ApiModelProperty(value = "0-旧版本APP;1-新版APP",required = true)
+    private String newApp;
+
 }

+ 3 - 0
src/main/java/com/ydtech/modules/admin/model/dto/SysUserDto.java

@@ -54,4 +54,7 @@ public class SysUserDto extends PageRequest {
     private String notSelected;
     //区分管理还是审核
     private int examine;
+
+
+    private SysUserDto dto;
 }

+ 113 - 0
src/main/java/com/ydtech/modules/admin/model/po/WorkScheduleConfig.java

@@ -0,0 +1,113 @@
+package com.ydtech.modules.admin.model.po;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 工作时间配置表
+ * </p>
+ *
+ * @author author
+ * @since 2024-01-01
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("work_schedule_config")
+public class WorkScheduleConfig implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 日期类型:工作日/休息日
+     */
+    @TableField("day_type")
+    private String dayType;
+
+    /**
+     * 时间段:上午/下午
+     */
+    @TableField("time_slot")
+    private String timeSlot;
+
+    /**
+     * 开始时间
+     */
+    @TableField("start_time")
+    @JsonFormat(pattern = "HH:mm:ss")
+    private LocalTime startTime;
+
+    /**
+     * 结束时间
+     */
+    @TableField("end_time")
+    @JsonFormat(pattern = "HH:mm:ss")
+    private LocalTime endTime;
+
+    /**
+     * 是否生效
+     */
+    @TableField("is_active")
+    private Boolean active;
+
+    /**
+     * 创建时间
+     */
+    @TableField(value = "created_at", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createdAt;
+
+    /**
+     * 更新时间
+     */
+    @TableField(value = "updated_at", fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updatedAt;
+
+    /**
+     * 日期类型枚举
+     */
+    @AllArgsConstructor
+    @Getter
+    public enum DayType {
+
+        WEEKDAY("weekday", "工作日"),
+        WEEKEND("weekend", "休息日");
+
+        private final String code;
+
+        private final String desc;
+
+
+    }
+
+    /**
+     * 时间段枚举
+     */
+    @AllArgsConstructor
+    @Getter
+    public enum TimeSlot {
+        MORNING("morning", "上午"),
+        AFTERNOON("afternoon", "下午");
+
+        private final String code;
+        private final String desc;
+
+    }
+}

+ 11 - 0
src/main/java/com/ydtech/modules/admin/model/vo/AppUserInfoVo.java

@@ -3,6 +3,7 @@ package com.ydtech.modules.admin.model.vo;
 import cn.afterturn.easypoi.excel.annotation.Excel;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.ydtech.modules.admin.model.SysPartnerConfig;
+import com.ydtech.modules.order.entity.po.InsUploadFiles;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -56,4 +57,14 @@ public class AppUserInfoVo {
     @ApiModelProperty(value = "类型:合伙人等级")
     private int level;
 
+    @ApiModelProperty(value = "新  类型:合伙人等级")
+    private int grade;
+
+    @ApiModelProperty(value = "头像")
+    private String pictureUrl;
+
+    @ApiModelProperty(value = "APP头像")
+    private InsUploadFiles insUploadFiles;
+
+
 }

+ 2 - 0
src/main/java/com/ydtech/modules/admin/model/vo/SysUserInfoQuery.java

@@ -22,5 +22,7 @@ public class SysUserInfoQuery {
     @ApiModelProperty("影像信息")
     private List<EsmUserImageQueryVo> esmUserImageVo;
 
+    @ApiModelProperty("用户等级")
+    private List<String> gradeList;
 
 }

+ 22 - 0
src/main/java/com/ydtech/modules/admin/service/IWorkScheduleConfigService.java

@@ -0,0 +1,22 @@
+package com.ydtech.modules.admin.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ydtech.modules.admin.model.po.WorkScheduleConfig;
+
+/**
+ * <p>
+ * 工作时间配置表 服务类
+ * </p>
+ *
+ * @author author
+ * @since 2024-01-01
+ */
+public interface IWorkScheduleConfigService extends IService<WorkScheduleConfig> {
+
+    /**
+     * 判断现在的时间是否是工作时间 true 工作时间 false 休息时间
+     */
+    boolean isWorkingHours();
+
+}

+ 2 - 0
src/main/java/com/ydtech/modules/admin/service/SysAgencyFeeApprovalService.java

@@ -34,4 +34,6 @@ public interface SysAgencyFeeApprovalService extends IService<SysAgencyFeeApprov
     List<SysAgencyFeeApproval> queryOperateInfo(SysAgencyFeeApprovalDto sysAgencyFeeApprovalDto);
 
     SysAgencyFeeApprovalRecordVo operateInfo(Integer id);
+
+    HttpResult partnerAccount(SysAgencyFeeApprovalAddDto sysAgencyFeeApprovalAddDto);
 }

+ 2 - 0
src/main/java/com/ydtech/modules/admin/service/SysDeptService.java

@@ -116,6 +116,8 @@ public interface SysDeptService extends IService<SysDept> {
 
     List<SysDeptTreeVo> getPartnerDeptTree();
 
+    List<SysDeptTreeVo> newGetPartnerDeptTree();
+
     /**
      * 对比订单中的业务来源和传入业务来源是否一致
      * @param orderNo 订单号

+ 2 - 0
src/main/java/com/ydtech/modules/admin/service/SysUserAccountService.java

@@ -26,6 +26,8 @@ public interface SysUserAccountService extends IService<SysUserAccount> {
 
     BasePageResult<SysUserAccount> queryByVo1(SysUserAccountVo sysUserAccountVo);
 
+    SysUserAccount querySum(SysUserAccountVo sysUserAccountVo);
+
     HttpResult<Object> inert(SysUserAccountVo sysUserAccountVo);
 
     HttpResult withdraw(SysUserAccountVo sysUserAccountVo);

+ 19 - 15
src/main/java/com/ydtech/modules/admin/service/SysUserService.java

@@ -132,7 +132,6 @@ public interface SysUserService extends BaseIService<SysUser> {
     boolean saveUser(SysUser sysUser);
 
     HttpResult saveUserInfo(SysUser2Vo sysUserVo);
-
     SysUser saveUserJzgInfo(SysUser2Vo sysUserVo);
 
     HttpResult saveUserInfoByPartner(SysUser2Vo sysUserVo);
@@ -258,10 +257,8 @@ public interface SysUserService extends BaseIService<SysUser> {
      * @return
      */
     List<String> getTelemarketingPersonnelData();
-
     /**
      * 获取当前用户的下级所有人员
-     *
      * @return
      */
     List<SysUser> findNextTree();
@@ -273,7 +270,6 @@ public interface SysUserService extends BaseIService<SysUser> {
 
     /**
      * 获取当前用户的所有代理人
-     *
      * @return
      */
     List<SysUser> findNextAgentTree(String pid);
@@ -297,7 +293,6 @@ public interface SysUserService extends BaseIService<SysUser> {
      * @Description: 查询用户管理的电销组员
      */
     List<String> getGroupByUserId(String userId);
-
     /**
      * @version
      * @author: whp
@@ -308,7 +303,6 @@ public interface SysUserService extends BaseIService<SysUser> {
 
     /**
      * 获取人员数
-     *
      * @return
      */
     List<SysUser> getTreeUser();
@@ -319,7 +313,7 @@ public interface SysUserService extends BaseIService<SysUser> {
     /**
      * 个代注册
      *
-     * @param dto         注册dto
+     * @param dto 注册dto
      * @param recommender 推荐人信息
      * @return
      */
@@ -329,13 +323,12 @@ public interface SysUserService extends BaseIService<SysUser> {
      * 个代认证
      *
      * @param sysUser 用户信息
-     * @param dto     认证dto
+     * @param dto 认证dto
      */
     SysUserAgentVo agentAuth(SysUser sysUser, AgentAuthDto dto);
 
     /**
      * 个代(认证/审核)结果获取
-     *
      * @param sysUser
      * @param dto
      */
@@ -343,7 +336,6 @@ public interface SysUserService extends BaseIService<SysUser> {
 
     /**
      * 个代资料提交
-     *
      * @param sysUser
      * @param dto
      * @return
@@ -351,6 +343,7 @@ public interface SysUserService extends BaseIService<SysUser> {
     void agentSubmit(SysUser sysUser, AgentSubmitDto dto);
 
     /**
+     *
      * @param roleId 角色id
      * @param deptId 机构id
      * @return 用户信息
@@ -364,7 +357,6 @@ public interface SysUserService extends BaseIService<SysUser> {
     List<SysUser> selectByUserId(List<String> ids);
 
     HttpResult userLogout(String userId);
-
     /**
      * @version
      * @author: hxl
@@ -375,10 +367,10 @@ public interface SysUserService extends BaseIService<SysUser> {
 
 
     /**
-     * @version
-     * @author: hxl
-     * @Date: 2025/1/21 9:31
-     * @Description: 获取最大的id
+     *  @version
+     *  @author: hxl
+     *  @Date: 2025/1/21 9:31
+     *  @Description: 获取最大的id
      */
     String findNewMaxId(String deptId);
 
@@ -400,6 +392,18 @@ public interface SysUserService extends BaseIService<SysUser> {
         return user;
     }
 
+
+    HttpResult saveByPartner(SysUser2Vo sysUser2Vo);
+
+    HttpResult updateByPartner(String userId, SysUser2Vo sysUser2Vo);
+
+    Page<SysUserBaseVO> findPartnerUserList(SysUserDto sysUserDto);
+
+    HttpResult newSaveUserInfoByPartner(SysUser2Vo sysUserVo);
+
+    List<String> queryInternalNumber();
+
+
 }
 
 

+ 12 - 0
src/main/java/com/ydtech/modules/admin/service/SysWechatCustomerService.java

@@ -4,6 +4,7 @@ import com.github.pagehelper.PageInfo;
 import com.ydtech.exception.SystemException;
 import com.ydtech.extension.BaseIService;
 import com.ydtech.modules.admin.model.po.SysWechatCustomer;
+import com.ydtech.modules.admin.model.po.SysWechatCustomerDuty;
 import com.ydtech.modules.admin.model.vo.wechat.SysWechatCustomerDutyRulesVo;
 import com.ydtech.modules.admin.model.vo.wechat.SysWechatCustomerQueryVo;
 import com.ydtech.modules.admin.model.vo.wechat.SysWechatCustomerVo;
@@ -58,6 +59,7 @@ public interface SysWechatCustomerService extends BaseIService<SysWechatCustomer
 
     /**
      * 昵称是否存在
+     *
      * @param nickname
      */
     default void isNicknameRepeat(String nickname) {
@@ -70,4 +72,14 @@ public interface SysWechatCustomerService extends BaseIService<SysWechatCustomer
 
     SysWechatCustomer getCacheCustomerId(SysWechatCustomer sysWechatCustomer);
 
+
+    /**
+     * 判断管理人是否一致
+     *
+     * @param externalUserId 企业微信id
+     * @param sysWechatCustomer       客服
+     * @return true 一致  false 不一致
+     *
+     */
+    boolean whetherTheManagersAreConsistent(String externalUserId, SysWechatCustomer sysWechatCustomer,  List<SysWechatCustomerDuty> sysWechatCustomerDuties);
 }

+ 8 - 1
src/main/java/com/ydtech/modules/admin/service/WechatCustomerService.java

@@ -25,7 +25,14 @@ public interface WechatCustomerService {
      *
      * @param wechatEncrypt
      */
-    void callbackSendMsgOnEvent(String wechatEncrypt) throws JsonProcessingException, WxErrorException;
+    void callbackSendMsgOnEventNew(String wechatEncrypt) throws Exception;
+
+    /**
+     * 回调事件
+     *
+     * @param wechatEncrypt
+     */
+    void callbackSendMsgOnEventOld(String wechatEncrypt) throws Exception;
 
 
     /**

+ 67 - 1
src/main/java/com/ydtech/modules/admin/service/impl/SysAgencyFeeApprovalServiceImpl.java

@@ -19,6 +19,8 @@ import com.ydtech.modules.admin.service.SysAgencyFeeApprovalService;
 import com.ydtech.modules.admin.service.SysAgencyLeaderService;
 import com.ydtech.modules.base.controller.BaseController;
 import com.ydtech.modules.order.entity.BasePageResult;
+import com.ydtech.modules.partner.dao.PartnerPartnerAccountMapper;
+import com.ydtech.modules.partner.model.PartnerPartnerAccount;
 import com.ydtech.utils.StringUtils;
 import com.ydtech.utils.idgen.IdGenerate;
 import org.springframework.stereotype.Service;
@@ -55,7 +57,8 @@ public class SysAgencyFeeApprovalServiceImpl extends ServiceImpl<SysAgencyFeeApp
     @Resource
     private SysUserMapper sysUserMapper;
 
-
+    @Resource
+    private PartnerPartnerAccountMapper partnerAccountMapper;
 
 
     @Override
@@ -241,5 +244,68 @@ public class SysAgencyFeeApprovalServiceImpl extends ServiceImpl<SysAgencyFeeApp
         return sysAgencyFeeApprovalRecordVo;
     }
 
+    @Override
+    public HttpResult partnerAccount(SysAgencyFeeApprovalAddDto sysAgencyFeeApprovalAddDto) {
+        BigDecimal actualFee = sysAgencyFeeApprovalAddDto.getActualFee();
+        if (actualFee == null || actualFee.equals(new BigDecimal("0.00"))) {
+            throw new SystemException("请输入提现金额");
+        }
+        //当前登录用户
+        SysUser user = BaseController.getUser();
+        SysPartnerAccount account = sysPartnerAccountMapper.selectOne(new LambdaQueryWrapper<>(SysPartnerAccount.class).eq(SysPartnerAccount::getUserId,user.getId()));
+        BigDecimal cashFee = account.getCashFee();
+        int compare = cashFee.compareTo(actualFee);
+        if (compare < 0) {
+            throw new SystemException("提现金额不能超过可提现金额");
+        }
+
+
+        SysAgencyFeeApproval sysAgencyFeeApproval = BeanUtil.copyProperties(sysAgencyFeeApprovalAddDto, SysAgencyFeeApproval.class);
+        sysAgencyFeeApproval.setUserId(user.getId());
+        sysAgencyFeeApproval.setUserName(user.getName());
+        sysAgencyFeeApproval.setDeptId(user.getDeptId());
+        SysDept sysDept = sysDeptMapper.selectOne(new LambdaQueryWrapper<SysDept>().eq(SysDept::getId, user.getDeptId()).eq(SysDept::getDelFlag, 0));
+        if (sysDept != null) {
+            sysAgencyFeeApproval.setDeptName(sysDept.getName());
+        }
+        sysAgencyFeeApproval.setNumber(IdGenerate.nextId());
+        //总保费
+        sysAgencyFeeApproval.setSumpremium(account.getSumPremium());
+        //总保费抽成费用
+        sysAgencyFeeApproval.setExtractFee(account.getExtractFee());
+        //已提现抽成费用
+//        sysAgencyFeeApproval.setHistoryFee(null);
+        //可提现抽成费用
+        sysAgencyFeeApproval.setCashFee(actualFee);
+//        sysAgencyFeeApproval.setStartTime(agencyExtractFee.getStartTime());
+//        sysAgencyFeeApproval.setProportional(agencyExtractFee.getProportional());
+        sysAgencyFeeApproval.setCreateBy(user.getName());
+        sysAgencyFeeApproval.setCreateTime(new Date());
+        sysAgencyFeeApproval.setStatus("0");
+        sysAgencyFeeApprovalMapper.insert(sysAgencyFeeApproval);
+
+
+        account.setCashFee(account.getCashFee().subtract(actualFee));
+        BigDecimal historyFee = account.getHistoryFee();
+        if (historyFee == null) {
+            account.setHistoryFee(actualFee);
+        }else {
+            account.setHistoryFee(account.getHistoryFee().add(actualFee));
+        }
+        sysPartnerAccountMapper.updateById(account);
+
+
+        //保存添加记录
+        SysAgencyFeeApprovalRecord sysAgencyFeeApprovalRecord = BeanUtil.copyProperties(sysAgencyFeeApproval, SysAgencyFeeApprovalRecord.class);
+        sysAgencyFeeApprovalRecord.setApprovalId(sysAgencyFeeApproval.getId());
+        sysAgencyFeeApprovalRecord.setId(null);
+        boolean i = sysAgencyFeeApprovalRecordMapper.insert(sysAgencyFeeApprovalRecord)>0;
+        if (i) {
+            return HttpResult.ok("提现申请提交成功");
+        }
+        return HttpResult.error("提现申请提交失败");
+    }
+
+
 
 }

+ 2 - 1
src/main/java/com/ydtech/modules/admin/service/impl/SysAmountAuditingServiceImpl.java

@@ -144,11 +144,12 @@ public class SysAmountAuditingServiceImpl extends ServiceImpl<SysAmountAuditingM
             //插入轨迹表
             SysAmountAuditingHistory sysAmountAuditingHistory =new SysAmountAuditingHistory(null, sysAmountAuditingEntity.getId(), amount, userId,new Date(),"4", "1",sysUserAccountHistory.getId());
             sysAmountAuditingHistoryService.save(sysAmountAuditingHistory);
-            sendLgParams(sysAmountAuditingEntity,sysAmountAuditingHistory.getAuditingStatus());
         }
     }
 
 
+    //sendLgParams(sysAmountAuditingEntity,sysAmountAuditingHistory.getAuditingStatus());
+    //   线下提现取消推送
     public void sendLgParams(SysAmountAuditingEntity sysAmountAuditingEntity,String auditingStatus){
         PushLgEntity lgEntity = new PushLgEntity();
         lgEntity.setApplicationTime(new Date());

+ 54 - 0
src/main/java/com/ydtech/modules/admin/service/impl/SysDeptServiceImpl.java

@@ -719,6 +719,60 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept>
         return sysDeptTreeVos;
     }
 
+
+
+    @Override
+    public List<SysDeptTreeVo> newGetPartnerDeptTree() {
+        String deptId = "9";
+        SysDept sysDept = getById(deptId);
+        if (sysDept == null) {
+            return Collections.emptyList();
+        }
+
+        LambdaQueryWrapper<SysDept> lqw = new LambdaQueryWrapper<>();
+        lqw.eq(SysDept::getDelFlag, 0);
+        lqw.likeRight(SysDept::getId, deptId);
+        lqw.orderByAsc(SysDept::getOrderNum);
+        List<SysDept> sysDeptList = list(lqw);
+
+        List<SysDeptTreeVo> sysDeptTreeVos = BeanUtil.copyToList(sysDeptList, SysDeptTreeVo.class);
+
+        Map<String, List<SysDeptTreeVo>> map = sysDeptTreeVos.stream()
+                .sorted(Comparator.comparing(SysDeptTreeVo::getId))
+                .collect(Collectors.groupingBy(SysDeptTreeVo::getParentId));
+
+        sysDeptTreeVos.forEach(i -> {
+            i.setChildren(map.getOrDefault(i.getId(), new ArrayList<>()));
+            i.setDeptCount(i.getChildren().size());
+        });
+
+        sysDeptTreeVos = map.getOrDefault(sysDept.getParentId(), new ArrayList<>());
+
+        // 使用递归统一处理 comlevel 过滤
+        for (SysDeptTreeVo vo : sysDeptTreeVos) {
+            if (StringUtils.isNullOrEmpty(vo.getComlevel())){
+                filterAndProcessChildren(vo);
+            }else {
+                if (Integer.parseInt(vo.getComlevel()) >= 4){
+                    filterAndProcessChildren(vo);
+                }else {
+                    break;
+                }
+            }
+        }
+        return sysDeptTreeVos;
+    }
+
+    private void filterAndProcessChildren(SysDeptTreeVo node) {
+        List<SysDeptTreeVo>   filtered = node.getChildren().stream()
+                .filter(child -> child.getComlevel() != null && Integer.parseInt(child.getComlevel()) <= 4)
+                .peek(this::filterAndProcessChildren)
+                .collect(Collectors.toList());
+        node.setChildren(filtered);
+    }
+
+
+
     @Override
     public boolean contrastiveManagementSource(String orderNo, String managementSource) {
         String managementSourceDept = sysDeptMapper.getByOrderNoQueryManagementSource(orderNo);

+ 66 - 3
src/main/java/com/ydtech/modules/admin/service/impl/SysUserAccountServiceImpl.java

@@ -8,6 +8,7 @@ import com.ydtech.core.page.HttpResult;
 import com.ydtech.exception.SystemException;
 import com.ydtech.modules.admin.constants.ManagementSource;
 import com.ydtech.modules.admin.constants.MoneyAttrConstants;
+import com.ydtech.modules.admin.constants.SwitchConfig;
 import com.ydtech.modules.admin.constants.WithdrawTypeConstants;
 import com.ydtech.modules.admin.dao.SysUserAccountMapper;
 import com.ydtech.modules.admin.dao.SysUserBankCardMapper;
@@ -32,8 +33,13 @@ import com.ydtech.modules.order.entity.InsOrders;
 import com.ydtech.modules.order.service.InsAreaCompanyService;
 import com.ydtech.modules.protocols.entity.po.InsFeeOrderNew;
 import com.ydtech.modules.protocols.service.InsFeeOrderNewService;
+import com.ydtech.modules.ttqf.dao.PartTtqfRecordMapper;
+import com.ydtech.modules.ttqf.entity.PartTtqfRecord;
 import com.ydtech.modules.ttqf.entity.vo.UserWithdrawal;
 import com.ydtech.modules.ttqf.service.TtqfService;
+import com.ydtech.modules.ttqf.xxx.InitializeInternalWithdrawalId;
+import com.ydtech.modules.ttqf.xxx.RoundRobinService;
+import com.ydtech.modules.ttqf.xxx.VirtualWithdrawal;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
@@ -288,11 +294,63 @@ public class SysUserAccountServiceImpl extends ServiceImpl<SysUserAccountMapper,
                 sysUserAccountHistoryPage.getRecords());
     }
 
+    @Override
+    public SysUserAccount querySum(SysUserAccountVo sysUserAccountVo){
+        List<SysUserAccount> records = baseMapper.querySum(sysUserAccountVo);
+        SysUserAccount sumAccount = new SysUserAccount();
+        List<String> userIds = new ArrayList<>();
+        List<String> dxUserIds = new ArrayList<>();
+        if (records != null) {
+            BigDecimal ssKTAmountSum = BigDecimal.ZERO;
+            BigDecimal ysTXAmountSum = BigDecimal.ZERO;
+            BigDecimal txzTXAmountSum = BigDecimal.ZERO;
+            BigDecimal sumAmountSum = BigDecimal.ZERO;
+            BigDecimal sumDocumentary = BigDecimal.ZERO;
+            if (records != null && !records.isEmpty()) {
+                for (SysUserAccount sysUserAccount : records) {
+                    //如果是电销组长,将组员的数据算进来
+                    if ("72".equals(sysUserAccount.getRoleId()) && "3".equals(sysUserAccount.getManagementSource())) {
+                        dxUserIds.add(sysUserAccount.getUserId());
+                    }
+                    userIds.add(sysUserAccount.getUserId());
+                    BigDecimal ssKTAmount = sysUserAccount.getSumAmount() == null ? BigDecimal.ZERO : sysUserAccount.getSumAmount();
+                    ssKTAmountSum = ssKTAmountSum.add(ssKTAmount);
+//                    sumDocumentary = sumDocumentary.add(sysUserAccount.getDocumentary());
+                }
+                if(!dxUserIds.isEmpty()) {
+                    userIds.addAll(insFeeOrderNewService.findDxUserIds(dxUserIds));
+                }
+                ysTXAmountSum = insFeeOrderNewService.findSumAmountYTXmount(userIds,"3");
+                txzTXAmountSum = insFeeOrderNewService.findSumAmountYTXmount(userIds, "2");
+                sumDocumentary = sumDocumentary.add(ysTXAmountSum.add(ssKTAmountSum).add(txzTXAmountSum));
+                sumAmountSum = sumAmountSum.add(ssKTAmountSum);
+            }
+            //可提现
+            sumAccount.setSumAmountWithdrawal(sumAmountSum);
+            // 已提现金额
+            sumAccount.setSumAmountAccount(ysTXAmountSum);
+            // 支付中的金额
+            sumAccount.setSumAmountPayment(txzTXAmountSum);
+            // 总金额
+            sumAccount.setDocumentary(sumDocumentary);
+        }
+        return sumAccount;
+    }
+
     @Override
     @Transactional
     public HttpResult<Object> inert(SysUserAccountVo sysUserAccountVo) {
         String userId = BaseController.getUser().getId();
-        if (isManagement(userId) && sysSwitchConfigService.getBalanceExtractStatus()) {
+//        if (isManagement(userId) && sysSwitchConfigService.getBalanceExtractStatus()) {
+//            //  个代走线上付款
+//            UserWithdrawal withdrawal = new UserWithdrawal();
+//            withdrawal.setUserId(userId);
+//            withdrawal.setAmount(sysUserAccountVo.getAmount());
+//            withdrawal.setBankNumber(sysUserAccountVo.getFromBankCardId());
+//            return ttqfService.userCashOut(withdrawal);
+//        }
+        SysUser byUserId = sysUserMapper.selectById(userId);
+        if (sysSwitchConfigService.isEnabled(SwitchConfig.VIRTUAL_WITHDRAWAL.getCode()) && byUserId.isInternalId()){
             //  个代走线上付款
             UserWithdrawal withdrawal = new UserWithdrawal();
             withdrawal.setUserId(userId);
@@ -300,6 +358,7 @@ public class SysUserAccountServiceImpl extends ServiceImpl<SysUserAccountMapper,
             withdrawal.setBankNumber(sysUserAccountVo.getFromBankCardId());
             return ttqfService.userCashOut(withdrawal);
         }
+
         //add  by  hxl   2024-09-26 添加电销组员开关
         boolean flag = sysSwitchConfigService.dxtxDisplaySwitches();
         if (flag) {
@@ -342,7 +401,6 @@ public class SysUserAccountServiceImpl extends ServiceImpl<SysUserAccountMapper,
                 throw new SystemException("该卡未绑定此账号,或输入卡号错误,或该账号尚未审核通过,请检查");
             }
             byId.setIsDefault(1);
-
             sysAmountAuditingEntity.setBankNumber(byId.getBankNumber());
             sysUserAccountHistory.setFromBankCard(byId.getBankNumber());
             sysUserBankCardService.updateById(byId);
@@ -411,11 +469,16 @@ public class SysUserAccountServiceImpl extends ServiceImpl<SysUserAccountMapper,
             SysAmountAuditingHistory sysAmountAuditingHistoryTwo = new SysAmountAuditingHistory(null, sysAmountAuditingEntity.getId(), amount, userId, date, "2", "1", sysUserAccountHistory.getId());
             sysAmountAuditingHistoryService.save(sysAmountAuditingHistory);
             sysAmountAuditingHistoryService.save(sysAmountAuditingHistoryTwo);
-
+        }
+        if (sysSwitchConfigService.isEnabled(SwitchConfig.VIRTUAL_WITHDRAWAL.getCode())){
+            SpringUtil.getBean(VirtualWithdrawal.class).virtualWithdrawal(userId, amount);
         }
         return HttpResult.ok("提现成功,等待审核");
     }
 
+
+
+
     public boolean isManagement(String userId) {
         SysUser sysUser = SpringUtil.getBean(SysUserBankCardMapper.class).selectByIdPay(userId);
         if (ManagementSource.MS_02.getCode().equals(sysUser.getManagementSource())) {

+ 623 - 5
src/main/java/com/ydtech/modules/admin/service/impl/SysUserServiceImpl.java

@@ -1,4 +1,5 @@
 package com.ydtech.modules.admin.service.impl;
+import java.util.Date;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
@@ -46,12 +47,19 @@ import com.ydtech.modules.message.constants.MessageTypeConstants;
 import com.ydtech.modules.message.entity.SystemMessage;
 import com.ydtech.modules.message.service.MessageSecretaryService;
 import com.ydtech.modules.message.service.SystemMessageService;
+import com.ydtech.modules.partner.utils.ListComparator;
+import com.ydtech.modules.partner.utils.UpdateRatioUtils;
+import com.ydtech.modules.partner.dao.PartnerUserMapper;
+import com.ydtech.modules.partner.model.PartnerUser;
+import com.ydtech.modules.partner.service.PartnerCommissionService;
+import com.ydtech.modules.partner.service.PartnerUserService;
 import com.ydtech.modules.protocol.utils.AssertionUtils;
 import com.ydtech.security.utils.PasswordUtils;
 import com.ydtech.utils.IDCardUtils;
 import com.ydtech.utils.StringUtils;
 import com.ydtech.utils.idgen.IdGenerate;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.redis.core.StringRedisTemplate;
@@ -151,6 +159,9 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     @Autowired
     private SysUserAccountMapper sysUserAccountMapper;
 
+    @Autowired
+    private PartnerUserService partnerUserService;
+
     @Value("${httpUrl}")
     private String httpUrl;
     //晋掌柜APP: 未注册的手机号登录时创建新账户使用 -deptId -referrerId
@@ -159,6 +170,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 
     @Value("${jzg.referrerId}")
     private String referrerId;
+    @Autowired
+    private PartnerUserMapper partnerUserMapper;
 
 
     @Override
@@ -1204,6 +1217,424 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         return HttpResult.ok("新增成功", sysUserMapper.selectById(userId));
     }
 
+
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResult newSaveUserInfoByPartner(SysUser2Vo sysUserVo) {
+        // 添加团队长
+        int tdz  = sysUserMapper.countTeamLeader(sysUserVo.getSysUser().getMobile(),RoleConstants.R21.getCode());
+        if (tdz > 0){
+            return HttpResult.error("已存在团队长,不允许再添加!!");
+        }
+        int cd  = sysUserMapper.countTeamLeader(sysUserVo.getSysUser().getMobile(),RoleConstants.R19.getCode());
+        if (cd > 0){
+            return HttpResult.error("已存在出单员,不允许再添加!!");
+        }
+        int gd  = sysUserMapper.countTeamLeader(sysUserVo.getSysUser().getMobile(),RoleConstants.R20.getCode());
+        if (gd > 0){
+            return HttpResult.error("已存在代理人,不允许再添加!!");
+        }
+        SysUser sysUser = sysUserVo.getSysUser();
+        String grade = String.valueOf(sysUser.getGrade() + 1);
+        String deptId = sysUser.getDeptId();
+        if (StringUtils.equals("4",grade) || StringUtils.equals("5",grade)){
+            deptId = addDeptUser(sysUser,grade);
+        }
+        sysUser.setDeptId(deptId);
+
+        //处理密码
+        if (StringUtils.isNotEmpty(sysUser.getPassword())) {
+            String salt = PasswordUtils.getSalt();
+            String pwd = PasswordUtils.encode(sysUser.getPassword(), salt);
+            sysUser.setPassword(pwd);
+            sysUser.setSalt(salt);
+        } else {
+            return HttpResult.error("密码不能为空");
+        }
+        String userId = gainNextUserId(deptId);
+
+        sysUser.setId(userId);
+        save(sysUser);
+
+        //角色配置
+        SysUserRole userRole = new SysUserRole();
+        userRole.setUserId(sysUser.getId());
+        userRole.setRoleId(StringUtils.toLong(sysUser.getRoleId()));
+        sysUserRoleService.save(userRole);
+        if (StringUtils.isNotEmpty(sysUser.getReferrerId())) {
+            //推荐人
+            esmUserReferrerService.addReferrer(sysUser.getReferrerId(), userId);
+        } else if ("20".equals(sysUser.getRoleId()) || "21".equals(sysUser.getRoleId())) {
+            //如果是 团队长或代码人 并且没有推荐人 则默认推荐人为自己
+            esmUserReferrerService.addReferrer(sysUser.getId(), userId);
+        }
+        SysUserInfo userInfo = sysUserVo.getSysUserInfo();
+        if (userInfo != null) {
+            if (null != userInfo.getLiveAddressString() && userInfo.getLiveAddressString().length > 0) {
+                sysUserVo.getSysUserInfo()
+                        .setLiveAddress(Arrays.stream(userInfo.getLiveAddressString())
+                                .map(item -> item.toString())
+                                .collect(Collectors.joining(",")));
+            }
+            userInfo.setId(sysUser.getId());
+        } else {
+            userInfo = new SysUserInfo();
+            userInfo.setId(sysUser.getId());
+        }
+        sysUserInfoService.save(userInfo);
+
+
+        List<EsmUserImageVo> esmUserImageVo = sysUserVo.getEsmUserImageVo();
+        String finalUserId = userId;
+        if (!CollectionUtils.isEmpty(esmUserImageVo)) {
+            List<EsmUserImage> esmUserImages = esmUserImageVo.stream()
+                    .map(x -> new EsmUserImage(x, finalUserId))
+                    .collect(Collectors.toList());
+            esmUserImageService.saveBatch(esmUserImages);
+        }
+        String referrerId = sysUserVo.getSysUser().getReferrerId();
+        if (referrerId == null) {
+            SpringUtil.getBean(RecordUserUtils.class).addRecord(userId, "admin");
+        } else {
+            SysUser sysUser1 = sysUserMapper.selectById(sysUserVo.getSysUser().getReferrerId());
+            SpringUtil.getBean(RecordUserUtils.class)
+                    .addRecord(userId, Optional.ofNullable(sysUser1.getName()).orElse("admin"));
+        }
+        // 保存新的合伙人数据
+        PartnerUser partnerUser = addNewPartnerRule(sysUser);
+        partnerUserService.save(partnerUser);
+        SpringUtil.getBean(UpdateRatioUtils.class).before(partnerUser.getUserId(),partnerUser.getGrade());
+        return HttpResult.ok("新增成功", sysUserMapper.selectById(userId));
+    }
+
+    @Override
+    public List<String> queryInternalNumber() {
+        return baseMapper.queryInternalNumber();
+    }
+
+
+    //  邀请的是团队长   去创建团队长部门
+    public String  addNewTeam(SysUser sysUser) {
+
+        if (4 == sysUser.getGrade()){
+            String maxDeptId = sysDeptService.findMaxDeptId(sysUser.getDeptId());
+            String deptId = addOneWithLeadingZeros(maxDeptId);
+            SysDeptVo dept = new SysDeptVo();
+            dept.setId(sysUser.getDeptId() + "D" + deptId);
+            dept.setName(sysUser.getName() + "团队长");
+            dept.setManagementSource(sysUser.getDeptSource());
+            dept.setDeptType("D");
+            dept.setParentId(sysUser.getDeptId());
+            sysDeptService.addDept(dept);
+            return dept.getId();
+        }
+        return sysUser.getDeptId();
+    }
+
+    public static String addOneWithLeadingZeros(String str) {
+        int num = Integer.parseInt(str);
+        num += 1;
+        return String.format("%0" + str.length() + "d", num);
+    }
+
+
+    public PartnerUser addNewPartnerRule(SysUser sysUser) {
+        return getPartnerUser(sysUser,String.valueOf(sysUser.getGrade() + 1) );
+    }
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResult saveByPartner(SysUser2Vo sysUser2Vo) {
+        SysUser sysUser = sysUser2Vo.getSysUser();
+        //1:合伙人 2:工作室管理员
+        Integer type = sysUser.getType();
+        // 手机号
+        List<SysUser> mobileList = lambdaQuery().eq(SysUser::getMobile, sysUser.getMobile())
+                .eq(SysUser::getType, type)
+                .list();
+        if (!mobileList.isEmpty()) {
+            throw new SystemException("手机号已经注册请更换手机号。");
+        }
+        // 身份证号
+        List<SysUser> identityList = lambdaQuery().eq(SysUser::getIdentity, sysUser.getIdentity())
+                .eq(SysUser::getType, type)
+                .list();
+        if (!identityList.isEmpty()) {
+            throw new SystemException("身份证号已经注册请更换身份证号。");
+        }
+
+        //处理密码
+        if (StringUtils.isNotEmpty(sysUser.getPassword())) {
+            String salt = PasswordUtils.getSalt();
+            String pwd = PasswordUtils.encode(sysUser.getPassword(), salt);
+            sysUser.setPassword(pwd);
+            sysUser.setSalt(salt);
+        } else {
+            return HttpResult.error("密码不能为空");
+        }
+        if (sysUser2Vo.getSysUser().getGradeList().size() == 1 && StringUtils.equals(sysUser2Vo.getSysUser().getGradeList().get(0),"4")){
+            String deptId = addDeptUser(sysUser,"4");
+            sysUser.setDeptId(deptId);
+        }
+        String userId = "";
+        //19 出单员 校验机构和业务员机构是否一致
+        if ("19".equals(sysUser.getRoleId())) {
+            // add by  hxl  2024-08-20
+            // return checkChuDanUser(sysUser);
+            if (StringUtils.isEmpty(sysUser.getReferrerId())) {
+                return HttpResult.error("业务员工号不能为空");
+            }
+            //归属业务员和出单员部门必须一致
+            SysUser user = getById(sysUser.getReferrerId());
+            if (user == null || !user.getDeptId().equals(sysUser.getDeptId())) {
+                return HttpResult.error("出单员机构必须和归属业务员机构一致");
+            }
+            sysUser.setOperatorCode(sysUser.getReferrerId());
+            if (StringUtils.isEmpty(sysUser.getId())) {
+                userId = gainNextUserId(sysUser.getDeptId());
+                sysUser.setId(userId);
+                save(sysUser);
+                //角色配置
+                SysUserRole userRole = new SysUserRole();
+                userRole.setUserId(sysUser.getId());
+                userRole.setRoleId(StringUtils.toLong(sysUser.getRoleId()));
+                sysUserRoleService.save(userRole);
+            } else {
+                userId = sysUser.getId();
+                updateById(sysUser);
+            }
+            SysUserInfo userInfo = sysUser2Vo.getSysUserInfo();
+            userInfo.setId(sysUser.getId());
+            sysUserInfoService.save(userInfo);
+        } else {
+            userId = gainNextUserId(sysUser.getDeptId());
+
+            if (RoleConstants.R22.getCode().equals(sysUser.getRoleId())) {//22	后线人员
+                if (!SysConstants.isAdministration(userId)) {
+                    throw new SystemException("后线人员只能公司部门中");
+                }
+            }
+
+            sysUser.setId(userId);
+            save(sysUser);
+
+            //角色配置
+            SysUserRole userRole = new SysUserRole();
+            userRole.setUserId(sysUser.getId());
+            userRole.setRoleId(StringUtils.toLong(sysUser.getRoleId()));
+            sysUserRoleService.save(userRole);
+            if (StringUtils.isNotEmpty(sysUser.getReferrerId())) {
+                //推荐人
+                esmUserReferrerService.addReferrer(sysUser.getReferrerId(), userId);
+            } else if ("20".equals(sysUser.getRoleId()) || "21".equals(sysUser.getRoleId())) {
+                //如果是 团队长或代码人 并且没有推荐人 则默认推荐人为自己
+                esmUserReferrerService.addReferrer(sysUser.getId(), userId);
+            }
+            SysUserInfo userInfo = sysUser2Vo.getSysUserInfo();
+            if (userInfo != null) {
+                if (null != userInfo.getLiveAddressString() && userInfo.getLiveAddressString().length > 0) {
+                    sysUser2Vo.getSysUserInfo()
+                            .setLiveAddress(Arrays.stream(userInfo.getLiveAddressString())
+                                    .map(item -> item.toString())
+                                    .collect(Collectors.joining(",")));
+                }
+                userInfo.setId(sysUser.getId());
+            } else {
+                userInfo = new SysUserInfo();
+                userInfo.setId(sysUser.getId());
+            }
+            sysUserInfoService.save(userInfo);
+        }
+        List<EsmUserImageVo> esmUserImageVo = sysUser2Vo.getEsmUserImageVo();
+        String finalUserId = userId;
+        if (!CollectionUtils.isEmpty(esmUserImageVo)) {
+            List<EsmUserImage> esmUserImages = esmUserImageVo.stream()
+                    .map(x -> new EsmUserImage(x, finalUserId))
+                    .collect(Collectors.toList());
+            esmUserImageService.saveBatch(esmUserImages);
+        }
+        String referrerId = sysUser2Vo.getSysUser().getReferrerId();
+        if (referrerId == null) {
+            SpringUtil.getBean(RecordUserUtils.class).addRecord(userId, "admin");
+        } else {
+            SysUser sysUser1 = sysUserMapper.selectById(sysUser2Vo.getSysUser().getReferrerId());
+            SpringUtil.getBean(RecordUserUtils.class)
+                    .addRecord(userId, Optional.ofNullable(sysUser1.getName()).orElse("admin"));
+        }
+        // 保存新的合伙人数据
+        addPartnerRule(sysUser,sysUser2Vo.getSysUser().getGradeList());
+        return HttpResult.ok("新增成功", sysUserMapper.selectById(userId));
+    }
+
+    @Override
+    public HttpResult updateByPartner(String userId, SysUser2Vo sysUser2Vo) {
+        SysUser sysUser = sysUser2Vo.getSysUser();
+        int beStatus = sysUser.getStatus();
+        //查找数据库是否存在相同的身份证
+        if (sysUserMapper.selectCount(new LambdaQueryWrapper<SysUser>()
+                .eq(SysUser::getIdentity, sysUser2Vo.getSysUser().getIdentity())
+                .ne(SysUser::getId, sysUser2Vo.getSysUser().getId())) > 0) {
+            return HttpResult.error("已存在身份证号,无法修改");
+        }
+
+        //如果审核驳回则 重新修改为 审核状态
+        if (sysUser2Vo.getSysUser().getStatus().equals(UserWorkStatus.UWS_3.getCode())) {
+            sysUser2Vo.getSysUser().setStatus(UserWorkStatus.UWS_2.getCode());
+        }
+
+        if (Objects.equals(sysUser2Vo.getSysUser().getStatus(), UserWorkStatus.UWS_5.getCode())) {
+            sysUser2Vo.getSysUser().setStatus(UserWorkStatus.UWS_4.getCode());
+        }
+
+        if (Objects.equals(sysUser2Vo.getSysUser().getStatus(), UserWorkStatus.UWS_7.getCode())
+                || Objects.equals(sysUser2Vo.getSysUser().getStatus(), UserWorkStatus.UWS_1.getCode())) {
+            sysUser2Vo.getSysUser().setStatus(UserWorkStatus.UWS_6.getCode());
+        }
+
+        //修改用户不能修改密码
+        if (StringUtils.isEmpty(sysUser.getPassword())) {
+            return HttpResult.error("密码不能为空");
+        }
+
+        //删除状态必须有离司时间
+        if (StringUtils.isNotEmpty(sysUser.getStatus().toString())) {
+            if (sysUser.getStatus() == 0 && sysUser.getLogoutTime() == null && !sysUser.getRoleId().equals("19")) {
+                return HttpResult.error("删除状态,离职时间必填");
+            }
+        } else {
+            return HttpResult.error("状态不能为空");
+        }
+        SysUser sysUser_org = findByUserId(sysUser.getId());
+
+        // 修改密码数据库相同不做修改
+        if (!sysUser_org.getPassword().equals(sysUser.getPassword())) {
+            String salt = PasswordUtils.getSalt();
+            String pwd = PasswordUtils.encode(sysUser.getPassword(), salt);
+            sysUser.setPassword(pwd);
+            sysUser.setSalt(salt);
+        } else {
+            sysUser.setPassword(sysUser_org.getPassword());
+            sysUser.setSalt(sysUser_org.getSalt());
+        }
+        if ("19".equals(sysUser.getRoleId())) {//19 出单员 校验机构和业务员机构是否一致
+            // add by  hxl  2024-08-20
+            // return checkChuDanUser(sysUser);
+            if (StringUtils.isEmpty(sysUser.getReferrerId())) {
+                return HttpResult.error("业务员工号不能为空");
+            }
+            //归属业务员和出单员部门必须一致
+            SysUser user = getById(sysUser.getReferrerId());
+            if (user == null || !user.getDeptId().equals(sysUser.getDeptId())) {
+                return HttpResult.error("出单员机构必须和归属业务员机构一致");
+            }
+            sysUser.setOperatorCode(sysUser.getReferrerId());
+            if (StringUtils.isEmpty(sysUser.getId())) {
+                userId = gainNextUserId(sysUser.getDeptId());
+                sysUser.setId(userId);
+                save(sysUser);
+                //角色配置
+                SysUserRole userRole = new SysUserRole();
+                userRole.setUserId(sysUser.getId());
+                userRole.setRoleId(StringUtils.toLong(sysUser.getRoleId()));
+                sysUserRoleService.save(userRole);
+            } else {
+                userId = sysUser.getId();
+                updateById(sysUser);
+            }
+
+            if (StringUtils.isEmpty(sysUser.getLeaderId())) {
+                SysUser leaderUser = baseMapper.getByRoleIdAndDeptId("21", sysUser.getDeptId());
+                sysUser.setLeaderId(leaderUser.getLeaderId());
+                sysUser.setLeaderName(leaderUser.getLeaderName());
+            }
+
+
+            SysUserInfo sysUserInfo = sysUser2Vo.getSysUserInfo();
+            sysUserInfo.setId(userId);
+            sysUserInfoService.saveOrUpdate(sysUserInfo);
+        } else {
+            sysUser.setStatus(sysUser2Vo.getSysUser().getStatus());
+            updateById(sysUser);
+
+            SysDept sysDept = sysDeptService.getById(sysUser.getDeptId());
+            // 渠道负责人更新数据
+            if (ManagementSource.MS_01.getCode()
+                    .equals(sysDept.getManagementSource()) && "21".equals(sysUser.getRoleId())) {
+                boolean update = lambdaUpdate()
+                        .set(SysUser::getLeaderId, sysUser.getLeaderId())
+                        .set(SysUser::getLeaderName, sysUser.getLeaderName())
+                        .eq(SysUser::getDeptId, sysDept.getId())
+                        .update();
+                AssertionUtils.isSucceed(update, "出单员数据更新失败");
+            }
+
+            //角色配置
+            SysUserRole sysUserRole = sysUserRoleService.selectByUserId(userId);
+            sysUserRole.setRoleId(StringUtils.toLong(sysUser.getRoleId()));
+            sysUserRole.setLastUpdateBy(sysUser.getCreateBy());
+            sysUserRole.setLastUpdateTime(new Date());
+            sysUserRoleService.updateById(sysUserRole);
+
+            if (StringUtils.isNotEmpty(sysUser.getReferrerId())) {
+                //推荐人
+                esmUserReferrerService.addReferrer(sysUser.getReferrerId(), userId);
+            }
+
+            //用户详情信息
+            SysUserInfo sysUserInfo = sysUser2Vo.getSysUserInfo();
+            if (null != sysUserInfo.getLiveAddressString() && sysUserInfo.getLiveAddressString().length > 0) {
+                sysUser2Vo.getSysUserInfo()
+                        .setLiveAddress(Arrays.stream(sysUserInfo.getLiveAddressString())
+                                .map(item -> item.toString())
+                                .collect(Collectors.joining(",")));
+            }
+            sysUserInfo.setId(userId);
+            if (null == sysUserInfo.getRemark()) {
+                sysUserInfo.setRemark("");
+            }
+            sysUserInfoService.saveOrUpdate(sysUserInfo);
+        }
+        // 影像资料
+        LambdaQueryWrapper<EsmUserImage> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(EsmUserImage::getUserId, userId);
+        esmUserImageService.remove(wrapper);
+
+        List<EsmUserImageVo> esmUserImageVo = sysUser2Vo.getEsmUserImageVo();
+        String finalUserId = userId;
+        List<EsmUserImage> esmUserImages = esmUserImageVo.stream()
+                .map(x -> new EsmUserImage(x, finalUserId))
+                .collect(Collectors.toList());
+        esmUserImageService.saveBatch(esmUserImages);
+
+        if (UserWorkStatus.UWS_5.getCode() == beStatus ||
+                UserWorkStatus.UWS_3.getCode() == beStatus ||
+                UserWorkStatus.UWS_7.getCode() == beStatus) {
+            //添加轨迹
+            SysUserTrack sysUserTrack = new SysUserTrack();
+            sysUserTrack.setUserId(sysUser.getId());
+            SysUser user = BaseController.getUser();
+            sysUserTrack.setApproveBy(user.getName());
+            sysUserTrack.setApproveById(user.getId());
+            sysUserTrack.setStatus(sysUser2Vo.getSysUser().getStatus());
+            sysUserTrack.setApproveTime(new Date());
+            sysUserTrackService.save(sysUserTrack);
+        }
+        SpringUtil.getBean(RecordUserUtils.class).recordUser(sysUser2Vo, BaseController.getUserName());
+        return HttpResult.ok("修改成功");
+    }
+
+    @Override
+    public Page<SysUserBaseVO> findPartnerUserList(SysUserDto sysUserDto) {
+        Page<SysUserBaseVO> page = new Page<>(sysUserDto.getPageNum(),
+                sysUserDto.getPageSize());
+        Page<SysUserBaseVO> backUserList = sysUserMapper.findPartnerUserList(page, sysUserDto.getDto());
+        return backUserList;
+    }
+
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpResult saveUserInfo1(SysUser2Vo sysUserVo) {
@@ -1416,10 +1847,12 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     public HttpResult updateUserInfo(String userId, SysUser2Vo sysUserVo) {
         SysUser sysUser = sysUserVo.getSysUser();
         int beStatus = sysUser.getStatus();
+        //  查询当前修改的用户是否是新合伙人多身份用户
+        Long count = partnerUserMapper.selectCount(new LambdaQueryWrapper<PartnerUser>().eq(PartnerUser::getUserId, sysUser.getId()));
         //查找数据库是否存在相同的身份证
         if (sysUserMapper.selectCount(new LambdaQueryWrapper<SysUser>()
                 .eq(SysUser::getIdentity, sysUserVo.getSysUser().getIdentity())
-                .ne(SysUser::getId, sysUserVo.getSysUser().getId())) > 0) {
+                .ne(SysUser::getId, sysUserVo.getSysUser().getId())) > 0 && count == 0) {
             return HttpResult.error("已存在身份证号,无法修改");
         }
 
@@ -1520,12 +1953,16 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
             sysUserRole.setLastUpdateBy(sysUser.getCreateBy());
             sysUserRole.setLastUpdateTime(new Date());
             sysUserRoleService.updateById(sysUserRole);
-
-            if (StringUtils.isNotEmpty(sysUser.getReferrerId())) {
-                //推荐人
-                esmUserReferrerService.addReferrer(sysUser.getReferrerId(), userId);
+            if (0 == sysUser.getNewApp()){
+                if (StringUtils.isNotEmpty(sysUser.getReferrerId())) {
+                    //推荐人
+                    esmUserReferrerService.addReferrer(sysUser.getReferrerId(), userId);
+                }
+            }else {
+                updateMultiUsers(sysUser);
             }
 
+
             //用户详情信息
             SysUserInfo sysUserInfo = sysUserVo.getSysUserInfo();
             if (null != sysUserInfo.getLiveAddressString() && sysUserInfo.getLiveAddressString().length > 0) {
@@ -1570,6 +2007,45 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         return HttpResult.ok("修改成功");
     }
 
+
+    public void updateMultiUsers(SysUser sysUser){
+        QueryWrapper<PartnerUser> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("user_id", sysUser.getId());
+        List<String> gradeList = sysUser.getGradeList();
+        if (CollectionUtils.isEmpty(gradeList)){
+            return;
+        }
+        List<PartnerUser> partnerUsers = partnerUserMapper.selectList(queryWrapper);
+        if (CollectionUtils.isEmpty(partnerUsers)){
+            return;
+        }
+        List<String> list = partnerUsers.stream()
+                .map(user -> String.valueOf(user.getGrade()))
+                .collect(Collectors.toList());
+
+        boolean listsEqual = ListComparator.areListsEqual(gradeList, list);
+        if (!listsEqual){
+            List<String> sortedAsc = gradeList.stream()
+                    .map(Integer::parseInt)
+                    .sorted()
+                    .map(String::valueOf)
+                    .collect(Collectors.toList());
+//            partnerUserMapper.deleteByUserId(sysUser.getId());
+//            for (String s : sortedAsc) {
+//                PartnerUser partnerUser = new PartnerUser();
+//                partnerUser.setUserId(sysUser.getId());
+//                partnerUser.setName(sysUser.getName());
+//                partnerUser.setDeptId(sysUser.getDeptId());
+//                partnerUser.setMobile(sysUser.getMobile());
+//                partnerUser.setGrade(Integer.valueOf(s));
+//                partnerUser.setGrade(Integer.valueOf(s));
+//            }
+
+        }
+    }
+
+
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpResult updateUserInfo1(String userId, SysUser2Vo sysUserVo) {
@@ -2788,6 +3264,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     @Transactional
     public String agentRegist(AgentUserNewDto dto, SysUser recommender) {
         int noCount = 3;
+        SysUser user = sysUserMapper.selectById(dto.getReferrerId());
         //根据机构号获取userid最大值,不需要加人员类型判断  从sys_user获取
         String maxId = this.findMaxId(recommender.getDeptId());
         String nextPK = StringUtils.isNullOrEmpty(maxId) ? recommender.getDeptId() + "001"
@@ -2808,6 +3285,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         sysUser.setFactorVerify(0);  // 未认证状态
         sysUser.setUpdateTime(new Date());
         sysUser.setUpdateBy("admin");
+        sysUser.setNewApp(user.getNewApp());
         this.save(sysUser);
         //角色配置
         SysUserRole userRole = new SysUserRole();
@@ -2824,9 +3302,27 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         SpringUtil.getBean(UserAgentTrackUtils.class).addTrack(
                 sysUser.getId(), UserAgentStatus.UAS_0.getCode(),
                 "admin");
+        addPartner(sysUser, dto.getReferrerId(),user.getNewApp());
         return sysUser.getId();
     }
 
+
+    public void addPartner(SysUser sysUser,String referrerId,Integer newApp){
+        if (1 == newApp){
+            Integer max = partnerUserService.selectByUserIdMax(referrerId);
+            PartnerUser partnerUser = new PartnerUser();
+            partnerUser.setName(sysUser.getName());
+            partnerUser.setMobile(sysUser.getMobile());
+            partnerUser.setUserId(sysUser.getId());
+            partnerUser.setDeptId(sysUser.getDeptId());
+            partnerUser.setDeptName(sysUser.getDeptName());
+            partnerUser.setGrade(max + 1);
+            partnerUser.setReferrerId(referrerId);
+            partnerUser.setCreateTime(new Date());
+            partnerUserService.save(partnerUser);
+        }
+    }
+
     @Override
     @Transactional
     public SysUserAgentVo agentAuth(SysUser sysUser, AgentAuthDto dto) {
@@ -3206,4 +3702,126 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         return maxId;
     }
 
+    public void addPartnerRule(SysUser sysUser, List<String> gradeList) {
+        if (sysUser == null || sysUser.getType() != 4) {
+            return;
+        }
+        if (CollectionUtils.isEmpty(gradeList)) {
+            throw new SystemException("请选择合伙人等级");
+        }
+        List<Integer> sortedGrades = gradeList.stream()
+                .map(Integer::valueOf)
+                .sorted()
+                .collect(Collectors.toList());
+        int minGrade = sortedGrades.get(0);
+        boolean hasReferrer = StringUtils.isNotEmpty(sysUser.getReferrerId());
+        boolean hasDept = true;
+        if (gradeList.size() == 1 && StringUtils.equals(gradeList.get(0),"4")){
+            hasDept = false;
+        }
+
+        for (int grade : sortedGrades) {
+            String deptId = sysUser.getDeptId();
+            if (4 == grade && hasDept){
+                deptId = addDeptUser(sysUser,String.valueOf(grade));
+            }
+            PartnerUser partnerUser = createPartnerUser(sysUser, grade, minGrade, hasReferrer,deptId);
+            partnerUserService.save(partnerUser);
+        }
+    }
+
+    private PartnerUser createPartnerUser(SysUser sysUser, int grade, int minGrade, boolean hasReferrer,String deptId) {
+        PartnerUser partnerUser = new PartnerUser();
+        partnerUser.setName(sysUser.getName());
+        partnerUser.setMobile(sysUser.getMobile());
+        partnerUser.setUserId(sysUser.getId());
+        partnerUser.setDeptId(deptId);
+        partnerUser.setDeptName(sysUser.getDeptName());
+        partnerUser.setGrade(grade);
+        partnerUser.setCreateTime(new Date());
+        if (grade != 1) {
+            String referrerId = (grade == minGrade)
+                    ? (hasReferrer ? sysUser.getReferrerId() : sysUser.getId())
+                    : sysUser.getId();
+            partnerUser.setReferrerId(referrerId);
+        }
+        return partnerUser;
+    }
+
+    private  PartnerUser getPartnerUser(SysUser sysUser,String grade) {
+        PartnerUser partnerUser = new PartnerUser();
+        partnerUser.setName(sysUser.getName());
+        partnerUser.setMobile(sysUser.getMobile());
+        partnerUser.setUserId(sysUser.getId());
+        partnerUser.setDeptId(sysUser.getDeptId());
+        partnerUser.setDeptName(sysUser.getDeptName());
+        partnerUser.setGrade(Integer.valueOf(grade));
+        String referrerId = StringUtils.isNotEmpty(sysUser.getReferrerId()) ? sysUser.getReferrerId() : sysUser.getId();
+        if (!StringUtils.equals(grade, "1")){
+            partnerUser.setReferrerId(referrerId);
+        }
+        partnerUser.setCreateTime(new Date());
+        return partnerUser;
+    }
+
+     public String addDeptUser(SysUser sysUser,String grade){
+         SysDept sysDept = sysDeptMapper.selectById(sysUser.getDeptId());
+         SysDeptVo sysDeptVo = new SysDeptVo();
+         sysDeptVo.setParentId(sysDept.getId());
+         sysDeptVo.setComtype(sysUser.getDeptType());
+         sysDeptVo.setAddress(sysDept.getAddress());
+         sysDeptVo.setComattribute("procar"); //机构性质 车险
+         sysDeptVo.setProvince(sysDept.getProvince()); // 默认省与负责人所在机构一样
+         sysDeptVo.setCity(sysDept.getCity()); // 默认市与负责人所在机构一样
+         sysDeptVo.setArea(sysDept.getArea()); // 默认区县与负责人所在机构一样
+         if (StringUtils.equals("4",grade)){
+             sysDeptVo.setDeptType("C"); // 默认为子公司
+             sysDeptVo.setName(sysUser.getName() + "(工作室)");
+             sysDeptVo.setComlevel("5");
+         }
+         if (StringUtils.equals("5",grade)){
+             sysDeptVo.setDeptType("D"); // 默认为子公司
+             sysDeptVo.setName(sysUser.getName() + "团队"); // 以人名设置工作室名称
+         }
+         sysDeptVo.setManagementSource("2");
+
+         String sysDeptVo1 = queryDId(sysDeptVo);
+         sysDeptVo.setId(sysDeptVo1);
+         SysDept sysDept1 = new SysDept();
+         BeanUtils.copyProperties(sysDeptVo,sysDept1);
+         sysDeptMapper.insert(sysDept1);
+         return sysDept1.getId();
+     }
+
+     public String queryDId(SysDeptVo sysDeptVo){
+         String deptType = sysDeptVo.getDeptType();
+         String comlevel = sysDeptVo.getComlevel();
+         String parentId = sysDeptVo.getParentId();
+         if ("C".equals(deptType) && comlevel.equals("5")) {
+             sysDeptVo.setDeptType("M");
+         } else if ("D".equals(deptType)) {
+             sysDeptVo.setDeptType("D");
+             deptType = "M";
+         }
+         String number;
+         String maxId = sysDeptMapper.getMaxId(sysDeptVo.getParentId(), deptType, comlevel);
+         if (!maxId.equals("0")) {
+             String substring = maxId.substring(parentId.length() + 1);
+             int i = Integer.parseInt("1" + substring) + 1;
+             number = String.valueOf(i);
+         } else {
+             number = "101";
+         }
+
+         String substring = number.substring(number.length() - 2);
+         String serialNumber;
+         if ("M,D".contains(sysDeptVo.getDeptType())) {
+             serialNumber = parentId + sysDeptVo.getDeptType() + substring;
+         } else {
+             serialNumber = parentId + substring;
+         }
+         return serialNumber;
+     }
+
+
 }

+ 22 - 0
src/main/java/com/ydtech/modules/admin/service/impl/SysWechatCustomerServiceImpl.java

@@ -6,11 +6,13 @@ import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.ydtech.exception.SystemException;
 import com.ydtech.modules.admin.dao.SysWechatCustomerMapper;
+import com.ydtech.modules.admin.model.SysUser;
 import com.ydtech.modules.admin.model.po.SysWechatCustomer;
 import com.ydtech.modules.admin.model.po.SysWechatCustomerDuty;
 import com.ydtech.modules.admin.model.vo.wechat.SysWechatCustomerDutyRulesVo;
 import com.ydtech.modules.admin.model.vo.wechat.SysWechatCustomerQueryVo;
 import com.ydtech.modules.admin.model.vo.wechat.SysWechatCustomerVo;
+import com.ydtech.modules.admin.service.SysUserService;
 import com.ydtech.modules.admin.service.SysWechatCustomerDutyService;
 import com.ydtech.modules.admin.service.SysWechatCustomerService;
 import com.ydtech.utils.DateTimeUtil;
@@ -21,6 +23,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.ObjectUtils;
 import org.springframework.util.StringUtils;
 
+import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -40,6 +43,8 @@ public class SysWechatCustomerServiceImpl extends ServiceImpl<SysWechatCustomerM
 
     private final StringRedisTemplate redisTemplate;
 
+    private final SysUserService sysUserService;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void deleteAllInfo(String customerId) {
@@ -141,6 +146,23 @@ public class SysWechatCustomerServiceImpl extends ServiceImpl<SysWechatCustomerM
         redisTemplate.opsForValue().set(KEY, String.valueOf(sysWechatCustomer.getId()));
         return sysWechatCustomer;
     }
+
+
+    @Override
+    public boolean whetherTheManagersAreConsistent(String externalUserId, SysWechatCustomer sysWechatCustomer,  List<SysWechatCustomerDuty> sysWechatCustomerDuties) {
+        SysUser sysUser = sysUserService.lambdaQuery().eq(SysUser::getExternalUserId, externalUserId).one();
+        if (ObjectUtils.isEmpty(sysUser)) {
+            return true;
+        }
+        if(!StringUtils.hasLength(sysUser.getLeaderId())){
+            return true;
+        }
+        if(sysWechatCustomerDuties.isEmpty()){
+            return sysWechatCustomer.getUserId().equals(sysUser.getLeaderId());
+        }
+        return true;
+    }
+
 }
 
 

+ 196 - 43
src/main/java/com/ydtech/modules/admin/service/impl/WechatCustomerServiceImpl.java

@@ -2,32 +2,37 @@ package com.ydtech.modules.admin.service.impl;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.dataformat.xml.XmlMapper;
+import com.ydtech.components.DistributedLockComponent;
 import com.ydtech.modules.admin.components.WechatCustomerComponents;
 import com.ydtech.modules.admin.components.wechat.customer.request.CustomerAddContactWayRequest;
 import com.ydtech.modules.admin.components.wechat.customer.request.CustomerListRequest;
 import com.ydtech.modules.admin.components.wechat.customer.request.CustomerSendMsgOnEventRequest;
-import com.ydtech.modules.admin.components.wechat.customer.request.CustomerSyncMsgRequest;
 import com.ydtech.modules.admin.components.wechat.customer.response.CustomerAddContactWayResponse;
 import com.ydtech.modules.admin.components.wechat.customer.response.CustomerListResponse;
-import com.ydtech.modules.admin.components.wechat.customer.response.CustomerSyncMsgResponse;
 import com.ydtech.modules.admin.model.SysUser;
 import com.ydtech.modules.admin.model.po.SysWechatCustomer;
+import com.ydtech.modules.admin.model.po.SysWechatCustomerDuty;
 import com.ydtech.modules.admin.model.vo.wechat.WechatCustomerCallbackVo;
 import com.ydtech.modules.admin.model.vo.wechat.WechatEncryptVo;
-import com.ydtech.modules.admin.service.SysUserService;
-import com.ydtech.modules.admin.service.SysWechatCustomerService;
-import com.ydtech.modules.admin.service.WechatCustomerService;
+import com.ydtech.modules.admin.service.*;
 import com.ydtech.utils.StringUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.util.crypto.WxCryptUtil;
 import me.chanjar.weixin.cp.api.WxCpKfService;
+import me.chanjar.weixin.cp.bean.kf.WxCpKfMsgListResp;
+import me.chanjar.weixin.cp.bean.kf.WxCpKfMsgSendRequest;
 import me.chanjar.weixin.cp.bean.kf.WxCpKfServiceStateResp;
+import me.chanjar.weixin.cp.bean.kf.msg.WxCpKfEventMsg;
+import me.chanjar.weixin.cp.bean.kf.msg.WxCpKfTextMsg;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.util.ObjectUtils;
 
+import java.time.LocalDateTime;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -45,6 +50,11 @@ public class WechatCustomerServiceImpl implements WechatCustomerService {
 
     private final SysWechatCustomerService sysWechatCustomerService;
 
+    private final IWorkScheduleConfigService workScheduleConfigService;
+
+    private final SysWechatCustomerDutyService sysWechatCustomerDutyService;
+
+    private final DistributedLockComponent distributedLockComponent;
 
     @Override
     public String customerCallback(String msgSignature, String timestamp, String nonce, String echoStr) {
@@ -53,7 +63,7 @@ public class WechatCustomerServiceImpl implements WechatCustomerService {
     }
 
     @Override
-    public void callbackSendMsgOnEvent(String wechatEncrypt) throws JsonProcessingException, WxErrorException {
+    public void callbackSendMsgOnEventOld(String wechatEncrypt) throws Exception {
         log.info("回调参数为{}", wechatEncrypt);
         WechatEncryptVo wechatEncryptVo = xmlMapper.readValue(wechatEncrypt, WechatEncryptVo.class);
         WxCryptUtil wxCryptUtil = wechatCustomerComponents.getWxCryptUtil();
@@ -63,54 +73,197 @@ public class WechatCustomerServiceImpl implements WechatCustomerService {
         WechatCustomerCallbackVo wechatCustomerCallbackVo = xmlMapper.readValue(encrypt, WechatCustomerCallbackVo.class);
 
         // 获取消息
-        CustomerSyncMsgRequest customerSyncMsgRequest = new CustomerSyncMsgRequest();
-        customerSyncMsgRequest.setToken(wechatCustomerCallbackVo.getToken());
-        customerSyncMsgRequest.setOpenKfid(wechatCustomerCallbackVo.getOpenKfId());
-        CustomerSyncMsgResponse customerSyncMsgResponse = wechatCustomerComponents.syncMsg(customerSyncMsgRequest);
-        while (customerSyncMsgResponse.getHasMore() == 1) {
-            String nextCursor = customerSyncMsgResponse.getNextCursor();
-            customerSyncMsgRequest.setCursor(nextCursor);
-            customerSyncMsgResponse = wechatCustomerComponents.syncMsg(customerSyncMsgRequest);
+        WxCpKfMsgListResp wxCpKfMsgListResp = wxCpKfService.syncMsg(null, wechatCustomerCallbackVo.getToken(), null, null, wechatCustomerCallbackVo.getOpenKfId());
+
+        while (wxCpKfMsgListResp.getHasMore() == 1) {
+            String nextCursor = wxCpKfMsgListResp.getNextCursor();
+            wxCpKfMsgListResp = wxCpKfService.syncMsg(nextCursor, wechatCustomerCallbackVo.getToken(), null, null, wechatCustomerCallbackVo.getOpenKfId());
         }
-        List<CustomerSyncMsgResponse.MsgListDTO> msgList = customerSyncMsgResponse.getMsgList();
-        CustomerSyncMsgResponse.MsgListDTO msgListDTO = customerSyncMsgResponse.getMsgList().get(msgList.size() - 1);
-
-        if (msgListDTO.getOrigin() == 3) {
-            List<CustomerSyncMsgResponse.MsgListDTO> msgListDTOList = msgList.stream()
-                    .filter(x -> "event".equals(x.getMsgtype()))
-                    .collect(Collectors.toList());
-            msgListDTOList.forEach(x -> {
+        List<WxCpKfMsgListResp.WxCpKfMsgItem> msgList = wxCpKfMsgListResp.getMsgList();
+        WxCpKfMsgListResp.WxCpKfMsgItem wxCpKfMsgItem = wxCpKfMsgListResp.getMsgList().get(msgList.size() - 1);
+
+        SysWechatCustomer sysWechatCustomer = sysWechatCustomerService.lambdaQuery().eq(SysWechatCustomer::getOpenKfId, wechatCustomerCallbackVo.getOpenKfId()).one();
+
+        distributedLockComponent.executeWithLock(wxCpKfMsgItem.getMsgId(), () -> {
+            // 改变会话状态
+            if (wxCpKfMsgItem.getOrigin() == 3) {
+                WxCpKfServiceStateResp serviceState;
                 try {
-                    CustomerSyncMsgResponse.MsgListDTO.EventDTO xEvent = x.getEvent();
-                    WxCpKfServiceStateResp serviceState = wxCpKfService.getServiceState(xEvent.getOpenKfid(), xEvent.getExternalUserid());
-                    if (serviceState.getServiceState() == 0) {
-                        List<SysWechatCustomer> list = sysWechatCustomerService.lambdaQuery()
-                                .eq(SysWechatCustomer::getOpenKfId, xEvent.getOpenKfid())
-                                .list();
-                        wxCpKfService.transServiceState(xEvent.getOpenKfid(), xEvent.getExternalUserid(), 3, list.get(0)
-                                .getReceptionistId());
+                    serviceState = wxCpKfService.getServiceState(wxCpKfMsgItem.getOpenKfid(), wxCpKfMsgItem.getExternalUserId());
+                } catch (WxErrorException e) {
+                    throw new RuntimeException(e);
+                }
+                Integer state1 = serviceState.getServiceState();
+                if (state1 == 0 || state1 == 1) {
+                    state1 = 3;
+                    try {
+                        wxCpKfService.transServiceState(wxCpKfMsgItem.getOpenKfid(), wxCpKfMsgItem.getExternalUserId(), state1, sysWechatCustomer.getReceptionistId());
+                    } catch (WxErrorException e) {
+                        throw new RuntimeException(e);
                     }
+                }
+            } else if (wxCpKfMsgItem.getOrigin() == 4) {
+                // 发送欢迎语
+                WxCpKfEventMsg event = wxCpKfMsgItem.getEvent();
+                WxCpKfServiceStateResp serviceState = null;
+                try {
+                    serviceState = wxCpKfService.getServiceState(event.getOpenKfid(), event.getExternalUserId());
                 } catch (WxErrorException e) {
                     throw new RuntimeException(e);
                 }
-            });
-        }
+                Integer state = serviceState.getServiceState();
+                if (ObjectUtils.isEmpty(event)) {
+                    return;
+                }
+                String scene = event.getScene();
+                if (!StringUtils.isEmpty(scene)) {
+                    SysUser sysUser = sysUserService.getById(scene);
+                    sysUser.setExternalUserId(event.getExternalUserId());
+                    sysUserService.updateById(sysUser);
+                    CustomerSendMsgOnEventRequest customerSendMsgOnEventRequest = CustomerSendMsgOnEventRequest.sendMsgOnEvent(sysUser, event.getWelcomeCode(), true);
+                    wechatCustomerComponents.sendMsgOnEvent(customerSendMsgOnEventRequest);
+                }
+
+                if (state == 0 || state == 1) {
+                    state = 3;
+                    List<SysWechatCustomer> list = sysWechatCustomerService.lambdaQuery().eq(SysWechatCustomer::getOpenKfId, wxCpKfMsgItem.getEvent().getOpenKfid()).list();
+                    String receptionistId = list.get(0).getReceptionistId();
+                    try {
+                        wxCpKfService.transServiceState(wxCpKfMsgItem.getEvent().getOpenKfid(), wxCpKfMsgItem.getEvent().getExternalUserId(), state, receptionistId);
+                    } catch (WxErrorException e) {
+                        throw new RuntimeException(e);
+                    }
+                }
+            }
+        }, 2, 2);
+    }
+
+    @Override
+    public void callbackSendMsgOnEventNew(String wechatEncrypt) throws Exception {
+        log.info("回调参数为{}", wechatEncrypt);
+        WechatEncryptVo wechatEncryptVo = xmlMapper.readValue(wechatEncrypt, WechatEncryptVo.class);
+        WxCryptUtil wxCryptUtil = wechatCustomerComponents.getWxCryptUtil();
+        log.info("解密参数为{}", wechatEncryptVo.getEncrypt());
+        String encrypt = wxCryptUtil.decrypt(wechatEncryptVo.getEncrypt());
+        log.info("解密后的参数为{}", encrypt);
+        WechatCustomerCallbackVo wechatCustomerCallbackVo = xmlMapper.readValue(encrypt, WechatCustomerCallbackVo.class);
+
+        // 获取消息
+        WxCpKfMsgListResp wxCpKfMsgListResp = wxCpKfService.syncMsg(null, wechatCustomerCallbackVo.getToken(), null, null, wechatCustomerCallbackVo.getOpenKfId());
 
-        CustomerSyncMsgResponse.MsgListDTO.EventDTO event = msgListDTO.getEvent();
-        if (ObjectUtils.isEmpty(event)) {
-            return;
+        while (wxCpKfMsgListResp.getHasMore() == 1) {
+            String nextCursor = wxCpKfMsgListResp.getNextCursor();
+            wxCpKfMsgListResp = wxCpKfService.syncMsg(nextCursor, wechatCustomerCallbackVo.getToken(), null, null, wechatCustomerCallbackVo.getOpenKfId());
         }
+        List<WxCpKfMsgListResp.WxCpKfMsgItem> msgList = wxCpKfMsgListResp.getMsgList();
+        WxCpKfMsgListResp.WxCpKfMsgItem wxCpKfMsgItem = wxCpKfMsgListResp.getMsgList().get(msgList.size() - 1);
+
+        SysWechatCustomer sysWechatCustomer = sysWechatCustomerService.lambdaQuery().eq(SysWechatCustomer::getOpenKfId, wechatCustomerCallbackVo.getOpenKfId()).one();
+        boolean workingHours = workScheduleConfigService.isWorkingHours();
+        List<SysWechatCustomerDuty> sysWechatCustomerDuties = sysWechatCustomerDutyService.lambdaQuery()
+                .eq(SysWechatCustomerDuty::getCustomerId, sysWechatCustomer.getId())
+                .le(SysWechatCustomerDuty::getStartTime, LocalDateTime.now())
+                .ge(SysWechatCustomerDuty::getEndTime, LocalDateTime.now())
+                .list();
+
+        distributedLockComponent.executeWithLock(wxCpKfMsgItem.getMsgId(), () -> {
+            // 改变会话状态
+            if (wxCpKfMsgItem.getOrigin() == 3) {
+                // 1 管理人是否一致
+                // 2 休息日
+                // 3 工作时间内 安排了值班客服
+                boolean unanimous = !sysWechatCustomerService.whetherTheManagersAreConsistent(wxCpKfMsgItem.getExternalUserId(), sysWechatCustomer, sysWechatCustomerDuties);
+                WxCpKfServiceStateResp serviceState;
+                try {
+                    serviceState = wxCpKfService.getServiceState(wxCpKfMsgItem.getOpenKfid(), wxCpKfMsgItem.getExternalUserId());
+                } catch (WxErrorException e) {
+                    throw new RuntimeException(e);
+                }
+                Integer state1 = serviceState.getServiceState();
+                if (unanimous || !workingHours) {
+                    if (state1 == 0) {
+                        state1 = 1;
+                        try {
+                            wxCpKfService.transServiceState(wxCpKfMsgItem.getOpenKfid(), wxCpKfMsgItem.getExternalUserId(), state1, sysWechatCustomer.getReceptionistId());
+                        } catch (WxErrorException e) {
+                            throw new RuntimeException(e);
+                        }
+                        restTimeSendMsg(workingHours, wxCpKfMsgItem.getExternalUserId(), wxCpKfMsgItem.getOpenKfid());
+                    } else if (state1 == 1) {
+                        restTimeSendMsg(workingHours, wxCpKfMsgItem.getExternalUserId(), wxCpKfMsgItem.getOpenKfid());
+                    } else if (state1 == 3) {
+                        state1 = 4;
+                        try {
+                            wxCpKfService.transServiceState(wxCpKfMsgItem.getOpenKfid(), wxCpKfMsgItem.getExternalUserId(), state1, sysWechatCustomer.getReceptionistId());
+                        } catch (WxErrorException e) {
+                            throw new RuntimeException(e);
+                        }
+                    }
+                } else {
+                    if (state1 == 0 || state1 == 1) {
+                        state1 = 3;
+                        try {
+                            wxCpKfService.transServiceState(wxCpKfMsgItem.getOpenKfid(), wxCpKfMsgItem.getExternalUserId(), state1, sysWechatCustomer.getReceptionistId());
+                        } catch (WxErrorException e) {
+                            throw new RuntimeException(e);
+                        }
+                    }
+                }
+            } else if (wxCpKfMsgItem.getOrigin() == 4) {
+                // 发送欢迎语
+                WxCpKfEventMsg event = wxCpKfMsgItem.getEvent();
+                WxCpKfServiceStateResp serviceState = null;
+                try {
+                    serviceState = wxCpKfService.getServiceState(event.getOpenKfid(), event.getExternalUserId());
+                } catch (WxErrorException e) {
+                    throw new RuntimeException(e);
+                }
+                Integer state = serviceState.getServiceState();
+                if (ObjectUtils.isEmpty(event)) {
+                    return;
+                }
+                String scene = event.getScene();
+                if (!StringUtils.isEmpty(scene)) {
+                    SysUser sysUser = sysUserService.getById(scene);
+                    sysUser.setExternalUserId(event.getExternalUserId());
+                    sysUserService.updateById(sysUser);
+                    CustomerSendMsgOnEventRequest customerSendMsgOnEventRequest = CustomerSendMsgOnEventRequest.sendMsgOnEvent(sysUser, event.getWelcomeCode(), workingHours);
+                    wechatCustomerComponents.sendMsgOnEvent(customerSendMsgOnEventRequest);
+                }
+
+                if (workingHours && (state == 0 || state == 1)) {
+                    state = 3;
+                    List<SysWechatCustomer> list = sysWechatCustomerService.lambdaQuery().eq(SysWechatCustomer::getOpenKfId, wxCpKfMsgItem.getEvent().getOpenKfid()).list();
+                    String receptionistId = list.get(0).getReceptionistId();
+                    try {
+                        wxCpKfService.transServiceState(wxCpKfMsgItem.getEvent().getOpenKfid(), wxCpKfMsgItem.getEvent().getExternalUserId(), state, receptionistId);
+                    } catch (WxErrorException e) {
+                        throw new RuntimeException(e);
+                    }
+                }
+            }
+        }, 2, 2);
+    }
 
-        String scene = event.getScene();
-        if (StringUtils.isEmpty(scene)) {
-            return;
+    private void restTimeSendMsg(boolean workingHours, String externalUserId, String openKfId) {
+        String message;
+        if (!workingHours) {
+            message = "您好~当前客服暂时不在服务时间,服务时间为:周一至周五:8:30-12:00,14:00-18:30,周六至周日:9:00-12:00,14:00-18:30,当前未到服务时间,请您在服务时段内咨询~";
+        } else {
+            message = "您咨询的客服目前暂时不在服务时间,请您前往“晋掌柜App”点击“微信客服”,将为您安排新的客服为您提供服务~(客服服务时间:周一至周五  8:30-18:30,周六至周日  9:00-18:30,午间 12:00-14:00 休息)";
         }
-        if (msgListDTO.getOrigin() == 4) {
-            SysUser sysUser = sysUserService.getById(scene);
-            CustomerSendMsgOnEventRequest customerSendMsgOnEventRequest = CustomerSendMsgOnEventRequest.sendMsgOnEvent(sysUser, msgListDTO.getMsgid(), event.getWelcomeCode());
-            wechatCustomerComponents.sendMsgOnEvent(customerSendMsgOnEventRequest);
+        WxCpKfMsgSendRequest wxCpKfMsgSendRequest = new WxCpKfMsgSendRequest();
+        wxCpKfMsgSendRequest.setToUser(externalUserId);
+        wxCpKfMsgSendRequest.setOpenKfid(openKfId);
+        wxCpKfMsgSendRequest.setMsgType("text");
+        WxCpKfTextMsg wxCpKfTextMsg = new WxCpKfTextMsg();
+        wxCpKfTextMsg.setContent(message);
+        wxCpKfMsgSendRequest.setText(wxCpKfTextMsg);
+        try {
+            wxCpKfService.sendMsg(wxCpKfMsgSendRequest);
+        } catch (WxErrorException e) {
+            throw new RuntimeException(e);
         }
-
     }
 
     @Override

+ 47 - 0
src/main/java/com/ydtech/modules/admin/service/impl/WorkScheduleConfigServiceImpl.java

@@ -0,0 +1,47 @@
+package com.ydtech.modules.admin.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ydtech.modules.admin.constants.DataPermissionsEnum;
+import com.ydtech.modules.admin.dao.WorkScheduleConfigMapper;
+import com.ydtech.modules.admin.model.po.WorkScheduleConfig;
+import com.ydtech.modules.admin.service.IWorkScheduleConfigService;
+import com.ydtech.modules.admin.utils.WorkdayUtils;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalTime;
+import java.util.List;
+
+@Service
+public class WorkScheduleConfigServiceImpl extends ServiceImpl<WorkScheduleConfigMapper, WorkScheduleConfig> implements IWorkScheduleConfigService {
+
+    @Override
+    public boolean isWorkingHours() {
+        WorkScheduleConfig.DayType dayType = WorkdayUtils.isTodayWeekend() ? WorkScheduleConfig.DayType.WEEKEND : WorkScheduleConfig.DayType.WEEKDAY;
+        List<WorkScheduleConfig> list = lambdaQuery().eq(WorkScheduleConfig::getDayType, dayType.getCode()).list();
+        LocalTime now = LocalTime.now();
+        for (WorkScheduleConfig workScheduleConfig : list) {
+            if (isTimeInRange(now, workScheduleConfig.getStartTime(), workScheduleConfig.getEndTime())) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public static boolean isTimeInRange(LocalTime checkTime, LocalTime startTime, LocalTime endTime) {
+        if (startTime.equals(endTime)) {
+            // 开始时间等于结束时间,表示全天
+            return true;
+        }
+        if (startTime.isBefore(endTime)) {
+            // 正常情况:开始时间在结束时间之前(同一天内)
+            return !checkTime.isBefore(startTime) && !checkTime.isAfter(endTime);
+        } else {
+            // 跨天情况:开始时间在结束时间之后(如 22:00 - 06:00)
+            return !checkTime.isBefore(startTime) || !checkTime.isAfter(endTime);
+        }
+    }
+
+}
+
+
+

+ 47 - 0
src/main/java/com/ydtech/modules/admin/utils/WorkdayUtils.java

@@ -0,0 +1,47 @@
+package com.ydtech.modules.admin.utils;
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+
+/**
+ * 工作日工具类
+ * 默认规则:周一至周五为工作日,周六周日为休息日
+ */
+public class WorkdayUtils {
+
+    /**
+     * 判断指定日期是否为工作日
+     * @param date 日期
+     * @return true-工作日, false-休息日
+     */
+    public static boolean isWorkday(LocalDate date) {
+        DayOfWeek dayOfWeek = date.getDayOfWeek();
+        return dayOfWeek != DayOfWeek.SATURDAY && dayOfWeek != DayOfWeek.SUNDAY;
+    }
+
+    /**
+     * 判断指定日期是否为休息日
+     * @param date 日期
+     * @return true-休息日, false-工作日
+     */
+    public static boolean isWeekend(LocalDate date) {
+        return !isWorkday(date);
+    }
+
+    /**
+     * 判断当前日期是否为工作日
+     * @return true-工作日, false-休息日
+     */
+    public static boolean isTodayWorkday() {
+        return isWorkday(LocalDate.now());
+    }
+
+    /**
+     * 判断当前日期是否为休息日
+     * @return true-休息日, false-工作日
+     */
+    public static boolean isTodayWeekend() {
+        return isWeekend(LocalDate.now());
+    }
+
+
+}

+ 14 - 0
src/main/java/com/ydtech/modules/fee/dto/vo/RuleAttrMappingVo.java

@@ -91,6 +91,20 @@ public class RuleAttrMappingVo {
         //商业起保日期
         ruleAttrMappingVoList.add(new RuleAttrMappingVo("SyStartTime", insAreaCompany.getSyStartDate()));
 
+        String isImportedCar = "1";
+        if (carInfo.getFrameNo() != null && !carInfo.getFrameNo().isEmpty() && carInfo.getFrameNo().charAt(0) == 'L') {
+            isImportedCar = "0";
+        }
+
+        //自主定价系数
+        if (Objects.nonNull(quoteRespVo)) {
+            if (quoteRespVo.getPricingCoefficient() != null) {
+                ruleAttrMappingVoList.add(new RuleAttrMappingVo("PricingCoefficient", quoteRespVo.getPricingCoefficient()));
+            }
+        }
+        // 判断是否是进口车
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("IsImportedCar", isImportedCar));
+
         // 中煤不浮动原因
         if (Objects.nonNull(quoteRespVo)) {
             String rateFloatFlag = ZmTransferType.getByCode(quoteRespVo.getRateFloatFlag());

+ 1 - 0
src/main/java/com/ydtech/modules/fee/service/FeeRuleSchemeNewService.java

@@ -82,6 +82,7 @@ public interface FeeRuleSchemeNewService {
     ReCalcuLateProportion recalculateProportion(BigDecimal costsProportion,
                                                 BigDecimal deptProportion,
                                                 BigDecimal retailProportion,
+                                                BigDecimal partnerProportion,
                                                 BigDecimal taxRadio,
                                                 Integer retailLevel,
                                                 PtlAgreementProductCostsExport ptlAgreementProductCostsExport,

+ 3 - 2
src/main/java/com/ydtech/modules/fee/service/FeeRuleSchemeService.java

@@ -78,7 +78,7 @@ public interface FeeRuleSchemeService {
      * @return
      */
      FeeOrderNewVo.ExportFee calcExportFee(BigDecimal premium, BigDecimal superviseCostsProportion, BigDecimal entranceTotalProportion,
-                                                 BigDecimal deptTotalProportion, BigDecimal retailTotalProportion, BigDecimal taxRate, BigDecimal enterProportion);
+                                                 BigDecimal deptTotalProportion, BigDecimal retailTotalProportion,BigDecimal partnerProportion, BigDecimal taxRate, BigDecimal enterProportion);
 
     /**
      * 计算分销费用
@@ -123,10 +123,11 @@ public interface FeeRuleSchemeService {
      * @param deptManagerFee 机构管理
      * @param exportFee      出口
      * @param retailRadio    分销比例
+     * @param partnerProportion 合伙人比例
      * @param premiums       保费
      * @return
      */
-    boolean calculateProportion(FeeOrderNewVo.EntranceFee entranceFee, FeeOrderNewVo.DeptManagerFee deptManagerFee, FeeOrderNewVo.ExportFee exportFee, BigDecimal retailRadio, BigDecimal taxRadio, BigDecimal premiums);
+    boolean calculateProportion(FeeOrderNewVo.EntranceFee entranceFee, FeeOrderNewVo.DeptManagerFee deptManagerFee, FeeOrderNewVo.ExportFee exportFee, BigDecimal retailRadio, BigDecimal taxRadio, BigDecimal partnerProportion, BigDecimal premiums);
 
     List<DistributionLevelVo> converDistrbutionData(InsFeeOrderNew insFeeOrderNew);
 }

+ 9 - 3
src/main/java/com/ydtech/modules/fee/service/impl/FeeRuleSchemeServiceImpl.java

@@ -2931,13 +2931,18 @@ public class FeeRuleSchemeServiceImpl implements FeeRuleSchemeService {
      */
     public FeeOrderNewVo.ExportFee calcExportFee(BigDecimal premium, BigDecimal superviseCostsProportion,
                                                  BigDecimal entranceTotalProportion,
-                                                 BigDecimal deptTotalProportion, BigDecimal retailTotalProportion, BigDecimal taxRate, BigDecimal enterProportion) {
+                                                 BigDecimal deptTotalProportion, BigDecimal retailTotalProportion,
+                                                 BigDecimal taxRate,BigDecimal partnerProportion, BigDecimal enterProportion) {
         FeeOrderNewVo.ExportFee exportFee = new FeeOrderNewVo.ExportFee();
         exportFee.setPremium(premium);
         //去税后的入口比例
         BigDecimal noTaxEntranceTotalProportion = entranceTotalProportion.divide(taxRate, 2, RoundingMode.DOWN);
         //出口的总比例
-        BigDecimal exportTotalProportion = noTaxEntranceTotalProportion.subtract(deptTotalProportion).subtract(retailTotalProportion).subtract(enterProportion);
+        BigDecimal exportTotalProportion = noTaxEntranceTotalProportion
+                .subtract(deptTotalProportion)
+                .subtract(retailTotalProportion)
+                .subtract(enterProportion)
+                .subtract(partnerProportion);
 
         // 外部
         exportFee.setExternalProportion(enterProportion);
@@ -3166,7 +3171,7 @@ public class FeeRuleSchemeServiceImpl implements FeeRuleSchemeService {
      */
     @Override
     public boolean calculateProportion(FeeOrderNewVo.EntranceFee entranceFee, FeeOrderNewVo.DeptManagerFee deptManagerFee,
-                                       FeeOrderNewVo.ExportFee exportFee, BigDecimal retailRadio, BigDecimal taxRadio, BigDecimal premiums) {
+                                       FeeOrderNewVo.ExportFee exportFee, BigDecimal retailRadio, BigDecimal taxRadio,BigDecimal partnerProportion, BigDecimal premiums) {
         if (entranceFee.getTotalAmount().compareTo(BigDecimal.ZERO) == 0)
             return true;
         //去税入口比例
@@ -3178,6 +3183,7 @@ public class FeeRuleSchemeServiceImpl implements FeeRuleSchemeService {
                 .subtract(deptManagerFee.getDeptProportionLevelThree())
                 .subtract(deptManagerFee.getDeptProportionLevelFoure())
                 .subtract(deptManagerFee.getDeptProportionLevelFive())
+                .subtract(partnerProportion)
                 .subtract(retailRadio).compareTo(BigDecimal.ZERO) == 0;
     }
 }

Dosya farkı çok büyük olduğundan ihmal edildi
+ 495 - 444
src/main/java/com/ydtech/modules/fee/service/impl/FeeRuleSchemeServiceNewImpl.java


+ 117 - 75
src/main/java/com/ydtech/modules/fnc/service/impl/InsFeeAuditServiceImpl.java

@@ -1,4 +1,5 @@
 package com.ydtech.modules.fnc.service.impl;
+import java.util.Date;
 
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.collection.CollUtil;
@@ -41,6 +42,10 @@ import com.ydtech.modules.order.dao.InsOrdersMapper;
 import com.ydtech.modules.order.entity.InsFeeOrder;
 import com.ydtech.modules.order.entity.InsOrders;
 import com.ydtech.modules.order.service.InsOrdersService;
+import com.ydtech.modules.partner.dao.PartnerPartnerAccountMapper;
+import com.ydtech.modules.partner.dao.PartnerPremiumDetailsMapper;
+import com.ydtech.modules.partner.model.PartnerPartnerAccount;
+import com.ydtech.modules.partner.model.PartnerPremiumDetails;
 import com.ydtech.modules.protocol.service.PtlAgreementService;
 import com.ydtech.modules.protocol.utils.AssertionUtils;
 import com.ydtech.modules.protocols.entity.po.InsFeeOrderNew;
@@ -148,6 +153,12 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
     @Autowired
     private SysSwitchConfigService sysSwitchConfigService;
 
+    @Autowired
+    private PartnerPremiumDetailsMapper partnerPremiumDetailsMapper;
+
+    @Autowired
+    private PartnerPartnerAccountMapper partnerPartnerAccountMapper;
+
     @Autowired
     private RedisTemplate redisTemplate;
 
@@ -196,8 +207,6 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
 
             //生成机构费用
             gene_deptfee(order, insFeeOrderNew, insAreaCompany);
-
-
             //结算费用生成
             insPlyIncomeService.saveBalanceNew(order, insFeeOrderNew, insAreaCompany, user.getLeaderId(), user.getLeaderName());
 
@@ -250,10 +259,6 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
                     sysUserAccount.setDocumentaryStatus("2");  // 收入
                     sysUserAccount.setSuborderId(insAreaCompany.getId());  // 订单Id
                     sysUserAccountService.addOrUpdate(sysUserAccount);
-
-
-
-
                     if (insFeeOrderNew.getDistributionStatus() != null) {
                         createInsFeeOrderNewDistribution(insFeeOrderNew, insAreaCompany, order, order.getUserid(), BigDecimal.ZERO, BigDecimal.ZERO, "0");
                         if (insFeeOrderNew.getFirstLevelUserId() != null) {
@@ -357,98 +362,135 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
                 sysChannelCostService.updateBatchById(costList);
             }
 
-            //先把钱加到总账户,再修改抽层状态
-            List<SysPremiumDetails> sysPremiumDetails = sysPremiumDetailsMapper.selectList(new LambdaQueryWrapper<SysPremiumDetails>()
+            SysUser sysUser = sysUserService.getById(order.getUserid());
+            if (1 == sysUser.getNewApp()){
+                newExtractFee(insAreaCompany);
+            }
+            extractFee(insAreaCompany);
+
+            sysPremiumDetailsMapper.updateStatus(insAreaCompany.getId());
+            if (isManagement(order.getUserid()) && sysSwitchConfigService.getBalanceExtractStatus()) {
+                dataServerService.sendLgDataServer(insOrderNo);
+            }
+            // 审核完成之后 清空锁
+            redisTemplate.delete("FEE_AUDIT:"+insOrderNo);
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new SystemException("当前业务繁忙,请稍后重试");
+        } finally {
+            //释放锁
+            if (locked.isHeldByCurrentThread()) {
+                locked.unlock();
+            }
+        }
+    }
+
+    public void extractFee(InsAreaCompany insAreaCompany) {
+        //先把钱加到总账户,再修改抽层状态
+        List<SysPremiumDetails> sysPremiumDetails = sysPremiumDetailsMapper.selectList(new LambdaQueryWrapper<SysPremiumDetails>()
+                .eq(SysPremiumDetails::getCompanyId, insAreaCompany.getId())
+                .eq(SysPremiumDetails::getType, 2)
+                .eq(SysPremiumDetails::getStatus, 0));
+
+        if (sysPremiumDetails.isEmpty()) {
+            //已承保记录保费数据
+            com.ydtech.modules.order.entity.InsAreaCompany insAreaCompany1 = new com.ydtech.modules.order.entity.InsAreaCompany();
+            BeanUtils.copyProperties(insAreaCompany, insAreaCompany1);
+            insOrdersService.saveFeeInfo(insAreaCompany1);
+            sysPremiumDetails = sysPremiumDetailsMapper.selectList(new LambdaQueryWrapper<SysPremiumDetails>()
                     .eq(SysPremiumDetails::getCompanyId, insAreaCompany.getId())
                     .eq(SysPremiumDetails::getType, 2)
                     .eq(SysPremiumDetails::getStatus, 0));
+        }
 
-            if (sysPremiumDetails.isEmpty()) {
-                //已承保记录保费数据
-                com.ydtech.modules.order.entity.InsAreaCompany insAreaCompany1 = new com.ydtech.modules.order.entity.InsAreaCompany();
-                BeanUtils.copyProperties(insAreaCompany, insAreaCompany1);
-                insOrdersService.saveFeeInfo(insAreaCompany1);
-                sysPremiumDetails = sysPremiumDetailsMapper.selectList(new LambdaQueryWrapper<SysPremiumDetails>()
-                        .eq(SysPremiumDetails::getCompanyId, insAreaCompany.getId())
-                        .eq(SysPremiumDetails::getType, 2)
-                        .eq(SysPremiumDetails::getStatus, 0));
-            }
+        Map<String, List<SysPremiumDetails>> listMap = sysPremiumDetails.stream()
+                .sorted(Comparator.comparing(SysPremiumDetails::getId))
+                .collect(Collectors.groupingBy(SysPremiumDetails::getUserId));
 
-            Map<String, List<SysPremiumDetails>> listMap = sysPremiumDetails.stream()
-                    .sorted(Comparator.comparing(SysPremiumDetails::getId))
-                    .collect(Collectors.groupingBy(SysPremiumDetails::getUserId));
+        for (String key : listMap.keySet()) {
+            List<SysPremiumDetails> sysPremiumDetails1 = listMap.get(key);
 
-            for (String key : listMap.keySet()) {
-                List<SysPremiumDetails> sysPremiumDetails1 = listMap.get(key);
+            if (sysPremiumDetails1.size() > 1) {
 
-                if (sysPremiumDetails1.size() > 1) {
+                SysPremiumDetails sysPremiumDetails2 = sysPremiumDetails1.get(0);
+                SysPartnerAccount sysPartnerAccount = sysPartnerAccountMapper.selectOne(new LambdaQueryWrapper<SysPartnerAccount>()
+                        .eq(SysPartnerAccount::getUserId, sysPremiumDetails2.getUserId()));
 
-                    SysPremiumDetails sysPremiumDetails2 = sysPremiumDetails1.get(0);
-                    SysPartnerAccount sysPartnerAccount = sysPartnerAccountMapper.selectOne(new LambdaQueryWrapper<SysPartnerAccount>()
-                            .eq(SysPartnerAccount::getUserId, sysPremiumDetails2.getUserId()));
+                BigDecimal extractFee = sysPremiumDetails1.stream()
+                        .map(SysPremiumDetails::getExtractFee)
+                        .reduce(BigDecimal.ZERO, BigDecimal::add);
+                if (sysPartnerAccount == null) {
+                    SysPartnerAccount sysPartnerAccount1 = new SysPartnerAccount();
 
-                    BigDecimal extractFee = sysPremiumDetails1.stream()
-                            .map(SysPremiumDetails::getExtractFee)
-                            .reduce(BigDecimal.ZERO, BigDecimal::add);
+                    sysPartnerAccount1.setCreateTime(new Date());
+                    sysPartnerAccount1.setSumPremium(sysPremiumDetails2.getSumpremium());
+                    sysPartnerAccount1.setExtractFee(extractFee);
+                    sysPartnerAccount1.setCashFee(extractFee);
+                    sysPartnerAccount1.setUserId(sysPremiumDetails2.getUserId());
+                    sysPartnerAccountMapper.insert(sysPartnerAccount1);
+                } else {
+                    sysPartnerAccount.setSumPremium(sysPartnerAccount.getSumPremium()
+                            .add(sysPremiumDetails2.getSumpremium()));
+                    sysPartnerAccount.setExtractFee(sysPartnerAccount.getExtractFee().add(extractFee));
+                    sysPartnerAccount.setCashFee(sysPartnerAccount.getCashFee().add(extractFee));
+                    sysPartnerAccountMapper.updateById(sysPartnerAccount);
+                }
+
+            } else {
+                for (SysPremiumDetails sysPremiumDetail : sysPremiumDetails1) {
+                    SysPartnerAccount sysPartnerAccount = sysPartnerAccountMapper.selectOne(new LambdaQueryWrapper<SysPartnerAccount>()
+                            .eq(SysPartnerAccount::getUserId, sysPremiumDetail.getUserId()));
                     if (sysPartnerAccount == null) {
                         SysPartnerAccount sysPartnerAccount1 = new SysPartnerAccount();
-
                         sysPartnerAccount1.setCreateTime(new Date());
-                        sysPartnerAccount1.setSumPremium(sysPremiumDetails2.getSumpremium());
-                        sysPartnerAccount1.setExtractFee(extractFee);
-                        sysPartnerAccount1.setCashFee(extractFee);
-                        sysPartnerAccount1.setUserId(sysPremiumDetails2.getUserId());
+                        sysPartnerAccount1.setSumPremium(sysPremiumDetail.getSumpremium());
+                        sysPartnerAccount1.setExtractFee(sysPremiumDetail.getExtractFee());
+                        sysPartnerAccount1.setCashFee(sysPremiumDetail.getExtractFee());
+                        sysPartnerAccount1.setUserId(sysPremiumDetail.getUserId());
                         sysPartnerAccountMapper.insert(sysPartnerAccount1);
                     } else {
                         sysPartnerAccount.setSumPremium(sysPartnerAccount.getSumPremium()
-                                .add(sysPremiumDetails2.getSumpremium()));
-                        sysPartnerAccount.setExtractFee(sysPartnerAccount.getExtractFee().add(extractFee));
-                        sysPartnerAccount.setCashFee(sysPartnerAccount.getCashFee().add(extractFee));
+                                .add(sysPremiumDetail.getSumpremium()));
+                        sysPartnerAccount.setExtractFee(sysPartnerAccount.getExtractFee()
+                                .add(sysPremiumDetail.getExtractFee()));
+                        sysPartnerAccount.setCashFee(sysPartnerAccount.getCashFee()
+                                .add(sysPremiumDetail.getExtractFee()));
                         sysPartnerAccountMapper.updateById(sysPartnerAccount);
                     }
-
-                } else {
-                    for (SysPremiumDetails sysPremiumDetail : sysPremiumDetails1) {
-                        SysPartnerAccount sysPartnerAccount = sysPartnerAccountMapper.selectOne(new LambdaQueryWrapper<SysPartnerAccount>()
-                                .eq(SysPartnerAccount::getUserId, sysPremiumDetail.getUserId()));
-                        if (sysPartnerAccount == null) {
-                            SysPartnerAccount sysPartnerAccount1 = new SysPartnerAccount();
-                            sysPartnerAccount1.setCreateTime(new Date());
-                            sysPartnerAccount1.setSumPremium(sysPremiumDetail.getSumpremium());
-                            sysPartnerAccount1.setExtractFee(sysPremiumDetail.getExtractFee());
-                            sysPartnerAccount1.setCashFee(sysPremiumDetail.getExtractFee());
-                            sysPartnerAccount1.setUserId(sysPremiumDetail.getUserId());
-                            sysPartnerAccountMapper.insert(sysPartnerAccount1);
-                        } else {
-                            sysPartnerAccount.setSumPremium(sysPartnerAccount.getSumPremium()
-                                    .add(sysPremiumDetail.getSumpremium()));
-                            sysPartnerAccount.setExtractFee(sysPartnerAccount.getExtractFee()
-                                    .add(sysPremiumDetail.getExtractFee()));
-                            sysPartnerAccount.setCashFee(sysPartnerAccount.getCashFee()
-                                    .add(sysPremiumDetail.getExtractFee()));
-                            sysPartnerAccountMapper.updateById(sysPartnerAccount);
-                        }
-                    }
                 }
-
-            }
-            sysPremiumDetailsMapper.updateStatus(insAreaCompany.getId());
-            if (isManagement(order.getUserid()) && sysSwitchConfigService.getBalanceExtractStatus()) {
-                dataServerService.sendLgDataServer(insOrderNo);
             }
-            // 审核完成之后 清空锁
-            redisTemplate.delete("FEE_AUDIT:"+insOrderNo);
-        } catch (Exception e) {
-            e.printStackTrace();
-            throw new SystemException("当前业务繁忙,请稍后重试");
-        } finally {
-            //释放锁
-            if (locked.isHeldByCurrentThread()) {
-                locked.unlock();
+
+        }
+    }
+
+
+    public void newExtractFee(InsAreaCompany insAreaCompany) {
+        List<PartnerPremiumDetails> partnerPremiumDetails = partnerPremiumDetailsMapper.selectList(new LambdaQueryWrapper<PartnerPremiumDetails>()
+                .eq(PartnerPremiumDetails::getCompanyId,  insAreaCompany.getId()));
+        for (PartnerPremiumDetails detail : partnerPremiumDetails) {
+            PartnerPartnerAccount account1 = partnerPartnerAccountMapper.selectOne(new LambdaQueryWrapper<PartnerPartnerAccount>()
+                    .eq(PartnerPartnerAccount::getUserId, detail.getUserId()).eq(PartnerPartnerAccount::getGrade,detail.getSource()));
+            if (Objects.isNull(account1)){
+                PartnerPartnerAccount account = new PartnerPartnerAccount();
+                account.setUserId(detail.getUserId());
+                account.setSumPremium(detail.getSumpremium());
+                account.setExtractFee(detail.getExtractFee());
+                account.setHistoryFee(new BigDecimal("0"));
+                account.setCashFee(detail.getExtractFee());
+                account.setCreateTime(new Date());
+                account.setGrade(detail.getSource());
+                partnerPartnerAccountMapper.insert(account);
+            }else {
+                account1.setSumPremium(account1.getSumPremium().add(detail.getSumpremium()));
+                account1.setExtractFee(account1.getExtractFee().add(detail.getExtractFee()));
+                account1.setCashFee(account1.getCashFee().add(detail.getExtractFee()));
+                partnerPartnerAccountMapper.updateById(account1);
             }
         }
     }
 
+
+
     public boolean isManagement(String userId) {
         SysUser sysUser = SpringUtil.getBean(SysUserBankCardMapper.class).selectByIdPay(userId);
         if (ManagementSource.MS_02.getCode().equals(sysUser.getManagementSource())) {

+ 3 - 0
src/main/java/com/ydtech/modules/ins/model/vo/QuoteRespVo.java

@@ -253,6 +253,9 @@ public class QuoteRespVo {
     @ApiModelProperty("报价记录")
     private List<SysQuoteRecord> quoteRecords;
 
+    @ApiModelProperty("大地 不浮动原因")
+    private String reasonNoFluctuation;
+
     public void setJqClaims(String jqClaims) {
         this.jqClaims = StringUtils.isEmpty(jqClaims) ? null : jqClaims;
     }

+ 17 - 1
src/main/java/com/ydtech/modules/ins/model/yc/accident/Accident.java

@@ -55,6 +55,20 @@ public class Accident {
         @JacksonXmlProperty(localName = "seatsNum")
         private String seatsNum;
 
+        /**
+         * 使用性质
+         */
+        @JacksonXmlProperty(localName = "CUsageCde")
+        private String cUsageCde;
+
+        /**
+         * 投保类型
+         * 单交强:DJ
+         * 单商业:DS交商联保:JS
+         */
+        @JacksonXmlProperty(localName = "CProdNo")
+        private String cProNo;
+
 
     }
 
@@ -69,8 +83,10 @@ public class Accident {
         RequestLabel r = new RequestLabel();
         r.setAuthorityData(ycConfigureParameters.gainAuthorityDataXml());
 //        r.setDeptcde(ycConfigureParameters.getDptCde().substring(0, 2));
-        r.setDeptcde("00");
+        r.setDeptcde("14");
         r.setSeatsNum(accidentalDrivingVo.getSeatNum() + "");
+        r.setCUsageCde("DJ");
+        r.setCProNo("349003001");
         if (StringUtils.isNotEmpty(schemeNo)) {
             r.setSchemeNo(schemeNo);
         }

+ 0 - 1
src/main/java/com/ydtech/modules/order/components/InsCrawlerOrderComponents.java

@@ -26,7 +26,6 @@ public class InsCrawlerOrderComponents {
     public <T, B> B post(String url, String logId, String message, @Nullable T requestBody, Class<B> responseType, HttpHeaders httpHeaders) {
         httpHeaders.setContentType(MediaType.APPLICATION_JSON);
         HttpEntity<T> yaQuoteInfoVoHttpEntity = new HttpEntity<>(requestBody, httpHeaders);
-
         String request = JSON.toJSONString(requestBody);
         InsuranceLog.infoLog(logId, "\n\t---------> {} \n\t---------> URL: {} \n\t---------> 请求参数: {}", message, url, request);
         ResponseEntity<B> stringResponseEntity = restTemplate.postForEntity(url, yaQuoteInfoVoHttpEntity, responseType);

+ 6 - 0
src/main/java/com/ydtech/modules/order/controller/InsCrawlerOrderController.java

@@ -166,9 +166,14 @@ public class InsCrawlerOrderController extends BaseController {
         YaCrawlerSendSmsCodeResponse result = insuranceCrawlerOrderService.yaSendCode(jsonObject.getString("companyId"),jsonObject.getString("smsCode"));
         if(result.getCode() == 200){
             return HttpResult.ok("发送成功!");
+        }else if(result.getCode() == 300){
+            // 获取新连接
+            return HttpResult.error(300,result.getMessage());
         }else{
             return HttpResult.error(result.getMessage());
         }
+//        return HttpResult.error(300,"https://www.baidu.com/");
+
     }
 
     @PostMapping(value = "/yaVerifySendCode")
@@ -183,6 +188,7 @@ public class InsCrawlerOrderController extends BaseController {
         }
     }
 
+
     @PostMapping(value = "/sendLoginSmsCode")
     @ApiOperation(value = "统一发送登录验证码")
     public HttpResult sendLoginSmsCode(@RequestBody PtlAgreementAttributionDto agreementAttributionDto) {

+ 2 - 0
src/main/java/com/ydtech/modules/order/controller/QrCodeController.java

@@ -114,6 +114,8 @@ public class QrCodeController {
                 }else{
                     qrCodeUrl = insAreaCompany.getPaymentLink();
                 }
+            } else if(insAreaCompany.getCompanyId().equals("CCIC1000000")){
+                qrCodeUrl = insAreaCompany.getPaymentLink();
             }
 
             qrCodeVo.setQrCodeUrl(qrCodeUrl);

+ 6 - 0
src/main/java/com/ydtech/modules/order/controller/QuoteController.java

@@ -250,6 +250,12 @@ public class QuoteController extends BaseController {
                 if(StringUtils.isNotBlank(javaObject.getProjectCode())){
                     LambdaQueryWrapper<InsDrivingIntentionInsurance> wrapper = new LambdaQueryWrapper<>();
                     wrapper.eq(InsDrivingIntentionInsurance::getProjectCode,javaObject.getProjectCode());
+                    InsDrivingIntentionInsurance finalJavaObject = javaObject;
+                    wrapper.and(w -> w
+                            .isNull(InsDrivingIntentionInsurance::getSeatNum)
+                            .or()
+                            .eq(InsDrivingIntentionInsurance::getSeatNum, finalJavaObject.getSeatNum())
+                    );
                     InsDrivingIntentionInsurance insDrivingIntentionInsurance = insDrivingIntentionInsuranceService.getOne(wrapper);
                     if (StringUtils.isNotBlank(insDrivingIntentionInsurance.getRelateCode())){
                         javaObject.setProjectCode(insDrivingIntentionInsurance.getRelateCode());

+ 6 - 0
src/main/java/com/ydtech/modules/order/entity/InsAreaCompany.java

@@ -613,6 +613,12 @@ public class InsAreaCompany implements Serializable {
     @TableField(value = "pricing_coefficient")
     private String pricingCoefficient;
 
+    /**
+     * 大地 不浮动原因
+     */
+    @TableField(value = "reason_no_fluctuation")
+    private String reasonNoFluctuation;
+
     //入口总金额
     @TableField(exist = false)
     private BigDecimal entranceAllFee;

+ 8 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/InsurePremiumRequest.java

@@ -101,6 +101,10 @@ public class InsurePremiumRequest extends ChengTaiBaseRequest{
         private String linkerName;
         @JsonProperty("unitTypeCode")
         private String unitTypeCode;
+        @JsonProperty("terrorNationality")
+        private String terrorNationality;
+
+
 
         public InsuredDTO(BaseQuoteInfoVo quoteInfoVo, PersonAreaVo personAreaVo){
             // 获取投保人信息
@@ -131,6 +135,7 @@ public class InsurePremiumRequest extends ChengTaiBaseRequest{
             this.identifyValidDate = insureInfo.getIdentifyValidDate();
             this.identifyValidEndDate = insureInfo.getIdentifyValidEndDate();
             this.longTerm = "0";
+            this.terrorNationality = "CN";
         }
     }
 
@@ -176,6 +181,8 @@ public class InsurePremiumRequest extends ChengTaiBaseRequest{
         private String linkerName;
         @JsonProperty("unitTypeCode")
         private String unitTypeCode;
+        @JsonProperty("terrorNationality")
+        private String terrorNationality;
 
 
         public ApplicantDTO(BaseQuoteInfoVo quoteInfoVo, PersonAreaVo applyPersonAreaVo){
@@ -205,6 +212,7 @@ public class InsurePremiumRequest extends ChengTaiBaseRequest{
             this.identifyValidDate = applyInfo.getIdentifyValidDate();
             this.identifyValidEndDate = applyInfo.getIdentifyValidEndDate();
             this.longTerm = "0";
+            this.terrorNationality = "CN";
         }
     }
 

+ 8 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/SubmitVerifyRequest.java

@@ -93,6 +93,9 @@ public class SubmitVerifyRequest extends ChengTaiBaseRequest{
         private String linkerName;
         @JsonProperty("unitTypeCode")
         private String unitTypeCode;
+        @JsonProperty("terrorNationality")
+        private String terrorNationality;
+
 
 
         public ApplicantDTO(InsOrders insOrders, PersonAreaVo applyPersonAreaVo){
@@ -122,6 +125,7 @@ public class SubmitVerifyRequest extends ChengTaiBaseRequest{
             this.identifyValidDate = applyInfo.getIdentifyValidDate();
             this.identifyValidEndDate = applyInfo.getIdentifyValidEndDate();
             this.longTerm = "0";
+            this.terrorNationality = "CN";
         }
     }
 
@@ -171,6 +175,9 @@ public class SubmitVerifyRequest extends ChengTaiBaseRequest{
         private String linkerName;
         @JsonProperty("unitTypeCode")
         private String unitTypeCode;
+        @JsonProperty("terrorNationality")
+        private String terrorNationality;
+
 
         public InsuredDTO(InsOrders insOrders, PersonAreaVo personAreaVo){
             // 获取投保人信息
@@ -201,6 +208,7 @@ public class SubmitVerifyRequest extends ChengTaiBaseRequest{
             this.identifyValidDate = insureInfo.getIdentifyValidDate();
             this.identifyValidEndDate = insureInfo.getIdentifyValidEndDate();
             this.longTerm = "0";
+            this.terrorNationality = "CN";
         }
     }
 

+ 46 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/InsurePremiumResponse.java

@@ -9,6 +9,7 @@ import com.ydtech.utils.StringUtils;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -28,6 +29,51 @@ public class InsurePremiumResponse extends ChengTaiBaseResponse {
     @JsonProperty("ciContract")
     private CiContractDTO ciContract;
 
+    @JsonProperty("yztScore")
+    private YztScore yztScore;
+
+    @NoArgsConstructor
+    @Data
+    public static class YztScore {
+
+        /**
+         * 评分百分段
+         */
+        @JsonProperty("centile")
+        private Integer centile;
+
+        /**
+         * 商业险纯损失
+         */
+        @JsonProperty("commercialPureLost")
+        private BigDecimal commercialPureLost;
+
+        /**
+         * 预估标的终极赔付率
+         */
+        @JsonProperty("finalLossrationRate")
+        private BigDecimal finalLossrationRate;
+
+        /**
+         * 交强险纯损失
+         */
+        @JsonProperty("forcePureLost")
+        private BigDecimal forcePureLost;
+
+        /**
+         * 标的纯损失
+         */
+        @JsonProperty("targetPureLost")
+        private BigDecimal targetPureLost;
+
+        /**
+         * 升分主要因子
+         */
+        @JsonProperty("increaseFactor")
+        private String increaseFactor;
+    }
+
+
     @NoArgsConstructor
     @Data
     public static class BiContractDTO {

+ 13 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/UnderwritingResultResponse.java

@@ -4,6 +4,8 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.util.List;
+
 @NoArgsConstructor
 @Data
 public class UnderwritingResultResponse extends ChengTaiBaseResponse{
@@ -22,4 +24,15 @@ public class UnderwritingResultResponse extends ChengTaiBaseResponse{
     private String contractNoCI;
     @JsonProperty("finalRuleResultEndDate")
     private String finalRuleResultEndDate;
+    @JsonProperty("data")
+    private List<UnderwritingResponse.DataDTO> data;
+
+    @NoArgsConstructor
+    @Data
+    public static class DataDTO {
+        @JsonProperty("reasondescription")
+        private String reasondescription;
+        @JsonProperty("riskCode")
+        private String riskCode;
+    }
 }

+ 3 - 1
src/main/java/com/ydtech/modules/order/entity/crawler/request/CrawlerQuoteRequest.java

@@ -97,8 +97,10 @@ public class CrawlerQuoteRequest extends BaseQuoteInfoVo {
     private String hopecoefficient;
 
     /**
-     * 华农
+     * 华农参数
      */
     private String permitComName;
 
+
+
 }

+ 7 - 0
src/main/java/com/ydtech/modules/order/entity/crawler/response/CrawlerQuoteResponse.java

@@ -388,6 +388,13 @@ public class CrawlerQuoteResponse extends CrawlerBaseResponse {
         private String hopecoefficient;
 
 
+        /**
+         * 大地不浮动原因
+         * @return
+         */
+        @JsonProperty("reason_no_fluctuation")
+        private String reasonNoFluctuation;
+
         public String getDiscount() {
             return StringUtils.isEmpty(discount) ? "0" : discount;
         }

+ 12 - 0
src/main/java/com/ydtech/modules/order/entity/vo/AuditExportVo.java

@@ -172,5 +172,17 @@ public class AuditExportVo {
     @ExcelProperty("补录订单")
     private String isExternal;
 
+    @ApiModelProperty("一级分销人员")
+    @ExcelIgnore
+    private String firstLevelUserId;
+
+    @ApiModelProperty("二级分销人员")
+    @ExcelIgnore
+    private String twoLevelUserId;
+
+    @ApiModelProperty("三级分销人员")
+    @ExcelIgnore
+    private String threeLevelUserId;
+
 
 }

+ 36 - 15
src/main/java/com/ydtech/modules/order/service/impl/ChengTaiOrderApiServiceImpl.java

@@ -263,19 +263,22 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
         }
 
         if(switchConfigService.ctDiscountSwitches()){ //是否自动计算折扣
-            String EntireInitialDiscountStr = biContract.getDiscountInfo().getEntireInitialDiscount();
-            String hopeDiscountStr = biContract.getContractMain().getHopeDiscount();
+            if(biContract != null) {
+                String EntireInitialDiscountStr = biContract.getDiscountInfo().getEntireInitialDiscount();
+                String hopeDiscountStr = biContract.getContractMain().getHopeDiscount();
 //            String hopeCoefficientStr = biContract.getContractMain().getHopeCoefficient();
-            if(StringUtils.isNotBlank(hopeDiscountStr) && StringUtils.isNotBlank(EntireInitialDiscountStr)){
-                // 获取商业险的初始建议折扣 和 期望折扣
-                Double entireInitialDiscount = Double.parseDouble(EntireInitialDiscountStr); //初始建议折扣
-                Double hopeDiscount = Double.parseDouble(hopeDiscountStr); // 期望折扣
-                if(entireInitialDiscount > hopeDiscount){
-                    biDiscountBoo = true;
-                }
-                if(biDiscountBoo){
-                    this.replaceDiscount(insurePremiumRequest,entireInitialDiscount);
-                    insurePremiumResponse = chengTaiRequestApiComponents.quoteApi(insurePremiumRequest,httpHeaders);
+                if (StringUtils.isNotBlank(hopeDiscountStr) && StringUtils.isNotBlank(EntireInitialDiscountStr)) {
+                    // 获取商业险的初始建议折扣 和 期望折扣
+                    Double entireInitialDiscount = Double.parseDouble(EntireInitialDiscountStr); //初始建议折扣
+                    Double hopeDiscount = Double.parseDouble(hopeDiscountStr); // 期望折扣
+                    if (entireInitialDiscount > hopeDiscount) {
+                        biDiscountBoo = true;
+                    }
+                    if (biDiscountBoo) {
+                        entireInitialDiscount = entireInitialDiscount + 0.01;
+                        this.replaceDiscount(insurePremiumRequest, entireInitialDiscount);
+                        insurePremiumResponse = chengTaiRequestApiComponents.quoteApi(insurePremiumRequest, httpHeaders);
+                    }
                 }
             }
         }
@@ -418,6 +421,15 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
                 contractMain.setExpiryDate(DateTimeUtil.format(localDateTime, DateTimeUtil.DATETIME_PATTERN));
                 ciContract.setContractMain(contractMain);
                 insurePremiumRequest.setCiContract(ciContract);
+                if(Objects.nonNull(insurePremiumRequest.getBiContract())){
+                    // 如果存在商业险的话  交强险重复投保 则也修改商业险的投保时间
+                    InsurePremiumRequest.BiContractDTO biContract = insurePremiumRequest.getBiContract();
+                    InsurePremiumRequest.BiContractDTO.ContractMainDTO biContractMain = biContract.getContractMain();
+                    biContractMain.setValidDate(DateTimeUtil.format(tomorrowMidnight, DateTimeUtil.DATETIME_PATTERN));
+                    biContractMain.setExpiryDate(DateTimeUtil.format(localDateTime, DateTimeUtil.DATETIME_PATTERN));
+                    biContract.setContractMain(biContractMain);
+                    insurePremiumRequest.setBiContract(biContract);
+                }
             }
             if (a.contains("商业险险平台") && a.contains("重复投保")){
                 InsurePremiumRequest.BiContractDTO biContract = insurePremiumRequest.getBiContract();
@@ -594,6 +606,10 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
                 quoteRespVo.setSyappoint(JSON.toJSONString(biEngageDTOS));
             }
         }
+        // 评分
+        if(insurePremiumResponse.getYztScore() != null) {
+            quoteRespVo.setILogPreUdwMess(insurePremiumResponse.getYztScore().getCentile() + "");
+        }
         return quoteRespVo;
     }
 
@@ -818,12 +834,17 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
             // 查询核保结果
             UnderwritingResultRequest resultRequest = new UnderwritingResultRequest(parameters,insAreaCompany.getInsOrderNo());
             UnderwritingResultResponse underwritingResultResponse = chengTaiRequestApiComponents.auditResult(resultRequest,httpHeaders);
-            String uwMsg = systemException.getMessage();
+            StringBuilder uwMsg = new StringBuilder(systemException.getMessage());
             if (OrderStatusEnum.A2001.getCode().equals(underwritingResultResponse.getFinalRuleResult()) || OrderStatusEnum.A2007.getCode().equals(underwritingResultResponse.getFinalRuleResult())) {
                 //  add  by  hxl  添加手动更新状态
                 insSubOrderUpdateDetailService.insertData(insAreaCompany, insAreaCompany.getOrderstatus(), InsOrderStatusEnum.TO_BACK.getCode(), "1");
                 insAreaCompany.setOrderstatus(InsOrderStatusEnum.TO_BACK.getCode());
-                insAreaCompanyService.updateCompanyAndOrdersMessage(insAreaCompany, uwMsg);
+                int i=1;
+                for(UnderwritingResponse.DataDTO dto : underwritingResultResponse.getData()){
+                    uwMsg.append("\n").append(String.valueOf(i)).append(".").append(dto.getReasondescription());
+                    i++;
+                }
+                insAreaCompanyService.updateCompanyAndOrdersMessage(insAreaCompany, uwMsg.toString());
                 return HttpResult.error(OrderStatusEnum.A2001.getDesc() + ":" + uwMsg);
                 // 人工核保
             } else if (OrderStatusEnum.A2002.getCode().equals(underwritingResultResponse.getFinalRuleResult())) {
@@ -831,7 +852,7 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
                 //  add  by  hxl  添加手动更新状态
                 insSubOrderUpdateDetailService.insertData(insAreaCompany, insAreaCompany.getOrderstatus(), InsOrderStatusEnum.WAIT_AUDIT.getCode(), "1");
                 insAreaCompany.setOrderstatus(InsOrderStatusEnum.WAIT_AUDIT.getCode());
-                insAreaCompanyService.updateCompanyAndOrdersMessage(insAreaCompany, uwMsg);
+                insAreaCompanyService.updateCompanyAndOrdersMessage(insAreaCompany, uwMsg.toString());
                 return HttpResult.error("人工核保" + ":" + uwMsg);
             }
 

+ 10 - 0
src/main/java/com/ydtech/modules/order/service/impl/ExcelExportServiceImpl.java

@@ -92,6 +92,16 @@ public class ExcelExportServiceImpl implements ExcelExportService {
             }else if(item.getIsExternal().equals("1")){
                 item.setIsExternal("是");
             }
+            //判断是否存在分销人员 如果不存在则分销金额为0
+            if (item.getFirstLevelUserId() == null || item.getFirstLevelUserId().equals("")){
+                item.setFirstDetailPremiums("0");
+            }
+            if (item.getTwoLevelUserId() == null || item.getTwoLevelUserId().equals("")){
+                item.setSecondDetailPremiums("0");
+            }
+            if (item.getThreeLevelUserId() == null || item.getThreeLevelUserId().equals("")){
+                item.setThirdDetailPremiums("0");
+            }
         });
         return auditExportList;
     }

+ 14 - 1
src/main/java/com/ydtech/modules/order/service/impl/InsCrawlerOrderServiceImpl.java

@@ -298,6 +298,13 @@ public class InsCrawlerOrderServiceImpl implements InsCrawlerOrderService {
             quoteRespVo.setPreDiscount(response.getOther().getBiDiscount());
         } else if (t.getCompanyId().equals("CCIC1000000")) {
             quoteRespVo.setSyAdjustRate(response.getOther().getHopecoefficient());
+            // 浮动原因 设置为过户车  并保存到主订单上
+            if (quoteRespVo.getReasonNoFluctuation().equals("1")) {
+                InsOrders insOrders = insOrdersService.getById(quoteInfoVo.getOrderNo());
+                JSONObject carinfo = insOrders.getCarinfo();
+                carinfo.put("transferFlag", true);
+                insOrdersService.updateById(insOrders);
+            }
         }
 
         //处理订单信息
@@ -656,6 +663,10 @@ public class InsCrawlerOrderServiceImpl implements InsCrawlerOrderService {
         if(other.getBiDiscount() != null && !other.getBiDiscount().isEmpty()){
             quoteRespVo.setPreDiscount(other.getBiDiscount());
         }
+        // 大地不浮动原因
+        if(other.getReasonNoFluctuation() != null){
+            quoteRespVo.setReasonNoFluctuation(other.getReasonNoFluctuation());
+        }
         return quoteRespVo;
     }
 
@@ -682,7 +693,6 @@ public class InsCrawlerOrderServiceImpl implements InsCrawlerOrderService {
         insAreaCompany.setOwnerInfo(JSON.toJSONString(quoteInfoVo.getOwnerInfo()));
         insAreaCompany.setApplyInfo(JSON.toJSONString(quoteInfoVo.getPolicyHolderInfo()));
         insAreaCompany.setInsureInfo(JSON.toJSONString(quoteInfoVo.getInsuredPersonInfo()));
-
         insAreaCompany.setTaxArrears(JSON.parseArray(JSON.toJSONString(quoteRespVo.getTaxArrears())));
 
         // 此单是否需要验车
@@ -762,6 +772,9 @@ public class InsCrawlerOrderServiceImpl implements InsCrawlerOrderService {
             insAreaCompany.setSyLossRation(Double.parseDouble(response.getOther().getSyLossRation()));
         }
 
+        if(Objects.nonNull(response.getOther().getReasonNoFluctuation())){
+            insAreaCompany.setReasonNoFluctuation(response.getOther().getReasonNoFluctuation());
+        }
 
         insAreaCompanyService.insertCompanyAndOrders(insAreaCompany, insAreaCompanyAccidentalDriving);
         //清空驾意险信息 重新复制

+ 106 - 0
src/main/java/com/ydtech/modules/order/service/impl/InsOrdersServiceImpl.java

@@ -1,6 +1,8 @@
 package com.ydtech.modules.order.service.impl;
+import java.util.Date;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.extra.spring.SpringUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -69,6 +71,12 @@ import com.ydtech.modules.order.entity.vo.ya.YaExtendInfoDto;
 import com.ydtech.modules.order.entity.vo.yangguang.YgQuoteAccidentVo;
 import com.ydtech.modules.order.entity.vo.zj.ZjQuoteAccidentVo;
 import com.ydtech.modules.order.service.*;
+import com.ydtech.modules.partner.utils.CalculateCommissionUtils;
+import com.ydtech.modules.partner.utils.KickbackChangeUtils;
+import com.ydtech.modules.partner.dao.PartnerPremiumDetailsMapper;
+import com.ydtech.modules.partner.model.PartnerPremiumDetails;
+import com.ydtech.modules.partner.model.PartnerUser;
+import com.ydtech.modules.partner.service.PartnerUserService;
 import com.ydtech.modules.protocol.entity.constants.PtlApiType;
 import com.ydtech.modules.protocol.entity.dto.PtlAgreementInsCompanyDto;
 import com.ydtech.modules.protocol.entity.po.PtlAgreement;
@@ -217,6 +225,13 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
     @Autowired
     private InsAreaCompanyInfoMapper insAreaCompanyInfoMapper;
 
+    @Autowired
+    private PartnerPremiumDetailsMapper partnerPremiumDetailsMapper;
+
+    @Autowired
+    private PartnerUserService partnerUserService;
+
+    private static final Integer[] STATIC_INTEGER_ARRAY = {1, 2, 3, 4};
 
     public InsOrdersServiceImpl(OrderComponents orderComponents, SysUserService sysUserService,
                                 SysUserRoleService sysUserRoleService,
@@ -274,6 +289,14 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
             insOrders.setInsureTime(insAreaCompany.getPayDate());
             String id = insAreaCompany.getId();
             if (StringUtils.isNotEmpty(id)) {
+                SysUser sysUser = sysUserService.getById(insOrders.getUserid());
+                if (1 == sysUser.getNewApp()){
+                   //新版本分钱-承保保费数据
+                   List<PartnerPremiumDetails> sysPremiumDetails = partnerPremiumDetailsMapper.selectList(new LambdaQueryWrapper<PartnerPremiumDetails>().eq(PartnerPremiumDetails::getCompanyId, id));
+                   if (sysPremiumDetails.isEmpty()){
+                       newSaveFeeInfo(insAreaCompany);
+                   }
+               }
                 List<SysPremiumDetails> sysPremiumDetails = sysPremiumDetailsMapper.selectList(new LambdaQueryWrapper<SysPremiumDetails>().eq(SysPremiumDetails::getCompanyId, id));
                 if (sysPremiumDetails.isEmpty()) {
                     //已承保记录保费数据
@@ -294,6 +317,89 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
 
     }
 
+
+
+    public void newSaveFeeInfo(InsAreaCompany insAreaCompany) {
+        InsOrders insOrders = getById(insAreaCompany.getOrderno());
+        String userId = insOrders.getUserid();
+        String userId3 = CalculateCommissionUtils.querySuperiorAndSubordinate(userId,"3");
+        String userId4 = CalculateCommissionUtils.querySuperiorAndSubordinate(userId,"4");
+        List<PartnerUser> partnerUser = partnerUserService.selectByUserId(userId);
+        List<PartnerPremiumDetails> list = new ArrayList<>();
+        for (PartnerUser user : partnerUser) {
+            PartnerPremiumDetails details = new PartnerPremiumDetails();
+            details.setUserId(user.getUserId());
+            details.setUserName("");
+            details.setIssuerId(userId);
+            details.setIssuerName(insOrders.getUsername());
+            details.setOrderno(insAreaCompany.getOrderno());
+            details.setCompanyId(insAreaCompany.getId());
+            details.setSumpremium(insAreaCompany.getJqpremium().add(insAreaCompany.getJypremium()).add(insAreaCompany.getSypremium()));
+            details.setJqpremium(insAreaCompany.getJqpremium());
+            details.setSypremium(insAreaCompany.getSypremium());
+            details.setJypremium(insAreaCompany.getJypremium());
+            BigDecimal bigDecimal = CalculateCommissionUtils.calculateCommission(String.valueOf(user.getGrade()), user.getUserId(),userId3,userId4);
+            details.setProportional(String.valueOf(bigDecimal));
+            details.setExtractFee(details.getSumpremium().multiply(bigDecimal.divide(new BigDecimal("100"))).setScale(2, RoundingMode.DOWN));
+            details.setStatus(0);
+            details.setType(1);
+            details.setDeptId(user.getDeptId());
+            details.setIndustrySector(0);
+            details.setCreateTime(new Date());
+            details.setLicenseno(insOrders.getLicenseno());
+            details.setSource(user.getGrade());
+            list.add(details);
+            SpringUtil.getBean(KickbackChangeUtils.class).before(bigDecimal, details,userId3,userId4);
+            saveFeeLevelInfo(user.getGrade() - 1, user.getReferrerId(), insAreaCompany, userId, list,userId3,userId4);
+        }
+        for (PartnerPremiumDetails details : list) {
+            partnerPremiumDetailsMapper.insert(details);
+        }
+        SpringUtil.getBean(KickbackChangeUtils.class).updatePersonnel(list,userId3,userId4);
+    }
+
+    public void saveFeeLevelInfo(Integer grade, String referrerId, InsAreaCompany insAreaCompany, String userId, List<PartnerPremiumDetails> list,String userId3,String userId4) {
+        if (Objects.isNull(grade) || grade <= 0) {
+            return;
+        }
+        PartnerUser partnerUser = partnerUserService.selectByUserIdAndGrade(referrerId, grade);
+        if (Objects.isNull(partnerUser)) {
+            return;
+        }
+        if (Arrays.stream(STATIC_INTEGER_ARRAY).anyMatch(partnerUser.getGrade()::equals)){
+            PartnerPremiumDetails details = new PartnerPremiumDetails();
+            // 获取订单信息
+            InsOrders insOrders = getById(insAreaCompany.getOrderno());
+            details.setUserId(partnerUser.getUserId());
+            details.setUserName("");
+            details.setIssuerId(userId);
+            details.setIssuerName(insOrders.getUsername());
+            details.setOrderno(insAreaCompany.getOrderno());
+            details.setCompanyId(insAreaCompany.getId());
+            details.setSumpremium(insAreaCompany.getJqpremium().add(insAreaCompany.getJypremium()).add(insAreaCompany.getSypremium()));
+            details.setJqpremium(insAreaCompany.getJqpremium());
+            details.setSypremium(insAreaCompany.getSypremium());
+            details.setJypremium(insAreaCompany.getJypremium());
+            BigDecimal bigDecimal = CalculateCommissionUtils.calculateCommission(String.valueOf(partnerUser.getGrade()), partnerUser.getUserId(),userId3,userId4);
+            details.setProportional(String.valueOf(bigDecimal));
+            details.setExtractFee(details.getSumpremium().multiply(bigDecimal.divide(new BigDecimal("100"))).setScale(2, RoundingMode.DOWN));
+            details.setStatus(0);
+            details.setType(1);
+            details.setDeptId(partnerUser.getDeptId());
+            details.setIndustrySector(0);
+            details.setCreateTime(new Date());
+            details.setLicenseno(insOrders.getLicenseno());
+            details.setSource(partnerUser.getGrade());
+            if (partnerUser.isIdentityStatus()){
+                details.setAppStatus(1);
+            }
+            list.add(details);
+            SpringUtil.getBean(KickbackChangeUtils.class).before(bigDecimal, details,userId3,userId4);
+        }
+        saveFeeLevelInfo(grade - 1, partnerUser.getReferrerId(), insAreaCompany, userId, list,userId3,userId4);
+    }
+
+
     @Override
     public void saveFeeInfo(InsAreaCompany insAreaCompany) {
         InsOrders insOrders = getById(insAreaCompany.getOrderno());

+ 19 - 0
src/main/java/com/ydtech/modules/order/service/impl/YongchengOrderApiServiceImpl.java

@@ -13,6 +13,7 @@ import com.ydtech.constants.enums.InsuranceRisk;
 import com.ydtech.constants.enums.dict.AttachInsureEnum;
 import com.ydtech.constants.enums.dict.InsOrderStatusEnum;
 import com.ydtech.constants.enums.dict.WhetherEnum;
+import com.ydtech.constants.enums.dict.agreement.ProductsType;
 import com.ydtech.core.page.HttpResult;
 import com.ydtech.exception.SystemException;
 import com.ydtech.modules.admin.model.vo.PersonAreaVo;
@@ -1052,6 +1053,24 @@ public class YongchengOrderApiServiceImpl implements YongchengOrderApiService {
             log.info("永诚API方式 - 补传回调 - 参数:{},车牌号:{}", JSON.toJSONString(param), order.getLicenseno());
             //订单原先状态
             String oldStatus = iac.getOrderstatus();
+//            // 查询状态
+//            boolean flag = false;
+//            if(iac.getProductid().equals(ProductsType.PT_0330.getCode())){
+//                if ("1".equals(param.getJqstatus())){
+//                    flag = true;
+//                }
+//            }
+//            if(iac.getProductid().equals(ProductsType.PT_034002.getCode()) || iac.getProductid().equals(ProductsType.PT_0330034001.getCode())){
+//                if("1".equals(param.getSystatus())){
+//                    flag = true;
+//                }
+//            }
+//            if(iac.getProductid().equals(ProductsType.PT_0330034002.getCode()) || iac.getProductid().equals(ProductsType.PT_0330034001.getCode())){
+//                if ("1".equals(param.getJqstatus()) && "1".equals(param.getSystatus())){
+//                    flag = true;
+//                }
+//            }
+
             //成功
             if (param.getResult().equals("0")) {
 

+ 3 - 3
src/main/java/com/ydtech/modules/order/service/impl/ZijinOrderApiServiceImpl.java

@@ -3,6 +3,7 @@ package com.ydtech.modules.order.service.impl;
 import cn.hutool.core.util.ArrayUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.ydtech.constants.enums.InsuranceOrderPdf;
 import com.ydtech.constants.enums.InsuranceRisk;
@@ -162,10 +163,9 @@ public class ZijinOrderApiServiceImpl implements ZijinOrderApiService {
         CalculatePremiumResponse calculatePremiumResponse = zijinRequestApiComponents.calculatePremium(calculatePremiumRequest,
                 httpHeaders, modelQueryRequest, message, queryActualValueRequest, REPEAT_NUMBER, RETRY_NUMBER);
 
-        List<CalculatePremiumResponse.CarInfoListDTO> collect = calculatePremiumResponse.getCarInfoList().stream().sorted(Comparator.comparing(CalculatePremiumResponse.CarInfoListDTO::getCarValue).reversed()).collect(Collectors.toList());
+        if (CollectionUtils.isNotEmpty(calculatePremiumResponse.getCarInfoList()) && calculatePremiumResponse.getCarInfoList().size() > 1) {
+            List<CalculatePremiumResponse.CarInfoListDTO> collect = calculatePremiumResponse.getCarInfoList().stream().sorted(Comparator.comparing(CalculatePremiumResponse.CarInfoListDTO::getCarValue).reversed()).collect(Collectors.toList());
 
-        // 如果报价返回的车型大于1的话 则赋值车价最低的 进行重新报价
-        if (collect.size() > 1) {
             calculatePremiumRequest.getVehicleInfo().setVehicleStyleUniqueId(collect.get(0).getVehicleStyleUniqueId());
             calculatePremiumResponse = zijinRequestApiComponents.calculatePremium(calculatePremiumRequest,
                     httpHeaders, modelQueryRequest, message, queryActualValueRequest, REPEAT_NUMBER, RETRY_NUMBER);

+ 51 - 0
src/main/java/com/ydtech/modules/partner/controller/ExpiredCommissionController.java

@@ -0,0 +1,51 @@
+package com.ydtech.modules.partner.controller;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ydtech.core.page.HttpResult;
+import com.ydtech.modules.base.controller.BaseController;
+import com.ydtech.modules.base.model.dto.PageDto;
+import com.ydtech.modules.partner.model.PartnerExpiredCommission;
+import com.ydtech.modules.partner.service.PartnerExpiredCommissionService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@Api(tags = "过期佣金记录")
+@Slf4j
+@RestController
+@RequestMapping("/expiredCommission")
+public class ExpiredCommissionController extends BaseController {
+
+
+    @Autowired
+    private PartnerExpiredCommissionService expiredCommissionService;
+
+    /**
+     * 过期佣金记录 列表
+     */
+    @PostMapping("/queryPage")
+    @ApiOperation(value = "过期佣金记录列表")
+    public HttpResult queryPage(@RequestBody PartnerExpiredCommission expiredCommission){
+        PageDto pageDto = new PageDto();
+        pageDto.setPageNum(expiredCommission.getPageNum());
+        pageDto.setPageSize(expiredCommission.getPageSize());
+        Page page = buildPageRequest(pageDto);
+        return expiredCommissionService.queryPage(page,expiredCommission);
+    }
+
+
+
+    /**
+     * 保存
+     */
+    @PostMapping("/save")
+    @ApiOperation(value = "过期佣金记录列表")
+    public HttpResult save(@RequestBody PartnerExpiredCommission expiredCommission){
+        return expiredCommissionService.save(expiredCommission) ? HttpResult.ok() : HttpResult.error();
+    }
+
+
+}

+ 497 - 0
src/main/java/com/ydtech/modules/partner/controller/NewAppPartnerController.java

@@ -0,0 +1,497 @@
+package com.ydtech.modules.partner.controller;
+
+
+import com.alipay.api.AlipayApiException;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ydtech.core.page.HttpResult;
+import com.ydtech.exception.SystemException;
+import com.ydtech.modules.admin.model.SysPartnerAccount;
+import com.ydtech.modules.admin.model.dto.*;
+import com.ydtech.modules.admin.model.vo.*;
+import com.ydtech.modules.admin.service.SysPartnerService;
+import com.ydtech.modules.base.controller.BaseController;
+import com.ydtech.modules.base.model.dto.PageDto;
+import com.ydtech.modules.order.entity.BasePageResult;
+import com.ydtech.modules.partner.model.PartnerPartnerAccount;
+import com.ydtech.modules.partner.model.param.AppHomeParams;
+import com.ydtech.modules.partner.model.param.PartnerApp;
+import com.ydtech.modules.partner.service.PartnerUserService;
+import com.ydtech.modules.protocol.utils.AssertionUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import java.util.List;
+
+@Api(tags = "(新)合伙人app")
+@Slf4j
+@RestController
+@RequestMapping("/newAppPartner")
+public class NewAppPartnerController extends BaseController {
+
+
+    @Resource
+    private SysPartnerService sysPartnerService;
+
+
+    @Resource
+    private PartnerUserService partnerUserService;
+
+
+    /**
+     * (新)查询用户身份信息
+     */
+    @GetMapping("/queryIdentityInformation")
+    @ApiOperation(value = "查询用户身份信息")
+    public HttpResult queryIdentityInformation(){
+        return partnerUserService.queryIdentityInformation(getUserId());
+    }
+
+
+    /**
+     * (新)首页信息
+     */
+    @PostMapping("/getHomePage")
+    @ApiOperation(value = "APP首页信息")
+    public HttpResult<AppPartnerNumVo> getHomePage(@RequestBody AppHomeParams params){
+        params.setUserId(getUserId());
+        return partnerUserService.getHomePage(params);
+    }
+
+    /**
+     * (新)首页钱包
+     */
+    @PostMapping("/getHomeWallet")
+    @ApiOperation(value = "APP首页信息")
+    public HttpResult<PartnerPartnerAccount> getHomeWallet(@RequestBody AppHomeParams params){
+        params.setUserId(getUserId());
+        return partnerUserService.getHomeWallet(params);
+    }
+
+    /**
+     * (新)人员查询
+     */
+    @PostMapping("/selectUser")
+    @ApiOperation(value = "人员查询")
+    public HttpResult selectUser(@RequestBody AppHomeParams params){
+        params.setUserId(getUserId());
+        return partnerUserService.selectUser(params);
+    }
+
+
+
+
+    /**
+     * (新)统计视图数据
+     */
+    @PostMapping("/userCountVo")
+    @ApiOperation(value = "统计视图数据")
+    public HttpResult userCountVo(@RequestBody AppHomeParams params){
+        params.setUserId(getUserId());
+        return partnerUserService.userCountVo(params);
+    }
+
+
+
+
+    /**
+     * (新)统计视图    汇总统计数据
+     */
+    @PostMapping("/userCountStatisticsVo")
+    @ApiOperation(value = "统计视图数据")
+    public HttpResult userCountStatisticsVo(@RequestBody AppHomeParams params){
+        params.setUserId(getUserId());
+        return partnerUserService.userCountStatisticsVo(params);
+    }
+
+
+
+    /**
+     * (新)统计视图    占比分析
+     */
+    @PostMapping("/userCountProportionVo")
+    @ApiOperation(value = "统计视图数据")
+    public HttpResult userCountProportionVo(@RequestBody AppHomeParams params){
+        params.setUserId(getUserId());
+        return partnerUserService.userCountProportionVo(params);
+    }
+
+
+    /**
+     * (新)统计视图    排名数据
+     */
+    @PostMapping("/userCountRankingVo")
+    @ApiOperation(value = "统计视图数据")
+    public HttpResult userCountRankingVo(@RequestBody AppHomeParams params){
+        params.setUserId(getUserId());
+        return partnerUserService.userCountRankingVo(params);
+    }
+
+
+    /**
+     * (新)人员列表详情数据查询  通过管理等级查询
+     */
+    @PostMapping("/selectByGradeList")
+    @ApiOperation(value = "人员列表详情数据查询")
+    public HttpResult selectByGradeList(@RequestBody PartnerApp partnerApp){
+        partnerApp.setUserId(getUserId());
+        partnerApp.setPage(buildPageRequest(partnerApp));
+        return partnerUserService.selectByGradeList(partnerApp);
+    }
+
+
+    /**
+     * (新)人员列表详情数据查询 通过用户ID  查询
+     */
+    @PostMapping("/selectByIdList")
+    @ApiOperation(value = "人员列表详情数据查询")
+    public HttpResult selectByIdList(@RequestBody PartnerApp partnerApp){
+        partnerApp.setPage(buildPageRequest(partnerApp));
+        return partnerUserService.selectByIdList(partnerApp);
+    }
+
+
+    /**
+     * (新)人员列表详情数据查询 通过用户ID  查询
+     */
+    @GetMapping("/selectByIdList")
+    @ApiOperation(value = "人员列表详情数据查询")
+    public HttpResult selectByIdList(@RequestParam("id") String id){
+        return partnerUserService.selectByIdListData(id);
+    }
+
+    public Page buildPageRequest(PartnerApp partnerApp) {
+        if (partnerApp.getPageNum() == null || partnerApp.getPageSize() == null){
+            throw new SystemException("分页参数不能为空");
+        }
+        PageDto pageDto = new PageDto();
+        pageDto.setPageNum(partnerApp.getPageNum());
+        pageDto.setPageSize(partnerApp.getPageSize());
+        return buildPageRequest(pageDto);
+    }
+
+
+    /**
+     * (新)个人信息
+     *
+     * @return
+     */
+    @GetMapping("/getUserInfo")
+    @ApiOperation(value = "APP个人信息")
+    public HttpResult<AppUserInfoVo> getUserInfo(@RequestParam("type") Integer type) {
+
+        return HttpResult.ok("success",partnerUserService.getUserInfo(type));
+    }
+
+
+    /**
+     * (新)我的业绩
+     * @param partnerApp
+     * @return
+     */
+    @PostMapping("/myPerformance")
+    public HttpResult myPerformance(@RequestBody PartnerApp partnerApp) {
+        partnerApp.setUserId(getUserId());
+        partnerApp.setPage(buildPageRequest(partnerApp));
+        return HttpResult.ok("success",partnerUserService.myPerformance(partnerApp));
+    }
+
+
+
+    /**
+     * (新)我的业绩  详情
+     * @param ordersNo
+     * @return
+     */
+    @GetMapping("/myPerformanceDetails")
+    public HttpResult myPerformance(@RequestParam("ordersNo") String ordersNo) {
+        return partnerUserService.myPerformanceDetails(ordersNo,getUserId());
+    }
+
+
+    /**
+     * (新APP)APP账户金额
+     *
+     * @return
+     */
+    @GetMapping("/newGetFee")
+    @ApiOperation(value = "APP账户金额")
+    public HttpResult newGetFee() {
+
+        return HttpResult.ok("success",this.partnerUserService.newGetFee(getUserId()));
+    }
+
+
+    /**
+     * APP账户金额
+     *
+     * @return
+     */
+    @GetMapping("/getFee")
+    @ApiOperation(value = "APP账户金额")
+    public HttpResult<SysPartnerAccount> getFee() {
+
+        return HttpResult.ok("success",this.sysPartnerService.getFee());
+    }
+
+
+
+
+    /**
+     * 登陆人下的每个等级合伙人统计信息
+     */
+    @PostMapping("/info")
+    @ApiOperation(value = "APP登陆人下的每个等级合伙人统计信息")
+    public HttpResult<List<AppSysPartnerVo>> partnerInfo(@RequestBody PartnerInfoDto partnerInfoDto) {
+
+        return HttpResult.ok("success",this.sysPartnerService.partnerInfo(partnerInfoDto));
+    }
+
+    /**
+     * 合伙人工作室详情 统计总费用
+     */
+    @PostMapping("/partnerLeaderInfo")
+    @ApiOperation(value = "合伙人工作室详情")
+    public HttpResult<PartnerLeaderInfoVo> partnerLeaderInfo(@RequestBody PartnerGradeInfo partnerGradeInfo) {
+
+        return HttpResult.ok("success",this.sysPartnerService.partnerLeaderInfo(partnerGradeInfo));
+    }
+
+
+    /**
+     * 筛选合伙人详情(未用)
+     * @return
+     */
+    @PostMapping("/queryFilterPartnerInfo")
+    @ApiOperation(value = "筛选合伙人详情")
+    public HttpResult<FilterPartnerInfoVo> queryFilterPartnerInfo(@RequestBody FilterPartnerInfoDto filterPartnerInfoDto) {
+
+        return HttpResult.ok("success",this.sysPartnerService.queryFilterPartnerInfo(filterPartnerInfoDto));
+    }
+
+    /**
+     * 等级合伙人详情
+     * @param partnerGradeInfo
+     * @return
+     */
+    @PostMapping("/queryPartnerInfo")
+    @ApiOperation(value = "等级合伙人详情")
+    public HttpResult<PartnerInfoFreeVo> queryPartnerInfo(@RequestBody PartnerGradeInfo partnerGradeInfo) {
+
+        return HttpResult.ok("success",this.sysPartnerService.queryPartnerInfo(partnerGradeInfo));
+    }
+
+
+    /**
+     * 查看团队
+     */
+    @PostMapping("/getTeamInfo")
+    @ApiOperation(value = "查看机构下团队信息")
+    public HttpResult<APPPartnerInfoFreeVo> getTeamInfo(@RequestBody PartnerGradeInfo partnerGradeInfo) {
+
+        return HttpResult.ok("success",this.sysPartnerService.getTeamInfo(partnerGradeInfo));
+    }
+
+    @PostMapping("/getTeamUserInfo")
+    @ApiOperation(value = "查看团队下人员信息")
+    public HttpResult<TeamUserInfosFreeVo> getTeamUserInfo(@RequestBody TeamUserInfosDto teamUserInfosDto) {
+
+        return HttpResult.ok("success",this.sysPartnerService.getTeamUserInfo(teamUserInfosDto));
+    }
+
+    /**
+     * 总佣金组成明细
+     */
+    @PostMapping("/getCommissionInfo")
+    @ApiOperation(value = "总佣金组成明细")
+    public HttpResult<BasePageResult<SysPremiumDetailsVo>> getCommissionInfo(@RequestBody CommissionInfoDto commissionInfoDto) {
+        if (commissionInfoDto.getPageNum() == 0) {
+            commissionInfoDto.setPageNum(1);
+        }
+        if (commissionInfoDto.getPageSize() == 0) {
+            commissionInfoDto.setPageSize(10);
+        }
+
+        return HttpResult.ok("success",this.sysPartnerService.getCommissionInfo(commissionInfoDto));
+    }
+
+    /**
+     * 改版后的总佣金组成明细
+     *
+     * @return
+     */
+    @PostMapping("/getCommissionInfos")
+    @ApiOperation(value = "改版后的总佣金组成明细")
+    public HttpResult<List<SysPremiumDetailsVo>> getCommissionInfos(@RequestBody CommissionInfoDto commissionInfoDto) {
+
+
+        return HttpResult.ok("success",this.sysPartnerService.getCommissionInfos(commissionInfoDto));
+    }
+
+
+
+
+    /**
+     *  app工作室新增人员统计
+     */
+    @PostMapping("/getCountUser")
+    @ApiOperation(value = "app工作室新增人员统计")
+    public HttpResult<CountUserVo> getCountUser(@RequestBody CountUserDto countUserDto) {
+
+        return HttpResult.ok("success",this.sysPartnerService.getCountUser(countUserDto));
+    }
+    /**
+     *  app合伙人新增人员统计
+     */
+    @PostMapping("/getPartnerCount")
+    @ApiOperation(value = "app合伙人新增人员统计")
+    public HttpResult<PartnerCountVo> getPartnerCount(@RequestBody PartnerCountDto partnerCountDto) {
+
+        return HttpResult.ok("success",this.sysPartnerService.getPartnerCount(partnerCountDto));
+    }
+
+    /**
+     *  五级合伙人新增人员统计
+     */
+    @PostMapping("/getFivePartnerCount")
+    @ApiOperation(value = "五级合伙人新增人员统计")
+    public HttpResult<PartnerCountVo> getFivePartnerCount(@RequestBody PartnerCountDto partnerCountDto) {
+
+        return HttpResult.ok("success",this.sysPartnerService.getFivePartnerCount(partnerCountDto));
+    }
+
+
+    /**
+     * 新增人员占比分析
+     */
+    @PostMapping("/getPartnerProportion")
+    @ApiOperation(value = "新增人员占比分析")
+    public HttpResult<PartnerProportionVo> getPartnerProportion(@RequestBody PartnerCountDto partnerCountDto) {
+
+        return HttpResult.ok("success",this.sysPartnerService.getPartnerProportion(partnerCountDto));
+    }
+
+    /**
+     * 排行榜
+     */
+    @GetMapping("/getLevelPartner")
+    @ApiOperation(value = "排行榜")
+    public HttpResult<List<LevelPartnerVo>> getLevelPartner(@RequestParam("type") @ApiParam("等级:1、2、3、4、5") Integer type) {
+
+        return HttpResult.ok("success",this.sysPartnerService.getLevelPartner(type));
+    }
+
+    /**
+     * 排行榜->查看详情
+     * @return
+     */
+    @PostMapping("/getLevelPartnerInfo")
+    @ApiOperation(value = "排行榜->查看详情")
+    public HttpResult<List<LevelPartnerInfoVo>> getLevelPartnerInfo(@RequestBody List<String> partnerIds) {
+
+        return HttpResult.ok("success",this.sysPartnerService.getLevelPartnerInfo(partnerIds));
+    }
+
+
+    /**
+     * 支付宝登录
+     * @param alipayBindVo
+     * @return
+     */
+    @PostMapping("/loginAlipay")
+    @ApiOperation(value = "支付宝登录")
+    public HttpResult<AAPLoginVo> loginAlipay(@RequestBody AlipayBindVo alipayBindVo) {
+        log.info("支付宝登录入参:{}",alipayBindVo);
+        try {
+            return sysPartnerService.loginAlipay(alipayBindVo);
+        } catch (AlipayApiException e) {
+            log.info(e.getMessage());
+            throw new SystemException("支付宝登录失败");
+        }
+    }
+
+    /**
+     * 工号绑定支付宝
+     * @param alipayBindVo
+     * @return
+     * @throws AlipayApiException
+     */
+    @PostMapping("/bindAlipay")
+    @ApiOperation(value = "工号绑定支付宝")
+    HttpResult<Object> bindAlipay(@RequestBody AlipayBindVo alipayBindVo){
+        log.info("支付宝绑定入参:{}",alipayBindVo);
+        try {
+            String userId = getUserId();
+            return sysPartnerService.bindAlipay(alipayBindVo, userId);
+        } catch (AlipayApiException e) {
+            throw new SystemException("支付宝绑定失败");
+        }
+    }
+
+    /**
+     * 是否绑定支付宝
+     * @return
+     */
+    @ApiOperation(value = "是否绑定支付宝")
+    @GetMapping(value = "/checkBindAlipay")
+    public HttpResult checkBindAlipay() {
+
+        String alipayId = sysPartnerService.checkBindAlipay();
+
+        AssertionUtils.isStringEmpty(alipayId, "未绑定支付宝");
+        return HttpResult.ok();
+    }
+
+    /**
+     * 微信登录
+     * @param wechatLoginVo
+     * @return
+     */
+    @PostMapping("/loginWechat")
+    @ApiOperation(value = "微信登录")
+    public HttpResult<AAPLoginVo> loginWechat(@RequestBody WechatLoginVo wechatLoginVo) {
+        log.info("微信登录入参:{}",wechatLoginVo);
+        try {
+            return sysPartnerService.loginWechat(wechatLoginVo);
+        } catch (WxErrorException e) {
+            log.info(e.getMessage());
+            throw new SystemException("微信登录失败");
+        }
+    }
+
+    /**
+     * 工号绑定微信
+     * @param wechatBindVo
+     * @return
+     * @throws WxErrorException
+     */
+    @PostMapping("/bindWechat")
+    @ApiOperation(value = "工号绑定微信")
+    HttpResult<Object> bindWechat(@RequestBody WechatBindVo wechatBindVo){
+        log.info("微信绑定入参:{}",wechatBindVo);
+        try {
+            String userId = getUserId();
+            return sysPartnerService.bindWechat(wechatBindVo, userId);
+        } catch (WxErrorException e) {
+            log.info(e.getMessage());
+            throw new SystemException("微信绑定失败");
+        }
+    }
+
+    /**
+     * 是否绑定微信
+     */
+    @ApiOperation(value = "是否绑定微信")
+    @GetMapping(value = "/checkBindWechat")
+    public HttpResult checkBindWechat() {
+        String openId = sysPartnerService.checkBindWechat();
+        AssertionUtils.isStringEmpty(openId, "未绑定微信");
+        return HttpResult.ok();
+    }
+
+
+
+}

+ 37 - 0
src/main/java/com/ydtech/modules/partner/controller/PartnerCommissionController.java

@@ -0,0 +1,37 @@
+package com.ydtech.modules.partner.controller;
+
+
+import com.ydtech.core.page.HttpResult;
+import com.ydtech.modules.partner.model.vo.CommissionRulesVo;
+import com.ydtech.modules.partner.service.PartnerCommissionService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+
+@Api(tags = "佣金规则")
+@RestController
+@RequestMapping("/partner/commission")
+@RequiredArgsConstructor
+public class PartnerCommissionController {
+
+
+    @Autowired
+    private PartnerCommissionService commissionService;
+
+
+    @PostMapping("/save")
+    public HttpResult save(@RequestBody CommissionRulesVo rulesVo) {
+        return HttpResult.ok(commissionService.save(rulesVo) > 0 ? "保存成功" : "保存失败");
+    }
+
+
+
+    @GetMapping("/query")
+    public HttpResult queryAll() {
+        return HttpResult.ok(commissionService.queryAll());
+    }
+
+
+}

+ 46 - 0
src/main/java/com/ydtech/modules/partner/controller/PartnerCommissionDetailsController.java

@@ -0,0 +1,46 @@
+package com.ydtech.modules.partner.controller;
+
+
+import com.ydtech.core.page.HttpResult;
+import com.ydtech.modules.base.controller.BaseController;
+import com.ydtech.modules.partner.model.param.PartnerDetailsParam;
+import com.ydtech.modules.partner.service.PartnerPremiumDetailsService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.RequiredArgsConstructor;
+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;
+
+
+@Api(tags = "佣金明细")
+@RestController
+@RequestMapping("/partner/commissionDetails")
+@RequiredArgsConstructor
+public class PartnerCommissionDetailsController extends BaseController {
+
+    @Autowired
+    private PartnerPremiumDetailsService partnerPremiumDetailsService;
+
+
+    @PostMapping("/queryPage")
+    public HttpResult queryPage(@RequestBody PartnerDetailsParam detailsParam){
+        detailsParam.setPage(buildPageRequest(detailsParam.getPageDto()));
+        return HttpResult.ok(partnerPremiumDetailsService.queryPage(detailsParam));
+    }
+
+
+
+    @ApiModelProperty(dataType = "查询过期锁定记录")
+    @PostMapping("queryExpiredLockRecords")
+    public HttpResult queryExpiredLockRecords(@RequestBody PartnerDetailsParam detailsParam){
+        detailsParam.setPage(buildPageRequest(detailsParam.getPageDto()));
+        detailsParam.setUserId(getUserId());
+        return HttpResult.ok(partnerPremiumDetailsService.queryExpiredLockRecords(detailsParam));
+    }
+
+
+
+}

+ 167 - 0
src/main/java/com/ydtech/modules/partner/controller/PartnerExtractHistoryController.java

@@ -0,0 +1,167 @@
+package com.ydtech.modules.partner.controller;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ydtech.core.page.HttpResult;
+import com.ydtech.modules.admin.dao.SysPartnerAccountMapper;
+import com.ydtech.modules.admin.model.SysPartnerAccount;
+import com.ydtech.modules.base.controller.BaseController;
+import com.ydtech.modules.base.model.dto.PageDto;
+import com.ydtech.modules.partner.dao.PartnerPartnerAccountMapper;
+import com.ydtech.modules.partner.model.PartnerExtractHistory;
+import com.ydtech.modules.partner.model.PartnerPartnerAccount;
+import com.ydtech.modules.partner.model.param.PartnerRuleEntity;
+import com.ydtech.modules.partner.service.PartnerExtractHistoryService;
+import com.ydtech.modules.partner.service.PartnerLiftingRecordService;
+import com.ydtech.modules.partner.service.PartnerRuleService;
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+
+@Api(tags = "提现记录")
+@Slf4j
+@RestController
+@RequestMapping("/partnerExtractHistory")
+public class PartnerExtractHistoryController extends BaseController {
+
+
+    @Autowired
+    private PartnerExtractHistoryService partnerExtractHistoryService;
+
+    @Autowired
+    private SysPartnerAccountMapper sysPartnerAccountMapper;
+
+    @Autowired
+    private PartnerPartnerAccountMapper partnerPartnerAccountMapper;
+
+    @Autowired
+    private PartnerRuleService ruleService;
+
+    @Autowired
+    private PartnerLiftingRecordService liftingRecordService;
+
+    @PostMapping("/query")
+    public HttpResult query(@RequestBody PartnerExtractHistory extractHistory){
+//        if (StringUtils.isEmpty(extractHistory.getGrade())){
+//            return HttpResult.error("用户等级不能为空");
+//        }
+        if (extractHistory.getPageNum() == null || extractHistory.getPageSize() == null){
+            return HttpResult.error("分页参数不能为空");
+        }
+        PageDto pageDto = new PageDto();
+        pageDto.setPageNum(extractHistory.getPageNum());
+        pageDto.setPageSize(extractHistory.getPageSize());
+        extractHistory.setPage(buildPageRequest(pageDto));
+        extractHistory.setUserId(getUserId());
+        return HttpResult.ok(partnerExtractHistoryService.queryPage(extractHistory));
+    }
+
+    /**
+     * 提现
+     * @param extractHistory
+     * @return
+     */
+    @PostMapping("/extractRecords")
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResult extractRecords(@RequestBody PartnerExtractHistory extractHistory){
+        if (StringUtils.isEmpty(extractHistory.getGrade())){
+            return HttpResult.error("用户等级不能为空");
+        }
+        if (null != extractHistory.getAmount() &&extractHistory.getAmount().compareTo(new BigDecimal("0")) <= 0){
+            return HttpResult.error("提现金额不能小于0");
+        }
+        String userId = getUserId();
+        PartnerPartnerAccount partnerAccount = partnerPartnerAccountMapper.selectOne(new LambdaQueryWrapper<PartnerPartnerAccount>()
+                .eq(PartnerPartnerAccount::getUserId, userId)
+                .eq(PartnerPartnerAccount::getGrade, extractHistory.getGrade()));
+        if (null == partnerAccount){
+            return HttpResult.error("账号余额不足");
+        }
+        if (partnerAccount.getCashFee().compareTo(extractHistory.getAmount()) == -1){
+            return HttpResult.error("账号余额不足");
+        }
+        extractHistory.setUserId(userId);
+        boolean save = partnerExtractHistoryService.save(extractHistory);
+        if (save){
+            SysPartnerAccount account = sysPartnerAccountMapper.selectOne(new LambdaQueryWrapper<SysPartnerAccount>()
+                    .eq(SysPartnerAccount::getUserId,userId));
+            if (account != null){
+                account.setExtractFee(account.getExtractFee().add(extractHistory.getAmount()));
+                account.setCashFee(account.getCashFee().add(extractHistory.getAmount()));
+                sysPartnerAccountMapper.updateById(account);
+            }else {
+                account = new SysPartnerAccount();
+                account.setUserId(userId);
+                account.setExtractFee(extractHistory.getAmount());
+                account.setHistoryFee(new BigDecimal("0"));
+                account.setCashFee(extractHistory.getAmount());
+                account.setCreateTime(new Date());
+                sysPartnerAccountMapper.insert( account);
+            }
+            partnerAccount.setHistoryFee(partnerAccount.getHistoryFee().add(extractHistory.getAmount()));
+            partnerAccount.setCashFee(partnerAccount.getCashFee().subtract(extractHistory.getAmount()));
+            partnerPartnerAccountMapper.updateById(partnerAccount);
+        }
+        return HttpResult.ok(save ? "提取成功" : "提取失败");
+    }
+
+
+    /**
+     * 未转入的金额
+     * @return
+     */
+    @GetMapping("/queryExtractRecords")
+    public HttpResult queryExtractRecords(){
+        List<PartnerPartnerAccount> partnerPartnerAccounts = partnerPartnerAccountMapper.selectList(new LambdaQueryWrapper<PartnerPartnerAccount>()
+                .eq(PartnerPartnerAccount::getUserId,getUserId()));
+
+        partnerPartnerAccounts.stream().forEach(partnerPartnerAccount -> {
+            partnerPartnerAccount.setCashFee(partnerPartnerAccount.getCashFee().subtract(partnerPartnerAccount.getExpiredAmount()));
+        });
+
+        List<Map.Entry<Integer, BigDecimal>> collect = partnerPartnerAccounts.stream()
+                .collect(Collectors.groupingBy(
+                        PartnerPartnerAccount::getGrade,
+                        Collectors.reducing(
+                                BigDecimal.ZERO,
+                                PartnerPartnerAccount::getCashFee,
+                                BigDecimal::add
+                        )
+                ))
+                .entrySet().stream()
+                .sorted(Map.Entry.comparingByKey())
+                .collect(Collectors.toList());
+        List<JSONObject> list = new ArrayList<>();
+        BigDecimal total = BigDecimal.ZERO;
+        for (Map.Entry<Integer, BigDecimal> entry : collect) {
+
+            BigDecimal lockCommission = liftingRecordService.queryLockCommission(getUserId(),entry.getKey().toString());
+
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("grade", entry.getKey().toString());
+            if (null != lockCommission){
+                BigDecimal subtract = entry.getValue().subtract(lockCommission);
+                total = total.add(subtract);
+                jsonObject.put("cashFee", subtract.toString());
+            }else {
+                total = total.add(entry.getValue());
+                jsonObject.put("cashFee", entry.getValue().toString());
+            }
+            PartnerRuleEntity ruleEntity = ruleService.selectByGrade(entry.getKey().toString());
+            jsonObject.put("gradeName", ruleEntity.getGradeName());
+            list.add(jsonObject);
+        }
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("list", list);
+        map.put("total", total);
+        return HttpResult.ok(map);
+    }
+
+}

+ 37 - 0
src/main/java/com/ydtech/modules/partner/controller/PartnerKickbackChangeController.java

@@ -0,0 +1,37 @@
+package com.ydtech.modules.partner.controller;
+
+
+import com.ydtech.core.page.HttpResult;
+import com.ydtech.modules.partner.model.PartnerKickbackChange;
+import com.ydtech.modules.partner.model.param.PartnerKickbackChangeParam;
+import com.ydtech.modules.partner.service.PartnerKickbackChangeService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+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;
+
+@Api(tags = "佣金变更记录 ")
+@RestController
+@RequestMapping("/partner/kickbackChange")
+@RequiredArgsConstructor
+public class PartnerKickbackChangeController {
+
+    @Autowired
+    private PartnerKickbackChangeService kickbackChangeService;
+
+
+    @PostMapping("queryPage")
+    public HttpResult queryPage(@RequestBody PartnerKickbackChangeParam changeParam){
+        return HttpResult.ok(kickbackChangeService.queryPage(changeParam));
+    }
+
+
+    @PostMapping("save")
+    public HttpResult save(@RequestBody PartnerKickbackChange kickbackChange){
+        return kickbackChangeService.saveKickbackChange(kickbackChange);
+    }
+
+}

+ 88 - 0
src/main/java/com/ydtech/modules/partner/controller/PartnerLiftingRecordController.java

@@ -0,0 +1,88 @@
+package com.ydtech.modules.partner.controller;
+
+
+import com.ydtech.core.page.HttpResult;
+import com.ydtech.modules.base.controller.BaseController;
+import com.ydtech.modules.partner.model.PartnerLiftingRecord;
+import com.ydtech.modules.partner.model.PartnerRecordApper;
+import com.ydtech.modules.partner.model.param.LiftingRecordAudit;
+import com.ydtech.modules.partner.model.param.PartnerLiftingRecordParam;
+import com.ydtech.modules.partner.service.PartnerLiftingRecordService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Api(tags = "升降记录 ")
+@RestController
+@RequestMapping("/partner/liftingRecord")
+@RequiredArgsConstructor
+public class PartnerLiftingRecordController extends BaseController {
+
+    @Autowired
+    private PartnerLiftingRecordService liftingRecordService;
+
+
+    @PostMapping("/save")
+    public HttpResult save(@RequestBody PartnerLiftingRecord liftingRecord) {
+        return liftingRecordService.saveLiftingRecord(liftingRecord);
+    }
+
+
+
+
+    @PostMapping("/queryPage")
+    public HttpResult queryPage(@RequestBody PartnerLiftingRecordParam recordParam) {
+        recordParam.setPage(buildPageRequest(recordParam.getPageDto()));
+        return HttpResult.ok(liftingRecordService.queryPage(recordParam));
+    }
+
+    /**
+     * 升级  审核、驳回
+     * @param audit
+     * @return
+     */
+    @PostMapping("/audit")
+    public HttpResult audit(@RequestBody LiftingRecordAudit audit) {
+        audit.setAuditUser(getUserName());
+        return liftingRecordService.audit(audit);
+    }
+
+
+    /**
+     * 降级    审核、驳回
+     * @param audit
+     * @return
+     */
+    @PostMapping("/downgradeAudit")
+    public HttpResult downgradeAudit(@RequestBody LiftingRecordAudit audit) {
+        audit.setAuditUser(getUserName());
+        return liftingRecordService.downgradeAudit(audit);
+    }
+
+    /**
+     * 解锁等级查询金额
+     * @param grade
+     * @return
+     */
+    @GetMapping("/unlockLevel")
+    public HttpResult unlockLevel(@RequestParam("grade")String grade) {
+        return liftingRecordService.unlockLevel(grade);
+    }
+
+
+
+
+    /**
+     * 确认解锁
+     * @param recordApper
+     * @return
+     */
+    @PostMapping("/confirmUnlocking")
+    public HttpResult confirmUnlocking(@RequestBody PartnerRecordApper recordApper) {
+        return liftingRecordService.confirmUnlocking(recordApper);
+    }
+
+}

+ 55 - 0
src/main/java/com/ydtech/modules/partner/controller/PartnerRuleController.java

@@ -0,0 +1,55 @@
+package com.ydtech.modules.partner.controller;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.ydtech.core.page.HttpResult;
+import com.ydtech.modules.partner.model.param.PartnerRuleEntity;
+import com.ydtech.modules.partner.service.PartnerRuleService;
+import com.ydtech.modules.partner.utils.ConditionUtils;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Api(tags = "等级规则")
+@RestController
+@RequestMapping("/partner/rule")
+@RequiredArgsConstructor
+public class PartnerRuleController {
+
+    @Autowired
+    private PartnerRuleService partnerRuleService;
+
+
+    @PostMapping("/save")
+    public HttpResult save(@RequestBody List<PartnerRuleEntity> ruleEntityList) {
+        return HttpResult.ok(partnerRuleService.save(ruleEntityList) > 0 ? "保存成功" : "保存失败");
+    }
+
+
+    @GetMapping("/query")
+    public HttpResult query() {
+        return HttpResult.ok(partnerRuleService.queryAll());
+    }
+
+
+    /**
+     * 获取等级规则名称
+     * @return
+     */
+    @GetMapping("/queryGradeName")
+    public HttpResult queryGradeName() {
+        return HttpResult.ok(partnerRuleService.queryGradeName());
+    }
+
+    @GetMapping("/verifyUpgradeConditions")
+    public HttpResult verifyUpgradeConditions(@RequestParam("grade") String grade) {
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("升级", ConditionUtils.upgradeConditions(grade));
+        jsonObject.put("考核", ConditionUtils.assessmentRules(grade));
+        return HttpResult.ok(jsonObject);
+    }
+
+}

+ 207 - 0
src/main/java/com/ydtech/modules/partner/controller/PartnerUserController.java

@@ -0,0 +1,207 @@
+package com.ydtech.modules.partner.controller;
+
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.ydtech.core.page.HttpResult;
+import com.ydtech.modules.base.controller.BaseController;
+import com.ydtech.modules.partner.model.PartnerUser;
+import com.ydtech.modules.partner.model.param.QueryVo;
+import com.ydtech.modules.partner.model.param.UserGradeParam;
+import com.ydtech.modules.partner.service.PartnerUserService;
+import com.ydtech.modules.partner.utils.ContactQrCodeUtils;
+import com.ydtech.modules.partner.utils.TimedTaskUtils;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.Map;
+
+
+@Api(tags = "合伙人")
+@RestController
+@RequestMapping("/partner")
+@RequiredArgsConstructor
+public class PartnerUserController extends BaseController {
+
+
+    @Autowired
+    private PartnerUserService partnerUserService;
+
+
+
+    @PostMapping("/save")
+    public HttpResult add(@RequestBody PartnerUser partnerUser) {
+        partnerUser.setCreateTime(new Date());
+        return HttpResult.ok(partnerUserService.save(partnerUser) ? "添加成功" : "添加失败");
+    }
+
+
+    @PostMapping("/update")
+    public HttpResult update(@RequestBody PartnerUser partnerUser) {
+        return HttpResult.ok(partnerUserService.updateById(partnerUser)  ? "修改成功" : "修改失败");
+    }
+
+
+
+    @PostMapping("/queryPage")
+    public HttpResult queryPage(@RequestBody QueryVo queryVo) {
+        queryVo.setPage(buildPageRequest(queryVo.getPageDto()));
+        return HttpResult.ok(partnerUserService.queryPage(queryVo));
+    }
+
+    /**
+     * 用户关系查询
+     * @param id
+     * @return
+     */
+    @GetMapping("relationalQuery")
+    public HttpResult relationalQuery(@RequestParam("id") String id) {
+        return HttpResult.ok(partnerUserService.relationalQuery(id));
+    }
+
+
+    /**
+     * 选择上级推荐人
+     * @param level
+     * @return
+     */
+    @GetMapping("selectRecommender")
+    public HttpResult selectRecommender(@RequestParam(value = "level",required = false) String level) {
+        return HttpResult.ok(partnerUserService.selectRecommender(level));
+    }
+
+
+    /**
+     * 验证是否满足升级条件
+     * @param userGradeParam
+     * @return
+     */
+    @PostMapping("/verifyUpgradeConditions")
+    public HttpResult verifyUpgradeConditions(@RequestBody UserGradeParam userGradeParam) {
+        userGradeParam.setId(getUserId());
+        return partnerUserService.verifyUpgradeConditions(userGradeParam);
+    }
+
+
+    /**
+     * 提交合伙人变更申请
+     * @param userGradeParam
+     * @return
+     */
+    @PostMapping("submitLiftingRecord")
+    public HttpResult submitLiftingRecord(@RequestBody UserGradeParam userGradeParam) {
+        userGradeParam.setId(getUserId());
+        return partnerUserService.submitLiftingRecord(userGradeParam);
+    }
+
+
+    /**
+     * 合伙人头像修改
+     * @param partnerUser
+     * @return
+     */
+    @PostMapping("avatarUpdate")
+    public HttpResult avatarUpdate(@RequestBody PartnerUser partnerUser) {
+        partnerUser.setUserId(getUserId());
+        return partnerUserService.avatarUpdate(partnerUser);
+    }
+
+    /**
+     * 我的佣金比例
+     * @return
+     */
+    @GetMapping("commissionRate")
+    public HttpResult commissionRate(@RequestParam("grade") String grade) {
+        return partnerUserService.commissionRate(getUserId(),grade);
+    }
+
+
+    /**
+     * 我的佣金比例
+     * @return
+     */
+    @GetMapping("myCommissionRate")
+    public HttpResult myCommissionRate() {
+        return partnerUserService.myCommissionRate(getUserId());
+    }
+
+
+    /**
+     * 查询当前用户的身份
+     * @param userId
+     * @return
+     */
+    @GetMapping("getUserGradeList")
+    public HttpResult getUserGradeList(@RequestParam(value = "userId",required = false) String userId) {
+        return HttpResult.ok(partnerUserService.getUserGradeList(userId));
+    }
+
+    /**
+     * 查询当前用户的身份
+     * @param userId
+     * @return
+     */
+    @GetMapping("getUserGradeListMap")
+    public HttpResult getUserGradeListMap() {
+        return HttpResult.ok(partnerUserService.getUserGradeListMap(getUserId()));
+    }
+
+
+
+    /**
+     * 新增用户身份
+     * @param > map
+     * @return
+     */
+    @PostMapping("addUserIdentity")
+    public HttpResult addUserIdentity(@RequestBody Map<String,Object> map) {
+        return partnerUserService.addUserIdentity(map);
+    }
+
+    /**
+     * 未降级完成任务
+     * @param grade
+     * @return
+     */
+    @GetMapping("queryDowngradeTask")
+    public HttpResult queryDowngradeTask(@RequestParam(value = "grade") String grade) {
+        return partnerUserService.queryDowngradeTask(grade,getUserId());
+    }
+
+
+    /**
+     * 已降级完成任务
+     * @param grade
+     * @return
+     */
+    @GetMapping("degradedTask")
+    public HttpResult degradedTask(@RequestParam(value = "grade") String grade) {
+        return partnerUserService.degradedTask(grade,getUserId());
+    }
+
+
+
+    /**
+     * 已降级完成任务
+     * @return
+     */
+    @GetMapping("checkCommissionExpireTime")
+    public void checkCommissionExpireTime() {
+         SpringUtil.getBean(TimedTaskUtils.class).updateOrderDateNoon();
+    }
+
+
+
+    /**
+     * 联系客服
+     * @return
+     */
+    @GetMapping("contactCustomerService")
+    public HttpResult contactCustomerService() {
+        return HttpResult.ok(ContactQrCodeUtils.getContactQrCode());
+    }
+
+
+}

+ 61 - 0
src/main/java/com/ydtech/modules/partner/controller/PurchaseRecordController.java

@@ -0,0 +1,61 @@
+package com.ydtech.modules.partner.controller;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ydtech.core.page.HttpResult;
+import com.ydtech.modules.base.controller.BaseController;
+import com.ydtech.modules.base.model.dto.PageDto;
+import com.ydtech.modules.partner.model.PartnerPurchaseRecord;
+import com.ydtech.modules.partner.service.PurchaseRecordService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@Api(tags = "购买记录")
+@Slf4j
+@RestController
+@RequestMapping("/purchaseRecord")
+public class PurchaseRecordController extends BaseController {
+
+
+    @Autowired
+    private PurchaseRecordService purchaseRecordService;
+
+
+    /**
+     * 购买记录 列表
+     */
+    @PostMapping("/queryPage")
+    @ApiOperation(value = "购买记录列表")
+    public HttpResult queryPage(@RequestBody PartnerPurchaseRecord purchaseRecord){
+        PageDto pageDto = new PageDto();
+        pageDto.setPageNum(purchaseRecord.getPageNum());
+        pageDto.setPageSize(purchaseRecord.getPageSize());
+        Page page = buildPageRequest(pageDto);
+        return purchaseRecordService.queryPage(page,purchaseRecord);
+    }
+
+
+
+    /**
+     * 保存
+     */
+    @PostMapping("/save")
+    @ApiOperation(value = "购买记录保存")
+    public HttpResult save(@RequestBody PartnerPurchaseRecord purchaseRecord){
+        return purchaseRecordService.save(purchaseRecord) ? HttpResult.ok() : HttpResult.error();
+    }
+
+
+    /**
+     * 查看凭证
+     */
+    @GetMapping("/viewVouchers")
+    @ApiOperation(value = "查看凭证")
+    public HttpResult viewVouchers(@RequestParam("id")String id){
+        return purchaseRecordService.viewVouchers(id);
+    }
+
+}

+ 25 - 0
src/main/java/com/ydtech/modules/partner/dao/PartnerAttributeMapper.java

@@ -0,0 +1,25 @@
+package com.ydtech.modules.partner.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ydtech.modules.partner.model.PartnerAttribute;
+import com.ydtech.modules.partner.model.param.PartnerRuleEntity;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+import java.util.Map;
+
+@Mapper
+public interface PartnerAttributeMapper extends BaseMapper<PartnerAttribute> {
+
+
+    List<PartnerRuleEntity> queryAll();
+
+
+    PartnerRuleEntity selectByGrade(String grade);
+
+
+    @Select("select grade,grade_name gradeName from partner_rule WHERE grade != 5 GROUP BY grade,grade_name ")
+    List<Map<String,String>> queryGradeName();
+
+}

+ 9 - 0
src/main/java/com/ydtech/modules/partner/dao/PartnerCommissionMapper.java

@@ -0,0 +1,9 @@
+package com.ydtech.modules.partner.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ydtech.modules.partner.model.PartnerCommissionRules;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface PartnerCommissionMapper  extends BaseMapper<PartnerCommissionRules> {
+}

+ 16 - 0
src/main/java/com/ydtech/modules/partner/dao/PartnerExpiredCommissionMapper.java

@@ -0,0 +1,16 @@
+package com.ydtech.modules.partner.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ydtech.modules.partner.model.PartnerExpiredCommission;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+import java.math.BigDecimal;
+
+@Mapper
+public interface PartnerExpiredCommissionMapper extends BaseMapper<PartnerExpiredCommission> {
+
+
+    @Select("select SUM(lock_commission) from partner_expired_commission where user_id=#{userId} ")
+    BigDecimal selectCountInvalid(String userId);
+}

+ 10 - 0
src/main/java/com/ydtech/modules/partner/dao/PartnerExtractHistoryMapper.java

@@ -0,0 +1,10 @@
+package com.ydtech.modules.partner.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ydtech.modules.partner.model.PartnerExtractHistory;
+import org.apache.ibatis.annotations.Mapper;
+
+
+@Mapper
+public interface PartnerExtractHistoryMapper extends BaseMapper<PartnerExtractHistory> {
+}

+ 34 - 0
src/main/java/com/ydtech/modules/partner/dao/PartnerKickbackChangeMapper.java

@@ -0,0 +1,34 @@
+package com.ydtech.modules.partner.dao;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ydtech.modules.partner.model.PartnerKickbackChange;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.math.BigDecimal;
+
+@Mapper
+public interface PartnerKickbackChangeMapper extends BaseMapper<PartnerKickbackChange> {
+
+    @Select("SELECT IFNULL(after_change,original_commission) AS result FROM partner_kickback_change WHERE user_id = #{userId} and user_grade = #{grade} ORDER BY change_time DESC LIMIT 1")
+    BigDecimal mostRecentRecord(@Param("userId") String userId,@Param("grade")String grade);
+
+    @Select("SELECT " +
+            " c.user_id, " +
+            " u.`name`, " +
+            " u.mobile, " +
+            " c.user_grade, " +
+            " c.original_commission, " +
+            " c.after_change, " +
+            " c.change_reason,c.change_time, " +
+            " d.`name` deptName  " +
+            "FROM " +
+            " partner_kickback_change c " +
+            " LEFT JOIN sys_dept d ON d.id = c.dept_id " +
+            " LEFT JOIN sys_user u ON u.id =  c.user_id ${ew.customSqlSegment} ")
+    Page<PartnerKickbackChange> queryPage(Page page,@Param("ew") QueryWrapper<PartnerKickbackChange> wrapper);
+}

+ 40 - 0
src/main/java/com/ydtech/modules/partner/dao/PartnerLiftingRecordMapper.java

@@ -0,0 +1,40 @@
+package com.ydtech.modules.partner.dao;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ydtech.modules.partner.model.PartnerLiftingRecord;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Mapper
+public interface PartnerLiftingRecordMapper extends BaseMapper<PartnerLiftingRecord> {
+
+
+    @Select("select audit_status as auditStatus,count(1) as count from partner_lifting_record group by audit_status")
+    List<Map<String, Object>> groupByAuditStatus();
+
+    @Select("SELECT r.id,r.`name`,r.mobile,r.user_id,r.dept_id,r.type,r.original_level,r.after_change,r.cycle,r.upgrade_strategy,r.audit_status,r.audit_time,r.audit_user,r.reject_reason,r.conditions,r.rules,r.create_time,r.upgrade_type,( SELECT `name` FROM sys_dept WHERE sys_dept.id = r.dept_id ) dept_name FROM partner_lifting_record r ${ew.customSqlSegment} ")
+    Page<PartnerLiftingRecord> queryPage(Page page,@Param("ew") QueryWrapper<PartnerLiftingRecord> queryWrapper);
+
+    @Select("SELECT * FROM partner_lifting_record WHERE type = 1 AND audit_status = 0 AND DATE(DATE_ADD(create_time, INTERVAL #{expireDays} DAY)) =  CURDATE() ")
+    List<PartnerLiftingRecord> queryExpireDays(Integer expireDays);
+
+    @Update("update partner_lifting_record set audit_status = #{status} where id = #{id}")
+    void updateAuditStatusById(String id, int status);
+
+    @Select("SELECT create_time FROM partner_lifting_record WHERE type = 1 AND audit_status = 0 AND user_id = #{userId} and" +
+            " original_level = #{grade} ")
+    Date selectQueryDowngradeTime(@Param("userId") String userId, @Param("grade")Integer grade);
+
+
+    @Select("SELECT MAX(original_level) FROM partner_lifting_record WHERE type = 1 AND audit_status = 0 AND user_id = #{userId} " )
+    String selectMaxGradeByUserId(String userId);
+}

+ 26 - 0
src/main/java/com/ydtech/modules/partner/dao/PartnerPartnerAccountMapper.java

@@ -0,0 +1,26 @@
+package com.ydtech.modules.partner.dao;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ydtech.modules.partner.model.PartnerPartnerAccount;
+import com.ydtech.modules.partner.model.param.AppHomeParams;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.math.BigDecimal;
+
+@Mapper
+public interface PartnerPartnerAccountMapper extends BaseMapper<PartnerPartnerAccount> {
+
+
+    @Select("SELECT (SUM( extract_fee ) - SUM(expired_amount)) AS extractFee, SUM( history_fee ) AS historyFee, (SUM( cash_fee ) - SUM(expired_amount)) AS cashFee , SUM(expired_amount) FROM partner_partner_account WHERE  user_id = #{userId} ")
+    PartnerPartnerAccount selectByUserId(String userId);
+
+    @Select("SELECT cash_fee FROM partner_partner_account WHERE user_id = #{userId} AND grade = #{grade}")
+    BigDecimal selectCashFee(@Param("userId") String userId,@Param("grade") Integer grade);
+
+    PartnerPartnerAccount selectStatisticalData(@Param("params") AppHomeParams params);
+
+
+}

+ 59 - 0
src/main/java/com/ydtech/modules/partner/dao/PartnerPremiumDetailsMapper.java

@@ -0,0 +1,59 @@
+package com.ydtech.modules.partner.dao;
+
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ydtech.modules.partner.model.PartnerPremiumDetails;
+import org.apache.ibatis.annotations.*;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Mapper
+public interface PartnerPremiumDetailsMapper extends BaseMapper<PartnerPremiumDetails> {
+
+
+    @Select("SELECT user_id AS userId, SUM(DISTINCT sumpremium) AS num  FROM partner_premium_details ${ew.customSqlSegment}")
+    List<Map<String,Object>> selectTotalSumPremiumGroupBy(@Param("ew") QueryWrapper<PartnerPremiumDetails> queryWrapper);
+
+
+    @Select("SELECT SUM(db.sumpremium) FROM (SELECT DISTINCT orderno,sumpremium FROM partner_premium_details ${ew.customSqlSegment}) db ")
+    BigDecimal selectTotalSumPremium(@Param("ew") QueryWrapper<PartnerPremiumDetails> queryWrapper);
+
+    @Select("SELECT " +
+            " d.orderno, " +
+            " d.company_id, " +
+            " d.user_id, " +
+            " d.user_name, " +
+            " d.issuer_id, " +
+            " d.issuer_name, " +
+            " d.sumpremium, " +
+            " d.proportional, " +
+            " d.extract_fee, " +
+            " d.licenseno, " +
+            " d.source, " +
+            " d.create_time, " +
+            " u.`name` AS userName, " +
+            " u.mobile " +
+            "FROM " +
+            " partner_premium_details d " +
+            " LEFT JOIN sys_user u ON u.id = d.user_id  ${ew.customSqlSegment}")
+    Page<PartnerPremiumDetails> queryPage(@Param("page") Page page, @Param("ew") Wrapper<PartnerPremiumDetails> queryWrapper);
+
+    @Select("SELECT user_id AS userId,SUM( sumpremium) AS premium,SUM(extract_fee) AS commission FROM partner_premium_details ${ew.customSqlSegment} ")
+    List<Map<String,Object>> selectCombinedStatistics(@Param("ew")QueryWrapper<PartnerPremiumDetails> wrapper);
+
+    //
+    @Select("SELECT SUM(extract_fee) AS commission FROM partner_premium_details WHERE app_status = 1 AND user_id = #{userId} AND source = #{grade} AND DATE(create_time) >= DATE(#{createTime}) ")
+    BigDecimal commissionAfterUserLocking(@Param("userId") String userId,@Param("grade") Integer grade,@Param("createTime") Date createTime);
+
+    @Select("UPDATE partner_premium_details SET app_status = 0 WHERE app_status = 1 AND source = #{originalLevel} AND user_id = #{userId} AND DATE(create_time) >= #{identityTime} ")
+    void updateAppStatus(@Param("originalLevel") String originalLevel,@Param("userId") String userId, @Param("identityTime")Date identityTime);
+
+    @Select(" SELECT create_time FROM partner_premium_details WHERE app_status = 1 AND user_id = #{userId} AND source = #{grade} ORDER BY create_time  LIMIT 1 ")
+    Date queryRemainingDaysExpiration(@Param("userId") String userId, @Param("grade") Integer grade);
+
+}

+ 9 - 0
src/main/java/com/ydtech/modules/partner/dao/PartnerRatioMapper.java

@@ -0,0 +1,9 @@
+package com.ydtech.modules.partner.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ydtech.modules.partner.model.PartnerRatio;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface PartnerRatioMapper extends BaseMapper<PartnerRatio> {
+}

+ 10 - 0
src/main/java/com/ydtech/modules/partner/dao/PartnerRecordApperMapper.java

@@ -0,0 +1,10 @@
+package com.ydtech.modules.partner.dao;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ydtech.modules.partner.model.PartnerRecordApper;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface PartnerRecordApperMapper extends BaseMapper<PartnerRecordApper> {
+}

+ 13 - 0
src/main/java/com/ydtech/modules/partner/dao/PartnerRuleMapper.java

@@ -0,0 +1,13 @@
+package com.ydtech.modules.partner.dao;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ydtech.modules.partner.model.PartnerRule;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface PartnerRuleMapper extends BaseMapper<PartnerRule> {
+
+
+
+}

+ 10 - 0
src/main/java/com/ydtech/modules/partner/dao/PartnerRulesRatioMapper.java

@@ -0,0 +1,10 @@
+package com.ydtech.modules.partner.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ydtech.modules.partner.model.vo.PartnerRulesRatio;
+import org.apache.ibatis.annotations.Mapper;
+
+
+@Mapper
+public interface PartnerRulesRatioMapper extends BaseMapper<PartnerRulesRatio> {
+}

+ 208 - 0
src/main/java/com/ydtech/modules/partner/dao/PartnerUserMapper.java

@@ -0,0 +1,208 @@
+package com.ydtech.modules.partner.dao;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ydtech.modules.partner.model.PartnerUser;
+import com.ydtech.modules.partner.model.param.AppHomeParams;
+import com.ydtech.modules.partner.model.param.CommissionValidityPeriod;
+import com.ydtech.modules.partner.model.param.PartnerApp;
+import com.ydtech.modules.partner.model.param.QueryVo;
+import com.ydtech.modules.partner.model.vo.*;
+import org.apache.ibatis.annotations.*;
+
+import javax.validation.constraints.NotBlank;
+import java.math.BigDecimal;
+import java.util.*;
+
+@Mapper
+public interface PartnerUserMapper extends BaseMapper<PartnerUser> {
+
+    //分页查询
+    IPage<PartnerUserVo> queryPage(Page page, @Param("queryVo")QueryVo queryVo);
+
+    @MapKey("userId")
+    List<Map<String, String>> selectRecommender(@Param("level") String level);
+
+    List<RelationalVo> selectByUserId(@Param("id")String id,@Param("grade")Integer grade);
+
+    TodayOverview selectTodayOverview(@Param("params") AppHomeParams params);
+
+    List<TeamOverviewVo> selectTeamOverview(@Param("params") AppHomeParams params);
+
+
+    @Delete("delete from partner_user where user_id=#{id}")
+    void deleteByUserId(String id);
+
+    Object selectStatisticsMap(@Param("grade") String grade,@Param("params")AppHomeParams params);
+
+    SelectUserVo selectUser(AppHomeParams params);
+
+
+    Integer userCountVo(@Param("userId")String userId,@Param("params")AppHomeParams params,@Param("grade")Integer grade);
+
+
+    @Select("select  MIN(grade) as grade from partner_user where user_id= #{userId}  ")
+    Integer selectGradeMin(String userId);
+
+    @Select("select  MIN(grade) as grade from partner_user where  grade != 1 and identity_status = 0 and user_id=  #{userId}  ")
+    Integer selectGradeIntMin(String userId);
+
+
+    List<String> selectJuniorList(@Param("grade") Integer grade,@Param("ids") List<String> ids,@Param("params")AppHomeParams params);
+
+    @MapKey("createTime")
+    List<Map<String, String>> userCountVo2(@Param("userId")List<String> userId,@Param("params")AppHomeParams params);
+
+
+    List<PartnerUser> selectJuniorListUser(@Param("grade")Integer grade,@Param("ids") List<String> currentUserIds,@Param("params") AppHomeParams params);
+
+    @Select("SELECT GROUP_CONCAT( r.grade_name ORDER BY u.grade) FROM partner_user u LEFT JOIN partner_rule r ON r.grade = u.grade WHERE user_id = #{userId}")
+    String selectByUserIdGrade(String userId);
+
+    @Select("SELECT `name` FROM partner_user WHERE user_id = #{userId} LIMIT 1")
+    String selectByUserIdUserName(String userId);
+
+    Integer userCountIdsVo(@Param("ids") List<String> ids,@Param("params")  AppHomeParams params);
+
+
+    List<RelationalVo> selectByReferrerId(@Param("userId") String userId,@Param("grade") Integer grade);
+
+    List<RelationalVo> selectQuerySuperiors(@Param("userId") String userId,@Param("grade") Integer grade);
+
+    JSONObject myPerformanceTotal(@Param("map")Map<String, String> map, @Param("list") Set<String> list);
+
+    Page<JSONObject> queryDataList(Page page,@Param("map") PartnerApp partnerApp);
+
+
+    Integer selectNumber(@Param("userId") String userId, @Param("number") String number,@Param("period") CommissionValidityPeriod period);
+
+
+    @Select("SELECT assessment_time FROM partner_user WHERE user_id = #{userId} AND grade = #{grade}")
+    Date selectAssessmentTime(@Param("userId") String userId, @Param("grade")String grade);
+
+
+    @Select("SELECT fixed_cycle_time FROM partner_user WHERE user_id = #{userId} AND grade = #{grade}")
+    Date selectFixedCycleTime(@Param("userId") String userId, @Param("grade")String grade);
+
+    @Update("UPDATE partner_user SET assessment_time = ( " +
+            " SELECT DATE(approve_time) FROM sys_user_track WHERE `status` = 1 AND user_id = #{userId} LIMIT 1 " +
+            " ) WHERE  user_id = #{userId} ")
+    void updateAssessmentTime(String userId);
+
+    @Update("UPDATE partner_user SET fixed_cycle_time = ( " +
+            " SELECT DATE(approve_time) FROM sys_user_track WHERE `status` = 1 AND user_id = #{userId} LIMIT 1 " +
+            " ) WHERE  user_id = #{userId} ")
+    void updateFixedCycleTime(String userId);
+
+    @Update("UPDATE partner_user SET assessment_time = #{date} WHERE user_id = #{userId} AND grade =#{grade} ")
+    void updateAssessmentTimeByDate(@Param("userId") String userId,@Param("date") Date date,@Param("grade")String grade);
+
+    Integer selectByUserIdNumber(@Param("userId") String userId,@Param("number")  String number, @Param("period") CommissionValidityPeriod period);
+
+    PartnerUser queryUser(@Param("referrerId")String referrerId,@Param("grade") Integer grade);
+
+    Integer selectNumber4(@Param("userId") String userId,@Param("number") String number,@Param("period") CommissionValidityPeriod period);
+
+    List<PartnerUser> queryByUserId(String userId);
+
+    @Select("SELECT * FROM partner_user WHERE user_id = #{userId} ORDER BY grade DESC LIMIT 1")
+    PartnerUser selectMaxGradeUserId(String userId);
+
+    @Select("SELECT upgrade_time FROM partner_user WHERE user_id = #{userId} AND grade = #{grade}")
+    Date selectUpgradeTime(String userId, String grade);
+
+    @Update("UPDATE partner_user SET upgrade_time = #{date} WHERE  user_id = #{userId} and grade = #{grade}")
+    void updateUpgradeTimeByDate(@Param("userId") String userId,@Param("date") Date date,@Param("grade") Integer grade);
+
+    @Update("UPDATE partner_user SET upgrade_time = ( " +
+            " SELECT DATE(approve_time) FROM sys_user_track WHERE `status` = 1 AND user_id = #{userId} LIMIT 1 " +
+            " ) WHERE  user_id = #{userId} and grade = #{grade} ")
+    void updateUpgradeTime(@Param("userId")String userId,@Param("grade") String grade);
+
+
+    int assessment(@Param("userId") String userId,@Param("grade") String grade, @Param("period")CommissionValidityPeriod period);
+
+    String querySuperiors(@Param("userId") String userId,@Param("grade") Integer grade,@Param("original") String original);
+
+    @Select("SELECT * FROM partner_user WHERE user_id = #{userId} AND grade = #{grade}")
+    PartnerUser getLevelUserId(@Param("userId") String userId,@Param("grade") Integer grade);
+
+    Set<String> querySubordinateUserId(@Param("levelUserId") String levelUserId);
+
+    Set<String> querySubordinate(String levelUserId);
+
+    Set<String> getLevelAllUserId(String userId);
+
+
+    @Select(" SELECT p.id,p.user_id,p.grade,p.name,p.create_time FROM partner_user p LEFT JOIN sys_user u ON u.id = p .user_id ${ew.customSqlSegment}")
+    Page<PartnerUser> selectListVo(@Param("page") Page page ,@Param("ew") QueryWrapper<PartnerUser> queryWrapper);
+
+    @Select(" SELECT p.id,p.user_id,p.grade,p.name,p.create_time FROM partner_user p LEFT JOIN sys_user u ON u.id = p .user_id ${ew.customSqlSegment}")
+    List<PartnerUser> selectListDb(@Param("ew") QueryWrapper<PartnerUser> queryWrapper);
+
+    @Select(" SELECT p.id,p.user_id,p.grade,p.name,p.create_time FROM partner_user p LEFT JOIN sys_user u ON u.id = p .user_id ${ew.customSqlSegment}")
+    List<PartnerUser> selectAllListVo(@Param("ew") QueryWrapper<PartnerUser> queryWrapper);
+
+    @Update("UPDATE partner_user SET identity_status = #{identityStatus},upgrade_time = DATE_FORMAT(NOW(), '%Y-%m-%d 00:00:00'),upgrade_cycle_start_time = DATE_FORMAT(NOW(), '%Y-%m-%d 00:00:00') WHERE user_id = #{userId} and grade = #{originalLevel} ")
+    void updateIdentityStatus(@Param("userId") String userId,@Param("originalLevel") String originalLevel,@Param("identityStatus")int identityStatus);
+
+    UserRuleVo queryUserRuleVo(@Param("userId") String userId, @Param("grade")Integer grade,@Param("period") CommissionValidityPeriod period);
+
+    @Select("SELECT upgrade_cycle_start_time as startDate FROM partner_user WHERE user_id = #{userId} AND grade = #{grade}")
+    CommissionValidityPeriod selectUpgradeCycleStartTime(@Param("userId") String userId,@Param("grade") Integer grade);
+
+    @Update("UPDATE partner_user SET upgrade_cycle_start_time = #{newDate} WHERE  user_id = #{userId} and grade = #{grade} ")
+    void updateUpgradeCycleStartTime(@Param("userId") String userId, @Param("newDate")Date newDate,@Param("grade") Integer grade);
+
+
+    BigDecimal selectOwnSumPremium(@Param("userId") String userId, @Param("period") CommissionValidityPeriod period);
+
+    @Select("SELECT upgrade_cycle_start_time FROM partner_user WHERE user_id = #{userId} AND grade = #{grade}")
+    Date selectUpgradeStartTime(@Param("userId") String userId,@Param("grade") Integer grade);
+
+    @Update("UPDATE partner_user SET upgrade_cycle_start_time = ( " +
+            " SELECT DATE_ADD(DATE(approve_time), INTERVAL 1 DAY) FROM sys_user_track WHERE `status` = 1 AND user_id = #{userId} LIMIT 1 " +
+            " ) WHERE  user_id = #{userId} and grade = #{grade} ")
+    void updateUpgradeStartTime(@Param("userId") String userId,@Param("grade") Integer grade);
+
+    BigDecimal subordinateMembersInsurancePremiums(@Param("userId") String userId, @Param("grade")String grade,@Param("period") CommissionValidityPeriod period);
+
+    @Select("SELECT commission_rate FROM partner_user WHERE user_id = #{userId} AND grade = #{grade}")
+    BigDecimal selectFixedRatio(@Param("userId") String userId, @Param("grade") String  grade);
+
+
+    @Select("SELECT p.* FROM partner_user p LEFT JOIN sys_user u ON u.id = p.user_id WHERE u.`status` = 1  " +
+            "AND( p.grade, p.user_id) IN ( SELECT MIN( grade ) grade, user_id FROM partner_user WHERE grade IN ( '2', '3', '4' ) AND identity_status = 0 GROUP BY user_id )" +
+            " ORDER BY p.create_time DESC")
+    List<PartnerUser> queryDowngradedData();
+
+
+    @Update("UPDATE partner_user SET commission_rate = null WHERE user_id = #{userId} AND grade = #{grade}")
+    void resetFixedRatio(@Param("userId") String userId, @Param("grade")Integer grade);
+
+    @Select("SELECT max(grade) FROM partner_user WHERE user_id = #{userId}")
+    Integer selectByUserIdMax(String referrerId);
+
+    @Select("SELECT dept_id FROM partner_user WHERE user_id = #{userId} AND grade = #{grade}")
+    String queryDeptIdByUserId(@Param("userId") String id,@Param("grade") Integer grade);
+
+    List<JSONObject> queryDataList(@Param("map")PartnerApp partnerApp);
+
+
+    @Select("SELECT max(grade) FROM partner_user WHERE identity_status = 1 and user_id = #{id}")
+    Integer selectMax(String id);
+
+    @Select("SELECT min(grade) FROM partner_user WHERE identity_status = 1 and user_id = #{id}")
+    Integer selectMin(String id);
+
+    @Select("SELECT identity_time FROM partner_user WHERE user_id = #{userId} AND grade = #{originalLevel}")
+    Date selectLockTime(@Param("userId") String userId, @Param("originalLevel")String originalLevel);
+
+    @Select(" SELECT user_id,grade,name,mobile,dept_id,dept_name,identity_time FROM partner_user WHERE identity_status = 1 AND DATE(DATE_ADD(identity_time, INTERVAL (#{expireDays} + 1) DAY)) <=  CURDATE()  ")
+    List<PartnerUser> queryExpiredRecords(Integer expireDays);
+
+
+}

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor