Browse Source

crmNew代码

yusm 3 weeks ago
parent
commit
d69b2cf881
100 changed files with 8815 additions and 66 deletions
  1. 189 38
      fhKeeper/formulahousekeeper/management-crmNew/pom.xml
  2. 0 28
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/PlatformStartApplication.java
  3. 40 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/PlatformStartApplication.java
  4. 81 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/aop/AopLogConfiguration.java
  5. 59 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/aop/LimitRequestAspect.java
  6. 95 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/aop/SensitiveWordConfig.java
  7. 35 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/config/BeanConfig.java
  8. 55 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/config/Config.java
  9. 14 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/config/DefaultCommonModuleConfig.java
  10. 12 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/config/LimitRequest.java
  11. 14 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/config/MyExitCodeGenerator.java
  12. 19 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/config/PropertyMsg.java
  13. 86 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/config/RefererInterceptor.java
  14. 23 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/config/RefererProperties.java
  15. 22 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/config/SchedulerConfig.java
  16. 24 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/config/SuperSonicConfig.java
  17. 28 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/config/WebConfig.java
  18. 50 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/config/WebMvcConfig.java
  19. 62 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/constant/Constant.java
  20. 27 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/constant/MybatisPlusPageConfig.java
  21. 44 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/constant/Parameter.java
  22. 58 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/AIQuestionController.java
  23. 20 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ActionLogController.java
  24. 20 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/AlertTimeController.java
  25. 176 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/AttachmentCenterController.java
  26. 46 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/AuditLogCenterController.java
  27. 126 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/AuditWorkflowSettingController.java
  28. 145 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/AuditWorkflowTimeSettingController.java
  29. 457 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/AuthRedirectController.java
  30. 21 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/BusinessItemCustomController.java
  31. 20 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/BusinessItemProductController.java
  32. 648 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/BusinessOpportunityController.java
  33. 21 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/BusinessProductController.java
  34. 100 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/BusinessTripController.java
  35. 36 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/BustripAuditLogController.java
  36. 52 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CategoryRatioTblSettingController.java
  37. 396 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ClueController.java
  38. 20 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ClueLogController.java
  39. 20 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ClueUploadfileController.java
  40. 117 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CommonUploadController.java
  41. 20 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CommonUseController.java
  42. 108 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CompanyCertController.java
  43. 242 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CompanyController.java
  44. 42 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CompanyCustomerContactController.java
  45. 99 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CompanyDingdingController.java
  46. 80 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CompanyReportController.java
  47. 20 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ContactSyncLogController.java
  48. 302 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ContactsController.java
  49. 77 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ContactsDocumentController.java
  50. 20 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ContactsLogController.java
  51. 162 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ContractController.java
  52. 20 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ContractCustomController.java
  53. 68 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ContractDocumentController.java
  54. 20 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ContractLogController.java
  55. 36 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ContractModifyRecordController.java
  56. 20 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ContractPayCustomizedController.java
  57. 65 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ContractPaymentController.java
  58. 51 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ContractTypeController.java
  59. 53 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ContractTypeSecController.java
  60. 21 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CorpwxJobResultController.java
  61. 20 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CorpwxPreAuthCodeController.java
  62. 20 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CorpwxRegisterCodeController.java
  63. 140 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CusTableColumnController.java
  64. 310 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CustomController.java
  65. 21 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CustomItemContactsController.java
  66. 191 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CustomerInfoController.java
  67. 20 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/DdCallbackController.java
  68. 154 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/DepartmentController.java
  69. 20 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/DepartmentDingdingController.java
  70. 21 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/DepartmentFeishuController.java
  71. 20 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/DepartmentOtherManagerController.java
  72. 20 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/DepartmentWxController.java
  73. 291 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/DingDingController.java
  74. 47 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/DirtyCleanController.java
  75. 101 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/EarningSnapshotController.java
  76. 52 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/EstimateTimeSettingController.java
  77. 62 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ExpenseAuditSettingController.java
  78. 106 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ExpenseItemController.java
  79. 192 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ExpenseMainTypeController.java
  80. 36 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ExpensePayWayController.java
  81. 155 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ExpenseSheetController.java
  82. 117 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ExpenseTypeController.java
  83. 20 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/FastAccessController.java
  84. 810 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/FeishuInfoController.java
  85. 20 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/FeishuSendController.java
  86. 45 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/FinanceAuditorController.java
  87. 20 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/FinanceCalculateController.java
  88. 20 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/FinanceFixedcolnameController.java
  89. 21 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/FinanceProjectsController.java
  90. 198 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/FinanceTblcuscolController.java
  91. 212 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/GroupBudgetReviewController.java
  92. 47 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/GroupParticipatorController.java
  93. 125 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/GroupTemplateController.java
  94. 21 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/GroupTmpstagesController.java
  95. 20 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/GtemplateTaskController.java
  96. 13 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/HealthCheckController.java
  97. 47 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/InformationController.java
  98. 36 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/LeaveAuditLogController.java
  99. 20 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/LeavePmauditController.java
  100. 0 0
      fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/LeaveQuotaNumController.java

+ 189 - 38
fhKeeper/formulahousekeeper/management-crmNew/pom.xml

@@ -20,67 +20,181 @@
         <java.version>1.8</java.version>
     </properties>
     <dependencies>
+        <dependency>
+            <groupId>com.dingtalk</groupId>
+            <artifactId>taobao-sdk-java-auto_1479188381469-20210623.jar</artifactId>
+            <version>1.0</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/src/main/resources/lib/taobao-sdk-java-auto_1479188381469-20210623.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.11.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-core</artifactId>
+            <version>2.13.4</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>2.13.4</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.datatype</groupId>
+            <artifactId>jackson-datatype-jsr310</artifactId>
+            <version>2.13.4</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <version>2.5.6</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+            <version>2.6.13</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+            <version>2.5.6</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper-spring-boot-starter</artifactId>
+            <version>1.4.6</version>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>8.0.31</version>
+        </dependency>
+        <!--easyExcel-->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>2.2.4</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>5.2.5</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>5.2.5</version>
+        </dependency>
+        <!--Map依赖 -->
+        <dependency>
+            <groupId>net.jodah</groupId>
+            <artifactId>expiringmap</artifactId>
+            <version>0.5.10</version>
+        </dependency>
+           <dependency>
+              <groupId>com.baomidou</groupId>
+               <artifactId>mybatis-plus-generator</artifactId>
+               <version>3.1.2</version>
+          </dependency>
 
+          <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-boot-starter</artifactId>
+               <version>3.1.2</version>
+          </dependency>
+        <!-- fastjson -->
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>fastjson</artifactId>
-            <version>1.2.7</version>
+            <version>2.0.39</version>
+        </dependency>
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dingtalk</artifactId>
+            <version>1.1.50</version>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-web</artifactId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+            <version>2.7.18</version>
+        </dependency>
+        <dependency>
+            <groupId>com.baidu.aip</groupId>
+            <artifactId>java-sdk</artifactId>
+            <version>4.16.11</version>
         </dependency>
+        <!--开启aop支持-->
         <dependency>
             <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter</artifactId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+            <version>2.7.18</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-logging</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
-
-<!--        <dependency>-->
-<!--            <groupId>com.fasterxml.jackson.core</groupId>-->
-<!--            <artifactId>jackson-databind</artifactId>-->
-<!--            <version>2.9.8</version>-->
-<!--        </dependency>-->
-
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
+            <version>1.18.28</version>
+            <scope>provided</scope>
         </dependency>
-
+        <!-- tess4j相关依赖 -->
         <dependency>
-            <groupId>mysql</groupId>
-            <artifactId>mysql-connector-java</artifactId>
+            <groupId>net.sourceforge.tess4j</groupId>
+            <artifactId>tess4j</artifactId>
+            <version>5.7.0</version>
+        </dependency>
+        <!--微信模版消息推送三方sdk-->
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-mp</artifactId>
+            <version>3.3.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.jcraft</groupId>
+            <artifactId>jsch</artifactId>
+            <version>0.1.55</version>
+        </dependency>
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dysmsapi20170525</artifactId>
+            <version>2.0.4</version>
         </dependency>
-
         <dependency>
             <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-test</artifactId>
-            <scope>test</scope>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <version>2.7.18</version>
+            <optional>true</optional>
         </dependency>
-
+        <!-- 获取客户端信息 -->
         <dependency>
-            <groupId>com.baomidou</groupId>
-            <artifactId>mybatis-plus-boot-starter</artifactId>
-            <version>3.1.2</version>
+            <groupId>eu.bitwalker</groupId>
+            <artifactId>UserAgentUtils</artifactId>
+            <version>1.21</version>
         </dependency>
-
+        <!--热部署-->
         <dependency>
-            <groupId>com.microsoft.sqlserver</groupId>
-            <artifactId>mssql-jdbc</artifactId>
-            <version>10.2.1.jre8</version>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <version>2.7.18</version>
         </dependency>
-
         <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-lang3</artifactId>
-            <version>3.12.0</version>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity-engine-core</artifactId>
+            <version>2.3</version>
         </dependency>
-
         <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-lang3</artifactId>
-            <version>3.12.0</version>
+            <groupId>org.freemarker</groupId>
+            <artifactId>freemarker</artifactId>
+            <version>2.3.31</version> <!-- 如果用 Freemarker -->
         </dependency>
-
     </dependencies>
 
     <build>
@@ -88,15 +202,52 @@
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-plugin</artifactId>
                 <configuration>
-                    <skip>true</skip>
+                    <includeSystemScope>true</includeSystemScope>
                 </configuration>
             </plugin>
         </plugins>
     </build>
 
+    <!--配置阿里云仓库-->
+    <repositories>
+        <repository>
+            <id>public</id>
+            <name>aliyun nexus</name>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </repository>
+        <repository>
+            <id>bintray-qcloud-maven-repo</id>
+            <name>qcloud-maven-repo</name>
+            <url>https://dl.bintray.com/qcloud/maven-repo/</url>
+            <layout>default</layout>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+
+    <pluginRepositories>
+        <pluginRepository>
+            <id>public</id>
+            <name>aliyun nexus</name>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+
 </project>

+ 0 - 28
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/PlatformStartApplication.java

@@ -1,28 +0,0 @@
-package com.management;
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.context.annotation.Bean;
-import org.springframework.scheduling.annotation.EnableAsync;
-import org.springframework.scheduling.annotation.EnableScheduling;
-import org.springframework.transaction.annotation.EnableTransactionManagement;
-import org.springframework.web.client.RestTemplate;
-
-@SpringBootApplication
-@MapperScan("com.management.platform.mapper")
-@EnableTransactionManagement //开启事务支持
-@EnableAsync
-@EnableScheduling
-public class PlatformStartApplication {
-
-    public static void main(String[] args) {
-        SpringApplication.run(PlatformStartApplication.class, args);
-    }
-
-
-    @Bean(name = "redisTemplate")
-    RestTemplate restTemplate(){
-        return new RestTemplate();
-    }
-
-}

+ 40 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/PlatformStartApplication.java

@@ -0,0 +1,40 @@
+package com.management.platform;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+import org.springframework.web.client.RestTemplate;
+
+@SpringBootApplication
+@MapperScan("com.management.platform.mapper")
+@EnableTransactionManagement //开启事务支持
+@EnableAsync
+@EnableScheduling
+public class PlatformStartApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(PlatformStartApplication.class, args);
+    }
+
+
+    //防止存入redis数据后乱码
+    @Bean(name = "redisTemplate")
+    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
+        RedisTemplate<String, String> template = new RedisTemplate<>();
+        template.setConnectionFactory(factory);
+        template.setKeySerializer(new StringRedisSerializer());
+        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
+        template.setHashKeySerializer(new GenericJackson2JsonRedisSerializer());
+        template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
+        template.afterPropertiesSet();
+        return template;
+    }
+
+}

+ 81 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/aop/AopLogConfiguration.java

@@ -0,0 +1,81 @@
+package com.management.platform.aop;
+
+
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.*;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Author: 吴涛涛 cuiyi@itany.com
+ * Date : 2019 - 08 - 30 13:59
+ * Description:<描述> 开启aop配置
+ * Version: 1.0
+ */
+@Slf4j
+@Aspect
+@Configuration
+public class AopLogConfiguration {
+    public static String[] methods = {"importData", "exportReport", "editReport", "approve", "deny", "cancel", "batchApproveReport", "batchDenyReport"
+            , "loginByUserId", "getUserByCode"};
+    public static List<String> printMethods = new ArrayList<String>();
+    static {
+        printMethods = Arrays.asList(methods);
+    }
+    ;
+    //切入点表达式
+    @Pointcut("execution(public * com.management.*.controller.*.*(..))")
+    public void logPointcut(){
+
+    }
+
+    /**
+     * 前置通知
+     */
+    @Before("logPointcut()")
+    public void  methodBefore(JoinPoint joinPoint){
+        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        if (requestAttributes == null) return;
+        HttpServletRequest request = requestAttributes.getRequest();
+        //打印请求内容
+        String methodName = joinPoint.getSignature().getName();
+        if (printMethods.contains(methodName)) {
+            String reqUrl = request.getRequestURL().toString().replaceAll("http://localhost:10010/","");
+            log.info("请求方法:"+reqUrl+", 参数: "+Arrays.toString(joinPoint.getArgs()));
+        }
+    }
+
+    /**
+     * 后置通知
+     */
+    @AfterReturning(returning = "o",pointcut = "logPointcut()")
+    public void methodAfterReturning(Object o){
+        ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
+        if (requestAttributes == null) return;
+
+    }
+
+    /**
+     * 异常通知
+     */
+    @AfterThrowing(pointcut = "logPointcut()",throwing = "e")
+    public void logThrowing(JoinPoint joinPoint,Throwable e){
+        ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
+        if (requestAttributes == null) {
+            return ;
+        }
+
+        log.info("***************抛出异常***************");
+        log.info("请求类方法:"+joinPoint.getSignature().getName());
+        log.info("异常内容:"+e);
+        log.info("***************抛出异常***************");
+    }
+
+}

+ 59 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/aop/LimitRequestAspect.java

@@ -0,0 +1,59 @@
+package com.management.platform.aop;
+
+import com.management.platform.config.LimitRequest;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import net.jodah.expiringmap.ExpirationPolicy;
+import net.jodah.expiringmap.ExpiringMap;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+
+@Aspect
+@Component
+public class LimitRequestAspect {
+    private static ConcurrentHashMap<String, ExpiringMap<String, Integer>> book = new ConcurrentHashMap<>();
+    // 定义切点
+    // 让所有有@LimitRequest注解的方法都执行切面方法
+    @Pointcut("@annotation(limitRequest)")
+    public void excudeService(LimitRequest limitRequest) {
+    }
+
+    @Around("excudeService(limitRequest)")
+    public HttpRespMsg doAround(ProceedingJoinPoint pjp, LimitRequest limitRequest) throws Throwable {
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        // 获得request对象
+        RequestAttributes ra = RequestContextHolder.getRequestAttributes();
+        ServletRequestAttributes sra = (ServletRequestAttributes) ra;
+        HttpServletRequest request = sra.getRequest();
+
+        // 获取Map对象, 如果没有则返回默认值
+        // 第一个参数是key, 第二个参数是默认值
+        ExpiringMap<String, Integer> map = book.getOrDefault(request.getRequestURI(), ExpiringMap.builder().variableExpiration().build());
+        Integer uCount = map.getOrDefault(request.getRemoteAddr(), 0);
+        if (uCount >= limitRequest.count()) { // 超过次数,不执行目标方法
+            //这里的返回对象类型根据controller方法的返回方式一致
+            httpRespMsg.setError(MessageUtils.message("request.countLimit"));
+            return httpRespMsg;
+        } else if (uCount == 0){ // 第一次请求时,设置开始有效时间
+            map.put(request.getRemoteAddr(), uCount + 1, ExpirationPolicy.CREATED, limitRequest.time(), TimeUnit.MILLISECONDS);
+        } else { // 未超过次数, 记录数据加一
+            map.put(request.getRemoteAddr(), uCount + 1);
+        }
+        book.put(request.getRequestURI(), map);
+
+        // result的值就是被拦截方法的返回值
+        httpRespMsg.data= pjp.proceed();
+        return httpRespMsg;
+    }
+
+}

+ 95 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/aop/SensitiveWordConfig.java

@@ -0,0 +1,95 @@
+package com.management.platform.aop;
+
+import com.management.platform.util.RedisUtil;
+import com.management.platform.util.WordFilter;
+import lombok.SneakyThrows;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.time.LocalDate;
+
+/**
+ * 敏感词过滤
+ */
+//@Aspect
+//@Component
+public class SensitiveWordConfig {
+    @Resource
+    RedisUtil redisUtils;
+    @Resource
+    WordFilter wordFilter;
+
+    @Around("@annotation(org.springframework.web.bind.annotation.RequestMapping)||@annotation(org.springframework.web.bind.annotation.PutMapping)||@annotation(org.springframework.web.bind.annotation.PostMapping)")
+    @SneakyThrows
+    public Object doBefore(ProceedingJoinPoint point) {
+        System.out.println("####################进入敏感词检测#######");
+        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+        if (request.getRequestURI().contains("/word/sensitiveword")) {
+            return point.proceed();
+        }
+        //所有的参数对象
+        boolean hasSentiveWords = false;
+        for (int i=0;i<point.getArgs().length; i++) {
+            Object arg = point.getArgs()[i];
+            //参数对象,通过反射将String类型的值进行敏感词过滤
+            System.out.println("获取到参数:");
+            if (arg != null) {
+                Class<?> aClass = arg.getClass();
+                System.out.println("获取到aClass:"+aClass);
+                if(aClass == String.class) {
+                    //本身就是string类型
+                    String afterValue = wordFilter.replaceWords((String)(arg));
+                    System.out.println("替换后=" + afterValue);
+                    point.getArgs()[i] = afterValue;
+                    if (!afterValue.equals(arg)) {
+                        hasSentiveWords = true;
+                        break;
+                    }
+                } else if (aClass != Integer.class && aClass != LocalDate.class) {
+                    //递归遍历,将所有String参数进行敏感词匹配
+                    foundString(aClass,arg);
+                }
+            }
+        }
+        return  point.proceed(point.getArgs());
+    }
+
+    /**
+     * 递归将string替换
+     * @param clazz
+     * @param arg
+     * @return
+     */
+    @SneakyThrows
+    public Class<?> foundString(Class clazz,Object arg ){
+        Field[] declaredFields = clazz.getDeclaredFields();
+        for (Field declaredField : declaredFields) {
+            Class<?> type = declaredField.getType();
+            if (type==String.class&&!Modifier.toString(declaredField.getModifiers()).contains("final")){
+                //如果是String类型,进行关键词匹配 且要排除final修饰的字段
+                declaredField.setAccessible(true);
+                String value=(String)declaredField.get(arg);
+                System.out.println("参数值:"+value);
+                declaredField.set(arg, wordFilter.replaceWords(value));
+            }else if (type.getPackage()!=null&&type.getPackage().getName().contains("com.bysk")){
+                Method[] methods = clazz.getMethods();
+                for (Method method : methods) {
+                    String name = method.getName();
+                    if (name.toLowerCase().contains("get"+declaredField.getName().toLowerCase())){
+                        Object invoke = method.invoke(arg);
+                        this.foundString(type,invoke);
+                        break;
+                    }
+                }
+            }
+        }
+        return  clazz;
+    }
+}

+ 35 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/config/BeanConfig.java

@@ -0,0 +1,35 @@
+package com.management.platform.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.task.TaskExecutor;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.ThreadPoolExecutor;
+
+@Configuration
+@EnableAsync
+public class BeanConfig {
+
+    @Bean(name = "taskExecutor")
+    public TaskExecutor taskExecutor() {
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        // 设置核心线程数
+        executor.setCorePoolSize(5);
+        // 设置最大线程数
+        executor.setMaxPoolSize(10);
+        // 设置队列容量
+        executor.setQueueCapacity(20);
+        // 设置线程活跃时间(秒)
+        executor.setKeepAliveSeconds(60);
+        // 设置默认线程名称
+        executor.setThreadNamePrefix("crm-");
+        // 设置拒绝策略
+        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+        // 等待所有任务结束后再关闭线程池
+        executor.setWaitForTasksToCompleteOnShutdown(true);
+        System.out.println("初始化TaskExecutor");
+        return executor;
+    }
+}

+ 55 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/config/Config.java

@@ -0,0 +1,55 @@
+package com.management.platform.config;
+
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.config.Registry;
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.client.ClientHttpRequestFactory;
+import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+public class Config {
+
+  @Bean
+  public RestTemplate restTemplate()
+  {
+    ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient());
+    System.out.println("@@@===初始化RestRemplate===@@");
+    return new RestTemplate(requestFactory);
+  }
+  /**
+   * Apache HttpClient
+   *
+   * @return
+   * @see [类、类#方法、类#成员]
+   */
+  private HttpClient httpClient()
+  {
+    // 支持HTTP、HTTPS
+    Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory> create()
+            .register("http", PlainConnectionSocketFactory.getSocketFactory())
+            .register("https", SSLConnectionSocketFactory.getSocketFactory())
+            .build();
+    PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
+    connectionManager.setMaxTotal(200);
+    connectionManager.setDefaultMaxPerRoute(100);
+    connectionManager.setValidateAfterInactivity(2000);
+    RequestConfig requestConfig = RequestConfig.custom()
+            // 服务器返回数据(response)的时间,超时抛出read timeout
+            .setSocketTimeout(65000)
+            // 连接上服务器(握手成功)的时间,超时抛出connect timeout
+            .setConnectTimeout(5000)
+            // 从连接池中获取连接的超时时间,超时抛出ConnectionPoolTimeoutException
+            .setConnectionRequestTimeout(1000)
+            .build();
+    return HttpClientBuilder.create().setDefaultRequestConfig(requestConfig).setConnectionManager(connectionManager).build();
+  }
+}

+ 14 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/config/DefaultCommonModuleConfig.java

@@ -0,0 +1,14 @@
+package com.management.platform.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "defaultcommonmodules")
+public class DefaultCommonModuleConfig {
+    private List<String> path;
+}

+ 12 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/config/LimitRequest.java

@@ -0,0 +1,12 @@
+package com.management.platform.config;
+
+import java.lang.annotation.*;
+
+@Documented
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface LimitRequest {
+    //毫秒,分钟,小时 之间的转换用算数
+    long time() default 60000; // 限制时间 单位:毫秒
+    int count() default Integer.MAX_VALUE; // 允许请求的次数
+}

+ 14 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/config/MyExitCodeGenerator.java

@@ -0,0 +1,14 @@
+package com.management.platform.config;
+
+import org.springframework.boot.ExitCodeGenerator;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MyExitCodeGenerator implements ExitCodeGenerator {
+    @Override
+    public int getExitCode() {
+        System.out.println("Spring Boot shutting down.");
+        return 0;
+    }
+}
+

+ 19 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/config/PropertyMsg.java

@@ -0,0 +1,19 @@
+package com.management.platform.config;
+
+import java.lang.annotation.*;
+
+/**
+ *  属性信息注解,仅仅可以用于域声明
+ */
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Inherited
+public @interface PropertyMsg {
+    /**
+     * 提示语,用于标记哪个字段发生变更
+     *
+     * @return 提示语
+     */
+    String value();
+}

+ 86 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/config/RefererInterceptor.java

@@ -0,0 +1,86 @@
+package com.management.platform.config;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.util.AntPathMatcher;
+import org.springframework.util.StringUtils;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.net.MalformedURLException;
+
+public class RefererInterceptor extends HandlerInterceptorAdapter {
+    static final Logger LOGGER = LoggerFactory.getLogger(RefererInterceptor.class);
+
+    // URL匹配器
+    private AntPathMatcher matcher = new AntPathMatcher();
+    @Resource
+    private RefererProperties properties;
+
+    @Value(value = "${excludeUrls}")
+    private String excludeUrls;
+    @Value("${configEnv.isDev}")
+    public boolean isDev;
+
+    @Override
+    public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
+        if (isDev) return true;
+        String referer = req.getHeader("referer");
+        String host = req.getServerName();
+        //对外开放的回调url排除在外
+        String reqUrl = req.getRequestURI();
+//        System.out.println(reqUrl);
+        if (!StringUtils.isEmpty(excludeUrls)) {
+            String[] split = excludeUrls.split(",");
+            boolean isPass = false;
+            for (String pattern: split) {
+                if (matcher.match(pattern, reqUrl)) {
+                    isPass = true;
+                    break;
+                }
+            }
+            if (isPass) {
+                return true;
+            }
+        }
+        // 只验证POST请求
+        if ("POST".equals(req.getMethod())) {
+            //本地开发环境不验证
+            if (referer == null) {
+                System.out.println("===referer为Null, 返回404,拦截==");
+                // 状态置为404
+                resp.setStatus(HttpServletResponse.SC_NOT_FOUND);
+                return false;
+            }
+            java.net.URL url = null;
+            try {
+                url = new java.net.URL(referer);
+            } catch (MalformedURLException e) {
+                // URL解析异常,也置为404
+                resp.setStatus(HttpServletResponse.SC_NOT_FOUND);
+                return false;
+            }
+            boolean isSame = false;
+            if (host.equals(url.getHost())) {
+                isSame = true;
+            }
+            // 首先判断请求域名和referer域名是否相同
+            if (!isSame) {
+                // 如果不等,判断是否在白名单中
+                if (properties.getRefererDomain() != null) {
+                    for (String s : properties.getRefererDomain()) {
+                        if (s.equals(url.getHost())) {
+                            return true;
+                        }
+                    }
+                }
+                return false;
+            }
+        }
+        return true;
+    }
+}
+

+ 23 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/config/RefererProperties.java

@@ -0,0 +1,23 @@
+package com.management.platform.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+@ConfigurationProperties(prefix = "referer")
+public class RefererProperties {
+    // 白名单域名
+    private List<String> refererDomain;
+    //setter,getter方法
+
+
+    public List<String> getRefererDomain() {
+        return refererDomain;
+    }
+
+    public void setRefererDomain(List<String> refererDomain) {
+        this.refererDomain = refererDomain;
+    }
+}

+ 22 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/config/SchedulerConfig.java

@@ -0,0 +1,22 @@
+package com.management.platform.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.TaskScheduler;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
+
+@Configuration
+@EnableScheduling
+public class SchedulerConfig {
+    @Bean
+    public TaskScheduler taskScheduler() {
+        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
+        //线程池大小
+        scheduler.setPoolSize(10);
+        //线程名字前缀
+        scheduler.setThreadNamePrefix("spring-task-thread");
+        return scheduler;
+    }
+}
+

+ 24 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/config/SuperSonicConfig.java

@@ -0,0 +1,24 @@
+package com.management.platform.config;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+@Data
+@Configuration
+public class SuperSonicConfig {
+    @Value("${supersonic.use:false}")
+    private Boolean supersonicUse;
+
+    @Value("${supersonic.ip:localhost}")
+    private String supersonicIP;
+
+    @Value("${supersonic.port:9080}")
+    private String supersonicPort;
+
+    @Value("${supersonic.username:admin}")
+    private String supersonicUserName;
+
+    @Value("${supersonic.password:e6+jQ26AESREiBBuKM1u1A==}")
+    private String supersonicPassWord;
+}

+ 28 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/config/WebConfig.java

@@ -0,0 +1,28 @@
+package com.management.platform.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@EnableWebMvc
+@Configuration
+public class WebConfig implements WebMvcConfigurer {
+
+    @Bean
+    public RefererInterceptor refererInterceptor() {
+        return new RefererInterceptor();
+    }
+
+    /**
+     * 注册拦截器
+     */
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        //referer拦截
+        registry.addInterceptor(refererInterceptor());
+    }
+
+
+}

+ 50 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/config/WebMvcConfig.java

@@ -0,0 +1,50 @@
+package com.management.platform.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.LocaleResolver;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import org.springframework.web.servlet.i18n.CookieLocaleResolver;
+import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
+
+import java.util.Locale;
+
+@Configuration
+public class WebMvcConfig implements WebMvcConfigurer {
+
+    /**
+     * 国际化配置
+     */
+    @Bean
+    public LocaleResolver customLocaleResolver(){
+//		SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
+//		sessionLocaleResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
+//		return sessionLocaleResolver;
+        //使用CookieLocaleResolver,也可使用SessionLocaleResolver,区别在于一个使用Cookie存储Locale信息,一个使用Session
+        CookieLocaleResolver localeResolver = new CookieLocaleResolver();
+        localeResolver.setCookieName("localeCookie");
+        //设置默认区域
+        localeResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
+        localeResolver.setCookieMaxAge(3600);//设置cookie有效期.
+        return localeResolver;
+    }
+
+    /**
+     *
+     * 添加Locale 拦截器,从请求参数lang中获取参数值,这样我们可以通过lang RequestParam来切换Locale信息
+     */
+    @Bean
+    public LocaleChangeInterceptor localeChangeInterceptor(){
+        LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
+        localeChangeInterceptor.setParamName("lang");
+        return localeChangeInterceptor;
+    }
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        //添加locale拦截器
+        registry.addInterceptor(localeChangeInterceptor());
+    }
+
+}
+

+ 62 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/constant/Constant.java

@@ -0,0 +1,62 @@
+package com.management.platform.constant;
+
+import org.springframework.stereotype.Component;
+
+/**
+ * Author: 吴涛涛
+ * Date : 2019 - 07 - 24 16:00
+ * Description:<描述>常量配置类
+ * Version: 1.0
+ */
+@Component
+public class Constant {
+//    public static final String API_KEY = "gtImOYhgcFBzwuT29tB7tM0Z";//百度文字识别apiKey
+//    public static final String SECRET_KEY = "RipT5kfF3Zqp7S2vTXPlNcMiYcA76jfq";//百度文字识别secretKey
+    public static final String API_KEY = "UgceK95dGkVbQKicVDU9D6s2";//百度文字识别apiKey
+    public static final String SECRET_KEY = "fGCbfC9CR1v8Pf1u6kG4fM9KEXHgitAA";//百度文字识别secretKey
+    public static final Integer UN_HANDLE = 0;//定时任务未处理的状态码
+    public static final String PIC_PATH_PREFIX = "";//定时任务未处理的状态码
+    public static final String COMMON_SOFTWARE_KEYWORDS = "keyWords";//常用软件关键字
+    public static final String[] keyWords = new String[]{"IntelliJ IDEA","Eclipse",
+            "Postman","MyEclipse","Visual Studio Code",
+            "Navicat","Pycharm","Android Studio",
+            "WebStorm","SQLyog","PhpStorm",
+            "JetBrains Datagrip","JetBrains Rider",
+            "Android Studio","Photoshop","Illustrator",
+            "Adobe After Effects","Axure RP","Sketch"};//定时任务未处理的状态码
+//    public static final String ACCESS_KEY = "280d6f0e4a774117905ba789a9f0b978";//百度图像识别accessKey
+//    public static final String SECRET_KEY = "43b460e124eb474c8cdb7441dc30d66d";//百度图像识别secretKey
+    //角色定义
+    public static final String[] ROLE_NAMES = {"普通员工","超级管理员", "系统管理员", "无","财务管理员","项目管理员","公司领导","项目经理"};
+
+    public static final String ROLE_SUPER_MANAGER = "超级管理员";
+
+    public static final String[] DEFAULT_BASE_COST_ITEMS = {"人工成本","一般费用","外包费用","其他"};
+
+    public static final String[] LEAVE_TYPES = {"事假","病假","年假","产假","婚假","丧假","调休假","陪产假","其他"};
+
+    public static final String[] EXPENSE_TYPES = {"材料费","办公用品","培训费","打印费","快递费","制作费","律师费","水费","电费","团建费","其他",
+                                        "城市间交通费","住宿费","伙食补助费","市内交通费","其他差旅费","项目外包费","劳务外包费","其他外包费"};
+
+    //项目报告审核通知
+    public static final String[] PROJECT_REPORT_CHECK = {"审核结果","项目名称","填报人员","工作日期"};
+    //工作日报漏填提醒
+    public static final String[] WORK_REPORT_MISSING_FILLING = {"提示"};
+    //新任务通知
+    public static final String[] NEW_TASK = {"任务内容"};
+    //日报待审核提醒
+    public static final String[] REPORT_WAIT_CHECK = {"待审核数量"};
+    //日报审核通过提醒
+    public static final String[] REPORT_CHECK_PASS = {"审核人","日期"};
+    //日报审核通过提醒(带评价)
+    public static final String[] REPORT_CHECK_PASS_WITH_APPRAISE = {"审核人","评价","日期"};
+    //任务进展通知
+    public static final String[] TASK_EVOLVE= {"项目名称","任务名称","进展内容","任务状态"};
+    //费用报销待审核提醒
+    public static final String[] EXPENSE_REIMBURSEMENT_WAIT_CHECK= {"报销人","填报日期","票据类型","金额","备注"};
+    //员工请假待审核
+    public static final String[] LEAVE_WAIT_CHECK= {"请假人","请假类型","请假时间","备注"};
+    //请假审核通知
+    public static final String[] LEAVE_CHECK= {"审核结果","审核人","请假时间","备注"};
+    public static final int JUN_TIAN_COMPANY_ID= 6666;
+}

+ 27 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/constant/MybatisPlusPageConfig.java

@@ -0,0 +1,27 @@
+package com.management.platform.constant;
+
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+//Spring boot方式
+@EnableTransactionManagement
+@Configuration
+@MapperScan("com.management.platform.mapper")
+public class MybatisPlusPageConfig {
+
+    @Bean
+    public PaginationInterceptor paginationInterceptor() {
+        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
+        // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
+        // paginationInterceptor.setOverflow(false);
+        // 设置最大单页限制数量,默认 500 条,-1 不受限制
+        // paginationInterceptor.setLimit(500);
+        // 开启 count 的 join 优化,只针对部分 left join
+        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
+        return paginationInterceptor;
+    }
+}

+ 44 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/constant/Parameter.java

@@ -0,0 +1,44 @@
+package com.management.platform.constant;
+
+/**
+ * Author: 吴涛涛
+ * Date : 2020 - 01 - 06 11:19
+ * Description:<描述> 参数枚举
+ * Version: 1.0
+ */
+public enum Parameter {
+    //accessToken
+    ACCESS_TOKEN("accessToken", "accessToken"),
+    //accessToken 的有效时间 单位:s
+    EXPIRES_IN("expiresIn", "expiresIn");
+
+    private String code;
+    private String name;
+
+    private Parameter(String code, String name) {
+        this.code = code;
+//        this.name = name();
+        this.name = name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+//    public static void main(String[] args) {
+//        System.out.println(Parameter.API_KEY.getName());
+//    }
+
+}

+ 58 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/AIQuestionController.java

@@ -0,0 +1,58 @@
+package com.management.platform.controller;
+
+import com.management.platform.entity.bo.QuestionBO;
+import com.management.platform.service.AIQuestionService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+@RestController
+@RequestMapping("/aiQuestion")
+public class AIQuestionController {
+
+    @Resource
+    private AIQuestionService aiQuestionService;
+
+    @PostMapping("/ask")
+    public HttpRespMsg ask(QuestionBO questionBO
+            , HttpServletRequest request){
+        HttpRespMsg msg = new HttpRespMsg();
+        msg = aiQuestionService.ask(questionBO,request);
+        return msg;
+    }
+
+    @PostMapping("/downloadContent")
+    public ResponseEntity<byte[]> downloadContent(@RequestParam(value = "questionId")Integer questionId
+            , HttpServletRequest request){
+        ResponseEntity<byte[]> responseEntity = aiQuestionService.downloadContent(questionId, request);
+        return responseEntity;
+    }
+
+    @PostMapping("/getLatestQuestionList")
+    public HttpRespMsg getLatestQuestion(HttpServletRequest request){
+        HttpRespMsg msg = new HttpRespMsg();
+        msg = aiQuestionService.getLatestQuestionList(request);
+        return msg;
+    }
+
+    @PostMapping("/getHisQuestion")
+    public HttpRespMsg getHisQuestion(HttpServletRequest request){
+        HttpRespMsg msg = new HttpRespMsg();
+        msg = aiQuestionService.getHisQuestion(request);
+        return msg;
+    }
+
+    @PostMapping("/getCusReportForm")
+    public HttpRespMsg getCusReportForm(HttpServletRequest request){
+        HttpRespMsg msg = new HttpRespMsg();
+        msg = aiQuestionService.getCusReportForm(request);
+        return msg;
+    }
+
+}

+ 20 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ActionLogController.java

@@ -0,0 +1,20 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-26
+ */
+@RestController
+@RequestMapping("/action-log")
+public class ActionLogController {
+
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/AlertTimeController.java

@@ -0,0 +1,20 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-05-31
+ */
+@RestController
+@RequestMapping("/alert-time")
+public class AlertTimeController {
+
+}
+

+ 176 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/AttachmentCenterController.java

@@ -0,0 +1,176 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.entity.AttachmentCenter;
+import com.management.platform.entity.User;
+import com.management.platform.mapper.*;
+import com.management.platform.service.ProductService;
+import com.management.platform.task.SFTPAsyncUploader;
+import com.management.platform.util.DocumentTypeUtil;
+import com.management.platform.util.FileUtil;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.util.UUID;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-04-15
+ */
+@RestController
+@RequestMapping("/attachment")
+public class AttachmentCenterController {
+    @Resource
+    private ProductService productService;
+    @Resource
+    private HttpServletRequest request;
+
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private AttachmentCenterMapper attachmentCenterMapper;
+    @Value("${upload.path}")
+    private String uploadPath;
+
+    @Autowired
+    public SFTPAsyncUploader sftpAsyncUploader;
+
+    /**
+     * 上传文件
+     * @param files 上传的文件
+     * @param response
+     * @return
+     * @throws Exception
+     */
+    @RequestMapping(value="uploadAttachment")
+    public HttpRespMsg uploadAttachment(
+            @RequestParam Integer moduleId,
+            @RequestParam String moduleCode,
+            @RequestParam("file") MultipartFile[] files,
+            HttpServletResponse response) throws Exception {
+        HttpRespMsg msg = new HttpRespMsg();
+        User user = (User) userMapper.selectById(request.getHeader("Token"));
+
+        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
+        for (MultipartFile file : files) {
+            AttachmentCenter record = new AttachmentCenter();
+            record.setCreatorId(user.getId());
+            record.setCreatorName(user.getName());
+            record.setAttachmentName(file.getOriginalFilename());
+            record.setModuleId(moduleId);
+            record.setModuleCode(moduleCode);
+            if (file != null && !file.isEmpty()) {
+                //截取文件后缀
+                String fileSuffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
+                record.setAttachmentType(DocumentTypeUtil.DocumentType(fileSuffix));
+                record.setAttachmentSuffix(fileSuffix);
+                //处理文件
+                File dir = new File(uploadPath);
+                if (!dir.exists()) {
+                    dir.mkdir();
+                }
+                String fileName= "";
+                if (file!=null && !file.isEmpty()) {
+                    fileName = file.getOriginalFilename();
+
+                    int pos = fileName.lastIndexOf(".");
+                    String suffix = fileName.substring(pos).toLowerCase();
+                    //用uuid替换原始的文件名
+                    String purFName = UUID.randomUUID().toString().replaceAll("-", "");
+                    fileName = purFName + suffix;
+                    File saveFile = new File(dir, fileName);
+                    try {
+                        saveFile.createNewFile();
+                        file.transferTo(saveFile);
+                        //异步上传到备份服务器
+                        sftpAsyncUploader.uploadFileAsync(saveFile);
+
+                        //计算文件大小
+                        long fileSize = saveFile.length();
+                        String fileLength = FileUtil.getReadableFileSize(fileSize);
+                        record.setServerName(uploadPath + fileName);
+
+                        record.setSize(fileLength);
+                        String pathPrefix = "/upload/";
+                        record.setUrl(pathPrefix + fileName);
+                        attachmentCenterMapper.insert(record);
+                        String path = uploadPath;
+                        //生成原文件名称与服务器文件名称对应
+                        msg.data = record;
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                        fileName = null;
+                        msg.setError(e.getMessage()+", path="+dir.getAbsolutePath());
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        fileName = null;
+                        msg.setError(e.getMessage()+", path="+dir.getAbsolutePath());
+                    }
+                } else {
+                    msg.setError(MessageUtils.message("file.nonExistentError"));
+                }
+            }
+        }
+        return msg;
+    }
+
+    @RequestMapping("/rename")
+    public HttpRespMsg rename(Integer id,String name){
+        HttpRespMsg msg=new HttpRespMsg();
+        AttachmentCenter attachmentCenter = attachmentCenterMapper.selectById(id);
+        File file = new File(attachmentCenter.getServerName());
+        if(file.exists()){
+            attachmentCenter.setAttachmentName(name);
+            String pathPrefix = "/upload/";
+            attachmentCenterMapper.updateById(attachmentCenter);
+            msg.setMsg("文件重命名成功");
+        }else {
+            msg.setError("文件不存在");
+        }
+        return msg;
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id){
+        HttpRespMsg msg=new HttpRespMsg();
+        AttachmentCenter attachmentCenter = attachmentCenterMapper.selectById(id);
+        File file = new File(attachmentCenter.getServerName());
+        if(file.exists()){
+            boolean delete = file.delete();
+            if(delete){
+                attachmentCenterMapper.deleteById(id);
+                msg.setMsg("文件删除成功");
+            }else {
+                msg.setError("文件删除失败");
+            }
+        }else {
+            msg.setError("文件不存在");
+        }
+        return msg;
+    }
+
+    @RequestMapping("/attachmentList")
+    public HttpRespMsg attachmentList(Integer moduleId, String moduleCode){
+        // 根据 moduleId 和 moduleCode 查询 attachment_center 表
+        return productService.attachmentList(moduleId, moduleCode);
+    }
+}
+

+ 46 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/AuditLogCenterController.java

@@ -0,0 +1,46 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.management.platform.entity.AuditLogCenter;
+import com.management.platform.service.AuditLogCenterService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-04-15
+ */
+@RestController
+@RequestMapping("/audit-log-center")
+public class AuditLogCenterController {
+
+    @Resource
+    private AuditLogCenterService auditLogCenterService;
+
+
+    /**
+    * @Description:根据模块编码以及模块对应的数据id获取到日志数据
+    * @Param: [moduleCode, id]
+    * @return: com.management.platform.util.HttpRespMsg
+    * @Author: yurk
+    * @Date: 2024/5/21
+    */
+    @RequestMapping("/list")
+    public HttpRespMsg list(String moduleCode,Integer id){
+        HttpRespMsg msg=new HttpRespMsg();
+        List<AuditLogCenter> list = auditLogCenterService.list(new LambdaQueryWrapper<AuditLogCenter>().eq(AuditLogCenter::getModuleCode, moduleCode).eq(AuditLogCenter::getModuleId,id));
+        msg.setData(list);
+        return msg;
+    }
+
+}
+

+ 126 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/AuditWorkflowSettingController.java

@@ -0,0 +1,126 @@
+package com.management.platform.controller;
+
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.AuditWorkflowSetting;
+import com.management.platform.mapper.*;
+import com.management.platform.service.AuditWorkflowSettingService;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-28
+ */
+@RestController
+@RequestMapping("/audit-workflow-setting")
+public class AuditWorkflowSettingController {
+    public static final int TYPE_LEAVE = 1;//请假
+    public static final int TYPE_BUSTRIP = 2;//出差
+    public static final int TYPE_EXPENSE = 3;//费用报销
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    AuditWorkflowSettingMapper auditWorkflowSettingMapper;
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    AuditWorkflowSettingService auditWorkflowSettingService;
+
+    @RequestMapping("/add")
+    public HttpRespMsg add(String json, Integer deptId, @RequestParam Integer type) {
+        String token = request.getHeader("TOKEN");
+        Integer companyId = userMapper.selectById(token).getCompanyId();
+        QueryWrapper<AuditWorkflowSetting> eq = new QueryWrapper<AuditWorkflowSetting>().eq("dept_id", deptId).eq("type", type);
+        List<AuditWorkflowSetting> oldAuditSettingList = auditWorkflowSettingMapper.selectList(eq);
+        JSONArray array = JSONArray.parseArray(json);
+        //检查是否有重复的部门
+        List<Integer> auditDeptIds = new ArrayList<>();
+        for (int i=0;i<array.size(); i++) {
+            JSONObject obj = array.getJSONObject(i);
+            AuditWorkflowSetting auditWorkflowTimeSetting = JSONObject.toJavaObject(obj, AuditWorkflowSetting.class);
+            if (auditWorkflowTimeSetting.getAuditDeptId() != null) {
+                if (auditDeptIds.contains(auditWorkflowTimeSetting.getAuditDeptId())) {
+                    HttpRespMsg msg = new HttpRespMsg();
+                    msg.setError(MessageUtils.message("department.duplicateError", auditWorkflowTimeSetting.getAuditDeptName()));
+                    return msg;
+                } else {
+                    auditDeptIds.add(auditWorkflowTimeSetting.getAuditDeptId());
+                }
+            }
+        }
+
+        //
+        List<Integer> existingIds = new ArrayList<>();
+        for (int i=0;i<array.size(); i++) {
+            JSONObject obj = array.getJSONObject(i);
+            AuditWorkflowSetting auditWorkflowTimeSetting = JSONObject.toJavaObject(obj, AuditWorkflowSetting.class);
+            auditWorkflowTimeSetting.setCompanyId(companyId);
+            auditWorkflowTimeSetting.setType(type);
+            auditWorkflowTimeSetting.setSeq(i+1);
+            if (i == array.size() -1) {
+                auditWorkflowTimeSetting.setIsFinal(1);
+            } else {
+                auditWorkflowTimeSetting.setIsFinal(0);
+            }
+            auditWorkflowTimeSetting.setDeptId(deptId);
+            if (auditWorkflowTimeSetting.getId() == null) {
+                auditWorkflowSettingMapper.insert(auditWorkflowTimeSetting);
+            } else {
+                auditWorkflowSettingMapper.updateById(auditWorkflowTimeSetting);
+                existingIds.add(auditWorkflowTimeSetting.getId());
+            }
+        }
+
+        //移除不在本次保存范围内的已有节点数据
+        if (oldAuditSettingList.size() > 0) {
+            List<Integer> collect = oldAuditSettingList.stream().map(AuditWorkflowSetting::getId).filter(oldId -> !existingIds.stream().anyMatch(ex -> ex.equals(oldId))).collect(Collectors.toList());
+            if (collect.size() > 0) {
+                auditWorkflowSettingMapper.deleteBatchIds(collect);
+            }
+        }
+        return new HttpRespMsg();
+    }
+
+    @RequestMapping("/checkNodeInUse")
+    public HttpRespMsg checkNodeInUse(String auditDeptId, Integer deptId, Integer type) {
+        String token = request.getHeader("TOKEN");
+        HttpRespMsg msg = new HttpRespMsg();
+        List<AuditWorkflowSetting> targetNode = auditWorkflowSettingMapper.selectList(new QueryWrapper<AuditWorkflowSetting>().eq("dept_id", deptId).eq("audit_dept_id", auditDeptId).eq("type", type));
+        if (targetNode.size() > 0) {
+
+        }
+
+        return msg;
+    }
+
+    @RequestMapping("/get")
+    public HttpRespMsg get(String userId, Integer deptId, @RequestParam Integer type) {
+        HttpRespMsg msg = new HttpRespMsg();
+        //按照传入的用户取他的部门
+        if (!StringUtils.isEmpty(userId)) {
+            deptId = userMapper.selectById(userId).getDepartmentId();
+        }
+        msg.data = auditWorkflowSettingService.get(deptId, type);
+        return msg;
+    }
+
+}
+

+ 145 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/AuditWorkflowTimeSettingController.java

@@ -0,0 +1,145 @@
+package com.management.platform.controller;//package com.management.platform.controller;
+//
+//
+//import com.alibaba.fastjson.JSONArray;
+//import com.alibaba.fastjson.JSONObject;
+//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+//import com.baomidou.mybatisplus.extension.api.R;
+//import com.management.platform.entity.*;
+//import com.management.platform.mapper.*;
+//import com.management.platform.service.ReportService;
+//import com.management.platform.util.HttpRespMsg;
+//import com.management.platform.util.MessageUtils;
+//import org.springframework.util.StringUtils;
+//import org.springframework.web.bind.annotation.RequestMapping;
+//import org.springframework.web.bind.annotation.RestController;
+//
+//import javax.annotation.Resource;
+//import javax.servlet.http.HttpServletRequest;
+//import java.time.LocalDateTime;
+//import java.util.ArrayList;
+//import java.util.HashMap;
+//import java.util.List;
+//import java.util.stream.Collectors;
+//
+///**
+// * <p>
+// *  前端控制器
+// * </p>
+// *
+// * @author Seyason
+// * @since 2021-07-25
+// */
+//@RestController
+//@RequestMapping("/audit-workflow-time-setting")
+//public class AuditWorkflowTimeSettingController {
+//    @Resource
+//    private HttpServletRequest request;
+//    @Resource
+//    AuditWorkflowTimeSettingMapper auditWorkflowTimeSettingMapper;
+//    @Resource
+//    UserMapper userMapper;
+//    @Resource
+//    DepartmentMapper departmentMapper;
+//
+//    @RequestMapping("/add")
+//    public HttpRespMsg add(String json, Integer deptId) {
+//        String token = request.getHeader("TOKEN");
+//        Integer companyId = userMapper.selectById(token).getCompanyId();
+//        auditWorkflowTimeSettingMapper.delete(new QueryWrapper<AuditWorkflowTimeSetting>().eq("dept_id", deptId));
+//        JSONArray array = JSONArray.parseArray(json);
+//
+//        if (array.size() == 1 && array.getJSONObject(0).getInteger("isDeptAudit") == 0) {
+//            //只有一个项目负责人审核,不保存
+//        } else {
+//            //检查是否有重复的部门
+//            List<Integer> auditDeptIds = new ArrayList<>();
+//            for (int i=0;i<array.size(); i++) {
+//                JSONObject obj = array.getJSONObject(i);
+//                AuditWorkflowTimeSetting auditWorkflowTimeSetting = JSONObject.toJavaObject(obj, AuditWorkflowTimeSetting.class);
+//                if (auditDeptIds.contains(auditWorkflowTimeSetting.getAuditDeptId())) {
+//                    HttpRespMsg msg = new HttpRespMsg();
+//                    msg.setError(MessageUtils.message("department.duplicateError",auditWorkflowTimeSetting.getAuditDeptName()));
+//                    return msg;
+//                } else {
+//                    auditDeptIds.add(auditWorkflowTimeSetting.getAuditDeptId());
+//                }
+//            }
+//
+//            for (int i=0;i<array.size(); i++) {
+//                JSONObject obj = array.getJSONObject(i);
+//                AuditWorkflowTimeSetting auditWorkflowTimeSetting = JSONObject.toJavaObject(obj, AuditWorkflowTimeSetting.class);
+//                auditWorkflowTimeSetting.setCompanyId(companyId);
+//                auditWorkflowTimeSetting.setSeq(i+1);
+//                if (i == array.size() -1) {
+//                    auditWorkflowTimeSetting.setIsFinal(1);
+//                } else {
+//                    auditWorkflowTimeSetting.setIsFinal(0);
+//                }
+//                auditWorkflowTimeSetting.setDeptId(deptId);
+//                auditWorkflowTimeSettingMapper.insert(auditWorkflowTimeSetting);
+//            }
+//        }
+//        return new HttpRespMsg();
+//    }
+//
+//    @RequestMapping("/checkNodeInUse")
+//    public HttpRespMsg checkNodeInUse(String auditDeptId, Integer deptId) {
+//        String token = request.getHeader("TOKEN");
+//        Integer companyId = userMapper.selectById(token).getCompanyId();
+//        HttpRespMsg msg = new HttpRespMsg();
+//        List<AuditWorkflowTimeSetting> targetNode = auditWorkflowTimeSettingMapper.selectList(new QueryWrapper<AuditWorkflowTimeSetting>().eq("dept_id", deptId).eq("audit_dept_id", auditDeptId));
+//        if (targetNode.size() > 0) {
+//            //要删除的部门节点是存在的,需要检测是否有待审核的走到这个流程点了
+//            long num = reportMapper.selectCount(new QueryWrapper<Report>().eq("state", 0).eq("is_dept_audit", 1).eq("audit_deptid", auditDeptId));
+//            if (num > 0) {
+//                msg.setError(MessageUtils.message("department.reviewedError"));
+//            }
+//        }
+//        return msg;
+//    }
+//
+//    @RequestMapping("/approveDeptAuditReport")
+//    public HttpRespMsg approveDeptAuditReport(String auditDeptId) {
+//        String token = request.getHeader("TOKEN");
+//        User user = userMapper.selectById(token);
+//        return reportService.approveDeptAuditReport(user, auditDeptId);
+//    }
+//
+//    @RequestMapping("/get")
+//    public HttpRespMsg get(Integer deptId) {
+//        String token = request.getHeader("TOKEN");
+//        Integer companyId = userMapper.selectById(token).getCompanyId();
+//        List<AuditWorkflowTimeSetting> auditWorkflowTimeSettings = auditWorkflowTimeSettingMapper.selectList(new QueryWrapper<AuditWorkflowTimeSetting>().eq("dept_id", deptId).orderByAsc("seq"));
+//        HttpRespMsg msg = new HttpRespMsg();
+//        if (auditWorkflowTimeSettings.size() == 0) {
+//            int seq = 1;
+//            //未独立设置,获取默认的设置,默认直接就是项目负责人审批
+//            Department dept = departmentMapper.selectById(deptId);
+//            AuditWorkflowTimeSetting setting = new AuditWorkflowTimeSetting();
+//            setting.setSeq(seq);
+//            setting.setCompanyId(companyId);
+//            setting.setDeptId(dept.getDepartmentId());
+//            setting.setIsFinal(1);
+//            setting.setIsDeptAudit(0);
+//            auditWorkflowTimeSettings.add(setting);
+////            while (dept.getSuperiorId() != null && dept.getSuperiorId() > 0) {
+////                seq++;
+////                dept = departmentMapper.selectById(dept.getSuperiorId());
+////                setting = new AuditWorkflowTimeSetting();
+////                setting.setCompanyId(companyId);
+////                setting.setDeptId(dept.getDepartmentId());
+////                setting.setSeq(seq);
+////                setting.setAuditDeptId(dept.getDepartmentId());
+////                setting.setAuditDeptName(dept.getDepartmentName());
+////                auditWorkflowTimeSettings.add(setting);
+////            }
+//
+//        }
+//        msg.data = auditWorkflowTimeSettings;
+//        return msg;
+//    }
+//
+//
+//}
+//

+ 457 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/AuthRedirectController.java

@@ -0,0 +1,457 @@
+package com.management.platform.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.*;
+import com.management.platform.service.WxCorpInfoService;
+import com.management.platform.service.impl.FeishuInfoServiceImpl;
+import com.management.platform.util.MessageUtils;
+import com.management.platform.util.UserAgentUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.*;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.view.RedirectView;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.management.platform.controller.WeiXinCorpController.GET_CORP_USERINFO_URL;
+
+@Controller
+public class AuthRedirectController {
+    @Resource
+    HttpServletRequest request;
+    @Value("${suitId}")
+    private String suitId;
+    @Value("${suitSecret}")
+    private String suitSecret;
+    @Value("${privateDeployURL.pcUrl}")
+    private String pcUrl;
+    @Value("${privateDeployURL.mobUrl}")
+    private String mobUrl;
+    @Value("${corpId}")
+    private String corpId;
+
+    @Resource
+    SysConfigMapper sysConfigMapper;
+    @Autowired
+    RestTemplate restTemplate;
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    WxCorpInfoMapper wxCorpInfoMapper;
+    @Resource
+    CompanyMapper companyMapper;
+    @Resource
+    WxCorpInfoService wxCorpInfoService;
+    @Resource
+    FeishuInfoServiceImpl feishuInfoService;
+    @Resource
+    UserLoginInfoMapper userLoginInfoMapper;
+
+
+    @RequestMapping("/corpWXAuth")
+    public ModelAndView auth(String code, String state) {
+        Map<String,Object> reqParam = new HashMap<String,Object>(16);
+        String userAgent = request.getHeader("User-Agent");
+        //获取设备类型
+        String deviceType = UserAgentUtils.getDeviceType(userAgent);
+        boolean isMobile = "MOBILE".equals(deviceType);
+        String url = GET_CORP_USERINFO_URL.replace("SUITE_ACCESS_TOKEN", getSuiteAccessToken()).replace("CODE", code);
+        String forObject = this.restTemplate.getForObject(url, String.class);
+        JSONObject obj = JSONObject.parseObject(forObject);
+        System.out.println(obj.toString());
+        String wxUserId = obj.getString("UserId");
+        String openUserId = obj.getString("open_userid");
+        String corpId = obj.getString("CorpId");
+
+        System.out.println("登录 wxUserId="+wxUserId+", openUserId="+openUserId);
+        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("corpwx_userid", openUserId));
+        Integer companyId = 0;
+        if (userList.size() > 0) {
+            //该用户已存在
+            User curUser = userList.get(0);
+            System.out.println("找到用户corpwxUserid=="+curUser.getCorpwxUserid());
+            companyId = curUser.getCompanyId();
+            if (curUser.getIsActive() == 1) {
+                reqParam.put("userId", curUser.getId());
+            } else {
+                //提示账号已停用
+                //reqParam.put("errorMsg", "您的账号已停用,无法登录");
+                reqParam.put("errorMsg", MessageUtils.message("user.inactive"));
+            }
+        } else {
+            //使用UserId比对,之前有的老用户存的是UserId
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectById(corpId);
+            if (wxCorpInfo == null) {
+                reqParam.put("errorMsg", MessageUtils.message("user.accountNoExist"));
+            } else {
+                User curUser = userMapper.selectOne(new QueryWrapper<User>().eq("company_id", wxCorpInfo.getCompanyId()).eq("corpwx_userid", wxUserId));
+                if (curUser == null) {
+//                    reqParam.put("errorMsg", MessageUtils.message("user.accountNoExist"));
+                    //用户不存在,去生成该用户
+                    if (wxCorpInfo.getSaasSyncContact() == 1) {
+                        curUser = wxCorpInfoService.generateUserInfo(wxCorpInfo.getCompanyId(), openUserId);
+                    }
+                }
+                if (curUser != null) {
+                    if (curUser.getIsActive() == 1) {
+                        companyId = curUser.getCompanyId();
+                        reqParam.put("userId", curUser.getId());
+                    } else {
+                        //提示账号已停用
+                        //reqParam.put("errorMsg", "您的账号已停用,无法登录");
+                        reqParam.put("errorMsg", MessageUtils.message("user.inactive"));
+                    }
+                } else {
+                    System.err.println("==生成企业微信User失败==");
+                    reqParam.put("errorMsg", "尚未绑定企业微信,请使用账号密码登录。");
+                }
+
+            }
+        }
+        reqParam.put("hasTriedAutoLogin", 1);
+        if (!StringUtils.isEmpty(state) && state.length() > 1) {
+            reqParam.put("path", state);
+        }
+
+        String redirecUrl = null;
+        String router = "index";
+        if (companyId > 0) {
+            HashMap compExpireInfo = getCompExpireInfo(companyId);
+            if (compExpireInfo != null) {
+                //过期了
+                router = "expire";
+                reqParam.put("expDate", compExpireInfo.get("expDate"));
+                reqParam.put("version", compExpireInfo.get("version"));
+            }
+        }
+        if (isMobile) {
+            redirecUrl = "https://mobcrm.ttkuaiban.com/#/" + router;
+        } else {
+            redirecUrl = "https://crm.ttkuaiban.com/#/" + router;
+        }
+        ModelAndView modelAndView = new ModelAndView(
+                new RedirectView(redirecUrl), reqParam);
+
+        //存储该公司第一次登录所使用的设备
+        if (!reqParam.containsKey("errorMsg")){
+            Integer company = userLoginInfoMapper.selectCount(new QueryWrapper<UserLoginInfo>().eq("company_id",companyId));
+            if (company.equals(0)){
+                UserLoginInfo userLoginInfo = new UserLoginInfo();
+                userLoginInfo.setCompanyId(companyId);
+                userLoginInfo.setFirstLoginDevice(deviceType);
+                userLoginInfo.setWxUserId(wxUserId);
+                userLoginInfoMapper.insert(userLoginInfo);
+                System.err.println(userLoginInfo.toString());
+            }
+        }
+        return modelAndView;
+    }
+
+    @RequestMapping("/corpWXScanningAuth")
+    public ModelAndView corpWXScanningAuth(String code, String state)throws Exception {
+        Map<String,Object> reqParam = new HashMap<String,Object>(16);
+        String userAgent = request.getHeader("User-Agent");
+        //获取设备类型
+        String deviceType = UserAgentUtils.getDeviceType(userAgent);
+        boolean isMobile = "MOBILE".equals(deviceType);
+        String url = null;
+        String redirecUrl = null;
+        try {
+            String suiteAccessToken = getLoginSuiteAccessToken();
+            System.out.println("loginSuiteAccessToken=="+suiteAccessToken);
+            url = GET_CORP_USERINFO_URL.replace("SUITE_ACCESS_TOKEN", suiteAccessToken).replace("CODE", code);
+            String forObject = this.restTemplate.getForObject(url, String.class);
+            JSONObject obj = JSONObject.parseObject(forObject);
+            System.out.println("获取授权的用户身份信息:"+obj.toString());
+            String openId = obj.getString("open_userid");
+            String corpId = obj.getString("CorpId");
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectById(corpId);
+            if (wxCorpInfo != null) {
+                User curUser = null;
+                Integer companyId = wxCorpInfo.getCompanyId();
+                List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("corpwx_userid", openId).eq("company_id", companyId));
+                if (userList.size() > 0) {
+                    //该用户已存在
+                    curUser = userList.get(0);
+                    System.out.println("找到用户corpwxUserid=="+curUser.getCorpwxUserid());
+                    companyId = curUser.getCompanyId();
+                    if (curUser.getIsActive() == 1) {
+                        reqParam.put("userId", curUser.getId());
+                    } else {
+                        //提示账号已停用
+                        //reqParam.put("errorMsg", "您的账号已停用,无法登录");
+                        reqParam.put("errorMsg", MessageUtils.message("user.inactive"));
+                    }
+                } else {
+                    curUser = wxCorpInfoService.generateUserInfo(wxCorpInfo.getCompanyId(), openId);
+                    reqParam.put("userId", curUser.getId());
+                }
+                if (!StringUtils.isEmpty(state) && state.length() > 1) {
+                    reqParam.put("path", state);
+                }
+                String router = "login";
+                if (companyId > 0) {
+                    HashMap compExpireInfo = getCompExpireInfo(companyId);
+                    if (compExpireInfo != null) {
+                        //过期了
+                        router = "expire";
+                        reqParam.put("expDate", compExpireInfo.get("expDate"));
+                        reqParam.put("version", compExpireInfo.get("version"));
+                    }
+                }
+                redirecUrl = "https://crm.ttkuaiban.com/#/" + router;
+            } else {
+                reqParam.put("errorMsg", "该企业尚未授权开通应用,请联系管理员。");
+                redirecUrl = "https://crm.ttkuaiban.com/#/login";
+            }
+        } catch (Exception exception) {
+            exception.printStackTrace();
+            reqParam.put("errorMsg",exception.getMessage());
+        }
+        ModelAndView modelAndView = new ModelAndView(
+                new RedirectView(redirecUrl), reqParam);
+        return modelAndView;
+    }
+
+
+    @RequestMapping("/corpInsideWXAuth")
+    public ModelAndView authInside(String code, String state) throws Exception{
+        Map<String,Object> reqParam = new HashMap<String,Object>(16);
+        String userAgent = request.getHeader("User-Agent");
+        //获取设备类型
+        String deviceType = UserAgentUtils.getDeviceType(userAgent);
+        boolean isMobile = "MOBILE".equals(deviceType);
+        WxCorpInfo corpInfo = wxCorpInfoMapper.selectById(corpId);
+        String url = WeiXinCorpController.GET_CORP_INSIDE_USERINFO_URL.replace("ACCESS_TOKEN",getCorpConcactAccessToken(corpInfo)).replace("CODE", code);
+        String forObject = this.restTemplate.getForObject(url, String.class);
+        JSONObject obj = JSONObject.parseObject(forObject);
+        String wxUserId = obj.getString("userid");
+//        String openUserId = obj.getString("open_userid");
+//        String corpId = obj.getString("CorpId");
+
+        System.out.println("wxUserId="+wxUserId);
+        System.out.println(obj.toString());
+        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("corpwx_userid", wxUserId).eq("company_id", corpInfo.getCompanyId()));
+        Integer companyId = 0;
+        if (userList.size() > 0) {
+            //该用户已存在
+            User curUser = userList.get(0);
+            companyId = curUser.getCompanyId();
+            if (curUser.getIsActive() == 1) {
+                reqParam.put("userId", curUser.getId());
+            } else {
+                //提示账号已停用
+                //reqParam.put("errorMsg", "您的账号已停用,无法登录");
+                reqParam.put("errorMsg", MessageUtils.message("user.inactive"));
+            }
+        } else {
+            //使用UserId比对,之前有的老用户存的是UserId
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectById(corpId);
+            if (wxCorpInfo == null) {
+                reqParam.put("errorMsg", MessageUtils.message("user.accountNoExist"));
+            } else {
+                User curUser = userMapper.selectOne(new QueryWrapper<User>().eq("company_id", wxCorpInfo.getCompanyId()).eq("corpwx_userid", wxUserId));
+                if (curUser == null) {
+                    reqParam.put("errorMsg", MessageUtils.message("user.accountNoExist"));
+                }
+                if (curUser != null) {
+                    if (curUser.getIsActive() == 1) {
+                        companyId = curUser.getCompanyId();
+                        reqParam.put("userId", curUser.getId());
+                    } else {
+                        //提示账号已停用
+                        reqParam.put("errorMsg", MessageUtils.message("user.inactive"));
+                    }
+                } else {
+                    reqParam.put("errorMsg", MessageUtils.message("user.accountNoExist"));
+                }
+
+            }
+        }
+        reqParam.put("hasTriedAutoLogin", 1);
+        if (!StringUtils.isEmpty(state) && state.length() > 1) {
+            reqParam.put("path", state);
+        }
+
+        String redirecUrl = null;
+        String router = "index";
+        if (companyId > 0) {
+            HashMap compExpireInfo = getCompExpireInfo(companyId);
+            if (compExpireInfo != null) {
+                //过期了
+                router = "expire";
+                reqParam.put("expDate", compExpireInfo.get("expDate"));
+                reqParam.put("version", compExpireInfo.get("version"));
+            }
+        }
+        if (isMobile) {
+            redirecUrl = mobUrl +"/#/"+ router;
+        } else {
+            redirecUrl = pcUrl +"/#/"+ router;
+        }
+        ModelAndView modelAndView = new ModelAndView(
+                new RedirectView(redirecUrl), reqParam);
+        reqParam.put("isPrivateCorpWX", 1);
+        System.out.println("跳转=="+redirecUrl);
+        if (reqParam.containsKey("errorMsg")) {
+            System.out.println(reqParam.get("errorMsg"));
+        }
+        return modelAndView;
+    }
+
+    private HashMap getCompExpireInfo(Integer companyId) {
+        Company company = companyMapper.selectById(companyId);
+        int version = 1;
+        if (company.getPackageProject() == 1) {
+            version = 2;
+        }
+        if (company.getPackageOa() == 1) {
+            version = 3;
+        }
+        if (company.getPackageEngineering() == 1) {
+            version = 4;
+        }
+        boolean hasExp = false;
+        LocalDateTime expirationDate = company.getExpirationDate();
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        if (null != company.getExpirationDate()) {
+            if (expirationDate.isBefore(LocalDateTime.now())) {
+                hasExp = true;
+            }
+        }
+
+        if (hasExp) {
+            String format = dtf.format(expirationDate);
+            HashMap map = new HashMap();
+            map.put("version", version);
+            map.put("expDate", format);
+            return map;
+        } else {
+            return null;
+        }
+    }
+
+    @GetMapping("testClient")
+    @ResponseBody
+    public String test(HttpServletRequest request) {
+        String userAgent = request.getHeader("user-agent");
+        System.out.println("agent: " + userAgent);
+        if (userAgent.toLowerCase().contains("micromessenger")) {
+            System.out.println("===微信平台");
+        } else if (userAgent.toLowerCase().contains("wxwork")) {
+            System.out.println("===企业微信平台");
+        }
+        System.out.println("浏览器组:" + UserAgentUtils.getBorderGroup(userAgent));
+        System.out.println("浏览器名字:" + UserAgentUtils.getBorderName(userAgent));
+        System.out.println("浏览器类型" + UserAgentUtils.getBorderType(userAgent));
+        System.out.println("浏览器生产商:" + UserAgentUtils.getBrowserManufacturer(userAgent));
+        System.out.println("浏览器版本:" + UserAgentUtils.getBrowserVersion(userAgent));
+        System.out.println("设备生产厂商:" + UserAgentUtils.getDeviceManufacturer(userAgent));
+        System.out.println("设备类型:" + UserAgentUtils.getDeviceType(userAgent));
+        System.out.println("设备操作系统:" + UserAgentUtils.getOs(userAgent));
+        System.out.println("操作系统的名字:" + UserAgentUtils.getOsName(userAgent));
+        System.out.println("操作系统的版本号:" + UserAgentUtils.getOsVersion(userAgent));
+        System.out.println("操作系统浏览器的渲染引擎:" + UserAgentUtils.getBorderRenderingEngine(userAgent));
+        String os = UserAgentUtils.getOs(userAgent);
+        if (os.contains("Windows")) {
+            System.out.println("是Windows");
+        } else if (os.contains("Linux")) {
+            System.out.println("是Linux");
+        } else {
+            System.out.println("无法匹配: {" + os + "}");
+        }
+
+        return "Success";
+    }
+
+    //获取第三方应用临时凭证
+    private String getSuiteAccessToken() {
+        if (WeiXinCorpController.SUITE_ACCESS_TOKEN == null || WeiXinCorpController.suiteTokenExpireTime < System.currentTimeMillis()) {
+            //失效了,需要重新获取
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_JSON);
+            JSONObject reqParam = new JSONObject();
+            reqParam.put("suite_id",  suitId);
+            reqParam.put("suite_secret", suitSecret);
+            SysConfig param = sysConfigMapper.selectOne(new QueryWrapper<SysConfig>().eq("param_key", "wx_suite_ticket"));
+            if (param != null) {
+                reqParam.put("suite_ticket",param.getParamValue());
+            }
+
+            HttpEntity<String> requestEntity = new HttpEntity<String>(reqParam.toJSONString(), headers);
+            ResponseEntity<String> responseEntity = this.restTemplate.exchange(WeiXinCorpController.GET_SUITE_ACCESS_TOKEN_URL,
+                    HttpMethod.POST, requestEntity, String.class);
+            if (responseEntity.getStatusCode() == HttpStatus.OK) {
+                String resp = responseEntity.getBody();
+                System.out.println("获取企业微信suitAccessToken返回"+resp);
+                JSONObject obj = JSONObject.parseObject(resp);
+                if (obj.getIntValue("errcode") == 0 || obj.getString("suite_access_token") != null) {
+                    WeiXinCorpController.SUITE_ACCESS_TOKEN = obj.getString("suite_access_token");
+                    WeiXinCorpController.suiteTokenExpireTime = System.currentTimeMillis() + obj.getIntValue("expires_in")*1000;
+                }
+            }
+        }
+        return WeiXinCorpController.SUITE_ACCESS_TOKEN;
+    }
+
+    private String getLoginSuiteAccessToken() {
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        JSONObject reqParam = new JSONObject();
+        reqParam.put("suite_id",  "ww19f9868980b9bb43");
+        reqParam.put("suite_secret", "OeOqoMPGJH2X3k5j_wltO54q9mnXqKoJx6GkCLmOXdQ");
+        SysConfig param = sysConfigMapper.selectOne(new QueryWrapper<SysConfig>().eq("param_key", "login_wx_suite_ticket"));
+        if (param != null) {
+            reqParam.put("suite_ticket",param.getParamValue());
+        }
+
+        HttpEntity<String> requestEntity = new HttpEntity<String>(reqParam.toJSONString(), headers);
+        ResponseEntity<String> responseEntity = this.restTemplate.exchange(WeiXinCorpController.GET_SUITE_ACCESS_TOKEN_URL,
+                HttpMethod.POST, requestEntity, String.class);
+        if (responseEntity.getStatusCode() == HttpStatus.OK) {
+            String resp = responseEntity.getBody();
+            System.out.println("获取企业微信suitAccessToken返回"+resp);
+            JSONObject obj = JSONObject.parseObject(resp);
+            if (obj.getIntValue("errcode") == 0 || obj.getString("suite_access_token") != null) {
+                return obj.getString("suite_access_token");
+//                WeiXinCorpController.suiteTokenExpireTime = System.currentTimeMillis() + obj.getIntValue("expires_in")*1000;
+            }
+        }
+        return null;
+    }
+
+
+    //获取企业通讯录的accessToken,在私有化部署的企业内部服务器上跑
+    private String getCorpConcactAccessToken(WxCorpInfo corpInfo) throws Exception {
+        String url = WeiXinCorpController.GET_CORP_TOKEN.replace("ID", corpInfo.getCorpid()).replace("SECRET", corpInfo.getContactSecret());
+        ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
+                HttpMethod.GET, null, String.class);
+        if (responseEntity.getStatusCode() == HttpStatus.OK) {
+            String resp = responseEntity.getBody();
+            JSONObject json = JSONObject.parseObject(resp);
+            if (json.getIntValue("errcode") == 0) {
+                String access_token = json.getString("access_token");
+                corpInfo.setAccessToken(access_token);
+            } else {
+                throw new Exception(json.toJSONString());
+            }
+        }
+        return corpInfo.getAccessToken();
+    }
+
+}

+ 21 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/BusinessItemCustomController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-04-02
+ */
+@RestController
+@RequestMapping("/business-item-custom")
+public class BusinessItemCustomController {
+
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/BusinessItemProductController.java

@@ -0,0 +1,20 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-07
+ */
+@RestController
+@RequestMapping("/business-item-product")
+public class BusinessItemProductController {
+
+}
+

+ 648 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/BusinessOpportunityController.java

@@ -0,0 +1,648 @@
+package com.management.platform.controller;
+
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.*;
+import com.management.platform.service.BusinessOpportunityService;
+import com.management.platform.service.StageService;
+import com.management.platform.service.SysFunctionService;
+import com.management.platform.service.WxCorpInfoService;
+import com.management.platform.service.impl.ExcelExportServiceImpl;
+import com.management.platform.util.HttpRespMsg;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-02-28
+ */
+@RestController
+@RequestMapping("/business-opportunity")
+public class BusinessOpportunityController {
+    @Resource
+    private ExcelExportServiceImpl excelExportService;
+    @Resource
+    private SysFormMapper sysFormMapper;
+    @Resource
+    private ClueMapper clueMapper;
+    @Autowired
+    private WxCorpInfoService wxCorpInfoService;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private SysFunctionService sysFunctionService;
+    @Resource
+    private StageService stageService;
+    @Value(value = "${upload.path}")
+    private String path;
+    @Resource
+    private BusinessOpportunityService bOservice;
+    @Resource
+    private BusinessOpportunityMapper boMapper;
+    @Resource
+    private BusinessOpportunityMapper businessOpportunityMapper;
+    @Resource
+    private ActionLogMapper actionLogMapper;
+    @Resource
+    private BusinessOpportunityService businessOpportunityService;
+    @Resource
+    private CompanyMapper companyMapper;
+    @Autowired
+    private TaskMapper taskMapper;
+
+    @RequestMapping("getAll")
+    public Object getAll(HttpServletRequest request) {
+        User user = userMapper.selectById(request.getHeader("Token"));
+        List<BusinessOpportunity> list = new ArrayList<>();
+        boolean isAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部商机");
+        boolean isNotAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看负责部门商机");
+        if (isAll) {
+            list = boMapper.getAllList(user.getCompanyId());
+        } else if (isNotAll) {
+            list = boMapper.getAllList1(user);
+        } else {
+            list = boMapper.getAllList2(user);
+        }
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setData(list);
+        return msg;
+
+    }
+
+
+
+    @RequestMapping("/importData")
+    public HttpRespMsg importData(MultipartFile multipartFile){
+        return bOservice.importData(multipartFile);
+    }
+
+
+    @RequestMapping("/exportData")
+    public HttpRespMsg exportData(BusinessOpportunity bo ,HttpServletRequest request) throws Exception {
+        bo.setPageIndex(null).setPageFrom(null);
+        User user = userMapper.selectById(request.getHeader("token"));
+        SysForm sysForm = sysFormMapper.selectOne(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCompanyId, user.getCompanyId()).eq(SysForm::getCode, "business").eq(SysForm::getIsCurrent, 1));
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
+        String config = sysForm.getConfig();
+        Company company = companyMapper.selectById(user.getCompanyId());
+        String str = company.getIsExistBusiness() == 1 ? "商机" : "项目";
+
+        JSONObject configOb = JSON.parseObject(config);
+        JSONArray configObJSONArray = configOb.getJSONArray("list");
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        List<String> modelList=new ArrayList<>();
+        for (int i = 0; i < configObJSONArray.size(); i++) {
+            JSONObject item = configObJSONArray.getJSONObject(i);
+            String type = item.getString("type");
+            if (type.equals("grid")){
+                JSONArray columns = item.getJSONArray("columns");
+                for (int j = 0; j < columns.size(); j++) {
+                    JSONObject columnsJSONObject = columns.getJSONObject(j);
+                    JSONArray listJsonArray = columnsJSONObject.getJSONArray("list");
+                    for (int k = 0; k < listJsonArray.size(); k++) {
+                        JSONObject listJsonArrayJSONObject = listJsonArray.getJSONObject(k);
+                        titleList.add(listJsonArrayJSONObject.getString("label"));
+                        modelList.add(listJsonArrayJSONObject.getString("model"));
+                    }
+                }
+            }
+            else {
+                titleList.add(item.getString("label"));
+                modelList.add(item.getString("model"));
+            }
+        }
+        dataList.add(titleList);
+        for (int i = 0; i < titleList.size(); i++) {
+            String s = titleList.get(i);
+            if (s.contains("商机")) {
+                s = s.replaceAll("商机", str);
+                titleList.set(i, s);
+            }
+        }
+
+        HttpRespMsg respMsg = list(bo,request);
+        Map<String, Object> msgData = (Map<String, Object>) respMsg.getData();
+        List<BusinessOpportunity> list = (List<BusinessOpportunity>) msgData.get("data");
+        System.out.println("商机数据量==="+list.size());
+
+        for (BusinessOpportunity data : list) {
+            List<String> item=new ArrayList<>();
+            for (int i = 0; i < modelList.size(); i++) {
+
+                String model = modelList.get(i);
+                String targetName = model.substring(0, 1).toUpperCase() + model.substring(1);
+                Class<? extends BusinessOpportunity> aClass = data.getClass();
+                String value = "";
+
+                if(model.equals("inchargerId")){
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        if(null == aClass.getMethod("getInchargerName").invoke(data)){
+                            value = "";
+                        }else{
+                            value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(data))+"$";
+                        }
+//                        value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(data))+"$";
+                    }else {
+                        value = String.valueOf(aClass.getMethod("getInchargerName").invoke(data)).equals("null") ? "" :String.valueOf(aClass.getMethod("getInchargerName").invoke(data));
+                    }
+                }else {
+                    value= String.valueOf(aClass.getMethod("get" + targetName).invoke(data)==null?"":aClass.getMethod("get" + targetName).invoke(data));
+                }
+
+                if(model.equals("contactsId")){
+                    value = String.valueOf(aClass.getMethod("getContactsName").invoke(data)).equals("null")?"":String.valueOf(aClass.getMethod("getContactsName").invoke(data));
+                }
+                if(model.equals("customerId")){
+                    value = String.valueOf(null == aClass.getMethod("getCustomerName").invoke(data)?"":aClass.getMethod("getCustomerName").invoke(data));
+                }
+                if(model.equals("expectedTransactionDate")){
+                    LocalDate date = (LocalDate) aClass.getMethod("getExpectedTransactionDate").invoke(data);
+                    // 如果日期不为空,格式化日期
+                    if (date != null) {
+                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
+                        value = date.format(formatter);
+                    } else {
+                        value = "";
+                }                }
+                if(model.equals("stageId")){
+                    value = String.valueOf(null == aClass.getMethod("getStageValue").invoke(data)?"":aClass.getMethod("getStageValue").invoke(data));
+                }
+                if(model.equals("creatorId")){
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        if(null == aClass.getMethod("getCreatorName").invoke(data)){
+                            value = "";
+                        }else{
+                            value = "$userName="+String.valueOf(aClass.getMethod("getCreatorName").invoke(data))+"$";
+                        }
+                    }else {
+                        value = String.valueOf(aClass.getMethod("getCreatorName").invoke(data)).equals("null") ? "" :String.valueOf(aClass.getMethod("getCreatorName").invoke(data));
+                    }
+//                    value = String.valueOf(null == aClass.getMethod("getCreatorName").invoke(data)?"":aClass.getMethod("getCreatorName").invoke(data));
+                }
+
+                item.add(value);
+            }
+            dataList.add(item);
+        }
+        String fileName=str+"表导出_"+ System.currentTimeMillis();
+        System.out.println("fileName===="+fileName);
+        return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName,dataList,path);
+    }
+
+
+
+    // 批量放入回收站
+    @RequestMapping("delete")
+    public Object delete(BusinessOpportunity bo) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String ids1 = bo.getIds();
+        List<Integer> ids = new ArrayList<>();
+        if (!ids1.isEmpty()) {
+            for (String id : ids1.split(",")) {
+                ids.add(Integer.parseInt(id));
+            }
+            Integer taskCount = taskMapper.selectCount(new LambdaQueryWrapper<Task>()
+                    .ne(Task::getStatus, 2)
+                    .eq(Task::getIsDelete, 0)
+                    .in(Task::getBusinessOpportunityId, ids)
+            );
+            if(null!=taskCount&&taskCount>0){
+                msg.setError("选中商机仍有关联任务,无法删除");
+                return msg;
+            }
+            bOservice.isDelete(ids);
+            msg.setMsg("操作成功");
+        } else {
+            msg.setError("请选择线索");
+
+        }
+        return msg;
+    }
+
+    @RequestMapping("deleterDelete")
+    public Object deleterDelete(BusinessOpportunity bo) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String ids1 = bo.getIds();
+        List<Integer> ids = new ArrayList<>();
+        if (!ids1.isEmpty()) {
+            for (String id : ids1.split(",")) {
+                ids.add(Integer.parseInt(id));
+            }
+            bOservice.deleterDelete(ids);
+            msg.setMsg("操作成功");
+        } else {
+            msg.setError("请选择线索");
+        }
+        return msg;
+    }
+    @RequestMapping("rollBack")
+    public Object rollBack(BusinessOpportunity bo) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String ids1 = bo.getIds();
+        List<Integer> ids = new ArrayList<>();
+        if (!ids1.isEmpty()) {
+            for (String id : ids1.split(",")) {
+                ids.add(Integer.parseInt(id));
+            }
+            bOservice.isRollBack(ids);
+            msg.setMsg("操作成功");
+        } else {
+            msg.setError("请选择线索");
+
+        }
+        return msg;
+    }
+    @RequestMapping("insertAndUpdate")
+    public HttpRespMsg insertAndUpdate( BusinessOpportunity bo, HttpServletRequest request) {
+        User user = userMapper.selectById(request.getHeader("Token"));
+        HttpRespMsg msg = new HttpRespMsg();
+        Company company = companyMapper.selectById(user.getCompanyId());
+        String str= company.getIsExistBusiness()==1 ? "商机" :"项目";
+        if (bo.getId() == null){
+            //新增
+            Integer count = businessOpportunityMapper.selectCount(new LambdaQueryWrapper<BusinessOpportunity>()
+                    .eq(BusinessOpportunity::getName, bo.getName())
+                    .eq(BusinessOpportunity::getCompanyId,user.getCompanyId())
+            );
+            if(count>0){
+                msg.setError("已存在同名"+str);
+                return msg;
+            }
+            if (bo.getClueId()!= null ){
+                clueMapper.update(null, new UpdateWrapper<Clue>().eq("id",bo.getClueId()).set("is_bo",1));
+            }
+            bo.setCompanyId(user.getCompanyId());
+            bo.setCreatorId(user.getId());
+            bo.setUserId(user.getId());
+            bo.setCreateTime(new Date());
+            bo.setIsDelete(0);
+            if(StringUtils.isNotBlank(bo.getBusinessItemProductList())){
+                List<BusinessItemProduct> businessItemProducts = JSONArray.parseArray(bo.getBusinessItemProductList(), BusinessItemProduct.class);
+                for (BusinessItemProduct businessItemProduct : businessItemProducts) {
+                    if(businessItemProduct.getQuantity() > businessItemProduct.getInventory()){
+                        msg.setError("["+businessItemProduct.getProductName()+"]产品数量不能大于库存");
+                        return msg;
+                    }
+                }
+            }
+            QueryWrapper<BusinessOpportunity> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("stage_id", bo.getStageId()).eq("is_delete",0).orderByDesc("seq").last("limit 1");
+            List<BusinessOpportunity> list = bOservice.list(queryWrapper);
+            if (list != null && list.size() > 0) {
+                bo.setSeq(list.get(0).getSeq()+1);
+            }else {
+                bo.setSeq(1);
+            }
+            bOservice.insert(bo);
+        }else {
+            //修改
+            Integer count = businessOpportunityMapper.selectCount(new LambdaQueryWrapper<BusinessOpportunity>()
+                    .eq(BusinessOpportunity::getName, bo.getName())
+                    .eq(BusinessOpportunity::getCompanyId,user.getCompanyId())
+                    .ne(BusinessOpportunity::getId,bo.getId())
+            );
+            if(count>0){
+                msg.setError("已存在同名"+str);
+                return msg;
+            }
+            bo.setEditTime(new Date());
+            bOservice.update(bo,user.getId());
+
+        }
+        msg.setMsg("操作成功");
+        return msg;
+    }
+
+    @RequestMapping("claim")
+    public Object claim(BusinessOpportunity bo, HttpServletRequest request) {
+        User user = userMapper.selectById(request.getHeader("Token"));
+        HttpRespMsg msg = new HttpRespMsg();
+//        String[] strings = bo.getIds().split(",");
+//        for (String id : strings) {
+//            BusinessOpportunity opportunity = boMapper.selectById(id);
+//            if (StringUtils.isEmpty(opportunity.getInchargerId())){
+//                msg.setError("商机:"+opportunity.getName()+"未被认领不能转移");
+//                return msg;
+//            }
+//        }
+        bOservice.getAndTransfer(bo, user);
+        return msg;
+    }
+    @RequestMapping("saveReason")
+    public Object saveReason(BusinessOpportunity bo, HttpServletRequest request) {
+        User user = userMapper.selectById(request.getHeader("Token"));
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setMsg("操作成功");
+        bOservice.saveReason(bo, user);
+        return msg;
+    }
+    @RequestMapping("saveContactsId")
+    public Object saveContactsId(BusinessOpportunity bo, HttpServletRequest request) {
+        User user = userMapper.selectById(request.getHeader("Token"));
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setMsg("操作成功");
+        bOservice.saveContactsId(bo, user);
+        return msg;
+    }
+    @RequestMapping("saveStageId")
+    public Object getStageValue(BusinessOpportunity bo, HttpServletRequest request) {
+        User user = userMapper.selectById(request.getHeader("Token"));
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setMsg("操作成功");
+        bOservice.saveStage(bo, user);
+        return msg;
+    }
+
+
+    @RequestMapping("/changeOrder")
+    public HttpRespMsg changeOrder(HttpServletRequest request,Integer id, Integer oldIndex, Integer newIndex, Integer oldStagesId, Integer newStagesId) {
+
+        HttpRespMsg msg = new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("Token"));
+        BusinessOpportunity curItem = new BusinessOpportunity();
+        curItem.setId(id);
+        if (!oldStagesId.equals(newStagesId)) {
+            //获取移动到的目标位置上一个数据的seq,计算当前任务的新seq
+            //跨stage移动,旧的stage上移除,切换stages后,旧的任务列表自动会重新排序,不需要再操作
+            curItem.setStageId(newStagesId);
+//            curItem.setStageValue(sy.getById(newStagesId).getStagesName());
+        }
+
+        QueryWrapper<BusinessOpportunity> queryWrapper = new QueryWrapper<BusinessOpportunity>();
+        int startSeq = 0;
+        if (newIndex > 0) {
+            int beforeItemIndex = 0;
+            if (oldStagesId.equals(newStagesId)) {
+                beforeItemIndex = newIndex > oldIndex?newIndex:newIndex-1;
+            } else {
+                //跨stages移动,相当于从下往上移动
+                beforeItemIndex = newIndex-1;
+            }
+            queryWrapper.eq("stage_id", newStagesId).eq("is_delete",0).orderByAsc("seq").last("limit " +beforeItemIndex+", 1");
+            List<BusinessOpportunity> list = bOservice.list(queryWrapper);
+            if (list.size() > 0) {
+                BusinessOpportunity beforeItem = list.get(0);
+                startSeq = beforeItem.getSeq() + 1;
+            } else {
+                startSeq = 1;
+            }
+        } else {
+            //移动到了第一个位置
+            startSeq = 1;
+        }
+
+        curItem.setSeq(startSeq);
+        //在新位置下面的包括原来占据新位置的,全部调整,从startSeq开始递增
+        queryWrapper = new QueryWrapper<BusinessOpportunity>();
+        queryWrapper.eq("stage_id", newStagesId).eq("is_delete",0).ge("seq", startSeq).orderByAsc("seq");
+        List<BusinessOpportunity> list = bOservice.list(queryWrapper);
+        if (list.size() > 0) {
+            List<BusinessOpportunity> batchList = new ArrayList<>();
+            for (BusinessOpportunity t:list) {
+                BusinessOpportunity item = new BusinessOpportunity();
+                item.setId(t.getId());
+                startSeq++;
+                item.setSeq(startSeq);
+                batchList.add(item);
+            }
+            bOservice.updateBatchById(batchList);
+        }
+
+        if (!newStagesId.equals(oldStagesId)){
+            curItem.setEditTime(new Date());
+            Stage stage = stageService.getOne(new QueryWrapper<Stage>().eq("id", newStagesId).eq("company_id", user.getCompanyId()));
+            ActionLog al = new ActionLog();
+            al.setCode("business");
+            al.setName("推进了阶段至" + stage.getName());
+            al.setCreatTime(new Date());
+            al.setUserId(user.getId());
+            al.setItemId(id);
+            actionLogMapper.insert(al);
+        }
+        bOservice.updateById(curItem);
+
+        return msg;
+    }
+
+
+    @RequestMapping("list")
+    public HttpRespMsg list(BusinessOpportunity bo, HttpServletRequest request) {
+        HashMap<Object, Object> r = new HashMap<>();
+        User user = userMapper.selectById(request.getHeader("Token"));
+        bo.setIsDelete(0);
+        bo.setCompanyId(user.getCompanyId());
+        bo.setUserId(user.getId());
+        bo.setEndTime(bo.getEndTime() + " 23:59:59");
+        if (bo.getPageIndex() != null) {
+            bo.setPageIndex((bo.getPageIndex()-1) * bo.getPageFrom());
+        }
+        List<BusinessOpportunity> list = new ArrayList<>();
+        boolean isAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部商机");
+        boolean isNotAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看负责部门商机");
+        int i = 0;
+        if (isAll) {
+            list = bOservice.getAll(bo);
+            i = bOservice.getTotal(bo);
+        } else if (isNotAll) {
+            list = bOservice.getAll1(bo, user);
+            i = bOservice.getTotal1(bo, user);
+        } else {
+            list = bOservice.getAll2(bo, user);
+            i = bOservice.getTotal2(bo, user);
+        }
+        r.put("data", list);
+        r.put("total",i);
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setData(r);
+        return msg;
+
+    }
+
+
+    @PostMapping("/listByPin")
+    public HttpRespMsg listByPin(BusinessOpportunity bo, HttpServletRequest request) {
+        return businessOpportunityService.listByPin(bo,request);
+    }
+
+    @PostMapping("/pinBusinessOpportunity")
+    public HttpRespMsg pinBusinessOpportunity(BusinessOpportunity bo, HttpServletRequest request) {
+        return businessOpportunityService.pinBusinessOpportunity(bo,request);
+    }
+
+    @PostMapping("/undoPin")
+    public HttpRespMsg undoPin(BusinessOpportunity bo, HttpServletRequest request) {
+        return businessOpportunityService.undoPin(bo,request);
+    }
+
+
+    @RequestMapping("getAllByStage")
+    public Object getAllByStage(BusinessOpportunity bo,HttpServletRequest request) {
+        User user = userMapper.selectById(request.getHeader("Token"));
+        bo.setIsDelete(0);
+        bo.setCompanyId(user.getCompanyId());
+        bo.setUserId(user.getId());
+        bo.setEndTime(bo.getEndTime() + " 23:59:59");
+        bo.setPageFrom(null);
+        bo.setPageIndex(null);
+        List<BusinessOpportunity> list = new ArrayList<>();
+        boolean isAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部商机");
+        boolean isNotAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看负责部门商机");
+        if (isAll) {
+            list = bOservice.getAll(bo);
+        } else if (isNotAll) {
+            list = bOservice.getAll1(bo, user);
+        } else {
+            list = bOservice.getAll2(bo, user);
+        }
+
+        HttpRespMsg msg = new HttpRespMsg();
+        List<Stage> stageList = stageService.list(new QueryWrapper<Stage>().eq("company_id", user.getCompanyId()).orderByAsc("seq"));
+
+        List<HashMap<String, Object>> mapList = new ArrayList<>();
+        for (Stage stage : stageList) {
+            List<BusinessOpportunity> collect = list.stream().filter(l -> l.getStageId() != null && l.getStageId().equals(stage.getId())&& l.getSeq()!=null).collect(Collectors.toList());
+            collect=collect.stream().sorted(Comparator.comparing(BusinessOpportunity::getSeq)).collect(Collectors.toList());
+            HashMap<String, Object> map = new HashMap<>();
+            map.put("id", stage.getId());
+            map.put("label",stage.getName());
+            map.put("length",collect.size());
+            map.put("list",collect);
+            map.put("color",stage.getColor());
+            mapList.add(map);
+        }
+        msg.setData(mapList);
+        return msg;
+
+    }
+    @RequestMapping("deleterList")
+    public HttpRespMsg deleterList(BusinessOpportunity bo, HttpServletRequest request) {
+        HashMap<Object, Object> r = new HashMap<>();
+        User user = userMapper.selectById(request.getHeader("Token"));
+        bo.setIsDelete(1);
+        bo.setPageIndex((bo.getPageIndex()-1) * bo.getPageFrom());
+        bo.setUserId(user.getId());
+        bo.setCompanyId(user.getCompanyId());
+        setNull(bo);
+        List<BusinessOpportunity> list = new ArrayList<>();
+        boolean isAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部商机");
+        boolean isNotAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看负责部门商机");
+        int i = 0;
+        if (isAll) {
+            list = bOservice.getAll(bo);
+            i = bOservice.getTotal(bo);
+        } else if (isNotAll) {
+            list = bOservice.getAll1(bo, user);
+            i = bOservice.getTotal1(bo, user);
+        } else {
+            list = bOservice.getAll2(bo, user);
+            i = bOservice.getTotal2(bo, user);
+        }
+        r.put("data", list);
+        r.put("total",i);
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setData(r);
+        return msg;
+    }
+    @RequestMapping("getInfo")
+    public HttpRespMsg getInfo(BusinessOpportunity bo ,HttpServletRequest request) {
+        User user = userMapper.selectById(request.getHeader("Token"));
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setData(bOservice.getInfo(bo,user));
+        return msg;
+    }
+    @RequestMapping("saveProduct")
+    public HttpRespMsg saveProduct(BusinessOpportunity bo , HttpServletRequest request) {
+        User user = userMapper.selectById(request.getHeader("Token"));
+        return bOservice.saveProduct(bo,user);
+    } @RequestMapping("saveContacts")
+    public HttpRespMsg saveContacts(BusinessOpportunity bo , HttpServletRequest request) {
+        User user = userMapper.selectById(request.getHeader("Token"));
+        return bOservice.saveProduct(bo,user);
+    }
+
+    @RequestMapping("saveStage")
+    public HttpRespMsg insertStage(String stages, HttpServletRequest request) {
+        return stageService.changeStage(stages,request);
+    }   @RequestMapping("deleteStage")
+    public HttpRespMsg deleteStage(Stage stage) {
+        return stageService.deleteStage(stage);
+    }
+    @RequestMapping("getStage")
+    public HttpRespMsg Stage(HttpServletRequest request) {
+        return stageService.getStage(request);
+    }
+
+    private BusinessOpportunity setNull(BusinessOpportunity bo) {
+        if (bo.getPlate1() == "") {
+            bo.setPlate1(null);
+        }
+        if (bo.getPlate2() == "") {
+            bo.setPlate2(null);
+        }
+        if (bo.getPlate3() == "") {
+            bo.setPlate3(null);
+        }
+        if (bo.getPlate4() == "") {
+            bo.setPlate4(null);
+        }
+        if (bo.getPlate5() == "") {
+            bo.setPlate5(null);
+        }
+        return bo;
+    }
+
+
+    // 上传
+    @RequestMapping("uploadFile")
+    public Object uploadFile(BusinessOpportunity bo, HttpServletRequest request, MultipartFile file) throws Exception {
+        return bOservice.uploadFile(bo, request, file);
+    }
+
+
+    //下载
+    @RequestMapping("downFile")
+    public Object downFile(UploadFile file, HttpServletRequest request, HttpServletResponse response) throws Exception {
+        return bOservice.downFile(file, request, response);
+    }
+
+    //删除
+    @RequestMapping("deleteFile")
+    public Object downFile(UploadFile file, HttpServletRequest request) throws Exception {
+        return bOservice.deleteFile(file, request);
+    }
+
+    //重命名
+    @RequestMapping("reFileName")
+    public Object reFileName(UploadFile uploadFile, HttpServletRequest request) throws Exception {
+        return bOservice.reFileName(uploadFile, request);
+    }
+
+
+
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/BusinessProductController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-29
+ */
+@RestController
+@RequestMapping("/business-product")
+public class BusinessProductController {
+
+}
+

+ 100 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/BusinessTripController.java

@@ -0,0 +1,100 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.entity.BusinessTrip;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.BusinessTripService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-04-08
+ */
+@RestController
+@RequestMapping("/business-trip")
+public class BusinessTripController {
+
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    BusinessTripService businessTripService;
+    @Resource
+    private HttpServletRequest request;
+
+
+
+    @RequestMapping("/add")
+    public HttpRespMsg add(BusinessTrip sheet) {
+        return businessTripService.add(sheet);
+
+    }
+
+    @RequestMapping("/modifyProject")
+    public HttpRespMsg modifyProject(BusinessTrip sheet) {
+        return businessTripService.modifyProject(sheet);
+
+    }
+
+
+    @RequestMapping("/cancel")
+    public HttpRespMsg cancel(Integer id) {
+        String userId = request.getHeader("Token");
+        return businessTripService.cancel(id, userId);
+    }
+
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id) {
+        return businessTripService.delete(id);
+    }
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(BusinessTrip sheet, @RequestParam Integer pageIndex, @RequestParam Integer pageSize,@RequestParam(defaultValue = "0") Integer checkState) {
+        return businessTripService.queryList(sheet, pageIndex, pageSize,checkState);
+    }
+
+    @RequestMapping("/auditList")
+    public HttpRespMsg auditList(BusinessTrip sheet, @RequestParam Integer pageIndex, @RequestParam Integer pageSize, @RequestParam(defaultValue = "0") Integer checkState) {
+        return businessTripService.auditList(sheet, pageIndex, pageSize, checkState);
+    }
+
+    @RequestMapping("/approve")
+    public HttpRespMsg approve(Integer id) {
+        return businessTripService.approve(id);
+    }
+    @RequestMapping("/deny")
+    public HttpRespMsg deny(Integer id, String reason) {
+        return businessTripService.deny(id, reason);
+
+    }
+
+    /**
+     *
+     * @param keyword 姓名(模糊匹配)
+     * @param startDate 开始日期
+     * @param endDate 结束日期
+     * @return
+     */
+    @RequestMapping("/summaryData")
+    public HttpRespMsg summaryData(String keyword, String startDate, String endDate) {
+        String userId = request.getHeader("Token");
+        return businessTripService.summaryData(keyword, startDate, endDate, userId);
+
+    }
+    @RequestMapping("/exportData")
+    public HttpRespMsg exportData(BusinessTrip sheet,@RequestParam(defaultValue = "0") Integer keyword, String startDate, String endDate){
+        String userId = request.getHeader("Token");
+        return businessTripService.exportData(sheet,keyword, startDate, endDate, userId);
+    }
+}
+

+ 36 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/BustripAuditLogController.java

@@ -0,0 +1,36 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.BustripAuditLog;
+import com.management.platform.mapper.BustripAuditLogMapper;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-12-12
+ */
+@RestController
+@RequestMapping("/bustrip-audit-log")
+public class BustripAuditLogController {
+    @Resource
+    BustripAuditLogMapper bustripAuditLogMapper;
+
+    @RequestMapping("/getBySheetId")
+    public HttpRespMsg getBySheetId(int sheetId) {
+        List<BustripAuditLog> list = bustripAuditLogMapper.selectList(new QueryWrapper<BustripAuditLog>().eq("sheet_id", sheetId));
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = list;
+        return msg;
+    }
+}
+

+ 52 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CategoryRatioTblSettingController.java

@@ -0,0 +1,52 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.entity.CategoryRatioTblSetting;
+import com.management.platform.service.CategoryRatioTblSettingService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-01-01
+ */
+@RestController
+@RequestMapping("/category-ratio-tbl-setting")
+public class CategoryRatioTblSettingController {
+
+    @Resource
+    private HttpServletRequest request;
+
+    @Resource
+    private CategoryRatioTblSettingService categoryRatioTblSettingService;
+
+    @RequestMapping("/get")
+    public HttpRespMsg get(Integer companyId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        CategoryRatioTblSetting byId = categoryRatioTblSettingService.getById(companyId);
+        if (byId == null) {
+            byId = new CategoryRatioTblSetting();
+            byId.setCompanyId(companyId);
+        }
+        msg.setData(byId);
+        return msg;
+    }
+
+    @RequestMapping("/update")
+    public HttpRespMsg update(CategoryRatioTblSetting categoryRatioTblSetting) {
+        HttpRespMsg msg = new HttpRespMsg();
+        categoryRatioTblSettingService.saveOrUpdate(categoryRatioTblSetting);
+        return msg;
+    }
+
+
+}
+

+ 396 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ClueController.java

@@ -0,0 +1,396 @@
+package com.management.platform.controller;
+
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.ClueMapper;
+import com.management.platform.mapper.SysDictMapper;
+import com.management.platform.mapper.SysFormMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ClueService;
+import com.management.platform.service.ExcelExportService;
+import com.management.platform.service.SysFunctionService;
+import com.management.platform.service.WxCorpInfoService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-02-28
+ */
+@RestController
+@RequestMapping("/clue")
+public class ClueController {
+    @Resource
+    private ClueService clueService;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private SysFunctionService sysFunctionService;
+
+    @Resource
+    private ClueMapper clueMapper;
+
+    @Resource
+    private SysDictMapper sysDictMapper;
+    @Autowired
+    private ExcelExportService excelExportService;
+
+    @PostMapping("/pageClueByPin")
+    public HttpRespMsg pageClueByPin(Clue clue, HttpServletRequest request) {
+        return clueService.pageClueByPin(clue,request);
+    }
+
+    @PostMapping("/pinClue")
+    public HttpRespMsg pinClue(Clue clue, HttpServletRequest request) {
+        return clueService.pinClue(clue,request);
+    }
+
+    @PostMapping("/undoPin")
+    public HttpRespMsg undoPin(Clue clue,HttpServletRequest request) {
+        return clueService.undoPin(clue,request);
+    }
+
+
+    @RequestMapping("getAll")
+    public Object getAll(HttpServletRequest request) {
+        User user = userMapper.selectById(request.getHeader("Token"));
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setMsg("操作成功");
+
+        Clue clue = new Clue();
+        clue.setCompanyId(user.getCompanyId());
+        clue.setUserId(user.getId());
+        clue.setIsDelete(0);
+        boolean isAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部线索");
+        boolean isNotAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看负责部门线索");
+        List<Clue> list = new ArrayList<>();
+        if (isAll) {
+            //查看全部线索
+            list = clueService.getAllList(clue);
+        } else if (isNotAll) {
+            //查看负责部门线索 找出所处部门下所有的负责人
+            list = clueService.getAllList1(clue);
+        } else {
+            // 查看负责人为 自己 和 null的数据
+            list = clueService.getAllList2(clue, user);
+        }
+        msg.setData(list);
+        return msg;
+    }
+
+    // 详情
+    @RequestMapping("getDetail")
+    public Object getDetail(Clue clue) {
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setData(clueService.getInfo(clue));
+        return msg;
+    }
+
+    // 上传
+    @RequestMapping("uploadFile")
+    public Object uploadFile(Clue clue, HttpServletRequest request, MultipartFile file) throws Exception {
+        return clueService.uploadFile(clue, request, file);
+    }
+
+    //下载
+//    @RequestMapping("downFile")
+//    public Object downFile(UploadFile file, HttpServletRequest request, HttpServletResponse response) throws Exception {
+//        return clueService.downFile(file, request, response);
+//    }
+
+    //删除
+    @RequestMapping("deleteFile")
+    public Object downFile(UploadFile file, HttpServletRequest request) throws Exception {
+        return clueService.deleteFile(file, request);
+    }
+
+    //重命名
+    @RequestMapping("reFileName")
+    public Object reFileName(UploadFile uploadFile, HttpServletRequest request) throws Exception {
+        return clueService.reFileName(uploadFile, request);
+    }
+
+
+
+    @RequestMapping("listClue")
+    public HttpRespMsg list(Clue clue, HttpServletRequest request) {
+        User user = userMapper.selectById(request.getHeader("Token"));
+        clue.setCompanyId(user.getCompanyId());
+        clue.setIsDelete(0);
+        clue.setEndTime(clue.getEndTime() + " 23:59:59");
+        clue.setPageIndex((clue.getPageIndex() - 1) * clue.getPageFrom());
+        boolean isAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部线索");
+        boolean isNotAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看负责部门线索");
+        List<Clue> list = new ArrayList<>();
+        int i = 0;
+        if (isAll) {
+            //查看全部线索
+            list = clueService.getList(clue);
+            i = clueService.getTotal(clue);
+        } else if (isNotAll) {
+            //查看负责部门线索 找出所处部门下所有的负责人
+            list = clueService.getList1(clue, user);
+            i = clueService.getTotal1(clue, user);
+        } else {
+            // 查看负责人为 自己 和 null的数据
+            list = clueService.getList2(clue, user);
+            i = clueService.getTotal2(clue, user);
+        }
+        HashMap<Object, Object> map = new HashMap<>();
+        map.put("data", list);
+        map.put("total", i);
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setData(map);
+        return msg;
+    }
+
+    @RequestMapping("listDeleterClue")
+    public Object listDeleterClue(Clue clue, HttpServletRequest request) {
+        User user = userMapper.selectById(request.getHeader("Token"));
+        clue.setCompanyId(user.getCompanyId());
+        boolean isAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部线索");
+        boolean isNotAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看负责部门线索");
+        List<Clue> list = new ArrayList<>();
+        clue.setIsDelete(1);
+        clue.setPageIndex((clue.getPageIndex() - 1) * clue.getPageFrom());
+        int i = 0;
+        if (isAll) {
+            //查看全部线索
+            list = clueService.getList(clue);
+            i = clueService.getTotal(clue);
+        } else if (isNotAll) {
+            //查看负责部门线索 找出所处部门下所有的负责人
+            list = clueService.getList1(clue, user);
+            i = clueService.getTotal1(clue, user);
+        } else {
+            // 查看负责人为 自己 和 null的数据
+            list = clueService.getList2(clue, user);
+            i = clueService.getTotal2(clue, user);
+        }
+        HashMap<Object, Object> map = new HashMap<>();
+        map.put("data", list);
+        map.put("total", i);
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        httpRespMsg.setData(map);
+        return httpRespMsg;
+    }
+
+    @RequestMapping("/importData")
+    public HttpRespMsg importData(MultipartFile multipartFile,HttpServletRequest request){
+        return clueService.importData(multipartFile, request);
+    }
+    @Value(value = "${upload.path}")
+    private String path;
+    @Autowired
+    private SysFormMapper sysFormMapper;
+    @Autowired
+    private WxCorpInfoService wxCorpInfoService;
+    @RequestMapping("/exportData")
+    public HttpRespMsg exportData(Clue clue ,HttpServletRequest request) throws Exception {
+        User user = userMapper.selectById(request.getHeader("token"));
+        SysForm sysForm = sysFormMapper.selectOne(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCompanyId, user.getCompanyId()).eq(SysForm::getCode, "Thread").eq(SysForm::getIsCurrent, 1));
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
+        String config = sysForm.getConfig();
+        JSONObject configOb = JSON.parseObject(config);
+        JSONArray configObJSONArray = configOb.getJSONArray("list");
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        List<String> modelList=new ArrayList<>();
+        for (int i = 0; i < configObJSONArray.size(); i++) {
+            JSONObject item = configObJSONArray.getJSONObject(i);
+            String type = item.getString("type");
+            if (type.equals("grid")){
+                JSONArray columns = item.getJSONArray("columns");
+                for (int j = 0; j < columns.size(); j++) {
+                    JSONObject columnsJSONObject = columns.getJSONObject(j);
+                    JSONArray listJsonArray = columnsJSONObject.getJSONArray("list");
+                    for (int k = 0; k < listJsonArray.size(); k++) {
+                        JSONObject listJsonArrayJSONObject = listJsonArray.getJSONObject(k);
+                        titleList.add(listJsonArrayJSONObject.getString("label"));
+                        modelList.add(listJsonArrayJSONObject.getString("model"));
+                    }
+                }
+            }
+            else {
+                titleList.add(item.getString("label"));
+                modelList.add(item.getString("model"));
+            }
+        }
+        dataList.add(titleList);
+
+        HttpRespMsg respMsg = list(clue,request);
+        Map<String, Object> msgData = (Map<String, Object>) respMsg.getData();
+        List<Clue> list = (List<Clue>) msgData.get("data");
+
+        for (Clue data : list) {
+            List<String> item=new ArrayList<>();
+            for (int i = 0; i < modelList.size(); i++) {
+
+                String model = modelList.get(i);
+                String targetName = model.substring(0, 1).toUpperCase() + model.substring(1);
+                Class<? extends Clue> aClass = data.getClass();
+                String value = "";
+
+                if(model.equals("inchargerId")){
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        if(null == aClass.getMethod("getInchargerName").invoke(data)){
+                            value = "";
+                        }else{
+                            value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(data))+"$";
+                        }
+//                        value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(data))+"$";
+                    }else {
+                        value = String.valueOf(aClass.getMethod("getInchargerName").invoke(data)).equals("null") ? "" :String.valueOf(aClass.getMethod("getInchargerName").invoke(data));
+                    }
+                }else {
+                    value= String.valueOf(aClass.getMethod("get" + targetName).invoke(data)==null?"":aClass.getMethod("get" + targetName).invoke(data));
+                }
+
+                if(model.equals("clueSourceId")){
+                    value = String.valueOf(null == aClass.getMethod("getClueSourceValue").invoke(data)?"":aClass.getMethod("getClueSourceValue").invoke(data));
+                }
+                if(model.equals("customerLevelId")){
+                    value = String.valueOf(null == aClass.getMethod("getCustomerLevelValue").invoke(data)?"":aClass.getMethod("getCustomerLevelValue").invoke(data));
+                }
+                if(model.equals("customerIndustryId")){
+                    value = String.valueOf(null == aClass.getMethod("getCustomerIndustryValue").invoke(data)?"":aClass.getMethod("getCustomerIndustryValue").invoke(data));
+                }
+                item.add(value);
+            }
+            dataList.add(item);
+        }
+        String fileName="线索表导出_"+ System.currentTimeMillis();
+        return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName,dataList,path);
+    }
+
+
+    @RequestMapping("/insertAndUpdate")
+    public Object inserANdUpdate(Clue clue, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+//        if (clue.getClueName() == null && clue.getClueName().trim().equals("")){
+//            msg.setError("请填写名称");
+//            return msg;
+//        }
+//        //操作前校验
+//        User user = userMapper.selectById(request.getHeader("Token"));
+//        if (user == null) {
+//            msg.setError("获取创建人失败");
+//            return msg;
+//        }
+//        clue.setCompanyId(user.getCompanyId());
+//        if (null == clue.getClueName() || "".equals(clue.getClueName())) {
+//            msg.setError("线索名称不能为空");
+//            return msg;
+//        }
+//        if (null == clue.getClueSourceId()) {
+//            msg.setError("线索来源不能为空");
+//            return msg;
+//        }
+//        clue.setIsDelete(0);
+//        if (null != clue.getId()) {
+//            //修改
+//            clueService.update(clue);
+//            msg.setMsg("操作成功");
+//        } else {
+//            //新增
+//            clue.setCreateId(user.getId());
+//            clueService.insert(clue);
+//            msg.setMsg("操作成功");
+//        }
+        msg = clueService.insertAndUpdate(clue,request);
+        return msg;
+    }
+
+
+    // 批量放入回收站
+    @RequestMapping("delete")
+    public Object delete(Clue clue,HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        msg = clueService.delete(clue,request);
+//        String ids1 = clue.getIds();
+//        List<Integer> ids = new ArrayList<>();
+//        User user = userMapper.selectById(request.getHeader("Token"));
+//        if (!ids1.isEmpty()) {
+//            for (String id : ids1.split(",")) {
+//                ids.add(Integer.parseInt(id));
+//            }
+//            clueService.isDelete(ids,user.getId());
+//            msg.setMsg("操作成功");
+//        } else {
+//            msg.setError("请选择线索");
+//        }
+        return msg;
+    }
+
+    // 批量恢复
+    @RequestMapping("rollback")
+    public Object rollback(Clue clue,HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setMsg("操作成功");
+        User user = userMapper.selectById(request.getHeader("Token"));
+        String ids1 = clue.getIds();
+        List<Integer> ids = new ArrayList<>();
+        if (!ids1.isEmpty()) {
+            for (String id : ids1.split(",")) {
+                ids.add(Integer.parseInt(id));
+            }
+            clueService.isRollback(ids,user.getId());
+            msg.setMsg("操作成功");
+        } else {
+            msg.setError("请选择线索");
+
+        }
+        return msg;
+    }
+
+    // 认领&转移线索
+    @RequestMapping("claim")
+    public Object claim(Clue clue, HttpServletRequest request) {
+        User user = userMapper.selectById(request.getHeader("Token"));
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setMsg("操作成功");
+        clueService.getAndTransfer(clue, user);
+        return msg;
+    }
+
+    //回收站内删除
+    @RequestMapping("deleterDelete")
+    public Object deleterDelete(Clue clue) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String ids1 = clue.getIds();
+        List<Integer> ids = new ArrayList<>();
+        if (!ids1.isEmpty()) {
+            for (String id : ids1.split(",")) {
+                ids.add(Integer.parseInt(id));
+            }
+            clueService.deleterDelete(ids);
+            msg.setMsg("操作成功");
+        } else {
+            msg.setError("请选择线索");
+        }
+        return msg;
+    }
+
+
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ClueLogController.java

@@ -0,0 +1,20 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-04
+ */
+@RestController
+@RequestMapping("/clue-log")
+public class ClueLogController {
+
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ClueUploadfileController.java

@@ -0,0 +1,20 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-25
+ */
+@RestController
+@RequestMapping("/clue-uploadfile")
+public class ClueUploadfileController {
+
+}
+

+ 117 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CommonUploadController.java

@@ -0,0 +1,117 @@
+package com.management.platform.controller;
+
+import com.management.platform.task.SFTPAsyncUploader;
+import com.management.platform.util.HttpRespMsg;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+import java.util.UUID;
+
+@RestController
+@RequestMapping("/common")
+public class CommonUploadController {
+
+    Logger logger = LogManager.getLogger(org.apache.logging.log4j.LogManager.ROOT_LOGGER_NAME);
+    @Value(value = "${upload.path}")
+    private String path;
+    @Autowired
+    public SFTPAsyncUploader sftpAsyncUploader;
+
+    @RequestMapping(value="uploadFile")
+    public HttpRespMsg uploadFile(MultipartFile multipartFile) {
+        HttpRespMsg msg = new HttpRespMsg();
+
+        //然后处理文件
+        String fileName = multipartFile.getOriginalFilename();
+        String[] split = fileName.split("\\.");
+        String serverName = UUID.randomUUID().toString().replaceAll("-", "") + "."+split[split.length-1];
+
+        //检查目录
+        File dir = new File(path);
+        if (!dir.exists()) {
+            dir.mkdir();
+        }
+        File file = new File(dir, serverName);
+        InputStream inputStream = null;
+        OutputStream outputStream = null;
+        try {
+            inputStream = multipartFile.getInputStream();
+            outputStream = new FileOutputStream(file);
+            byte[] buffer = new byte[4096];
+            int temp = 0;
+            while ((temp = inputStream.read(buffer, 0, 4096)) != -1) {
+                outputStream.write(buffer, 0, temp);
+            }
+            inputStream.close();
+            outputStream.close();
+            msg.data = serverName;
+
+            // 上传到SFTP服务器
+            sftpAsyncUploader.uploadFileAsync(file);
+
+        } catch (Exception exception) {
+            exception.printStackTrace();
+            logger.error(exception.getMessage());
+        }
+
+        return msg;
+    }
+
+    @RequestMapping(value="uploadFileArray")
+    public HttpRespMsg uploadFileArray(List<MultipartFile> multipartFiles) {
+        HttpRespMsg msg = new HttpRespMsg();
+        StringBuilder stringBuilder=new StringBuilder();
+
+        for (int i = 0; i < multipartFiles.size(); i++) {
+            MultipartFile multipartFile=multipartFiles.get(i);
+            //然后处理文件
+            String fileName = multipartFile.getOriginalFilename();
+            String[] split = fileName.split("\\.");
+            String serverName = UUID.randomUUID().toString().replaceAll("-", "") + "."+split[split.length-1];
+
+            //检查目录
+            File dir = new File(path);
+            if (!dir.exists()) {
+                dir.mkdir();
+            }
+            File file = new File(dir, serverName);
+            InputStream inputStream = null;
+            OutputStream outputStream = null;
+            try {
+                inputStream = multipartFile.getInputStream();
+                outputStream = new FileOutputStream(file);
+                byte[] buffer = new byte[4096];
+                int temp = 0;
+                while ((temp = inputStream.read(buffer, 0, 4096)) != -1) {
+                    outputStream.write(buffer, 0, temp);
+                }
+                inputStream.close();
+                outputStream.close();
+                if(i==multipartFiles.size()-1){
+                    stringBuilder.append(serverName);
+                }else {
+                    stringBuilder.append(serverName+";");
+                }
+
+                // 上传到SFTP服务器
+                sftpAsyncUploader.uploadFileAsync(file);
+
+            } catch (Exception exception) {
+                exception.printStackTrace();
+                logger.error(exception.getMessage());
+            }
+        }
+        msg.data = stringBuilder.toString();
+        return msg;
+    }
+}

+ 20 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CommonUseController.java

@@ -0,0 +1,20 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2025-06-03
+ */
+@RestController
+@RequestMapping("/common-use")
+public class CommonUseController {
+
+}
+

+ 108 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CompanyCertController.java

@@ -0,0 +1,108 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.CompanyCert;
+import com.management.platform.entity.UserCert;
+import com.management.platform.mapper.*;
+import com.management.platform.mapper.CompanyCertMapper;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-04-15
+ */
+@RestController
+@RequestMapping("/company-cert")
+public class CompanyCertController {
+
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    CompanyCertMapper companyCertMapper;
+    @Resource
+    UserCertMapper userCertMapper;
+
+    @RequestMapping("/addOrMod")
+    public HttpRespMsg addOrMod(CompanyCert setting) {
+        HttpRespMsg msg = new HttpRespMsg();
+        if (StringUtils.isEmpty(setting.getName())) {
+            //msg.setError("名称不能为空");
+            msg.setError(MessageUtils.message("Company.nullNameError"));
+            return msg;
+        }
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        if (setting.getId() == null) {
+            setting.setCompanyId(companyId);
+            int count = companyCertMapper.selectCount(new QueryWrapper<CompanyCert>().eq("name", setting.getName()).eq("company_id", setting.getCompanyId()));
+            if (count > 0) {
+                //msg.setError("该名称已存在");
+                msg.setError(MessageUtils.message("Company.nameRepeat"));
+            } else {
+                companyCertMapper.insert(setting);
+                msg.data = companyCertMapper.selectList(new QueryWrapper<CompanyCert>().eq("company_id", companyId));
+            }
+        } else {
+            int count = companyCertMapper.selectCount(new QueryWrapper<CompanyCert>().eq("name", setting.getName())
+                    .eq("company_id", companyId).ne("id", setting.getId()));
+            if (count > 0) {
+                //msg.setError("该名称已存在");
+                msg.setError(MessageUtils.message("Company.nameRepeat"));
+            } else {
+                //检查名称是否有变化
+                CompanyCert oldSetting = companyCertMapper.selectById(setting.getId());
+                if (!setting.getName().equals(oldSetting.getName())) {
+                    companyCertMapper.updateById(setting);
+                    UserCert cost = new UserCert();
+                    cost.setCertName(setting.getName());
+                    userCertMapper.update(cost, new QueryWrapper<UserCert>().eq("cert_id", setting.getId()));
+                }
+                msg.data = companyCertMapper.selectList(new QueryWrapper<CompanyCert>().eq("company_id", companyId));
+            }
+        }
+
+        return msg;
+    }
+
+    @RequestMapping("/list")
+    public HttpRespMsg list() {
+        HttpRespMsg msg = new HttpRespMsg();
+
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        List<CompanyCert> list = companyCertMapper.selectList(new QueryWrapper<CompanyCert>().eq("company_id", companyId));
+        msg.data = list;
+
+        return msg;
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id) {
+        HttpRespMsg msg = new HttpRespMsg();
+        CompanyCert CompanyCert = companyCertMapper.selectById(id);
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        if (!CompanyCert.getCompanyId().equals(companyId)) {
+            //msg.setError("无权操作");
+            msg.setError(MessageUtils.message("Company.accessError"));
+        } else {
+            companyCertMapper.deleteById(id);
+        }
+
+        return msg;
+    }
+}
+

+ 242 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CompanyController.java

@@ -0,0 +1,242 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.management.platform.constant.Constant;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.*;
+import com.management.platform.service.CompanyService;
+import com.management.platform.service.ExpenseMainTypeService;
+import com.management.platform.service.ExpenseTypeService;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 吴涛涛
+ * @since 2020-01-13
+ */
+@RestController
+@RequestMapping("/company")
+public class CompanyController {
+    @Resource
+    private HttpServletRequest request;
+
+    @Resource
+    private CompanyService companyService;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
+    @Resource
+    private ExpenseTypeService expenseTypeService;
+    @Resource
+    private ContactSyncLogMapper contactSyncLogMapper;
+    @Resource
+    private CompanyMapper companyMapper;
+    @Resource
+    private ExpenseMainTypeService expenseMainTypeService;
+
+    @Resource
+    private SysFormMapper sysFormMapper;
+
+    @RequestMapping("/testTimeout")
+    public HttpRespMsg testTimeout(){
+        HttpRespMsg msg = new HttpRespMsg();
+        try {
+            Thread.sleep(90*1000);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+        return msg;
+    }
+
+    @RequestMapping("/getStaffCountMax")
+    public HttpRespMsg getStaffCountMax(Integer companyId){
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = companyService.getById(companyId).getStaffCountMax();
+        return msg;
+    }
+
+    @RequestMapping("/dataMigration")
+    public HttpRespMsg dataMigration(Integer oldCompanyId,Integer targetCompanyId){
+       return companyService.dataMigration(oldCompanyId,targetCompanyId);
+    }
+
+    @RequestMapping("/getSyncInfo")
+    public HttpRespMsg getSyncInfo(){
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        String token = request.getHeader("token");
+        User user = userMapper.selectById(token);
+        ContactSyncLog contactSyncLog1 = contactSyncLogMapper.selectOne(new QueryWrapper<ContactSyncLog>().eq("company_id", user.getCompanyId()).orderByDesc("id").last("limit 1"));
+        httpRespMsg.data = contactSyncLog1;
+        return httpRespMsg;
+    }
+
+    //同步钉钉
+//    @RequestMapping("/syncCorpMembs")
+//    public HttpRespMsg syncCorpMembs() {
+//        try {
+//            HttpRespMsg msg = new HttpRespMsg();
+//            String token = request.getHeader("TOKEN");
+//            User user = userMapper.selectById(token);
+//            Company company = companyMapper.selectOne(new QueryWrapper<Company>().eq("id", user.getCompanyId()));
+//            Integer employeeCnt = userMapper.selectCount(new QueryWrapper<User>().eq("company_id", company.getId()).eq("is_active",1));
+//            if (employeeCnt > company.getStaffCountMax()){
+//                //公司人员已达上限,请联系客服提高人数上限。
+//                msg.setError(MessageUtils.message("wx.employeeFull"));
+//                return msg;
+//            }
+//            CompanyDingding companyDingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", user.getCompanyId()));
+//            if (companyDingding != null) {
+//                System.out.println("===========同步钉钉===========");
+//                String rest = dingDingService.syncCorpMembs(companyDingding.getCorpid());
+//                /*syncLog.remove(user.getCompanyId()+"_status");*/
+//                if (rest.startsWith("调用失败")) {
+//                    msg.setError(rest);
+//                } else {
+//                    msg.data = rest;
+//                }
+//            } else {
+//                //msg.setError("非钉钉企业,无法同步");
+//                msg.setError(MessageUtils.message("Company.sysDDError"));
+//            }
+//            return msg;
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//            System.err.println(e.getMessage());
+//            HttpRespMsg msg = new HttpRespMsg();
+//            msg.setError(e.getMessage());
+//            return msg;
+//        }
+//    }
+    @RequestMapping("/settingExpenseType")
+    public HttpRespMsg settingExpenseType(){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        //生成费用报销默认条目
+        String[] expenseTypes = Constant.EXPENSE_TYPES;
+        List<String> commonly = new ArrayList<>();
+        //commonly.add("材料费");
+        commonly.add(MessageUtils.message("entry.materialCost"));
+        //commonly.add("办公用品");
+        commonly.add(MessageUtils.message("entry.workCost"));
+        //commonly.add("培训费");
+        commonly.add(MessageUtils.message("entry.trainCost"));
+        //commonly.add("打印费");
+        commonly.add(MessageUtils.message("entry.printCost"));
+        //commonly.add("快递费");
+        commonly.add(MessageUtils.message("entry.expressCost"));
+        //commonly.add("制作费");
+        commonly.add(MessageUtils.message("entry.makeCost"));
+        //commonly.add("律师费");
+        commonly.add(MessageUtils.message("entry.lawyerCost"));
+        //commonly.add("水费");
+        commonly.add(MessageUtils.message("entry.waterCost"));
+        //commonly.add("电费");
+        commonly.add(MessageUtils.message("entry.electricCost"));
+        //commonly.add("团建费");
+        commonly.add(MessageUtils.message("entry.leagueCost"));
+        //commonly.add("其他");
+        commonly.add(MessageUtils.message("entry.other"));
+        List<String> travel  = new ArrayList<>();
+        //travel.add("城市间交通费");
+        travel.add(MessageUtils.message("entry.cityTrafficCost"));
+        //travel.add("住宿费");
+        travel.add(MessageUtils.message("entry.liveCost"));
+        //travel.add("伙食补助费");
+        travel.add(MessageUtils.message("entry.eatCost"));
+        //travel.add("市内交通费");
+        travel.add(MessageUtils.message("entry.insideCityCost"));
+        //travel.add("其他差旅费");
+        travel.add(MessageUtils.message("entry.otherLiveTraCost"));
+        List<String> outsource = new ArrayList<>();
+        //outsource.add("项目外包费");
+        outsource.add(MessageUtils.message("entry.projectCost"));
+        //outsource.add("劳务外包费");
+        outsource.add(MessageUtils.message("entry.labourCost"));
+        //outsource.add("其他外包费");
+        outsource.add(MessageUtils.message("entry.OtherOutsourceCost"));
+        List<ExpenseType> expenseTypeList=new ArrayList<>();
+        List<ExpenseMainType> expenseMainTypes=new ArrayList<>();
+        ExpenseMainType expenseMainType=new ExpenseMainType();
+        expenseMainType.setName("一般费用");
+        expenseMainType.setCompanyId(user.getCompanyId());
+        ExpenseMainType expenseMainType1=new ExpenseMainType();
+        expenseMainType1.setName("差旅费用");
+        expenseMainType1.setCompanyId(user.getCompanyId());
+        ExpenseMainType expenseMainType2=new ExpenseMainType();
+        expenseMainType2.setName("外包费用");
+        expenseMainType2.setCompanyId(user.getCompanyId());
+        expenseMainTypes.add(expenseMainType);
+        expenseMainTypes.add(expenseMainType1);
+        expenseMainTypes.add(expenseMainType2);
+        expenseMainTypeService.saveBatch(expenseMainTypes);
+        for (String expenseType : expenseTypes) {
+            ExpenseType item=new ExpenseType();
+            item.setCompanyId(user.getCompanyId());
+            item.setTypeName(expenseType);
+            if(commonly.contains(expenseType)){
+                item.setMainType(expenseMainType.getId());
+            }
+            if(travel.contains(expenseType)){
+                item.setMainType(expenseMainType1.getId());
+            }
+            if(outsource.contains(expenseType)){
+                item.setMainType(expenseMainType2.getId());
+            }
+            expenseTypeList.add(item);
+        }
+        if(!expenseTypeService.saveBatch(expenseTypeList)){
+            //httpRespMsg.setError("验证失败");
+            httpRespMsg.setError(MessageUtils.message("Company.validationError"));
+            return httpRespMsg;
+        }
+        return httpRespMsg;
+    }
+
+    @RequestMapping("/editCompanyName")
+    public HttpRespMsg editCompanyName(String name,HttpServletRequest request){
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("token");
+        User user = userMapper.selectById(token);
+        if (StringUtils.isBlank(name)){
+            msg.setError("公司名称不可为空");
+            return msg;
+        }
+        if ("超级管理员".equals(user.getRoleName())){
+            Company company = companyMapper.selectById(user.getCompanyId());
+            company.setCompanyName(name);
+            companyMapper.updateById(company);
+            msg.msg = "修改成功";
+        }else {
+            msg.setError("无权修改");
+        }
+        return msg;
+    }
+
+    @RequestMapping("/editCompanyToSimpleAndSysFormConfig")
+    public HttpRespMsg editCompanyToSimpleAndSysFormConfig(Integer simpleMode ,String config,HttpServletRequest request){
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("token");
+        User user = userMapper.selectById(token);
+        Company company = companyMapper.selectById(user.getCompanyId());
+        companyMapper.update(null,new UpdateWrapper<Company>().set("is_simple",simpleMode).eq("id",company.getId()));
+        sysFormMapper.update(null,new UpdateWrapper<SysForm>().set("config",config).eq("company_id",company.getId()).eq("code","tasks"));
+        return msg;
+    }
+
+}
+

+ 42 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CompanyCustomerContactController.java

@@ -0,0 +1,42 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.service.CompanyCustomerContactService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-04-07
+ */
+@RestController
+@RequestMapping("/company-customer-contact")
+public class CompanyCustomerContactController {
+
+    @Resource
+    CompanyCustomerContactService companyCustomerContactService;
+
+    /**
+     * 获取公司列表
+     */
+    @RequestMapping("/getList")
+    public HttpRespMsg getList(Integer pageIndex, Integer pageSize) {
+        return companyCustomerContactService.getList(pageIndex, pageSize);
+    }
+
+    /**
+     * 处理,标记为联系
+     */
+    @RequestMapping("/handle")
+    public HttpRespMsg handle(Integer companyId, String feedback) {
+        return companyCustomerContactService.handle(companyId, feedback);
+    }
+}
+

+ 99 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CompanyDingdingController.java

@@ -0,0 +1,99 @@
+package com.management.platform.controller;//package com.management.platform.controller;
+//
+//
+//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+//import com.management.platform.entity.CompanyDingding;
+//import com.management.platform.entity.User;
+//import com.management.platform.mapper.CompanyDingdingMapper;
+//import com.management.platform.mapper.UserMapper;
+//import com.management.platform.service.CompanyDingdingService;
+//import com.management.platform.util.HttpRespMsg;
+//import org.springframework.web.bind.annotation.RequestMapping;
+//import org.springframework.web.bind.annotation.RestController;
+//
+//import javax.annotation.Resource;
+//import javax.servlet.http.HttpServletRequest;
+//import java.time.LocalDate;
+//import java.time.format.DateTimeFormatter;
+//import java.util.ArrayList;
+//import java.util.List;
+//
+///**
+// * <p>
+// *  前端控制器
+// * </p>
+// *
+// * @author Seyason
+// * @since 2021-06-27
+// */
+//@RestController
+//@RequestMapping("/company-dingding")
+//public class CompanyDingdingController {
+//    @Resource
+//    private CompanyDingdingService companyDingdingService;
+//    @Resource
+//    private CompanyDingdingMapper companyDingdingMapper;
+//    @Resource
+//    private HttpServletRequest request;
+//    @Resource
+//    private UserMapper userMapper;
+//
+//    @RequestMapping("/getSyncContact")
+//    public HttpRespMsg getSyncContact() {
+//        String token = request.getHeader("TOKEN");
+//        User user = userMapper.selectById(token);
+//        HttpRespMsg msg = new HttpRespMsg();
+//        CompanyDingding dd = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", user.getCompanyId()));
+//        msg.data = dd.getSyncContact();
+//
+//        return msg;
+//    }
+//
+//
+//    @RequestMapping("/setSyncContact")
+//    public HttpRespMsg setSyncContact(Integer isSync) {
+//        String token = request.getHeader("TOKEN");
+//        User user = userMapper.selectById(token);
+//        HttpRespMsg msg = new HttpRespMsg();
+//        CompanyDingding dd = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", user.getCompanyId()));
+//        if (dd != null) {
+//            CompanyDingding companyDingding = new CompanyDingding();
+//            companyDingding.setCorpid(dd.getCorpid());
+//            companyDingding.setSyncContact(isSync);
+//            companyDingdingMapper.updateById(companyDingding);
+//        } else {
+//            msg.setError("未找到公司钉钉配置");
+//        }
+//
+//        return msg;
+//    }
+//
+//    @RequestMapping("/pushAlertMsg")
+//    public HttpRespMsg pushAlertMsg(String corpid, String userDingId) {
+//        CompanyDingding companyDingding = companyDingdingMapper.selectById(corpid);
+//        companyDingdingService.sendFillReportAlertMsg(companyDingding.getCompanyId(), companyDingding.getAgentId(), "填入日报哦", "040534176023851922");
+//        return new HttpRespMsg();
+//    }
+//
+//    @RequestMapping("/pushFinishMileStoneMsg")
+//    public HttpRespMsg pushFinishMileStoneMsg(String corpid, String userDingId, Integer projectId, String projectName) {
+//        CompanyDingding companyDingding = companyDingdingMapper.selectById(corpid);
+//        LocalDate now = LocalDate.now();
+//        String finishDate = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(now);
+//        companyDingdingService.sendFinishMileStoneMsg(companyDingding, userDingId, "测试里程碑", projectId,projectName, finishDate);
+//        return new HttpRespMsg();
+//    }
+//
+//    @RequestMapping("/sendOAMsg")
+//    public HttpRespMsg sendOAMsg(String corpid, String userDingId) {
+//        CompanyDingding companyDingding = companyDingdingMapper.selectById(corpid);
+//        List<OapiMessageCorpconversationAsyncsendV2Request.Form> form=new ArrayList<>();
+//        OapiMessageCorpconversationAsyncsendV2Request.Form item=new OapiMessageCorpconversationAsyncsendV2Request.Form();
+//        item.setKey("测试");
+//        item.setValue("试试成功没");
+//        form.add(item);
+//        companyDingdingService.sendOAMsg(companyDingding, "040534176023851922", "OA提醒测试","这是一次测试",form,null);
+//        return new HttpRespMsg();
+//    }
+//}
+//

+ 80 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CompanyReportController.java

@@ -0,0 +1,80 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.CompanyReport;
+import com.management.platform.entity.ReportForm;
+import com.management.platform.service.CompanyReportService;
+import com.management.platform.service.ReportFormService;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-08-03
+ */
+@RestController
+@RequestMapping("/company-report")
+public class CompanyReportController {
+    @Autowired
+    private CompanyReportService companyReportService;
+    @Resource
+    private ReportFormService reportFormService;
+
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(Integer companyId){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        List<CompanyReport> companyReportList = companyReportService.list(new QueryWrapper<CompanyReport>().eq("company_id", companyId));
+        List<ReportForm> reportFormList = reportFormService.list();
+        for (ReportForm reportForm : reportFormList) {
+            boolean b = companyReportList.stream().anyMatch(cr -> cr.getReportFormId().equals(reportForm.getId()));
+            if(b){
+                reportForm.setOwned(1);
+            }
+        }
+        httpRespMsg.data=reportFormList;
+        return httpRespMsg;
+    }
+
+    @RequestMapping("/update")
+    public HttpRespMsg update(Integer companyId,String formIds){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        if(companyReportService.remove(new QueryWrapper<CompanyReport>().eq("company_id", companyId))){
+            //httpRespMsg.setError("更新失败");
+            httpRespMsg.setError(MessageUtils.message("Company.update"));
+            return httpRespMsg;
+        }
+        List<CompanyReport> updateList=new ArrayList<>();
+        if(formIds!=null&&!StringUtils.isEmpty(formIds)){
+            String[] split = formIds.split(",");
+            List<String> list = Arrays.asList(split);
+            for (String s : list) {
+                CompanyReport companyReport=new CompanyReport();
+                companyReport.setCompanyId(companyId);
+                companyReport.setReportFormId(Integer.parseInt(s));
+                updateList.add(companyReport);
+            }
+            if(!companyReportService.saveBatch(updateList)){
+                //httpRespMsg.setError("更新失败");
+                httpRespMsg.setError(MessageUtils.message("Company.update"));
+            }
+        }
+        return httpRespMsg;
+    }
+
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ContactSyncLogController.java

@@ -0,0 +1,20 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-11-14
+ */
+@RestController
+@RequestMapping("/contact-sync-log")
+public class ContactSyncLogController {
+
+}
+

+ 302 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ContactsController.java

@@ -0,0 +1,302 @@
+package com.management.platform.controller;
+
+
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.BusinessOpportunityMapper;
+import com.management.platform.mapper.ContactsMapper;
+import com.management.platform.mapper.TaskMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ContactsService;
+import com.management.platform.util.HttpRespMsg;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-02-28
+ */
+@RestController
+@RequestMapping("/contacts")
+public class ContactsController {
+
+    @Resource
+    private HttpServletRequest request;
+
+    @Autowired
+    private ContactsService contactsService;
+
+    @Autowired
+    private UserMapper userMapper;
+
+    @Autowired
+    private ContactsMapper contactsMapper;
+
+    @Resource
+    private BusinessOpportunityMapper businessOpportunityMapper;
+
+    @Resource
+    private TaskMapper taskMapper;
+
+
+    /***
+     * 置顶联系人
+     * @param request
+     * @return
+     */
+    @PostMapping("/pinContacts")
+    public HttpRespMsg pinContacts(Contacts contacts ,HttpServletRequest request) {
+        return contactsService.pinContacts(contacts,request);
+    }
+
+    /***
+     * 取消置顶联系人
+     * @param request
+     * @return
+     */
+    @PostMapping("/undoPin")
+    public HttpRespMsg undoPin(Contacts contacts ,HttpServletRequest request) {
+        return contactsService.undoPin(contacts,request);
+    }
+
+    @RequestMapping("/pageContactsByPin")
+    public HttpRespMsg pageContactsByPin(@RequestParam Integer pageIndex, @RequestParam Integer pageSize,Integer customId, String name, String email,String creatorId, String phone, String ownerId){
+        return contactsService.pageContactsByPin(pageIndex,pageSize,customId,name,email,creatorId,phone,ownerId,request);
+    }
+
+
+    /***
+     * 获取常用联系人
+     * @param request
+     * @return
+     */
+    @PostMapping("/getFrequentContacts")
+    public HttpRespMsg getFrequentContacts(HttpServletRequest request) {
+        return contactsService.getFrequentContacts(request);
+    }
+
+    /**
+     * 添加联系人
+     * @param contacts
+     * @return
+     */
+    @RequestMapping("/addContacts")
+    public HttpRespMsg addContacts(Contacts contacts){
+        return contactsService.addContacts(contacts, request);
+    }
+    @RequestMapping("/getAllContacts")
+    public HttpRespMsg getAllContacts(Integer businessId,Integer salesId ,Integer customerId,HttpServletRequest request){
+        return contactsService.getAllContacts(businessId,salesId,customerId,request);
+    }
+
+    /**
+     * 分页查询联系人
+     * @param pageIndex
+     * @param pageSize
+     * @param customId
+     * @param name
+     * @param email
+     * @param creatorId
+     * @param phone
+     * @param ownerId
+     * @return
+     */
+    @RequestMapping("/pageContacts")
+    public HttpRespMsg pageContacts(@RequestParam Integer pageIndex, @RequestParam Integer pageSize,Integer customId, String name, String email,String creatorId, String phone, String ownerId){
+        return contactsService.pageContacts(pageIndex,pageSize,customId,name,email,creatorId,phone,ownerId,request);
+    }
+
+    /**
+     * 客户对应的联系人有哪些
+     * @param custom
+     * @return
+     */
+    @RequestMapping("selectContactsByCustomId")
+    public HttpRespMsg selectContactsByCustomId(Custom custom){
+        return contactsService.selectContactsByCustomId(custom,request);
+    }
+
+    /**
+     * 修改联系人信息
+     * @param contacts
+     * @return
+     */
+    @RequestMapping("updateContacts")
+    public HttpRespMsg updateContacts( Contacts contacts){
+        return contactsService.updateContacts(contacts,request);
+    }
+
+    /**
+     * 放入回收站
+     * @param ids
+     * @return
+     */
+    @RequestMapping("deleteContacts")
+    public HttpRespMsg deleteContacts( String ids){
+        HttpRespMsg msg = new HttpRespMsg();
+        if (!StringUtils.isEmpty(ids)) {
+            ids="["+ids+"]";
+            List<Integer> array = JSONArray.parseArray(ids, Integer.class);
+            Integer bCount = businessOpportunityMapper.selectCount(new LambdaQueryWrapper<BusinessOpportunity>()
+                    .eq(BusinessOpportunity::getIsDelete, 0)
+                    .in(BusinessOpportunity::getContactsId, array)
+            );
+            if(bCount>0){
+                msg.setError("选中联系人中存在相关绑定商机,无法删除");
+                return msg;
+            }
+
+            Integer taskCount = taskMapper.selectCount(new LambdaQueryWrapper<Task>()
+                    .eq(Task::getIsDelete, 0)
+                    .in(Task::getContactsId, array)
+            );
+            if(taskCount>0){
+                msg.setError("选中联系人中存在相关绑定任务,无法删除");
+                return msg;
+            }
+
+            return contactsService.deleteContacts(array,request);
+        }
+
+        msg.setError("参数不能为空");
+        return msg;
+    }
+
+    /**
+     * 获取回收站的联系人
+     * @param pageIndex
+     * @param pageSize
+     * @return
+     */
+    @RequestMapping("getDeletedContacts")
+    public HttpRespMsg getDeletedContacts(@RequestParam Integer pageIndex, @RequestParam Integer pageSize){
+        return contactsService.getDeletedContacts(pageIndex,pageSize,request);
+    }
+
+    /**
+     * 批量删除回收站中的联系人
+     */
+    @RequestMapping("confirmDeleteContacts")
+    public HttpRespMsg confirmDeleteContacts(String ids){
+        if (!StringUtils.isEmpty(ids)) {
+            ids="["+ids+"]";
+            List<Integer> array = JSONArray.parseArray(ids, Integer.class);
+            return contactsService.confirmDeleteContacts(array);
+        }
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setError("参数不能为空");
+        return msg;
+    }
+
+    /**
+     * 恢复联系人
+     * @param ids
+     * @return
+     */
+    @RequestMapping("returnContacts")
+    public HttpRespMsg returnContacts(String ids){
+        if (!StringUtils.isEmpty(ids)) {
+            ids="["+ids+"]";
+            List<Integer> array = JSONArray.parseArray(ids, Integer.class);
+            return contactsService.returnContacts(array);
+        }
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setError("参数不能为空");
+        return msg;
+    }
+
+    @RequestMapping("getContactsDetail")
+    public HttpRespMsg getContactsDetail(Contacts contacts ){
+        return contactsService.getContactsDetail(contacts,request);
+    }
+
+    @RequestMapping("importData")
+    public HttpRespMsg importData(MultipartFile multipartFile){
+        return contactsService.importData(multipartFile,request);
+    }
+
+    @RequestMapping("exportData")
+    public HttpRespMsg exportData(String customName, String name, String email,String creatorName, String phone, String ownerName) throws Exception {
+        return contactsService.exportData(customName,name,email,creatorName,phone,ownerName,request);
+    }
+
+
+    @RequestMapping("allContacts")
+    public HttpRespMsg allContacts(HttpServletRequest request){
+        User user = userMapper.selectById(request.getHeader("Token"));
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setMsg("操作成功");
+        msg.setData(
+                contactsMapper.selectList(new QueryWrapper<Contacts>().eq("company_id", user.getCompanyId()))
+        );
+        return msg;
+    }
+
+
+    //转移联系人 conctacts 里面要有要转移的负责人的 owner_id,id
+    @RequestMapping("transferContacts")
+    public HttpRespMsg transferContacts(Contacts contacts,HttpServletRequest request){
+        User user = userMapper.selectById(request.getHeader("Token"));//当前登陆的用户
+        HttpRespMsg msg = new HttpRespMsg();
+        if (contacts.getOwnerId()==null|| StringUtils.isEmpty(contacts.getOwnerId())){
+            msg.setError("请选择要转移的负责人");
+            return msg;
+        }
+        Contacts contactsGet=contactsService.getById(contacts.getId());
+        if (contacts.getOwnerId().equals(contactsGet.getOwnerId())){
+            msg.setError("该联系人已属于所选负责人");
+            return msg;
+        }
+        contactsGet.setOwnerId(contacts.getOwnerId());
+        int count= contactsService.transferContacts(contactsGet, user);
+        if (count>0){
+            msg.setMsg("操作成功");
+            return msg;
+        }else {
+            msg.setError("操作失败");
+            return msg;
+        }
+    }
+
+
+    //认领联系人 conctacts 里面要有要转移的负责人的 owner_id,id
+    @RequestMapping("claimContacts")
+    public HttpRespMsg claimContacts(Contacts contacts,HttpServletRequest request){
+        User user = userMapper.selectById(request.getHeader("Token"));//当前登陆的用户
+        HttpRespMsg msg = new HttpRespMsg();
+        if (contacts.getOwnerId()==null|| StringUtils.isEmpty(contacts.getOwnerId())){
+            msg.setError("请选择要认领的负责人");
+            return msg;
+        }
+        Contacts contactsGet=contactsService.getById(contacts.getId());
+        if (contactsGet.getOwnerId()!=null){
+            msg.setError("该联系人已有负责人");
+            return msg;
+        }
+        contactsGet.setOwnerId(contacts.getOwnerId());
+        int count= contactsService.claimContacts(contactsGet, user);
+        if (count>0){
+            msg.setMsg("操作成功");
+            return msg;
+        }else {
+            msg.setError("操作失败");
+            return msg;
+        }
+    }
+}
+

+ 77 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ContactsDocumentController.java

@@ -0,0 +1,77 @@
+package com.management.platform.controller;
+
+import com.management.platform.entity.dto.ContactsFileDto;
+import com.management.platform.service.ContactsDocumentService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-14
+ */
+@RestController
+@RequestMapping("/contacts-document")
+public class ContactsDocumentController {
+    @Resource
+    private ContactsDocumentService documentService;
+
+
+    /**
+     * 上传附件
+     * @param request
+     * @param contactsId
+     * @param folderId
+     * @param files
+     * @return
+     */
+    @RequestMapping("/fileUpload")
+    public HttpRespMsg fileUpload (HttpServletRequest request, @RequestParam Integer contactsId, @RequestParam(required=false) Integer folderId, @RequestParam("file") MultipartFile[] files){
+        return documentService.fileUpload(request,contactsId,folderId,files);
+    }
+
+    /**
+     * 下载文件
+     * @param request
+     * @param response
+     * @param folderId
+     * @param contactsId
+     * @param fileId
+     * @return
+     */
+    @RequestMapping("/fileDown")
+    public HttpRespMsg fileDown (HttpServletRequest request, HttpServletResponse response, @RequestParam(required=false) Integer folderId, Integer contactsId, Integer fileId){
+        return documentService.fileDown(request,response,folderId,contactsId,fileId);
+    }
+
+    /**
+     *
+     * @param request
+     * @param contactsFileDto
+     * @return
+     */
+    @RequestMapping("/fileDelete")
+    public HttpRespMsg fileDelete (HttpServletRequest request, ContactsFileDto contactsFileDto){
+        return documentService.fileDelete(request,contactsFileDto);
+    }
+
+    @RequestMapping("/reNameFile")
+    public HttpRespMsg reNameFile(HttpServletRequest request,Integer fileId,Integer contactsId,String newName){
+        return documentService.reNameFile(request, fileId, contactsId, newName);
+    }
+
+
+
+
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ContactsLogController.java

@@ -0,0 +1,20 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-11
+ */
+@RestController
+@RequestMapping("/contacts-log")
+public class ContactsLogController {
+
+}
+

+ 162 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ContractController.java

@@ -0,0 +1,162 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.Contract;
+import com.management.platform.entity.ContractCustom;
+import com.management.platform.entity.Project;
+import com.management.platform.entity.User;
+import com.management.platform.mapper.ProjectMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ContractService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-11-29
+ */
+@RestController
+@RequestMapping("/contract")
+public class ContractController {
+    @Resource
+    private ContractService contractService;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private ProjectMapper projectMapper;
+
+    @PostMapping("/pageContractByPin")
+    public HttpRespMsg pageContractByPin(HttpServletRequest request, @RequestParam Integer pageIndex, @RequestParam Integer pageSize, String number,String name,String typeName,Integer status,
+                                         String startDate,String endDate, String paymentStartDate, String paymentEndDate, Integer secTypeId,@RequestParam(required = false) String customerOrg,@RequestParam(required = false) Integer finishStatus) {
+        return contractService.pageContractByPin(request,pageIndex,pageSize,number,name,typeName,status,startDate,endDate, paymentStartDate, paymentEndDate, secTypeId,customerOrg,finishStatus);
+    }
+
+    @PostMapping("/pinContract")
+    public HttpRespMsg pinContract(Contract contract, HttpServletRequest request) {
+        return contractService.pinContract(contract,request);
+    }
+
+    @PostMapping("/undoPin")
+    public HttpRespMsg undoPin(Contract contract,HttpServletRequest request) {
+        return contractService.undoPin(contract,request);
+    }
+
+    /**
+     * 分页查询合同
+     */
+    @RequestMapping("/getContractPage")
+    public HttpRespMsg getContractPage (HttpServletRequest request, @RequestParam Integer pageIndex, @RequestParam Integer pageSize, String number,String name,String typeName,Integer status,
+                                        String startDate,String endDate, String paymentStartDate, String paymentEndDate, Integer secTypeId,@RequestParam(required = false) String customerOrg,@RequestParam(required = false) Integer finishStatus){
+        return contractService.getContractPage(request,pageIndex,pageSize,number,name,typeName,status,startDate,endDate, paymentStartDate, paymentEndDate, secTypeId,customerOrg,finishStatus);
+    }
+
+    /**
+     * 导出合同
+     */
+    @RequestMapping("/exportContract")
+    public HttpRespMsg exportContract (HttpServletRequest request, String number,String name,String typeName,Integer status,String startDate,
+                                       String endDate, String paymentStartDate, String paymentEndDate, Integer secTypeId,@RequestParam(required = false) String customerOrg,@RequestParam(required = false) Integer finishStatus){
+        return contractService.ExportContract(request,number,name,typeName,status,startDate,endDate, paymentStartDate, paymentEndDate, secTypeId,customerOrg,finishStatus);
+    }
+
+    /**
+     * 导出合同
+     */
+    @RequestMapping("/exportContractOneToMany")
+    public HttpRespMsg exportContractOneToMany (HttpServletRequest request, String number,String name,String typeName,Integer status,String startDate,
+                                                String endDate, String paymentStartDate, String paymentEndDate, Integer secTypeId,@RequestParam(required = false) String customerOrg,@RequestParam(required = false) Integer finishStatus){
+        return contractService.exportContractOneToMany(request,number,name,typeName,status,startDate,endDate, paymentStartDate, paymentEndDate, secTypeId,customerOrg,finishStatus);
+    }
+
+
+    @RequestMapping("/getContractDetail")
+    public HttpRespMsg getContractDetail (HttpServletRequest request, Integer id){
+        return contractService.getContractDetail(request,id);
+    }
+
+
+    /**
+     * 导入合同
+     */
+    @RequestMapping("/importContract")
+    public HttpRespMsg importContract (HttpServletRequest request, MultipartFile file){
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        /*if (user.getCompanyId() == 10 || user.getCompanyId() == 4215) {
+            return contractService.importContractCustom(request,file);
+        } else {
+            return contractService.importContract(request,file);
+        }*/
+
+        return  contractService.importContractNew(request, file);
+    }
+
+    /**
+     * 新增合同
+     */
+    @RequestMapping("/addContract")
+    public HttpRespMsg addContract (HttpServletRequest request, Contract contract, ContractCustom custom, String paymentListStr){
+        return contractService.addContract(request,contract, custom, paymentListStr);
+    }
+
+    /**
+     * 编辑合同
+     */
+    @RequestMapping("/editContract")
+    public HttpRespMsg editContract (HttpServletRequest request,Contract contract,ContractCustom custom, String paymentListStr){
+        return contractService.editContract(request,contract, custom, paymentListStr);
+    }
+
+    /**
+     * 审核合同
+     */
+    @RequestMapping("/processContract")
+    public HttpRespMsg processContract (HttpServletRequest request,Integer id,Integer status,String msg){
+        return contractService.processContract(request,id,status,msg);
+    }
+
+    /**
+     * 删除合同
+     * @param request
+     * @param id
+     * @return
+     */
+    @RequestMapping("/deleteContract")
+    public HttpRespMsg deleteContract (HttpServletRequest request,Integer id){
+        return contractService.deleteContract(request,id);
+    }
+
+
+    /**
+     * 返回该合同的附件列表
+     */
+    @RequestMapping("/contractFile")
+    public HttpRespMsg contractFile (HttpServletRequest request,Integer id){
+        return contractService.contractFile(request,id);
+    }
+
+    @RequestMapping("/getProjectList")
+    public HttpRespMsg getProjectList (HttpServletRequest request){
+        HttpRespMsg msg = new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().select("id, project_code, project_name, contract_amount").eq("company_id", user.getCompanyId()));
+        msg.data = projectList;
+        return msg;
+    }
+
+
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ContractCustomController.java

@@ -0,0 +1,20 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-11-25
+ */
+@RestController
+@RequestMapping("/contract-custom")
+public class ContractCustomController {
+
+}
+

+ 68 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ContractDocumentController.java

@@ -0,0 +1,68 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.entity.vo.ContractFileDelVO;
+import com.management.platform.service.ContractDocumentService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-12-09
+ */
+@RestController
+@RequestMapping("/contract-document")
+public class ContractDocumentController {
+    @Resource
+    private ContractDocumentService contractDocumentService;
+
+    /**
+     * 上传附件
+     * @param request
+     * @param ContractId
+     * @param folderId
+     * @param files
+     * @return
+     */
+    @RequestMapping("/fileUpload")
+    public HttpRespMsg fileUpload (HttpServletRequest request, @RequestParam Integer ContractId, @RequestParam(required=false) Integer folderId, @RequestParam("file") MultipartFile[] files){
+        return contractDocumentService.fileUpload(request,ContractId,folderId,files);
+    }
+
+    /**
+     * 下载文件
+     * @param request
+     * @param response
+     * @param folderId
+     * @param contractId
+     * @param fileId
+     * @return
+     */
+    @RequestMapping("/fileDown")
+    public HttpRespMsg fileDown (HttpServletRequest request, HttpServletResponse response, @RequestParam(required=false) Integer folderId, Integer contractId, Integer fileId){
+        return contractDocumentService.fileDown(request,response,folderId,contractId,fileId);
+    }
+
+    /**
+     * 删除文件
+     * @param request
+     * @param contractFileDelVo
+     * @return
+     */
+    @RequestMapping("/fileDelete")
+    public HttpRespMsg fileDelete (HttpServletRequest request, ContractFileDelVO contractFileDelVo){
+        return contractDocumentService.fileDelete(request,contractFileDelVo);
+    }
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ContractLogController.java

@@ -0,0 +1,20 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-12-16
+ */
+@RestController
+@RequestMapping("/contract-log")
+public class ContractLogController {
+
+}
+

+ 36 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ContractModifyRecordController.java

@@ -0,0 +1,36 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.ContractModifyRecord;
+import com.management.platform.service.ContractModifyRecordService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-07-26
+ */
+@RestController
+@RequestMapping("/contract-modify-record")
+public class ContractModifyRecordController {
+    @Autowired
+    private ContractModifyRecordService contractModifyRecordService;
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(Integer projectId){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        List<ContractModifyRecord> contractModifyRecordList = contractModifyRecordService.list(new QueryWrapper<ContractModifyRecord>().eq("project_id", projectId));
+        httpRespMsg.data=contractModifyRecordList;
+        return httpRespMsg;
+    }
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ContractPayCustomizedController.java

@@ -0,0 +1,20 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-11-25
+ */
+@RestController
+@RequestMapping("/contract-pay-customized")
+public class ContractPayCustomizedController {
+
+}
+

+ 65 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ContractPaymentController.java

@@ -0,0 +1,65 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.ContractPayCustomized;
+import com.management.platform.entity.ContractPayment;
+import com.management.platform.entity.User;
+import com.management.platform.service.ContractPayCustomizedService;
+import com.management.platform.service.ContractPaymentService;
+import com.management.platform.service.UserService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-05-26
+ */
+@RestController
+@RequestMapping("/contract-payment")
+public class ContractPaymentController {
+
+    @Resource
+    private ContractPaymentService contractPaymentService;
+
+    @Resource
+    private UserService userService;
+
+    @Resource
+    private ContractPayCustomizedService payCustomizedService;
+
+    @RequestMapping("/getList")
+    public HttpRespMsg getList(HttpServletRequest request,Integer contractId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("token");
+        User user = userService.getById(token);
+        if (user.getCompanyId()!=4215){
+            List<ContractPayment> paymentList = contractPaymentService.list(new QueryWrapper<ContractPayment>().eq("contract_id", contractId));
+            for (ContractPayment contractPayment : paymentList) {
+                if (contractPayment!=null&&contractPayment.getInvoiceType()!=null){
+                    if (contractPayment.getInvoiceType()==0){
+                        contractPayment.setInvoiceTypeName("增值税专用发票");
+                    }else {
+                        contractPayment.setInvoiceTypeName("增值税普通发票");
+                    }
+                }
+            }
+            msg.data = paymentList;
+        }else {
+            msg.data = payCustomizedService.list(new QueryWrapper<ContractPayCustomized>().eq("contract_id", contractId));
+        }
+        return msg;
+    }
+
+
+}
+

+ 51 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ContractTypeController.java

@@ -0,0 +1,51 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.entity.ContractType;
+import com.management.platform.service.ContractTypeService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-11-29
+ */
+@RestController
+@RequestMapping("/contractType")
+public class ContractTypeController {
+    @Resource
+    private ContractTypeService contractTypeService;
+
+    /**
+     * 返回公司自定义合同类型
+     */
+    @RequestMapping("/getContractType")
+    public HttpRespMsg getContractType (HttpServletRequest request){
+        return contractTypeService.getContractType(request);
+    }
+
+    /**
+     * 新增、修改合同类型
+     */
+    @RequestMapping("/changeContractType")
+    public HttpRespMsg changeContractType (HttpServletRequest request, ContractType contractType){
+        return contractTypeService.changeContractType(request,contractType);
+    }
+
+    /**
+     * 删除合同类型
+     */
+    @RequestMapping("/deleteContractType")
+    public HttpRespMsg deleteContractType (HttpServletRequest request, Integer deleteId){
+        return contractTypeService.deleteContractType(request,deleteId);
+    }
+}
+

+ 53 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ContractTypeSecController.java

@@ -0,0 +1,53 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.entity.ContractTypeSec;
+import com.management.platform.service.ContractTypeSecService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-09-14
+ */
+@RestController
+@RequestMapping("/contract-type-sec")
+public class ContractTypeSecController {
+    @Resource
+    private ContractTypeSecService contractTypeSecService;
+
+    /**
+     * 返回公司自定义合同类型
+     */
+    @RequestMapping("/getContractType")
+    public HttpRespMsg getContractType (HttpServletRequest request){
+
+        return contractTypeSecService.getContractType(request);
+    }
+
+    /**
+     * 新增、修改合同类型
+     */
+    @RequestMapping("/changeContractType")
+    public HttpRespMsg changeContractType (HttpServletRequest request, ContractTypeSec contractType){
+        return contractTypeSecService.changeContractType(request,contractType);
+    }
+
+    /**
+     * 删除合同类型
+     */
+    @RequestMapping("/deleteContractType")
+    public HttpRespMsg deleteContractType (HttpServletRequest request, Integer deleteId){
+        return contractTypeSecService.deleteContractType(request,deleteId);
+    }
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CorpwxJobResultController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-10-06
+ */
+@RestController
+@RequestMapping("/corpwx-job-result")
+public class CorpwxJobResultController {
+
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CorpwxPreAuthCodeController.java

@@ -0,0 +1,20 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-11-22
+ */
+@RestController
+@RequestMapping("/corpwx-pre-auth-code")
+public class CorpwxPreAuthCodeController {
+
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CorpwxRegisterCodeController.java

@@ -0,0 +1,20 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-11-22
+ */
+@RestController
+@RequestMapping("/corpwx-register-code")
+public class CorpwxRegisterCodeController {
+
+}
+

+ 140 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CusTableColumnController.java

@@ -0,0 +1,140 @@
+package com.management.platform.controller;
+
+import com.management.platform.entity.BusReportStore;
+import com.management.platform.entity.CusReportForm;
+import com.management.platform.entity.bo.FormStorePageBO;
+import com.management.platform.service.CusTableColumnService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+@RestController
+@RequestMapping("/tableColumn")
+public class CusTableColumnController {
+
+    @Resource
+    private CusTableColumnService cusTableColumnService;
+
+    @PostMapping("/exportCusReportForm")
+    public HttpRespMsg exportCusReportForm(@RequestParam("formId") Integer formId,HttpServletRequest request){
+        HttpRespMsg msg = new HttpRespMsg();
+        msg = cusTableColumnService.exportCusReportForm(formId,request);
+        return msg;
+    }
+    @PostMapping("/getFormJsonByFormId")
+    public HttpRespMsg getFormJsonByFormId(@RequestParam("formId") Integer formId,HttpServletRequest request){
+        HttpRespMsg msg = new HttpRespMsg();
+        msg = cusTableColumnService.getFormJsonByFormId(formId,request);
+        return msg;
+    }
+
+    @PostMapping("/getResByFormJson")
+    public HttpRespMsg getResByFormJson(@RequestParam("formJson") String formJson
+            ,@RequestParam(value = "formTransConditionJson",required = false)String formTransConditionJson
+            ,@RequestParam(value = "formFieldHead") String formFieldHead
+            ,HttpServletRequest request){
+        HttpRespMsg msg = new HttpRespMsg();
+        msg = cusTableColumnService.getResByFormJson(formJson,formTransConditionJson,formFieldHead,request);
+        return msg;
+    }
+
+    /**获取所有文件夹*/
+    @PostMapping("/getAllStoresTree")
+    public HttpRespMsg getAllStoresTree(HttpServletRequest request){
+        HttpRespMsg msg = new HttpRespMsg();
+        msg = cusTableColumnService.getAllStoresTree(request);
+        return msg;
+    }
+
+    @PostMapping("/moveFormStore")
+    public HttpRespMsg moveFormStore(@RequestParam(value = "formId")Integer formId
+            ,@RequestParam(value = "targetStoreId")Integer targetStoreId
+            ,HttpServletRequest request){
+        HttpRespMsg msg = new HttpRespMsg();
+        msg = cusTableColumnService.moveFormStore(formId,targetStoreId,request);
+        return msg;
+    }
+
+    @PostMapping("/getFormResByFormId")
+    public HttpRespMsg getFormResByFormId(@RequestParam(value = "formId")Integer formId,HttpServletRequest request){
+        HttpRespMsg msg = new HttpRespMsg();
+        msg = cusTableColumnService.getFormResByFormId(formId,request);
+        return msg;
+    }
+
+
+    @PostMapping("/deleteReportForm")
+    public HttpRespMsg deleteReportForm(@RequestParam(value = "formId")Integer formId,HttpServletRequest request){
+        HttpRespMsg msg = new HttpRespMsg();
+        msg = cusTableColumnService.deleteReportForm(formId,request);
+        return msg;
+    }
+
+    /**更新报表*/
+    @PostMapping("/addOrUpdateReportForm")
+    public HttpRespMsg addOrUpdateReportForm(CusReportForm cusReportForm, HttpServletRequest request){
+        HttpRespMsg msg = new HttpRespMsg();
+        msg = cusTableColumnService.addOrUpdateReportForm(cusReportForm,request);
+        return msg;
+    }
+
+    @PostMapping("/deleteFormStore")
+    public HttpRespMsg deleteFormStore(@RequestParam(value = "storeId")Integer storeId,HttpServletRequest request){
+        HttpRespMsg msg = new HttpRespMsg();
+        msg = cusTableColumnService.deleteFormStore(storeId,request);
+        return msg;
+    }
+
+
+    /**更新文件夹*/
+    @RequestMapping("/addOrUpdateFormStore")
+    public HttpRespMsg addOrUpdateFormStore(BusReportStore busReportStore, HttpServletRequest request){
+        HttpRespMsg msg = new HttpRespMsg();
+        msg = cusTableColumnService.addOrUpdateFormStore(busReportStore,request);
+        return msg;
+    }
+
+    @RequestMapping("getFormStorePage")
+    public HttpRespMsg getFormStorePage(FormStorePageBO queryBO,HttpServletRequest request){
+        HttpRespMsg msg = new HttpRespMsg();
+        msg = cusTableColumnService.getFormStorePage(queryBO,request);
+        return msg;
+    }
+
+    @RequestMapping("/getAllBusTable")
+    public HttpRespMsg getAllBusTable(HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        msg = cusTableColumnService.getAllBusTable(request);
+        return msg;
+    }
+
+    @RequestMapping("/getStructByTableName")
+    public HttpRespMsg getStructByTableName(@RequestParam("tableName") String tableName, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        msg = cusTableColumnService.getStructByTableName(tableName,request);
+        return msg;
+    }
+
+    @RequestMapping("/getRelateTableByFromColumn")
+    public HttpRespMsg getRelateTableByFromColumn(@RequestParam("columnName") String columnName
+            , @RequestParam("tableName") String tableName
+            ,HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        msg = cusTableColumnService.getRelateTableByFromColumn(tableName,columnName,request);
+        return msg;
+    }
+
+    @RequestMapping("/getRelateBusTableByFromTable")
+    public HttpRespMsg getRelateBusTableByFromTable(@RequestParam("tableName") String tableName
+            ,HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        msg = cusTableColumnService.getRelateBusTableByFromTable(tableName,request);
+        return msg;
+    }
+
+}

+ 310 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CustomController.java

@@ -0,0 +1,310 @@
+package com.management.platform.controller;
+
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.*;
+import com.management.platform.service.ContactsService;
+import com.management.platform.service.CustomService;
+import com.management.platform.service.WxCorpInfoService;
+import com.management.platform.service.impl.ExcelExportServiceImpl;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-02-28
+ */
+@RestController
+@RequestMapping("/custom")
+public class CustomController {
+    @Autowired
+    private CustomService customService;
+    @Autowired
+    private UserMapper userMapper;
+
+    @Resource
+    private ExcelExportServiceImpl excelExportService;
+    @Resource
+    private SysFormMapper sysFormMapper;
+    @Autowired
+    private WxCorpInfoService wxCorpInfoService;
+    @Autowired
+    private ContactsService contactsService;
+    @Autowired
+    private TaskMapper taskMapper;
+    @Autowired
+    private BusinessOpportunityMapper businessOpportunityMapper;
+    @Autowired
+    private SalesOrderMapper salesOrderMapper;
+
+
+    @RequestMapping("list")
+    public HttpRespMsg list(Custom custom, HttpServletRequest request) {
+        return customService.getList(custom, request);
+    }
+
+    @PostMapping("/listByPin")
+    public HttpRespMsg listByPin(Custom custom, HttpServletRequest request) {
+        return customService.listByPin(custom, request);
+    }
+
+    @PostMapping("/undoPin")
+    public HttpRespMsg undoPin(Custom custom, HttpServletRequest request) {
+        return customService.undoPin(custom,request);
+    }
+
+    @PostMapping("/pinCustom")
+    public HttpRespMsg pinCustom(Custom custom, HttpServletRequest request) {
+        return customService.pinCutom(custom,request);
+    }
+
+    @RequestMapping("getPrivilegedCustom")
+    public HttpRespMsg getPrivilegedCustom(HttpServletRequest request) {
+        return customService.getPrivilegedCustom(request);
+    }
+
+    @RequestMapping("getAllCustom")
+    public HttpRespMsg getAllCustom(HttpServletRequest request) {
+        return customService.getAllCustom(request);
+    }
+
+    @RequestMapping("getAllContacts")
+    public HttpRespMsg getAllContacts(HttpServletRequest request) {
+        return contactsService.getAll(request);
+    }
+
+    @RequestMapping("deleteList")
+    public HttpRespMsg deleteList(Custom custom, HttpServletRequest request) {
+        return customService.getDeleteList(custom, request);
+    }
+
+
+    @RequestMapping("insertAndUpdate")
+    public HttpRespMsg insertAndUpdate(Custom custom, HttpServletRequest request) {
+        return customService.insertAndUpdate(custom, request);
+    }
+
+    @RequestMapping("getInfo")
+    public HttpRespMsg getInfo(Custom custom, HttpServletRequest request) {
+        return customService.getInfo(custom, request);
+    }
+
+//    @RequestMapping("getLog")
+//    public HttpRespMsg getLog(Custom custom, HttpServletRequest request) {
+//        return customService.getInfo(custom, request);
+//    }
+
+    @RequestMapping("/importData")
+    public HttpRespMsg importData(MultipartFile multipartFile){
+        return customService.importData(multipartFile);
+    }
+
+    @Value(value = "${upload.path}")
+    private String path;
+    @RequestMapping("/exportData")
+    public HttpRespMsg exportData(Custom custom , HttpServletRequest request) throws Exception {
+        System.out.println("========导出客户信息==========");
+        long startTimeSec = System.currentTimeMillis();
+        User user = userMapper.selectById(request.getHeader("token"));
+        SysForm sysForm = sysFormMapper.selectOne(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCompanyId, user.getCompanyId()).eq(SysForm::getCode, "Customer").eq(SysForm::getIsCurrent, 1));
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
+        String config = sysForm.getConfig();
+        JSONObject configOb = JSON.parseObject(config);
+        JSONArray configObJSONArray = configOb.getJSONArray("list");
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        List<String> modelList=new ArrayList<>();
+        for (int i = 0; i < configObJSONArray.size(); i++) {
+            JSONObject item = configObJSONArray.getJSONObject(i);
+            String type = item.getString("type");
+            if (type.equals("grid")){
+                JSONArray columns = item.getJSONArray("columns");
+                for (int j = 0; j < columns.size(); j++) {
+                    JSONObject columnsJSONObject = columns.getJSONObject(j);
+                    JSONArray listJsonArray = columnsJSONObject.getJSONArray("list");
+                    for (int k = 0; k < listJsonArray.size(); k++) {
+                        JSONObject listJsonArrayJSONObject = listJsonArray.getJSONObject(k);
+                        titleList.add(listJsonArrayJSONObject.getString("label"));
+                        modelList.add(listJsonArrayJSONObject.getString("model"));
+                    }
+                }
+            }
+            else {
+                titleList.add(item.getString("label"));
+                modelList.add(item.getString("model"));
+            }
+        }
+        dataList.add(titleList);
+
+        HttpRespMsg respMsg = list(custom,request);
+        Map<String, Object> msgData = (Map<String, Object>) respMsg.getData();
+        List<Custom> list = (List<Custom>) msgData.get("data");
+
+        for (Custom data : list) {
+            List<String> item=new ArrayList<>();
+            for (int i = 0; i < modelList.size(); i++) {
+
+                String model = modelList.get(i);
+                String targetName = model.substring(0, 1).toUpperCase() + model.substring(1);
+                Class<? extends Custom> aClass = data.getClass();
+                String value = "";
+
+                if(model.equals("inchargerId")){
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(data))+"$";
+                    }else {
+                        value = String.valueOf(aClass.getMethod("getInchargerName").invoke(data)).equals("null") ? "" :String.valueOf(aClass.getMethod("getInchargerName").invoke(data));
+                    }
+                }else {
+                    value= String.valueOf(aClass.getMethod("get" + targetName).invoke(data)==null?"":aClass.getMethod("get" + targetName).invoke(data));
+                }
+
+                if(model.equals("clueSourceId")){
+                    value = String.valueOf(null == aClass.getMethod("getClueSourceValue").invoke(data)?"":aClass.getMethod("getClueSourceValue").invoke(data));
+                }
+                if(model.equals("customerLevelId")){
+                    value = String.valueOf(null == aClass.getMethod("getCustomerLevelValue").invoke(data)?"":aClass.getMethod("getCustomerLevelValue").invoke(data));
+                }
+                if(model.equals("customerIndustryId")){
+                    value = String.valueOf(null == aClass.getMethod("getCustomerIndustryValue").invoke(data)?"":aClass.getMethod("getCustomerIndustryValue").invoke(data));
+                }
+                item.add(value);
+            }
+            dataList.add(item);
+        }
+        String fileName="客户表导出_"+ System.currentTimeMillis();
+        long endTimeSec = System.currentTimeMillis();
+        System.out.println("========客户信息导出数据准备结束==========耗时"+(endTimeSec-startTimeSec)+"毫秒");
+        return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName,dataList,path);
+    }
+
+    // 批量放入回收站
+    @RequestMapping("deleter")
+    public Object delete(Custom custom) {
+        HttpRespMsg msg = new HttpRespMsg();
+        msg = customService.delete(custom);
+        return msg;
+    }
+
+    // 批量恢复
+    @RequestMapping("rollback")
+    public Object rollback(Custom custom) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String ids1 = custom.getIds();
+        List<Integer> ids = new ArrayList<>();
+        if (!ids1.isEmpty()) {
+            for (String id : ids1.split(",")) {
+                ids.add(Integer.parseInt(id));
+            }
+            customService.isRollback(ids);
+            msg.setMsg("操作成功");
+        } else {
+            msg.setError("请选择客户");
+
+        }
+        return msg;
+    }
+
+    //彻底删除
+    @RequestMapping("reallyDelete")
+    public Object reallyDelete(Custom custom) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String ids1 = custom.getIds();
+        List<Integer> ids = new ArrayList<>();
+        if (!ids1.isEmpty()) {
+            for (String id : ids1.split(",")) {
+                ids.add(Integer.parseInt(id));
+            }
+            customService.isReallyDelete(ids);
+            msg.setMsg("操作成功");
+        } else {
+            msg.setError("请选择客户");
+
+        }
+        return msg;
+    }
+
+    // 认领&转移线索
+    @RequestMapping("claim")
+    public Object claim(Custom custom, HttpServletRequest request) {
+        User user = userMapper.selectById(request.getHeader("Token"));
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setMsg("操作成功");
+        customService.getAndTransfer(custom, user);
+        return msg;
+    }
+
+    @RequestMapping("getAll")
+    public Object getAll(HttpServletRequest request) {
+        HttpRespMsg list = list(new Custom(), request);
+        Map<String, Object> data = (Map<String, Object>) list.getData();
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setData(data.get("data")
+        );
+        return msg;
+    }
+
+    // 上传
+    @RequestMapping("uploadFile")
+    public Object uploadFile(Custom custom, HttpServletRequest request, MultipartFile file) throws Exception {
+        return customService.uploadFile(custom, request, file);
+    }
+
+    //下载
+    @RequestMapping("downFile")
+    public Object downFile(UploadFile file, HttpServletRequest request, HttpServletResponse response) throws Exception {
+        return customService.downFile(file, request, response);
+    }
+
+    //删除
+    @RequestMapping("deleteFile")
+    public Object downFile(UploadFile file, HttpServletRequest request) throws Exception {
+        return customService.deleteFile(file, request);
+    }
+
+    //删除
+    @RequestMapping("deleterDelete")
+    public Object deleterDelete(Custom custom , HttpServletRequest request) throws Exception {
+        HttpRespMsg msg = new HttpRespMsg();
+        String ids1 = custom.getIds();
+        List<Integer> ids = new ArrayList<>();
+        if (!ids1.isEmpty()) {
+            for (String id : ids1.split(",")) {
+                ids.add(Integer.parseInt(id));
+            }
+            customService.deleterDelete(ids);
+            msg.setMsg("操作成功");
+        } else {
+            msg.setError("请选择线索");
+        }
+        return msg;    }
+
+    //重命名
+    @RequestMapping("reFileName")
+    public Object reFileName(UploadFile uploadFile, HttpServletRequest request) throws Exception {
+        return customService.reFileName(uploadFile, request);
+    }
+
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CustomItemContactsController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-04-02
+ */
+@RestController
+@RequestMapping("/custom-item-contacts")
+public class CustomItemContactsController {
+
+}
+

+ 191 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/CustomerInfoController.java

@@ -0,0 +1,191 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.management.platform.entity.CustomerInfo;
+import com.management.platform.entity.Project;
+import com.management.platform.entity.User;
+import com.management.platform.mapper.CustomerInfoMapper;
+import com.management.platform.mapper.ProjectMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.CustomerInfoService;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-07-31
+ */
+@RestController
+@RequestMapping("/customer-info")
+public class CustomerInfoController {
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    ProjectMapper projectMapper;
+    @Resource
+    CustomerInfoMapper customerInfoMapper;
+    @Resource
+    CustomerInfoService customerInfoService;
+
+    @RequestMapping("/addOrMod")
+    public HttpRespMsg addOrMod(CustomerInfo info) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        List<CustomerInfo> customerInfoMapperAll = customerInfoMapper.getAll(user.getCompanyId());
+        List<String> nameList=new ArrayList<>();
+        List<String> codeList=new ArrayList<>();
+        customerInfoMapperAll.forEach(cu->{
+            nameList.add(cu.getCustomerName());
+            if(cu.getCustomerCode()!=null){
+                codeList.add(cu.getCustomerCode());
+            }
+        });
+        if (info.getId() == null) {
+            if(nameList.contains(info.getCustomerName())){
+                //msg.setError("客户名称已存在");
+                msg.setError(MessageUtils.message("customer.nameRepeat"));
+                return msg;
+            }
+            if(codeList.contains(info.getCustomerCode())){
+                //msg.setError("客户编号已存在");
+                msg.setError(MessageUtils.message("customer.noRepeat"));
+                return msg;
+            }
+            info.setCompanyId(user.getCompanyId());
+            customerInfoMapper.insert(info);
+        } else {
+            CustomerInfo customerInfo = customerInfoMapper.selectById(info.getId());
+            nameList.remove(customerInfo.getCustomerName());
+            codeList.remove(customerInfo.getCustomerCode());
+            if(nameList.contains(info.getCustomerName())){
+                //msg.setError("客户名称已存在");
+                msg.setError(MessageUtils.message("customer.nameRepeat"));
+                return msg;
+            }
+            if(codeList.contains(info.getCustomerCode())){
+                //msg.setError("客户编号已存在");
+                msg.setError(MessageUtils.message("customer.noRepeat"));
+                return msg;
+            }
+            info.setCompanyId(user.getCompanyId());
+            customerInfoMapper.updateById(info);
+            //更新项目表中的客户名称
+            Project p = new Project();
+            p.setCustomerName(info.getCustomerName());
+            projectMapper.update(p, new QueryWrapper<Project>().eq("customer_id", info.getId()));
+        }
+        return msg;
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        int r = customerInfoMapper.delete(new QueryWrapper<CustomerInfo>().eq("id", id).eq("company_id", user.getCompanyId()));
+        if (r <= 0) {
+            //msg.setError("无权删除");
+            msg.setError(MessageUtils.message("customer.accessError"));
+        }
+        return msg;
+    }
+    @RequestMapping("/batchDelete")
+    public HttpRespMsg batchDelete(String batchIds) {
+        HttpRespMsg msg = new HttpRespMsg();
+        if(!batchIds.equals("")&&!StringUtils.isEmpty(batchIds)){
+            String[] split = batchIds.split(",");
+            List<String> list = Arrays.asList(split);
+            String token = request.getHeader("TOKEN");
+            User user = userMapper.selectById(token);
+            List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().in("customer_id", list).eq("company_id", user.getCompanyId()));
+            System.out.println(projectList);
+            if(projectList.size()>0){
+                List<String> collect = projectList.stream().map(pro -> pro.getCustomerName()).collect(Collectors.toList());
+                String s = String.valueOf(collect);
+                //msg.setError("客户"+s+"已被使用");
+                msg.setError(MessageUtils.message("customer.UsedError",s));
+                return msg;
+            }
+            int r = customerInfoMapper.delete(new QueryWrapper<CustomerInfo>().eq("id", list.get(0)).eq("company_id", user.getCompanyId()));
+            if (r <= 0) {
+                //msg.setError("无权删除");
+                msg.setError(MessageUtils.message("customer.accessError"));
+                return msg;
+            }
+            customerInfoMapper.deleteBatchIds(list);
+        }
+        return msg;
+    }
+
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(@RequestParam Integer pageIndex, @RequestParam Integer pageSize, String keyword, String sortProp, Integer sortOrder) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        QueryWrapper<CustomerInfo> queryWrapper = new QueryWrapper<CustomerInfo>().eq("company_id", user.getCompanyId());
+        if (!StringUtils.isEmpty(keyword)) {
+            queryWrapper.like("customer_name", keyword);
+        }
+        if (!StringUtils.isEmpty(sortProp)) {
+            if (sortOrder == 0) {
+                //降序
+                queryWrapper.orderByDesc(sortProp);
+            } else {
+                queryWrapper.orderByAsc(sortProp);
+            }
+        } else {
+            queryWrapper.orderByDesc("id");
+        }
+        IPage<CustomerInfo> projectIPage = customerInfoMapper.selectPage(new Page<>(pageIndex, pageSize),
+                queryWrapper);
+        List<CustomerInfo> list = projectIPage.getRecords();
+        Long total = projectIPage.getTotal();
+        Map<String, Object> map = new HashMap<>();
+        map.put("records", list);
+        map.put("total", total);
+        msg.data = map;
+        return msg;
+    }
+
+    @RequestMapping("/getAll")
+    public HttpRespMsg getAll() {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        List<CustomerInfo> all = customerInfoMapper.getAll(user.getCompanyId());
+        msg.data = all;
+        return msg;
+    }
+    @RequestMapping("/importData")
+    public HttpRespMsg importData(HttpServletRequest request, MultipartFile file){
+        return customerInfoService.importData(request,file);
+    }
+
+    @RequestMapping("/exportData")
+    public HttpRespMsg exportData(){
+        return customerInfoService.exportData(request);
+    }
+
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/DdCallbackController.java

@@ -0,0 +1,20 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-11-01
+ */
+@RestController
+@RequestMapping("/dd-callback")
+public class DdCallbackController {
+
+}
+

+ 154 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/DepartmentController.java

@@ -0,0 +1,154 @@
+package com.management.platform.controller;
+
+
+import com.alibaba.fastjson.JSONArray;
+import com.management.platform.entity.vo.DepartmentVO;
+import com.management.platform.service.DepartmentService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * <p>
+ * 部门 前端控制器
+ * </p>
+ *
+ * @author 吴涛涛
+ * @since 2020-02-11
+ */
+@RestController
+@RequestMapping("/department")
+public class DepartmentController {
+
+    @Autowired
+    private DepartmentService departmentService;
+    @Resource
+    private HttpServletRequest request;
+    /**
+     * 获取带有层级的部门列表
+     */
+    @RequestMapping("/list")
+    public HttpRespMsg getDepartment(HttpServletRequest request) {
+        return departmentService.getDepartmentList(request);
+    }
+
+    /**
+     * 对部门进行排序
+     * @param request
+     * @return
+     */
+    @RequestMapping("/sortList")
+    public HttpRespMsg sortList(HttpServletRequest request,String list) {
+        List<DepartmentVO> departmentVOS = JSONArray.parseArray(list, DepartmentVO.class);
+        return departmentService.sortList(request,departmentVOS);
+    }
+
+    @RequestMapping("/listAllMemb")
+    public HttpRespMsg listAllMemb(HttpServletRequest request,String keyword,String cursor) throws Exception {
+        return departmentService.listAllMemb(request,keyword,cursor);
+    }
+
+    @RequestMapping("/listAllMembNew")
+    public HttpRespMsg listAllMembNew(HttpServletRequest request,String keyword,String cursor) throws Exception {
+        return departmentService.listAllMembNew(request,keyword,cursor);
+    }
+
+    //获取我可以管辖到的人员列表,进行代填时选择的人员列表用到
+    @RequestMapping("/listMyMembs")
+    public HttpRespMsg listMyMembs(HttpServletRequest request) {
+        return departmentService.listMyMembs(request);
+    }
+
+    /**
+     * 获取不带有层级的部门列表
+     */
+    @RequestMapping("/normalList")
+    public HttpRespMsg getDepartmentNormal(HttpServletRequest request) {
+        return departmentService.getNormalDepartmentList(request);
+    }
+
+
+    /**
+     * 新增部门
+     * name 部门名称
+     * parentId 父级部门id
+     */
+    @RequestMapping("/add")
+    public HttpRespMsg insertDepartment(@RequestParam String name, Integer parentId, String managerId, String reportAuditUserid,String otherManagerIds, HttpServletRequest request) {
+        return departmentService.insertDepartment(name, parentId, managerId, reportAuditUserid,otherManagerIds, request);
+    }
+
+    /**
+     * 修改部门名称
+     * id 部门id
+     * name 部门名称
+     */
+    @RequestMapping("/edit")
+    public HttpRespMsg updateDepartment(@RequestParam Integer id, @RequestParam String name, String managerId, String reportAuditUserid,String otherManagerIds,Integer pushToSap, HttpServletRequest request) {
+        return departmentService.updateDepartment(id, name, managerId, reportAuditUserid,otherManagerIds,pushToSap, request);
+    }
+
+    /**
+     * 删除部门
+     * id 部门id
+     */
+    @RequestMapping("/delete")
+    public HttpRespMsg deleteDepartment(@RequestParam Integer id, HttpServletRequest request) {
+        return departmentService.deleteDepartment(id, request);
+    }
+
+    /**
+     * 获取部门的统计工时成本
+     */
+    @RequestMapping("/departmentStatistic")
+    public HttpRespMsg getDepartmentStatistics(Integer parentDeptId, String startDate, String endDate, HttpServletRequest request) {
+        return departmentService.getDepartmentStatistics(parentDeptId, startDate, endDate, request);
+    }
+
+    /**
+     * 获取某个部门或者公司全部的人员的统计
+     * departmentId 要查询的项目
+     */
+    @RequestMapping("/userStatistic")
+    public HttpRespMsg getUserStatistics(String startDate, String endDate, Integer departmentId, HttpServletRequest request) {
+        return departmentService.getUserStatistics(startDate, endDate, departmentId, request);
+    }
+
+    @RequestMapping("/getUserCustomDataStatistic")
+    public HttpRespMsg getUserCustomDataStatistic(String startDate, String endDate, Integer departmentId, HttpServletRequest request) {
+        return departmentService.getUserCustomDataStatistic(startDate, endDate, departmentId, request);
+    }
+
+    @RequestMapping("/getDeptCustomDataStatistic")
+    public HttpRespMsg getDeptCustomDataStatistic(String startDate, String endDate, Integer departmentId, HttpServletRequest request){
+        return departmentService.getDeptCustomDataStatistic(startDate,endDate,departmentId,request);
+    }
+
+    /**
+     * 按人员导出工时统计,可选人员
+     * departmentId 要查询的项目
+     */
+    @RequestMapping("/exportUserStatistic")
+    public HttpRespMsg exportUserStatistic(boolean mainProjectColumn, String startDate, String endDate, String userIds, HttpServletRequest request) {
+        return departmentService.exportUserStatistic(mainProjectColumn, startDate, endDate, userIds, request);
+    }
+
+
+    @RequestMapping("/exportDeptStatistic")
+    public HttpRespMsg exportDeptStatistic(String startDate, String endDate, HttpServletRequest request) {
+        return departmentService.exportDeptStatistic(startDate, endDate, request);
+    }
+
+
+    @RequestMapping("/exportCustomDataSum")
+    public HttpRespMsg exportCustomDataSum(String startDate, String endDate) {
+        return departmentService.exportCustomDataSum(startDate, endDate, request);
+    }
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/DepartmentDingdingController.java

@@ -0,0 +1,20 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-06-27
+ */
+@RestController
+@RequestMapping("/department-dingding")
+public class DepartmentDingdingController {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/DepartmentFeishuController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-03-01
+ */
+@RestController
+@RequestMapping("/department-feishu")
+public class DepartmentFeishuController {
+
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/DepartmentOtherManagerController.java

@@ -0,0 +1,20 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-07-26
+ */
+@RestController
+@RequestMapping("/department-other-manager")
+public class DepartmentOtherManagerController {
+
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/DepartmentWxController.java

@@ -0,0 +1,20 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-11-28
+ */
+@RestController
+@RequestMapping("/department-wx")
+public class DepartmentWxController {
+
+}
+

+ 291 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/DingDingController.java

@@ -0,0 +1,291 @@
+package com.management.platform.controller;//package com.management.platform.controller;
+//
+//import com.alibaba.fastjson.JSON;
+//import com.alibaba.fastjson.JSONArray;
+//import com.alibaba.fastjson.JSONObject;
+//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+//import com.management.platform.entity.*;
+//import com.management.platform.mapper.*;
+//import com.management.platform.service.CompanyDingdingService;
+//import com.management.platform.service.DingDingService;
+//import com.management.platform.service.impl.DingDingServiceImpl;
+//import com.management.platform.util.*;
+//import com.taobao.api.ApiException;
+//import org.slf4j.Logger;
+//import org.slf4j.LoggerFactory;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.scheduling.annotation.Async;
+//import org.springframework.web.bind.annotation.*;
+//
+//import javax.annotation.Resource;
+//import javax.servlet.http.HttpServletRequest;
+//import java.time.LocalDate;
+//import java.time.LocalDateTime;
+//import java.time.ZoneOffset;
+//import java.time.format.DateTimeFormatter;
+//import java.util.List;
+//import java.util.Map;
+//import java.util.concurrent.ExecutorService;
+//import java.util.concurrent.Executors;
+//import java.util.stream.Collectors;
+//
+//@RestController
+//@RequestMapping("/dingding")
+//public class DingDingController {
+//
+//    private final Logger bizLogger = LoggerFactory.getLogger(getClass());
+//
+//    String aesKey = "ktmbamhymjsf60ndwp6n81mnu92847oynsgj9e0zr9v";
+//    String token = "cf776d62c5fb3508b5d8c2cbb9f3df0c";
+//
+//    String suiteKey = "suitejwoq9dw4bxv4stdb";
+//    String suiteSecret = "o-TWFLkFe8YbJsa_025JOj_JEWydP5GR3eigt1Yn1rtx5dTcryTJiSA6KEih3Bi4";
+//
+//    @Value("${configEnv.isPrivateDeploy}")
+//    private boolean isPrivateDeploy;
+//
+//    @Resource
+//    private DingDingService dingDingService;
+//    static ExecutorService executorService = Executors.newCachedThreadPool();
+//    @Resource
+//    private CompanyDingdingService companyDingdingService;
+//    @Resource
+//    private UserMapper userMapper;
+//    @Resource
+//    private CompanyDingdingMapper companyDingdingMapper;
+//    @Resource
+//    private TimeTypeMapper timeTypeMapper;
+//    @Resource
+//    private CompanyMapper companyMapper;
+//
+//
+//    @RequestMapping("/callback")
+//    public Map<String, String> dingCallback(
+//            @RequestParam(value = "signature") String signature,
+//            @RequestParam(value = "timestamp") String timestamp,
+//            @RequestParam(value = "nonce") String nonce,
+//            @RequestBody(required = false) JSONObject body,
+//            @RequestParam(value = "innerAppKey", required = false) String innerAppKey
+//    ) {
+//        System.out.println("接收到ding call back"+(isPrivateDeploy?", innerAppKey="+innerAppKey:""));
+//        if (body == null) {
+//            DingCallbackCrypto callbackCrypto = null;
+//            try {
+//                callbackCrypto = new DingCallbackCrypto(token, aesKey, isPrivateDeploy?innerAppKey:suiteKey);
+//                Map<String, String> successMap = callbackCrypto.getEncryptedMap("success");
+//                LocalDateTime now = LocalDateTime.now();
+//                DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
+//                System.out.println(dtf.format(now)+" 给钉钉返回数据了:"+successMap);
+//                return successMap;
+//            } catch (DingCallbackCrypto.DingTalkEncryptException e) {
+//                e.printStackTrace();
+//            }
+//        }
+//        try {
+//            // 1. 从http请求中获取加解密参数
+//
+//            // 2. 使用加解密类型
+//            // Constant.OWNER_KEY 说明:
+//            // 1、开发者后台配置的订阅事件为应用级事件推送,
+//            //      此时OWNER_KEY为应用的APP_KEY(企业内部应用)或SUITE_KEY(三方应用)。
+//            // 2、调用订阅事件接口订阅的事件为企业级事件推送,
+//            //      此时OWNER_KEY为:企业的CORP_ID(企业内部应用)或SUITE_KEY(三方应用)
+//            DingCallbackCrypto callbackCrypto = new DingCallbackCrypto(token, aesKey, isPrivateDeploy?innerAppKey:suiteKey);
+//            String encryptMsg = body.getString("encrypt");
+//            String decryptMsg = callbackCrypto.getDecryptMsg(signature, timestamp, nonce, encryptMsg);
+//            dingDingService.asyncHandleMsg(decryptMsg);
+//
+//            // 5. 返回success的加密数据
+//            Map<String, String> successMap = callbackCrypto.getEncryptedMap("success");
+//            LocalDateTime now = LocalDateTime.now();
+//            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
+//            System.out.println(dtf.format(now)+" 给钉钉返回数据了:"+successMap);
+//            return successMap;
+//        } catch (DingCallbackCrypto.DingTalkEncryptException e) {
+//            e.printStackTrace();
+//            System.out.println(e.getMessage());
+//        }
+//        return null;
+//    }
+//
+//    @RequestMapping("/inactiveUserNotInAuthRange")
+//    public HttpRespMsg inactiveUserNotInAuthRange(String corpid) {
+//        HttpRespMsg msg = new HttpRespMsg();
+//        msg.data = dingDingService.inactiveUserNotInAuthRange(corpid);
+//        return msg;
+//    }
+//
+//    @RequestMapping("/syncCorpMembs")
+//    public HttpRespMsg syncCorpMembs(String corpid) {
+//        try {
+//            System.out.println("===========手动调用syncCorpMembs请求接口===========");
+//            String rest = dingDingService.syncCorpMembs(corpid);
+//            HttpRespMsg msg = new HttpRespMsg();
+//            msg.data = rest;
+//            return msg;
+//        } catch (Exception e) {
+//            CompanyDingding dingding = companyDingdingMapper.selectById(corpid);
+//            Company company = companyMapper.selectById(dingding.getCompanyId());
+//            String token=company.getCompanyName();
+//            //移除锁
+//            DingDingServiceImpl.syncLog.remove(token);
+//            DingDingServiceImpl.syncLog.remove(company.getId()+"_status");
+//
+//            e.printStackTrace();
+//            System.err.println(e.getMessage());
+//            HttpRespMsg msg = new HttpRespMsg();
+//            msg.setError(e.getMessage());
+//            return msg;
+//        }
+//    }
+//
+//    @RequestMapping("/getUserByCode")
+//    public HttpRespMsg getUserByCode(String code, String corpid) {
+//        return dingDingService.getUserByCode(code, corpid);
+//    }
+//
+//    @RequestMapping("/syncCorpInfo")
+//    public HttpRespMsg syncCorpInfo(String corpid) {
+//        return dingDingService.syncCorpInfo(corpid);
+//    }
+//
+//    @RequestMapping("/syncCorpAgent")
+//    public HttpRespMsg syncCorpAgent(String corpid) {
+//        return dingDingService.syncCorpAgent(corpid);
+//    }
+//
+//    @RequestMapping("/getUnActiveCorp")
+//    public HttpRespMsg getUnActiveCorp() {
+//        return dingDingService.getUnActiveCorp();
+//    }
+//
+//    @RequestMapping("/reAuthCorp")
+//    public HttpRespMsg reAuthCorp(String corpid) {
+//        return dingDingService.reAuthCorp(corpid);
+//    }
+//
+//    @RequestMapping("/pushLeaveAuditAlert")
+//    public HttpRespMsg pushLeaveAuditAlert(String userId) {
+//        HttpRespMsg msg = new HttpRespMsg();
+//        User user = userMapper.selectById(userId);
+//        System.out.println("测试发送审批给=="+user.getName());
+//        CompanyDingding dingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", user.getCompanyId()));
+//        companyDingdingService.sendLeaveApplyAlertMsg(dingding.getCompanyId(), dingding.getAgentId(), "", user.getDingdingUserid());
+//        return msg;
+//    }
+//
+//    @RequestMapping("/syncCardTime")
+//    public HttpRespMsg syncCardTime(Integer companyId, String userId, String startDate, String endDate) {
+//        dingDingService.syncCardTime(companyId, userId, startDate, endDate);
+//        return new HttpRespMsg();
+//    }
+////
+////    @RequestMapping("/syncLeaveTime")
+////    public HttpRespMsg syncLeaveTime(Integer companyId, String userId, String startDate, String endDate) {
+////        dingDingService.syncLeaveTime(companyId, userId, startDate, endDate);
+////        return new HttpRespMsg();
+////    }
+//
+//    @RequestMapping("/fixAttendance")
+//    public HttpRespMsg fixAttendance(Integer companyId) {
+//        return dingDingService.fixAttendance(companyId);
+//    }
+//
+//
+//
+//    @RequestMapping("/syncUserWorkData")
+//    public HttpRespMsg syncUserWorkData(Integer companyId, String userId, String startDate, String endDate, @RequestParam(required = false, defaultValue = "false") boolean onlySyncAttendance) {
+//        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId).isNotNull("inner_appkey"));
+//        HttpRespMsg msg = new HttpRespMsg();
+//        if (startDate.compareTo(endDate) > 0) {
+//            //msg.setError("开始日期不能晚于结束日期");
+//            msg.setError(MessageUtils.message("DD.dateError"));
+//            return msg;
+//        }
+//
+//        if (companyId != null) {
+//            if (dingding == null) {
+//                //msg.setError("该公司没有设置innerAppkey和innerAppSecrt");
+//                msg.setError(MessageUtils.message("DD.keyAndSecretError"));
+//                return msg;
+//            } else {
+//                long t1 = System.currentTimeMillis();
+//                dingDingService.syncUserWorkData(dingding, userId, startDate, endDate, true, onlySyncAttendance);
+//                long t2 = System.currentTimeMillis();
+//                System.out.println("总共耗时:"+(t2-t1)+"ms");
+//            }
+//        } else {
+//            List<TimeType> timeTypeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_dingding", 1));
+//            List<Integer> compIds = timeTypeList.stream().map(TimeType::getCompanyId).collect(Collectors.toList());
+//            //企业内部应用才有权限调用
+//            List<CompanyDingding> dingdingList = companyDingdingMapper.selectList(new QueryWrapper<CompanyDingding>().in("company_id", compIds)
+//                    .isNotNull("inner_appkey"));
+//            System.out.println("==========获取钉钉内部应用的数量是:"+dingdingList.size());
+//            if (dingdingList.size() == 0) {
+//                //msg.setError("没有设置innerAppkey和innerAppSecrt的数据");
+//                msg.setError(MessageUtils.message("DD.keyAndSecretError"));
+//                return msg;
+//            } else {
+//                long t1 = System.currentTimeMillis();
+//                for (int i=0;i<dingdingList.size(); i++) {
+//                    dingDingService.syncUserWorkData(dingdingList.get(i), userId, startDate, endDate, true, onlySyncAttendance);
+//                }
+//                long t2 = System.currentTimeMillis();
+//                System.out.println("总共耗时:"+(t2-t1)+"ms");
+//            }
+//        }
+//
+//        return new HttpRespMsg();
+//    }
+//
+//    @RequestMapping("/testWaitingApply")
+//    public HttpRespMsg testWaitingApply(Integer companyId) {
+//        CompanyDingding companyDingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
+//        companyDingdingService.sendReportWaitingApplyMsg(companyId, companyDingding.getAgentId(),
+//                4L, "040534176023851922");
+//        return new HttpRespMsg();
+//    }
+////
+//    @RequestMapping("/syncLeaveQuotaData")
+//    public HttpRespMsg syncLeaveQuotaData(Integer companyId, HttpServletRequest request) {
+//        String token = request.getHeader("TOKEN");
+//        User user = userMapper.selectById(token);
+//        return dingDingService.syncLeaveQuotaData(companyId);
+//    }
+//
+//    @RequestMapping("/testSendBusTripLink")
+//    public HttpRespMsg testSendBusTripLink(Integer companyId) {
+//        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
+//
+//        companyDingdingService.sendBusinessTripSettingMsg(companyId, dingding.getAgentId(), "040534176023851922");
+//        return new HttpRespMsg();
+//    }
+//
+//    /**
+//     * 初始化内部应用的系统数据
+//     * @return
+//     */
+//    @RequestMapping("/initSystem")
+//    public HttpRespMsg initSystem(String corpid) {
+//        try {
+//            return dingDingService.initSystem(corpid);
+//        } catch (ApiException e) {
+//            e.printStackTrace();
+//            String errMsg = e.getErrMsg();
+//            HttpRespMsg msg = new HttpRespMsg();
+//            msg.setError(errMsg);
+//            return msg;
+//        }
+//    }
+//
+//    @RequestMapping("/removeCompInfo")
+//    public HttpRespMsg removeCompInfo(String corpid) {
+//        return dingDingService.removeCompInfo(corpid);
+//    }
+//
+//    @RequestMapping("/initSuperManager")
+//    public HttpRespMsg initSuperManager(String corpid, String name) {
+//        return dingDingService.initSuperManager(corpid, name);
+//    }
+//
+//}

+ 47 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/DirtyCleanController.java

@@ -0,0 +1,47 @@
+package com.management.platform.controller;//package com.management.platform.controller;
+//
+//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+//import com.management.platform.entity.Report;
+//import com.management.platform.mapper.ReportMapper;
+//import com.management.platform.service.ReportService;
+//import com.management.platform.util.HttpRespMsg;
+//import com.management.platform.util.ListUtil;
+//import org.springframework.web.bind.annotation.RequestMapping;
+//import org.springframework.web.bind.annotation.RestController;
+//
+//import javax.annotation.Resource;
+//import java.util.ArrayList;
+//import java.util.List;
+//import java.util.Map;
+//
+//@RestController
+//@RequestMapping("/clean")
+//public class DirtyCleanController {
+//    @Resource
+//    private ReportService reportService;
+//    @Resource
+//    private ReportMapper reportMapper;
+//
+//
+//
+//    @RequestMapping("/removeDuplicate")
+//    public HttpRespMsg removeDuplicate(Integer companyId) {
+//        HttpRespMsg msg = new HttpRespMsg();
+//        List<Map<String, Object>> list = reportMapper.getDuplicate(companyId);
+//        System.out.println("共=="+list.size()+"条重复记录");
+//        List<Integer> reportIds = new ArrayList<>();
+//        for(int i=0;i<list.size(); i++) {
+//            Map map = list.get(i);
+//            String ids = (String)map.get("reportIds");
+//            reportIds.addAll(ListUtil.convertIntegerIdsArrayToList(ids));
+//        }
+//        System.out.println(reportIds);
+//        System.out.println("日报记录report ="+reportIds.size());
+////        QueryWrapper<Report> queryWrapper = new QueryWrapper<Report>().in("id", reportIds).eq("company_id", companyId);
+////        reportMapper.delete(queryWrapper);
+////        List<Report> rList = reportMapper.selectList();
+////        System.out.println("去查找的日报数量="+rList.size());
+//
+//        return msg;
+//    }
+//}

+ 101 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/EarningSnapshotController.java

@@ -0,0 +1,101 @@
+package com.management.platform.controller;
+
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.EarningSnapshot;
+import com.management.platform.entity.Project;
+import com.management.platform.entity.ProjectBasecost;
+import com.management.platform.entity.User;
+import com.management.platform.entity.vo.SysRichFunction;
+import com.management.platform.mapper.ProjectMapper;
+import com.management.platform.mapper.SysFunctionMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.EarningSnapshotService;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.ListUtil;
+import com.management.platform.util.MessageUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-05-15
+ */
+@RestController
+@RequestMapping("/earning-snapshot")
+public class EarningSnapshotController {
+    @Resource
+    private HttpServletRequest request;
+
+    @Resource
+    private EarningSnapshotService earningSnapshotService;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private ProjectMapper projectMapper;
+    @Resource
+    SysFunctionMapper sysFunctionMapper;
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(Integer projectId) {
+        String userId = request.getHeader("Token");
+        User user = userMapper.selectById(userId);
+        HttpRespMsg msg = new HttpRespMsg();
+        Project project = projectMapper.selectById(projectId);
+
+        List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看成本基线");
+        if (userId.equals(project.getInchargerId()) || userId.equals(project.getCreatorId()) || functionList.size() > 0) {
+            List<EarningSnapshot> list = earningSnapshotService.list(new QueryWrapper<EarningSnapshot>().eq("project_id", projectId).orderByDesc("id"));
+            for (EarningSnapshot snapshot : list) {
+                if (snapshot.getCostData() != null) {
+                    JSONArray array = JSONArray.parseArray(snapshot.getCostData());
+                    List<ProjectBasecost> costList = new ArrayList<>();
+                    for (int i=0;i<array.size();i++) {
+                        ProjectBasecost projectBasecost = JSONObject.toJavaObject(array.getJSONObject(i), ProjectBasecost.class);
+                        costList.add(projectBasecost);
+                    }
+                    snapshot.setCostList(costList);
+                    snapshot.setCostData(null);
+                }
+            }
+            msg.data = list;
+        } else {
+
+            //msg.setError("无权查看");
+            msg.setError(MessageUtils.message("access.viewError"));
+        }
+
+        return msg;
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer projectId, String ids) {
+        String userId = request.getHeader("Token");
+        User user = userMapper.selectById(userId);
+
+        List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "校正成本基线");
+        HttpRespMsg msg = new HttpRespMsg();
+        Project project = projectMapper.selectById(projectId);
+        if (userId.equals(project.getInchargerId()) || userId.equals(project.getCreatorId()) || functionList.size() > 0) {
+            List<Integer> idArray = ListUtil.convertIntegerIdsArrayToList(ids);
+            earningSnapshotService.removeByIds(idArray);
+        } else {
+            //msg.setError("无权操作");
+            msg.setError(MessageUtils.message("access.operationError"));
+        }
+
+        return msg;
+    }
+}
+

+ 52 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/EstimateTimeSettingController.java

@@ -0,0 +1,52 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.entity.EstimateTimeSetting;
+import com.management.platform.mapper.EstimateTimeSettingMapper;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-11-19
+ */
+@RestController
+@RequestMapping("/estimate-time-setting")
+public class EstimateTimeSettingController {
+
+    @Resource
+    private EstimateTimeSettingMapper estimateTimeSettingMapper;
+
+    @RequestMapping("/get")
+    public HttpRespMsg get(Integer companyId) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        EstimateTimeSetting estimateTimeSetting = estimateTimeSettingMapper.selectById(companyId);
+        if (estimateTimeSetting == null) {
+            estimateTimeSetting = new EstimateTimeSetting();
+            estimateTimeSetting.setCompanyId(companyId);
+            estimateTimeSettingMapper.insert(estimateTimeSetting);
+            estimateTimeSetting = estimateTimeSettingMapper.selectById(companyId);
+        }
+        httpRespMsg.data = estimateTimeSetting;
+        return httpRespMsg;
+    }
+
+    @RequestMapping("/save")
+    public HttpRespMsg save(EstimateTimeSetting record) {
+        Boolean success = estimateTimeSettingMapper.updateById(record) > 0;
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        if (!success) {
+            httpRespMsg.setError(MessageUtils.message("other.saveError"));
+        }
+        return httpRespMsg;
+    }
+}
+

+ 62 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ExpenseAuditSettingController.java

@@ -0,0 +1,62 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.entity.ExpenseAuditSetting;
+import com.management.platform.entity.User;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ExpenseAuditSettingService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-07-20
+ */
+@RestController
+@RequestMapping("/expense-audit-setting")
+public class ExpenseAuditSettingController {
+
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private ExpenseAuditSettingService expenseAuditSettingService;
+    @Resource
+    private UserMapper userMapper;
+
+    @RequestMapping("get")
+    public HttpRespMsg get() {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("Token");
+        User user = userMapper.selectById(token);
+        Integer companyId = user.getCompanyId();
+        ExpenseAuditSetting byId = expenseAuditSettingService.getById(companyId);
+        if (byId == null) {
+            //给默认值
+            byId = new ExpenseAuditSetting();
+            byId.setCompanyId(companyId);
+            byId.setAuditType(0);
+        }
+        msg.data = byId;
+        return msg;
+    }
+
+    @RequestMapping("update")
+    public HttpRespMsg update(ExpenseAuditSetting setting) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("Token");
+        User user = userMapper.selectById(token);
+        Integer companyId = user.getCompanyId();
+        setting.setCompanyId(companyId);
+        expenseAuditSettingService.saveOrUpdate(setting);
+        return msg;
+    }
+}
+

+ 106 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ExpenseItemController.java

@@ -0,0 +1,106 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.management.platform.entity.WxCorpInfo;
+import com.management.platform.entity.vo.ExpenseItemVO;
+import com.management.platform.mapper.ExpenseItemMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.mapper.WxCorpInfoMapper;
+import com.management.platform.service.ExcelExportService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-05-17
+ */
+@RestController
+@RequestMapping("/expense-item")
+public class ExpenseItemController {
+
+    @Resource
+    private ExpenseItemMapper expenseItemMapper;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private WxCorpInfoMapper wxCorpInfoMapper;
+    @Resource
+    private ExcelExportService excelExportService;
+    @Value(value = "${upload.path}")
+    private String path;
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(Integer projectId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        List<ExpenseItemVO> userExpenseDetail = expenseItemMapper.getUserExpenseDetail(projectId);
+        msg.data = userExpenseDetail;
+        return msg;
+    }
+
+    @RequestMapping("/exportData")
+    public HttpRespMsg exportData(Integer projectId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId,companyId));
+        HttpRespMsg data = list(projectId);
+        List<ExpenseItemVO> itemVOS = (List<ExpenseItemVO>) data.getData();
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        titleList.add("员工姓名");
+        titleList.add("所在部门");
+        titleList.add("费用日期");
+        titleList.add("费用类型");
+        titleList.add("票据类型");
+        titleList.add("金额(含税)");
+        titleList.add("税额");
+        titleList.add("金额(不含税)");
+        titleList.add("备注");
+        dataList.add(titleList);
+        for (ExpenseItemVO itemVO : itemVOS) {
+            List<String> item=new ArrayList<>();
+            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                String userName ="$userName="+String.valueOf(itemVO.getCorpwxUserId())+"$";
+                String deptName ="$departmentName="+String.valueOf(itemVO.getCorpwxDeptId())+"$";
+                item.add(userName);
+                item.add(deptName);
+            }else {
+                item.add(itemVO.getUsername());
+                item.add(itemVO.getDepartmentName());
+            }
+            item.add(itemVO.getHappenDate());
+            item.add(itemVO.getExpenseType());
+            item.add(itemVO.getInvoiceType()==null?"":(itemVO.getInvoiceType()==0?"增值税专用发票":"增值税普通发票"));
+            BigDecimal decimal = new BigDecimal(itemVO.getAmount()==null?0:itemVO.getAmount());
+            item.add(String.valueOf(itemVO.getAmount()==null?"0":itemVO.getAmount()));
+            item.add(String.valueOf(itemVO.getTaxValue()==null?"0":itemVO.getTaxValue()));
+            decimal=decimal.subtract(new BigDecimal(itemVO.getTaxValue()==null?0:itemVO.getTaxValue())).setScale(2,BigDecimal.ROUND_HALF_UP);
+            item.add(String.valueOf(decimal.doubleValue()));
+            item.add(itemVO.getRemark()==null?"":itemVO.getRemark());
+            dataList.add(item);
+        }
+        String fileUrlSuffix = "费用报销明细表_" + System.currentTimeMillis();
+        try {
+           return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo, fileUrlSuffix, dataList, path);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return msg;
+    }
+}
+
+

+ 192 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ExpenseMainTypeController.java

@@ -0,0 +1,192 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.*;
+import com.management.platform.service.ExpenseMainTypeService;
+import com.management.platform.service.ExpenseSheetService;
+import com.management.platform.service.ExpenseTypeService;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Stream;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-04-06
+ */
+@RestController
+@RequestMapping("/expense-main-type")
+public class ExpenseMainTypeController {
+
+    @Autowired
+    private ExpenseMainTypeService expenseMainTypeService;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private ExpenseTypeMapper expenseTypeMapper;
+    @Resource
+    private ExpenseSheetMapper expenseSheetMapper;
+    @Resource
+    private CompanyMapper companyMapper;
+    @Resource
+    private ExpenseSheetService expenseSheetService;
+    @Resource
+    private ExpenseTypeService expenseTypeService;
+    @Resource
+    private ProjectBasecostSettingMapper projectBasecostSettingMapper;
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        List<ExpenseMainType> expenseMainTypes = expenseMainTypeService.list(new QueryWrapper<ExpenseMainType>().eq("company_id", user.getCompanyId()));
+        //获取basecostSetting名称
+        List<ProjectBasecostSetting> settings = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", user.getCompanyId()).eq("alarm_type", 0));
+        for (ExpenseMainType expenseMainType : expenseMainTypes) {
+            if (expenseMainType.getBasecostSettingId() != null) {
+                Stream<ProjectBasecostSetting> projectBasecostSettingStream = settings.stream().filter(setting -> setting.getId().equals(expenseMainType.getBasecostSettingId()));
+                Optional<ProjectBasecostSetting> first = projectBasecostSettingStream.findFirst();
+                if (first.isPresent()) {
+                    expenseMainType.setBasecostSettingName(first.get().getName());
+                }
+            }
+        }
+        httpRespMsg.data=expenseMainTypes;
+        return httpRespMsg;
+    }
+
+    @RequestMapping("/addOrMod")
+    public HttpRespMsg addOrMod(ExpenseMainType setting) {
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        HttpRespMsg msg = new HttpRespMsg();
+        if (StringUtils.isEmpty(setting.getName())) {
+            //msg.setError("名称不能为空");
+            msg.setError(MessageUtils.message("Company.nullNameError"));
+            return msg;
+        }
+        if (setting.getId() == null) {
+            setting.setCompanyId(companyId);
+            int num = expenseMainTypeService.count(new QueryWrapper<ExpenseMainType>().eq("company_id", setting.getCompanyId()));
+            if(num>=10){
+                msg.setError("已有类型上限为10");
+                return msg;
+            }
+            int count = expenseMainTypeService.count(new QueryWrapper<ExpenseMainType>().eq("name", setting.getName()).eq("company_id", setting.getCompanyId()));
+            if (count > 0) {
+                //msg.setError("该名称已存在");
+                msg.setError(MessageUtils.message("Company.nameRepeat"));
+            } else {
+                expenseMainTypeService.save(setting);
+                msg.data = expenseMainTypeService.list(new QueryWrapper<ExpenseMainType>().eq("company_id", setting.getCompanyId()));
+            }
+        } else {
+            int count = expenseMainTypeService.count(new QueryWrapper<ExpenseMainType>().eq("name", setting.getName())
+                    .eq("company_id", setting.getCompanyId()).ne("id", setting.getId()));
+            if (count > 0) {
+                //msg.setError("该名称已存在");
+                msg.setError(MessageUtils.message("Company.nameRepeat"));
+            } else {
+                expenseMainTypeService.updateById(setting);
+                msg.data = expenseMainTypeService.list(new QueryWrapper<ExpenseMainType>().eq("company_id", setting.getCompanyId()));
+            }
+        }
+        return msg;
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        ExpenseMainType expenseMainType = expenseMainTypeService.getById(id);
+        Integer count = expenseTypeMapper.selectCount(new QueryWrapper<ExpenseType>().eq("main_type", expenseMainType.getId()));
+        Integer count1 = expenseSheetMapper.selectCount(new QueryWrapper<ExpenseSheet>().eq("type", expenseMainType.getId()));
+        if (count > 0||count1>0) {
+            httpRespMsg.setError("当前费用类型[" + expenseMainType.getName() + "]已被使用");
+            return httpRespMsg;
+        }
+        expenseMainType.deleteById(id);
+        return httpRespMsg;
+    }
+
+    @RequestMapping("/dataBuild")
+    public HttpRespMsg dataBuild(){
+        List<Company> companyList = companyMapper.selectList(null);
+        for (Company company : companyList) {
+            List<ExpenseMainType> expenseMainTypes=new ArrayList<>();
+            ExpenseMainType expenseMainType=new ExpenseMainType();
+            expenseMainType.setName("一般费用");
+            expenseMainType.setCompanyId(company.getId());
+            ExpenseMainType expenseMainType1=new ExpenseMainType();
+            expenseMainType1.setName("差旅费用");
+            expenseMainType1.setCompanyId(company.getId());
+            ExpenseMainType expenseMainType2=new ExpenseMainType();
+            expenseMainType2.setName("外包费用");
+            expenseMainType2.setCompanyId(company.getId());
+            expenseMainTypes.add(expenseMainType);
+            expenseMainTypes.add(expenseMainType1);
+            expenseMainTypes.add(expenseMainType2);
+            expenseMainTypeService.saveBatch(expenseMainTypes);
+            List<ExpenseType> expenseTypeList = expenseTypeMapper.selectList(new QueryWrapper<ExpenseType>().eq("company_id", company.getId()).eq("main_type", 1111111));
+            expenseTypeList.forEach(et->{
+                et.setMainType(expenseMainType.getId());
+            });
+            List<ExpenseSheet> expenseSheetList = expenseSheetMapper.selectList(new QueryWrapper<ExpenseSheet>().eq("company_id", company.getId()).eq("type", 1111111));
+            expenseSheetList.forEach(es->{
+                es.setType(expenseMainType.getId());
+            });
+            List<ExpenseType> expenseTypeList1 = expenseTypeMapper.selectList(new QueryWrapper<ExpenseType>().eq("company_id", company.getId()).eq("main_type", 2222222));
+            expenseTypeList1.forEach(et->{
+                et.setMainType(expenseMainType1.getId());
+            });
+            List<ExpenseSheet> expenseSheetList1 = expenseSheetMapper.selectList(new QueryWrapper<ExpenseSheet>().eq("company_id", company.getId()).eq("type", 2222222));
+            expenseSheetList1.forEach(es->{
+                es.setType(expenseMainType1.getId());
+            });
+            List<ExpenseType> expenseTypeList2 = expenseTypeMapper.selectList(new QueryWrapper<ExpenseType>().eq("company_id", company.getId()).eq("main_type", 3333333));
+            expenseTypeList2.forEach(et->{
+                et.setMainType(expenseMainType2.getId());
+            });
+            List<ExpenseSheet> expenseSheetList2 = expenseSheetMapper.selectList(new QueryWrapper<ExpenseSheet>().eq("company_id", company.getId()).eq("type", 3333333));
+            expenseSheetList2.forEach(es->{
+                es.setType(expenseMainType2.getId());
+            });
+            if(expenseSheetList.size()>0){
+                expenseSheetService.updateBatchById(expenseSheetList);
+            }
+            if(expenseTypeList.size()>0){
+                expenseTypeService.updateBatchById(expenseTypeList);
+            }
+            if(expenseSheetList1.size()>0){
+                expenseSheetService.updateBatchById(expenseSheetList1);
+            }
+            if(expenseTypeList1.size()>0){
+                expenseTypeService.updateBatchById(expenseTypeList1);
+            }if(expenseSheetList2.size()>0){
+                expenseSheetService.updateBatchById(expenseSheetList2);
+            }
+            if(expenseTypeList2.size()>0){
+                expenseTypeService.updateBatchById(expenseTypeList2);
+            }
+
+        }
+        return new HttpRespMsg();
+    }
+
+}
+

+ 36 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ExpensePayWayController.java

@@ -0,0 +1,36 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.ExpensePayWay;
+import com.management.platform.service.ExpensePayWayService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-01-09
+ */
+@RestController
+@RequestMapping("/expense-pay-way")
+public class ExpensePayWayController {
+
+    @Resource
+    private ExpensePayWayService expensePayWayService;
+    @RequestMapping("/get")
+    public HttpRespMsg get(Integer companyId) {
+        List<ExpensePayWay> data = expensePayWayService.list(new QueryWrapper<ExpensePayWay>().eq("company_id", companyId));
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = data;
+        return msg;
+    }
+}
+

+ 155 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ExpenseSheetController.java

@@ -0,0 +1,155 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.ExpensePayWay;
+import com.management.platform.entity.ExpenseSheet;
+import com.management.platform.entity.User;
+import com.management.platform.entity.vo.SysRichFunction;
+import com.management.platform.mapper.SysFunctionMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ExpensePayWayService;
+import com.management.platform.service.ExpenseSheetService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-05-17
+ */
+@RestController
+@RequestMapping("/expense-sheet")
+public class ExpenseSheetController {
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    ExpenseSheetService expenseSheetService;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    SysFunctionMapper sysFunctionMapper;
+    @Resource
+    ExpensePayWayService expensePayWayService;
+
+    @RequestMapping("/getNextCode")
+    public HttpRespMsg getNextCode() {
+        String userId = request.getHeader("Token");
+        return expenseSheetService.getNextCode(userId);
+    }
+
+    @RequestMapping("/add")
+    public HttpRespMsg add(ExpenseSheet sheet, String items) {
+        String userId = request.getHeader("Token");
+        return expenseSheetService.add(sheet, items, userId);
+
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id) {
+        return expenseSheetService.delete(id);
+
+    }
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(ExpenseSheet sheet,Integer sendState,Integer projectId,String startDate, String endDate, @RequestParam Integer pageIndex, @RequestParam Integer pageSize) {
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全部报销单");
+        if (functionList.size() == 0) {
+            //普通员工只能看自己的
+            if (sheet.getStatus() == null) {
+                sheet.setOwnerId(user.getId());
+            }
+        }
+        sheet.setCompanyId(user.getCompanyId());
+        return expenseSheetService.queryList(sheet,projectId, startDate, endDate, pageIndex, pageSize);
+    }
+
+    @RequestMapping("/getDetail")
+    public HttpRespMsg getDetail(Integer id,Integer projectId) {
+
+        return expenseSheetService.getDetail(id,projectId);
+
+    }
+
+    @RequestMapping("/approve")
+    public HttpRespMsg approve(Integer id) {
+
+        return expenseSheetService.approve(id);
+
+    }
+
+    @RequestMapping("/approveSingleProject")
+    public HttpRespMsg approveSingleProject(Integer id) {
+        return expenseSheetService.approveSingleProject(id);
+
+    }
+
+    @RequestMapping("/denySingleProject")
+    public HttpRespMsg denySingleProject(Integer id,String denyReason) {
+
+        return expenseSheetService.denySingleProject(id,denyReason);
+
+    }
+
+    @RequestMapping("/deny")
+    public HttpRespMsg deny(Integer id,String denyReason) {
+
+        return expenseSheetService.deny(id,denyReason);
+
+    }
+
+    @RequestMapping("/importData")
+    public HttpRespMsg importData(HttpServletRequest request,MultipartFile[] files){
+        return expenseSheetService.importData(request,files);
+    }
+
+    @RequestMapping("/exportList")
+    public HttpRespMsg exportList(ExpenseSheet sheet,Integer projectId ,String startDate, String endDate) {
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全部报销单");
+        if (functionList.size() == 0) {
+            //普通员工只能看自己的
+            sheet.setOwnerId(user.getId());
+        }
+        sheet.setCompanyId(user.getCompanyId());
+        return expenseSheetService.exportList(sheet,projectId, startDate, endDate);
+    }
+
+    @RequestMapping("/editSendExpense")
+    public HttpRespMsg sendExpense(String expenseIds,Integer sendState, Integer payWayId){
+        HttpRespMsg msg=new HttpRespMsg();
+        String[] split = expenseIds.split(",");
+        List<String> asList = Arrays.asList(split);
+        List<Integer> ids = asList.stream().map(i -> Integer.parseInt(i)).collect(Collectors.toList());
+        ids.add(-1);
+        ExpensePayWay payway = expensePayWayService.getById(payWayId);
+        List<ExpenseSheet> expenseSheets = expenseSheetService.list(new QueryWrapper<ExpenseSheet>().in("id", ids));
+        expenseSheets.forEach(e->{
+            e.setSendState(sendState);
+            if (payway != null) {
+                e.setPayWayId(payWayId);
+                e.setPayWayName(payway.getName());
+            }
+        });
+        if(!expenseSheetService.updateBatchById(expenseSheets)){
+            msg.setError("验证失败");
+        }
+        return msg;
+    }
+}
+

+ 117 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/ExpenseTypeController.java

@@ -0,0 +1,117 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.ExpenseMainType;
+import com.management.platform.entity.ExpenseType;
+import com.management.platform.entity.User;
+import com.management.platform.mapper.ExpenseItemMapper;
+import com.management.platform.mapper.ExpenseTypeMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ExpenseMainTypeService;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-06-18
+ */
+@RestController
+@RequestMapping("/expense-type")
+public class ExpenseTypeController {
+    @Resource
+    private ExpenseTypeMapper expenseTypeMapper;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private ExpenseItemMapper expenseItemMapper;
+    @Resource
+    private ExpenseMainTypeService expenseMainTypeService;
+
+    @RequestMapping("/getList")
+    public HttpRespMsg getList() {
+        User user = userMapper.selectById(request.getHeader("token"));
+        HttpRespMsg msg = new HttpRespMsg();
+        List<ExpenseType> expenseTypeList = expenseTypeMapper.selectList(new QueryWrapper<ExpenseType>().eq("company_id", user.getCompanyId()).orderByAsc("main_type"));
+        List<ExpenseMainType> expenseMainTypes = expenseMainTypeService.list(new QueryWrapper<ExpenseMainType>().eq("company_id", user.getCompanyId()).or().eq("is_system",1));
+        expenseTypeList.forEach(re->{
+            Optional<ExpenseMainType> first = expenseMainTypes.stream().filter(et -> et.getId().equals(re.getMainType())).findFirst();
+            if(first.isPresent()){
+                re.setExpenseMainTypeName(first.get().getName());
+            }
+        });
+        msg.data=expenseTypeList;
+        return msg;
+    }
+
+    @RequestMapping("/addOrMod")
+    public HttpRespMsg addOrMod(ExpenseType setting) {
+        HttpRespMsg msg = new HttpRespMsg();
+        if (StringUtils.isEmpty(setting.getTypeName())) {
+            //msg.setError("名称不能为空");
+            msg.setError(MessageUtils.message("Company.nullNameError"));
+            return msg;
+        }
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        if (setting.getId() == null) {
+            setting.setCompanyId(companyId);
+            int count = expenseTypeMapper.selectCount(new QueryWrapper<ExpenseType>().eq("type_name", setting.getTypeName()).eq("company_id", setting.getCompanyId()));
+            if (count > 0) {
+                //msg.setError("该名称已存在");
+                msg.setError(MessageUtils.message("Company.nameRepeat"));
+            } else {
+                expenseTypeMapper.insert(setting);
+                msg.data = expenseTypeMapper.selectList(new QueryWrapper<ExpenseType>().eq("company_id", companyId));
+            }
+        } else {
+            int count = expenseTypeMapper.selectCount(new QueryWrapper<ExpenseType>().eq("type_name", setting.getTypeName())
+                    .eq("company_id", companyId).ne("id", setting.getId()));
+            if (count > 0) {
+                //msg.setError("该名称已存在");
+                msg.setError(MessageUtils.message("Company.nameRepeat"));
+            } else {
+                expenseTypeMapper.updateById(setting);
+                msg.data = expenseTypeMapper.selectList(new QueryWrapper<ExpenseType>().eq("company_id", companyId));
+            }
+        }
+
+        return msg;
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id) {
+        HttpRespMsg msg = new HttpRespMsg();
+        ExpenseType expenseType = expenseTypeMapper.selectById(id);
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+//        Integer cut = expenseItemMapper.selectCount(new QueryWrapper<ExpenseItem>().eq("expense_type", expenseType.getTypeName()));
+//        if(cut>0){
+//            //msg.setError("删除失败,已绑定费用报销数据");
+//            msg.setError(MessageUtils.message("expense.deleteError"));
+//            return msg;
+//        }
+        if (!expenseType.getCompanyId().equals(companyId)) {
+            //msg.setError("无权操作");
+            msg.setError(MessageUtils.message("access.operationError"));
+        } else {
+            expenseTypeMapper.deleteById(id);
+        }
+
+        return msg;
+    }
+
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/FastAccessController.java

@@ -0,0 +1,20 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2025-06-03
+ */
+@RestController
+@RequestMapping("/fast-access")
+public class FastAccessController {
+
+}
+

+ 810 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/FeishuInfoController.java

@@ -0,0 +1,810 @@
+package com.management.platform.controller;//package com.management.platform.controller;
+//
+//
+//import com.alibaba.fastjson.JSON;
+//import com.alibaba.fastjson.JSONArray;
+//import com.alibaba.fastjson.JSONObject;
+//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+//import com.google.gson.JsonObject;
+//import com.management.platform.constant.Constant;
+//import com.management.platform.entity.*;
+//import com.management.platform.entity.vo.UserVO;
+//import com.management.platform.mapper.*;
+//import com.management.platform.service.DepartmentOtherManagerService;
+//import com.management.platform.service.FeishuInfoService;
+//import com.management.platform.service.SysRoleService;
+//import com.management.platform.service.UserService;
+//import com.management.platform.service.impl.FeishuInfoServiceImpl;
+//import com.management.platform.util.*;
+//import com.taobao.api.ApiException;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.beans.BeanUtils;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.http.*;
+//import org.springframework.util.StringUtils;
+//import org.springframework.web.bind.annotation.*;
+//
+//import org.springframework.web.client.RestTemplate;
+//
+//import javax.annotation.Resource;
+//import javax.servlet.http.HttpServletRequest;
+//import javax.servlet.http.HttpServletResponse;
+//import java.io.IOException;
+//import java.io.PrintWriter;
+//import java.time.LocalDateTime;
+//import java.time.ZoneOffset;
+//import java.util.*;
+//import java.util.stream.Collectors;
+//
+///**
+// * <p>
+// *  前端控制器
+// * </p>
+// *
+// * @author Seyason
+// * @since 2023-02-27
+// */
+//@RestController
+//@RequestMapping("/feishu-info")
+//@Slf4j
+//public class FeishuInfoController {
+//
+//    @Resource
+//    private FeishuInfoService feishuInfoService;
+//    @Resource
+//    private FeishuInfoMapper feishuInfoMapper;
+//    @Resource
+//    private CompanyMapper companyMapper;
+//    @Resource
+//    private TimeTypeMapper timeTypeMapper;
+//    @Resource
+//    private SysRoleService sysRoleService;
+//    @Resource
+//    private ProjectBasecostSettingMapper projectBasecostSettingMapper;
+//    @Resource
+//    private CompanyReportMapper companyReportMapper;
+//    @Resource
+//    private DepartmentFeishuMapper departmentFeishuMapper;
+//    @Resource
+//    private DepartmentMapper departmentMapper;
+//    @Resource
+//    private SysRoleMapper sysRoleMapper;
+//    @Resource
+//    private UserService userService;
+//    @Resource
+//    private UserMapper userMapper;
+//    @Resource
+//    private AuditWorkflowTimeSettingMapper auditWorkflowTimeSettingMapper;
+//    @Resource
+//    private SysFunctionMapper sysFunctionMapper;
+//    @Resource
+//    private SysRoleFunctionMapper sysRoleFunctionMapper;
+//    @Resource
+//    private SysRoleModuleMapper sysRoleModuleMapper;
+//    @Resource
+//    private SysModuleMapper sysModuleMapper;
+//    @Resource
+//    private TaskGroupMapper taskGroupMapper;
+//    @Resource
+//    private ProjectAuditorMapper projectAuditorMapper;
+//    @Resource
+//    DepartmentOtherManagerService departmentOtherManagerService;
+//
+//
+//    /**
+//     * 初始化内部应用的系统数据
+//     * @return
+//     */
+//    @RequestMapping("/initSystem")
+//    public HttpRespMsg initSystem(@RequestBody  String json) throws Exception {
+//        Map map = JSONObject.parseObject(json, Map.class);
+//        //初始化数据生成公司
+//        System.out.println("========接收到initSystem请求===appid="+map.get("appId"));
+//        HttpRespMsg msg = new HttpRespMsg();
+//        //查找公司对应的记录是否已经添加
+//        FeishuInfo feishuInfo = feishuInfoMapper.selectOne(new QueryWrapper<FeishuInfo>().eq("app_id",map.get("appId")));
+//        if (feishuInfo == null) {
+//            msg.setError("请在feishu_info表中增加appid:" + map.get("appId"));
+//        } else if (feishuInfo.getCompanyId() != null) {
+//            //msg.setError("companyId已存在,如需重新初始化请先重置company_dingding中该条数据的companyId为null");
+//            msg.setError("companyId已存在,如需重新初始化请先重置feishu_info中该条数据的companyId为null");
+//        } else {
+//            /*todo 根据appId 获取企业信息*/
+//            JSONObject corpInfo = feishuInfoService.getCorpInfo(feishuInfo);
+//            String corpName = corpInfo.getString("name");
+//            String corpId = corpInfo.getString("display_id");
+//            String corpTag = corpInfo.getString("tenant_tag");
+//            corpInfo.getString("tenant_key");
+//            Company company = new Company().setCompanyName(corpName)
+//                    .setExpirationDate(LocalDateTime.now().plusDays(15));
+//            company.setPackageWorktime(1);
+//            companyMapper.insert(company);
+//            feishuInfo.setCorpid(corpId);
+//            feishuInfo.setCorpName(corpName);
+//            feishuInfo.setCompanyId(company.getId());
+//            LocalDateTime now = LocalDateTime.now();
+//            now = now.plusSeconds(7200);
+//            feishuInfo.setExpireTime(now);
+//            feishuInfoMapper.updateById(feishuInfo);
+//            //生成工作时长
+//            TimeType timeType = new TimeType();
+//            timeType.setCompanyId(company.getId());
+//            timeType.setFinanceJobnumEnabled(1);//启用工号来导入财务匹配
+//            timeType.setProjectManDay(1);
+//            timeTypeMapper.insert(timeType);
+//            SysRole smanager = sysRoleService.generateDefaultRoles(company.getId());
+//            //生成项目的成本基线默认条目
+//            String[] array = Constant.DEFAULT_BASE_COST_ITEMS;
+//            for (String baseItem : array) {
+//                ProjectBasecostSetting setting = new ProjectBasecostSetting();
+//                setting.setName(baseItem);
+//                setting.setCompanyId(company.getId());
+//                projectBasecostSettingMapper.insert(setting);
+//            }
+//            //todo: 生成项目报表服务默认条目
+//            Integer[] arrayInteger=new Integer[]{1,2,3,4,7};
+//            for (Integer integerItem : arrayInteger) {
+//                CompanyReport companyReport=new CompanyReport();
+//                companyReport.setCompanyId(company.getId());
+//                companyReport.setReportFormId(integerItem);
+//                companyReportMapper.insert(companyReport);
+//            }
+//            //获取应用可用范围内的部门
+//            Map<String, Object> availableRange = feishuInfoService.getAvailableRange(feishuInfo, null);
+//            JSONArray deptArray = (JSONArray) availableRange.get("department_ids");
+//            JSONArray departmentInfoArrays=new JSONArray();
+//            for (int i = 0; i < deptArray.size(); i++) {
+//                String dpId = deptArray.getString(i);
+//                JSONArray departmentInfo = feishuInfoService.getDepartmentInfo(feishuInfo, dpId);
+//                if(departmentInfo!=null&&departmentInfo.size()>0){
+//                    departmentInfoArrays.addAll(departmentInfo);
+//                }
+//                JSONArray subDepartmentList =getSubDepartmentList(feishuInfo,dpId);
+//                if(subDepartmentList!=null&&subDepartmentList.size()>0){
+//                    departmentInfoArrays.addAll(subDepartmentList);
+//                }
+//            }
+//            for (int j = 0; j < departmentInfoArrays.size(); j++) {
+//                JSONObject ob = departmentInfoArrays.getJSONObject(j);
+//                String departmentName = String.valueOf(ob.get("name"));
+//                System.out.println("synchronizationDP========="+departmentName);
+//                String departmentId = String.valueOf(ob.getString("department_id"));
+//                String openDepartmentId = String.valueOf(ob.getString("open_department_id"));
+//                String departmentParentId =String.valueOf(ob.getString("parent_department_id"));
+//                Integer cut = departmentFeishuMapper.selectCount(new QueryWrapper<DepartmentFeishu>().eq("corpid",corpId).eq("feishu_deptid",departmentId));
+//                if(cut==0&&!departmentId.equals("0")){
+//                    System.out.println("join===========");
+//                    DepartmentFeishu departmentFeishu=new DepartmentFeishu();
+//                    departmentFeishu.setCorpid(corpId)
+//                            .setName(departmentName)
+//                            .setFeishuParentid(departmentParentId)
+//                            .setFeishuDeptid(departmentId)
+//                            .setFeishuOpenDeptid(openDepartmentId);
+//                    Department department = new Department();
+//                    department.setCompanyId(company.getId());
+//                    department.setDepartmentName(departmentName);
+//                    department.setFeishuDeptid(openDepartmentId);
+//                    departmentMapper.insert(department);
+//                    departmentFeishu.setSysDeptid(department.getDepartmentId());
+//                    departmentFeishuMapper.insert(departmentFeishu);
+//                }
+//            }
+//            SysRole role = sysRoleMapper.selectOne(new QueryWrapper<SysRole>().eq("company_id", company.getId()).eq("rolename","普通员工"));
+//            List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", company.getId()));
+//            List<DepartmentFeishu> departmentFeishuList = departmentFeishuMapper.selectList(new QueryWrapper<DepartmentFeishu>().eq("corpid", corpId));
+//            List<User> userList=new ArrayList<>();
+//            for (DepartmentFeishu departmentFeishu : departmentFeishuList) {
+//                Optional<Department> first = departmentList.stream().filter(dl -> dl.getDepartmentId().equals(departmentFeishu.getSysDeptid())).findFirst();
+//                //获取到当前部门的上级部门
+//                Optional<DepartmentFeishu> wx = departmentFeishuList.stream().filter(dl -> dl.getFeishuOpenDeptid().equals(departmentFeishu.getFeishuParentid())).findFirst();
+//                if(first.isPresent()){
+//                    if(wx.isPresent()){
+//                        Optional<Department> dp = departmentList.stream().filter(dl -> dl.getDepartmentId().equals(wx.get().getSysDeptid())).findFirst();
+//                        if(dp.isPresent()){
+//                            first.get().setSuperiorId(dp.get().getDepartmentId());
+//                            departmentMapper.updateById(first.get());
+//                        }
+//                    }
+//                }
+//                //处理部门下的人员
+//                JSONArray userInfoWithDepartment=feishuInfoService.getUserInfoWithDepartment(feishuInfo,departmentFeishu.getFeishuOpenDeptid(),null);
+//                for (int m=0;m<userInfoWithDepartment.size(); m++) {
+//                    JSONObject userJson = userInfoWithDepartment.getJSONObject(m);
+//                    String curUserid = userJson.getString("user_id");
+//                    String openUserid = userJson.getString("open_id");
+//                    if(!userJson.getJSONObject("status").getBoolean("is_activated")){
+//                        continue;
+//                    }
+//                    List<String> departments = (List<String>) userJson.get("department_ids");
+//                    System.out.println("user info======:"+userJson.toString());
+//                    //不存在的人员, 进行插入
+//                    User user = new User();
+//                    //在当前部门下的员工
+//                    user.setId(SnowFlake.nextId()+"")
+//                            .setRoleId(role.getId())//默认普通员工
+//                            .setRoleName(role.getRolename())
+//                            .setCompanyId(company.getId())
+//                            .setName(userJson.getString("name"))
+//                            .setFeishuUserid(openUserid)
+//                            .setColor(ColorUtil.randomColor())
+//                            .setJobNumber(curUserid)
+//                            .setPassword(MD5Util.getPassword("000000"))
+//                            .setFeishuDeptid(departmentFeishu.getFeishuDeptid());
+//                    String max = departments.get(0);
+//                    Optional<DepartmentFeishu> dpFs = departmentFeishuList.stream().filter(dl -> dl.getFeishuOpenDeptid().equals(max)).findFirst();
+//                    if(dpFs.isPresent()){
+//                        Optional<Department> dp = departmentList.stream().filter(dl -> dl.getDepartmentId().equals(dpFs.get().getSysDeptid())).findFirst();
+//                        if(dp.isPresent()){
+//                            user.setDepartmentName(dp.get().getDepartmentName());
+//                            user.setDepartmentId(dp.get().getDepartmentId());
+//                            user.setDepartmentCascade(convertDepartmentIdToCascade(dp.get().getDepartmentId(),departmentList));
+//                        }
+//                    }
+//                    boolean b = userList.stream().anyMatch(ul ->ul.getFeishuUserid()!=null&&ul.getFeishuUserid().equals(user.getFeishuUserid()));
+//                    if(!b){
+//                        userList.add(user);
+//                    }
+//                }
+//            }
+//            //获取应用可用范围内的人员
+//            JSONArray userArray = (JSONArray) availableRange.get("user_ids");
+//            for (int i = 0; i < userArray.size(); i++) {
+//                String userId = userArray.getString(i);
+//                JSONObject userInfo = feishuInfoService.getUserInfo(feishuInfo, userId);
+//                List<String> departments = (List<String>) userInfo.get("department_ids");
+//                //不存在的人员, 进行插入
+//                User user = new User();
+//                //在当前部门下的员工
+//                String max = departments.get(0);
+//                user.setId(SnowFlake.nextId()+"")
+//                        .setRoleId(role.getId())//默认普通员工
+//                        .setRoleName(role.getRolename())
+//                        .setCompanyId(company.getId())
+//                        .setName(userInfo.getString("name"))
+//                        .setFeishuUserid(userInfo.getString("open_id"))
+//                        .setColor(ColorUtil.randomColor())
+//                        .setJobNumber(userInfo.getString("user_id"))
+//                        .setPassword(MD5Util.getPassword("000000"))
+//                        .setFeishuDeptid(max);
+//                Optional<DepartmentFeishu> dpFs = departmentFeishuList.stream().filter(dl -> dl.getFeishuDeptid().equals(max)).findFirst();
+//                if(dpFs.isPresent()){
+//                    Optional<Department> dp = departmentList.stream().filter(dl -> dl.getDepartmentId().equals(dpFs.get().getSysDeptid())).findFirst();
+//                    user.setDepartmentName(dp.get().getDepartmentName());
+//                    user.setDepartmentId(dp.get().getDepartmentId());
+//                    user.setDepartmentCascade(convertDepartmentIdToCascade(dp.get().getDepartmentId(),departmentList));
+//                }
+//                boolean b = userList.stream().anyMatch(ul ->ul.getFeishuUserid()!=null&&ul.getFeishuUserid().equals(user.getFeishuUserid()));
+//                if(!b){
+//                    userList.add(user);
+//                }
+//            }
+//            System.out.println("resutlList========="+userList);
+//            if(map.get("managerName")!=null){
+//                userList.forEach(ul->{
+//                    if(ul.getName().equals(map.get("managerName"))){
+//                        ul.setRoleName("超级管理员").setRoleId(smanager.getId());
+//                    }
+//                });
+//            }
+//
+//            userService.saveBatch(userList);
+//        }
+//        return msg;
+//    }
+//
+//    private JSONArray getSubDepartmentList(FeishuInfo feishuInfo, String dpId) {
+//        JSONArray result=new JSONArray();
+//        JSONArray subDepartmentList = feishuInfoService.getSubDepartmentList(feishuInfo, dpId, null);
+//        result.addAll(subDepartmentList);
+//        if(subDepartmentList!=null&&subDepartmentList.size()>0){
+//            for (int i = 0; i < subDepartmentList.size(); i++) {
+//                JSONObject ob = subDepartmentList.getJSONObject(i);
+//                if(ob.getString("open_department_id")!=null){
+//                    JSONArray array = getSubDepartmentList(feishuInfo,ob.getString("open_department_id"));
+//                    result.addAll(array);
+//                }
+//            }
+//        }
+//        return  result;
+//    }
+//
+//    //将部门id转换为部门层级
+//    private String convertDepartmentIdToCascade(Integer id, List<Department> allDeptList) {
+//        StringBuilder cascade = new StringBuilder();
+//        if (id == 0) {
+//            cascade.append("0");
+//        } else {
+//            cascade.append(id);
+//            id = findById(id, allDeptList).getSuperiorId();
+//            while (id != null) {
+//                cascade.append(",").append(id);
+//                id = findById(id, allDeptList).getSuperiorId();
+//            }
+//        }
+//        return cascade.toString();
+//    }
+//
+//    private Department findById(int id, List<Department> allList) {
+//        return allList.stream().filter(all->all.getDepartmentId().intValue() == id).findFirst().get();
+//    }
+//
+//
+//
+//
+//    @RequestMapping("/loginByFeishu")
+//    public HttpRespMsg loginByFeishu(String code,String appId){
+//        HttpRespMsg httpRespMsg=new HttpRespMsg();
+//        FeishuInfo feishuInfo = feishuInfoService.getOne(new QueryWrapper<FeishuInfo>().eq("app_id", appId));
+//        String url = FeishuInfoServiceImpl.GET_USER_ACCESS_TOKEN;
+//        HttpHeaders headers = new HttpHeaders();
+//        RestTemplate restTemplate = new RestTemplate();
+//        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
+//        headers.setContentType(type);
+//        headers.add("Authorization","Bearer "+feishuInfoService.getAppAccessToken(feishuInfo));
+//        JSONObject ob = new JSONObject();
+//        ob.put("grant_type", "authorization_code");
+//        ob.put("code", code);
+//        HttpEntity<JSONObject> Entity = new HttpEntity<>(ob, headers);
+//        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, Entity, String.class);
+//        String redirecUrl = null;
+//        String openUserId=null;
+//        String fsUserId=null;
+//        String corpId=null;
+//        if (responseEntity.getStatusCode() == HttpStatus.OK) {
+//            String resp = responseEntity.getBody();
+//            System.err.println(resp);
+//            JSONObject obj = JSONObject.parseObject(resp);
+//            if (obj.getIntValue("code") == 0) {
+//                System.out.println(obj.toString());
+//                JSONObject data = obj.getJSONObject("data");
+//                fsUserId = data.getString("user_id");
+//                openUserId = data.getString("open_id");
+//                corpId = data.getString("tenant_key");
+//            }
+//        }
+//        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("feishu_userid", openUserId));
+//        Integer companyId = 0;
+//        if (userList.size() > 0) {
+//            //该用户已存在
+//            User curUser = userList.get(0);
+//            System.out.println("找到用户corpFeishuUserid=="+curUser.getFeishuUserid());
+//            companyId = curUser.getCompanyId();
+//            String userId = curUser.getId();
+//            if (StringUtils.isEmpty(userId) || userId.length() > 50) {
+//                //httpRespMsg.setError("账号不存在");
+//                httpRespMsg.setError(MessageUtils.message("user.accountNoExist"));
+//                return httpRespMsg;
+//            }
+//            User user = userMapper.selectById(userId);
+//            if (user == null) {
+//                //httpRespMsg.setError("账号不存在");
+//                httpRespMsg.setError(MessageUtils.message("user.accountNoExist"));
+//                return httpRespMsg;
+//            }
+//            if (user.getIsActive() == 0) {
+//                //httpRespMsg.setError("该账号已停用");
+//                httpRespMsg.setError(MessageUtils.message("user.accountDeactivation"));
+//                return httpRespMsg;
+//            }
+//            //查看该公司非会员公司,只能允许试用三天,超时不可登录
+//            Company company = companyMapper.selectOne(new QueryWrapper<Company>().eq("id", user.getCompanyId()));
+//            //公司未办理会员
+//            if (null != company.getExpirationDate()) {
+//                if (0 == company.getSetMeal()) {
+//                    //未办理会员
+//                    if (company.getExpirationDate().isBefore(LocalDateTime.now())) {
+//                        //httpRespMsg.setError("账号试用已到期,请联系客服。");
+//                        httpRespMsg.setError(MessageUtils.message("user.accountExpired"));
+//                        return httpRespMsg;
+//                    }
+//                } else {
+//                    if (company.getExpirationDate().isBefore(LocalDateTime.now())) {
+//                        //httpRespMsg.setError("账号会员已到期,请联系客服。");
+//                        httpRespMsg.setError(MessageUtils.message("user.memberExpired"));
+//                        return httpRespMsg;
+//                    }
+//                }
+//            }
+//            UserVO userVO = new UserVO().setCompanyName(company.getCompanyName());
+//            userVO.setCompany(company);
+//            BeanUtils.copyProperties(user, userVO);
+//            //还要多返回一个公司名字
+//            userVO.setPassword("");
+//            LocalDateTime remainingTime = company.getExpirationDate() == null ? LocalDateTime.now() : company.getExpirationDate();
+//            userVO.setRemainingTime(remainingTime.toInstant(ZoneOffset.of("+8")).toEpochMilli() -
+//                    LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli());
+//            //检测是否是项目经理,项目经理有审核功能权限
+//            userVO.setLeader(judgeIsLeader(userVO.getId()));
+//            userVO.setTimeType(timeTypeMapper.selectById(company.getId()));
+//            List<Department> manageDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", userVO.getId()));
+//            List<Integer> deptIds = manageDeptList.stream().map(Department::getDepartmentId).collect(Collectors.toList());
+//            int num = 0;
+//            if (deptIds.size() > 0) {
+//                num = auditWorkflowTimeSettingMapper.selectCount(new QueryWrapper<AuditWorkflowTimeSetting>().in("audit_dept_id", deptIds));
+//            }
+//            userVO.setHasAuditDept(num>0);
+//            //获取当前角色的权限菜单
+//            setUserRoleMenu(userVO);
+//            httpRespMsg.data = userVO;
+//            return httpRespMsg;
+//        }else httpRespMsg.setError("飞书用户未开通");
+//        return httpRespMsg;
+//    }
+//
+//    private boolean judgeIsLeader(String userId) {
+//        int cnt = projectAuditorMapper.selectCount(new QueryWrapper<ProjectAuditor>().eq("auditor_id", userId));
+//        return cnt>0;
+//    }
+//
+//    public void setUserRoleMenu(UserVO user) {
+//        Integer roleId = user.getRoleId();
+//        //获取公司的套餐
+//        Company company = companyMapper.selectById(user.getCompanyId());
+//        TimeType timeType = timeTypeMapper.selectById(company.getId());
+//        //按照公司开通的模块进行匹配
+//        QueryWrapper<SysModule> queryWrapper = new QueryWrapper<SysModule>().eq("package_time", 1);
+//        if (company.getPackageProject() == 1) {
+//            queryWrapper.or().eq("package_project", 1);
+//        }
+//        if (company.getPackageOa() == 1) {
+//            queryWrapper.or().eq("package_oa", 1);
+//        }
+//        if (company.getPackageExpense() == 1) {
+//            queryWrapper.or().eq("package_expense", 1);
+//        }
+//        if (company.getPackageCustomer() == 1) {
+//            queryWrapper.or().eq("package_customer", 1);
+//        }
+//        if (company.getPackageEngineering() == 1) {
+//            queryWrapper.or().eq("package_engineering", 1);
+//        }
+//        if (company.getPackageContract() == 1) {
+//            queryWrapper.or().eq("package_contract", 1);
+//        }
+//        if (company.getPackageEtimecard()== 1) {
+//            queryWrapper.or().eq("package_etimecard", 1);
+//        }
+//        if (company.getPackageFinance() == 1) {
+//            queryWrapper.or().eq("package_finance", 1);
+//        }
+//        if (company.getPackageProvider() == 1) {
+//            queryWrapper.or().eq("package_provider", 1);
+//        }
+//        if (timeType.getReportWorkflow() == 1) {
+//            queryWrapper.or().eq("report_workflow", 1);
+//        }
+//        if (timeType.getNeedDeptAudit() == 1) {
+//            queryWrapper.or().eq("need_dept_audit", 1);
+//        }
+//
+//        queryWrapper.orderByAsc("orderitem");
+//
+//        //返回菜单
+//        List<SysRoleModule> rModules = sysRoleModuleMapper.selectList(new QueryWrapper<SysRoleModule>().eq("role_id", roleId));
+//        List<Integer> ids = rModules.stream().map(SysRoleModule::getModuleId).collect(Collectors.toList());
+//        //项目报告审核模块,如果参与日报的审核,需要自动加上, 或者担任任务分组负责人
+//        if (user.isLeader() || user.isHasAuditDept() || (company.getPackageProject() == 1 && taskGroupMapper.selectCount(new QueryWrapper<TaskGroup>().eq("incharger_id", user.getId())) > 0)) {
+//            SysModule projectAuditModule = sysModuleMapper.selectOne(new QueryWrapper<SysModule>().eq("name", "项目报告审核"));
+//            if (!ids.contains(projectAuditModule.getId())) {
+//                ids.add(projectAuditModule.getId());
+//            }
+//        }
+//
+//        List<SysModule> moduleList = sysModuleMapper.selectList(queryWrapper);
+//
+//        //过滤一下,这个角色选中的模块
+//        moduleList = moduleList.stream().filter(m->ids.contains(m.getId())).collect(Collectors.toList());
+//        if (company.getPackageEngineering() == 1) {
+//            //生成虚拟的两个审核放进去
+//            SysModule proModule = new SysModule();
+//            proModule.setName("专业审核");
+//            proModule.setPath("/reviewProfession");
+//            proModule.setId(0);
+//            moduleList.add(1,proModule);
+//            SysModule deptModule = new SysModule();
+//            deptModule.setName("部门审核");
+//            deptModule.setPath("/reviewDepartment");
+//            deptModule.setId(0);
+//            moduleList.add(2,deptModule);
+//        }
+//        //开启了自定义日报列表的情况下,需要菜单上有
+//        if (timeType.getCustomDegreeActive() == 1 && moduleList.stream().anyMatch(mod->mod.getName().equals("系统基础设置"))) {
+//            SysModule centerManageModule = new SysModule();
+//            //centerManageModule.setName(timeType.getCustomDegreeName()+"管理");
+//            centerManageModule.setName(timeType.getCustomDegreeName()+MessageUtils.message("project.manage"));
+//            centerManageModule.setPath("/centerManage");
+//            centerManageModule.setId(0);
+//            //加到组织架构前面
+//            int findIndex = 0;
+//            for (int i=0;i<moduleList.size(); i++) {
+//                if (moduleList.get(i).getName().equals("组织架构") || moduleList.get(i).getName().equals("基础数据管理")) {
+//                    findIndex = i;
+//                    break;
+//                }
+//            }
+//            moduleList.add(findIndex,centerManageModule);
+//        }
+//        //组装层级关系,默认只有两级
+//        List<SysModule> menuList = new ArrayList<>();
+//        for (SysModule module : moduleList) {
+//            if (module.getParentId() == null) {
+//                menuList.add(module);
+//            }
+//        }
+//        for (SysModule mainMenu : menuList) {
+//            List<SysModule> list = moduleList.stream().filter(mod -> mainMenu.getId().equals(mod.getParentId())).collect(Collectors.toList());
+//            mainMenu.setChildren(list);
+//        }
+//
+//        user.setModuleList(menuList);
+//        //此处返回权限集合
+//        List<Integer> functionIdList = new ArrayList<>();
+//        //获取角色所有的功能id
+//        List<SysRoleFunction> funList = sysRoleFunctionMapper.selectList(new QueryWrapper<SysRoleFunction>()
+//                .eq("role_id", roleId));
+//        for (SysRoleFunction sysRoleFunction : funList) {
+//            functionIdList.add(sysRoleFunction.getFunctionId());
+//        }
+//        //获取当前公司开启了得报表
+//        List<CompanyReport> companyReportList = companyReportMapper.selectList(new QueryWrapper<CompanyReport>().eq("company_id", company.getId()));
+//        List<Integer> formIds = companyReportList.stream().map(CompanyReport::getReportFormId).collect(Collectors.toList());
+//        if (functionIdList.size() > 0) {
+//            //根据功能id获取可用的操作代码
+//            if (formIds.size() == 0) {
+//                formIds.add(-1);
+//            }
+//            QueryWrapper<SysFunction> functionQueryWrapper = new QueryWrapper<SysFunction>().and(wrapper1->wrapper1.isNull("report_form_id").or().in("report_form_id",formIds)).and(wrapper->{
+//                wrapper.eq("package_time", 1);
+//                if (company.getPackageProject() == 1) {
+//                    wrapper.or().eq("package_project", 1);
+//                }
+//                if (company.getPackageOa() == 1) {
+//                    wrapper.or().eq("package_oa", 1);
+//                }
+//                if (company.getPackageExpense() == 1) {
+//                    wrapper.or().eq("package_expense", 1);
+//                }
+//                if (company.getPackageCustomer() == 1) {
+//                    wrapper.or().eq("package_customer", 1);
+//                }
+//                if (company.getPackageEngineering() == 1) {
+//                    wrapper.or().eq("package_engineering", 1);
+//                }
+//                if (company.getPackageContract() == 1) {
+//                    wrapper.or().eq("package_contract", 1);
+//                }
+//                if (company.getPackageEtimecard()== 1) {
+//                    wrapper.or().eq("package_etimecard", 1);
+//                }
+//                if (company.getPackageFinance() == 1) {
+//                    wrapper.or().eq("package_finance", 1);
+//                }
+////            if (company.getPackageProvider() == 1) {
+////                wrapper.or().eq("package_provider", 1);
+////            }
+//                if (timeType.getSyncCorpwxTime() == 1) {
+//                    wrapper.or().eq("sync_corpwx_time", 1);
+//                }
+//                //开通财务审核功能的
+//                if (timeType.getFinanceAudit() == 1) {
+//                    wrapper.or().eq("finance_audit", 1);
+//                }
+//                return wrapper;
+//            });
+//            functionQueryWrapper.orderByAsc("seq");
+//            List<SysFunction> functionList = sysFunctionMapper.selectList(functionQueryWrapper);
+//            functionList = functionList.stream().filter(f->functionIdList.contains(f.getId())).collect(Collectors.toList());
+//            user.setFunctionList(functionList);
+//        } else {
+//            user.setFunctionList(new ArrayList<>());
+//        }
+//    }
+//
+//
+//    @RequestMapping("/initSuperManager")
+//    public HttpRespMsg initSuperManager(String corpid, String name) {
+//        return feishuInfoService.initSuperManager(corpid, name);
+//    }
+//
+//    //"企业微信数据回调"
+//    @RequestMapping(value = "/dataCallback", method = RequestMethod.POST)
+//    @ResponseBody
+//    public void dataCallback(@RequestBody JSONObject jsonParam, HttpServletResponse response) throws IOException {
+//        //用于验证飞书的部分
+//        PrintWriter out = null;
+//        JSONObject jsonObject=new JSONObject();
+//        if(jsonParam.getString("challenge")!=null){
+//            jsonObject.put("challenge",jsonParam.getString("challenge"));
+//            //设定类容为json的格式
+//            response.setContentType("application/json;charset=UTF-8");
+//            out = response.getWriter();
+//            //写到客户端
+//            out.write(jsonObject.toJSONString());
+//            out.flush();
+//            return;
+//        }
+//        log.info("============回调参数==========="+jsonParam.toJSONString());
+//        JSONObject headerOb =jsonParam.getJSONObject("header");
+//        if(headerOb==null||headerOb.size()<=0){
+//            return;
+//        }
+//        JSONObject eventOb = jsonParam.getJSONObject("event");
+//        log.info("=========event======"+eventOb.toJSONString());
+//        String appId = headerOb.getString("app_id");
+//        log.info("========app_id========"+appId);
+//        String tenantKey = headerOb.getString("tenant_key");
+//        log.info("========tenant_key========"+tenantKey);
+//        String createTime = headerOb.getString("create_time");
+//        log.info("========create_time========"+createTime);
+//        List<FeishuInfo> feishuInfoList = feishuInfoMapper.selectList(new QueryWrapper<FeishuInfo>().eq("app_id", appId));
+//        if(feishuInfoList.size()>0){
+//            FeishuInfo feishuInfo = feishuInfoList.get(0);
+//            List<User> allUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", feishuInfo.getCompanyId()));
+//            SysRole role = sysRoleMapper.selectOne(new QueryWrapper<SysRole>().eq("company_id",feishuInfo.getCompanyId()).eq("rolename","普通员工"));
+//            //通讯录权限范围变更
+//            //todo:新增的
+//            if(eventOb!=null&&eventOb.getJSONObject("added").size()>0){
+//                JSONObject addedOb = eventOb.getJSONObject("added");
+//                //todo:处理部门
+//                JSONArray departmentArray = addedOb.getJSONArray("departments");
+//                JSONArray allNeedTodo=new JSONArray();
+//                allNeedTodo.addAll(departmentArray);
+//                for (int i = 0; i < departmentArray.size(); i++) {
+//                    JSONObject ob = departmentArray.getJSONObject(i);
+//                    JSONArray jsonArray = getSubDepartmentList(feishuInfo, ob.getString("open_department_id"));
+//                    if(jsonArray!=null&&jsonArray.size()>0){
+//                        allNeedTodo.addAll(jsonArray);
+//                    }
+//                }
+//                List<Department> departmentList=new ArrayList<>();
+//                List<DepartmentFeishu> departmentFeishuList=new ArrayList<>();
+//                for (int j = 0; j < allNeedTodo.size(); j++) {
+//                    JSONObject ob = allNeedTodo.getJSONObject(j);
+//                    String departmentName = String.valueOf(ob.get("name"));
+//                    System.out.println("synchronizationDP========="+departmentName);
+//                    String departmentId = String.valueOf(ob.getString("department_id"));
+//                    String openDepartmentId = String.valueOf(ob.getString("open_department_id"));
+//                    String departmentParentId =String.valueOf(ob.getString("parent_department_id"));
+//                    JSONArray leaders = ob.getJSONArray("leaders");
+//                    Integer cut = departmentFeishuMapper.selectCount(new QueryWrapper<DepartmentFeishu>().eq("corpid",feishuInfo.getCorpid()).eq("feishu_deptid",departmentId));
+//                    if(cut==0&&!departmentId.equals("0")){
+//                        System.out.println("join===========");
+//                        DepartmentFeishu departmentFeishu=new DepartmentFeishu();
+//                        departmentFeishu.setCorpid(feishuInfo.getCorpid())
+//                                .setName(departmentName)
+//                                .setFeishuParentid(departmentParentId)
+//                                .setFeishuDeptid(departmentId)
+//                                .setFeishuOpenDeptid(openDepartmentId);
+//                        Department department = new Department();
+//                        department.setCompanyId(feishuInfo.getCompanyId());
+//                        department.setDepartmentName(departmentName);
+//                        department.setFeishuDeptid(openDepartmentId);
+//                        departmentMapper.insert(department);
+//                        List<DepartmentOtherManager> odList=new ArrayList<>();
+//                        if(leaders!=null&&leaders.size()>0){
+//                            //todo:处理主要负责人
+//                            Optional<Object> first = leaders.stream().filter(l -> ((JSONObject) l).getIntValue("leaderType") == 1).findFirst();
+//                            if(first.isPresent()){
+//                                JSONObject firstOb = (JSONObject) first.get();
+//                                Optional<User> leaderID = allUserList.stream().filter(ul -> ul.getFeishuUserid().equals(firstOb.getString("leaderID"))).findFirst();
+//                                if(leaderID.isPresent()){
+//                                    department.setManagerId(leaderID.get().getId());
+//                                }
+//                            }
+//                            //todo:处理次要负责人
+//                            List<Object> othObs = leaders.stream().filter(l -> ((JSONObject) l).getIntValue("leaderType") == 2).collect(Collectors.toList());
+//                            for (Object othOb : othObs) {
+//                                JSONObject oth = (JSONObject) othOb;
+//                                Optional<User> leaderID = allUserList.stream().filter(ul -> ul.getFeishuUserid().equals(oth.getString("leaderID"))).findFirst();
+//                                if(leaderID.isPresent()){
+//                                    DepartmentOtherManager departmentOtherManager=new DepartmentOtherManager();
+//                                    departmentOtherManager.setCompanyId(feishuInfo.getCompanyId());
+//                                    departmentOtherManager.setDepartmentId(department.getDepartmentId());
+//                                    departmentOtherManager.setOtherManagerId(leaderID.get().getId());
+//                                    odList.add(departmentOtherManager);
+//                                }
+//                            }
+//                        }
+//                        departmentMapper.updateById(department);
+//                        departmentList.add(department);
+//                        departmentFeishu.setSysDeptid(department.getDepartmentId());
+//                        departmentFeishuMapper.insert(departmentFeishu);
+//                        departmentFeishuList.add(departmentFeishu);
+//                        departmentOtherManagerService.saveBatch(odList);
+//                    }
+//                }
+//                List<User> newUserList=new ArrayList<>();
+//                for (DepartmentFeishu departmentFeishu : departmentFeishuList) {
+//                    Optional<Department> first = departmentList.stream().filter(dl -> dl.getDepartmentId().equals(departmentFeishu.getSysDeptid())).findFirst();
+//                    //获取到当前部门的上级部门
+//                    Optional<DepartmentFeishu> wx = departmentFeishuList.stream().filter(dl -> dl.getFeishuOpenDeptid().equals(departmentFeishu.getFeishuParentid())).findFirst();
+//                    if(first.isPresent()){
+//                        if(wx.isPresent()){
+//                            Optional<Department> dp = departmentList.stream().filter(dl -> dl.getDepartmentId().equals(wx.get().getSysDeptid())).findFirst();
+//                            if(dp.isPresent()){
+//                                first.get().setSuperiorId(dp.get().getDepartmentId());
+//                                departmentMapper.updateById(first.get());
+//                            }
+//                        }
+//                    }
+//                    //处理部门下的人员
+//                    JSONArray userInfoWithDepartment=feishuInfoService.getUserInfoWithDepartment(feishuInfo,departmentFeishu.getFeishuOpenDeptid(),null);
+//                    for (int m=0;m<userInfoWithDepartment.size(); m++) {
+//                        JSONObject userJson = userInfoWithDepartment.getJSONObject(m);
+//                        String curUserid = userJson.getString("user_id");
+//                        String openUserid = userJson.getString("open_id");
+//                        if(!userJson.getJSONObject("status").getBoolean("is_activated")){
+//                            continue;
+//                        }
+//                        List<String> departments = (List<String>) userJson.get("department_ids");
+//                        System.out.println("user info======:"+userJson.toString());
+//                        boolean b = allUserList.stream().anyMatch(al -> al.getFeishuUserid() != null && al.getFeishuUserid().equals(userJson.getString("open_id")));
+//                        if(!b){
+//                            //不存在的人员, 进行插入
+//                            User user = new User();
+//                            //在当前部门下的员工
+//                            user.setId(SnowFlake.nextId()+"")
+//                                    .setRoleId(role.getId())//默认普通员工
+//                                    .setRoleName(role.getRolename())
+//                                    .setCompanyId(feishuInfo.getCompanyId())
+//                                    .setName(userJson.getString("name"))
+//                                    .setFeishuUserid(openUserid)
+//                                    .setColor(ColorUtil.randomColor())
+//                                    .setJobNumber(curUserid)
+//                                    .setPassword(MD5Util.getPassword("000000"))
+//                                    .setFeishuDeptid(departmentFeishu.getFeishuDeptid());
+//                            String max = departments.get(0);
+//                            Optional<DepartmentFeishu> dpFs = departmentFeishuList.stream().filter(dl -> dl.getFeishuOpenDeptid().equals(max)).findFirst();
+//                            if(dpFs.isPresent()){
+//                                Optional<Department> dp = departmentList.stream().filter(dl -> dl.getDepartmentId().equals(dpFs.get().getSysDeptid())).findFirst();
+//                                if(dp.isPresent()){
+//                                    user.setDepartmentName(dp.get().getDepartmentName());
+//                                    user.setDepartmentId(dp.get().getDepartmentId());
+//                                    user.setDepartmentCascade(convertDepartmentIdToCascade(dp.get().getDepartmentId(),departmentList));
+//                                }
+//                            }
+//                            boolean c = newUserList.stream().anyMatch(ul ->ul.getFeishuUserid()!=null&&ul.getFeishuUserid().equals(user.getFeishuUserid()));
+//                            if(!c){
+//                                newUserList.add(user);
+//                            }
+//                        }
+//                    }
+//                }
+//                //todo:处理人员
+//                JSONArray userArrays = addedOb.getJSONArray("users");
+//                if(userArrays!=null&&userArrays.size()>0){
+//                    for (int i = 0; i < userArrays.size(); i++) {
+//                        JSONObject userOb = userArrays.getJSONObject(i);
+//                        boolean b = allUserList.stream().anyMatch(al -> al.getFeishuUserid() != null && al.getFeishuUserid().equals(userOb.getString("open_id")));
+//                        if(!b){
+//                            //不存在的人员, 进行插入
+//                            User user = new User();
+//                            user.setId(SnowFlake.nextId()+"")
+//                                    .setRoleId(role.getId())//默认普通员工
+//                                    .setRoleName(role.getRolename())
+//                                    .setCompanyId(feishuInfo.getCompanyId())
+//                                    .setName(userOb.getString("name"))
+//                                    .setFeishuUserid(userOb.getString("open_id"))
+//                                    .setColor(ColorUtil.randomColor())
+//                                    .setJobNumber(userOb.getString("user_id"))
+//                                    .setPassword(MD5Util.getPassword("000000"));
+//                            boolean c = newUserList.stream().anyMatch(ul ->ul.getFeishuUserid()!=null&&ul.getFeishuUserid().equals(user.getFeishuUserid()));
+//                            if(!c){
+//                                newUserList.add(user);
+//                            }
+//                        }
+//                    }
+//                }
+//                if(newUserList.size()>0){
+//                    userService.saveBatch(newUserList);
+//                }
+//            }
+//            //todo:移除的
+//            if(eventOb.getJSONObject("removed")!=null){
+//
+//            }
+//        }
+//    }
+//
+//}
+//

+ 20 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/FeishuSendController.java

@@ -0,0 +1,20 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-03-02
+ */
+@RestController
+@RequestMapping("/feishu-send")
+public class FeishuSendController {
+
+}
+

+ 45 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/FinanceAuditorController.java

@@ -0,0 +1,45 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.entity.FinanceAuditor;
+import com.management.platform.service.FinanceAuditorService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-22
+ */
+@RestController
+@RequestMapping("/finance-auditor")
+public class FinanceAuditorController {
+
+    @Resource
+    private FinanceAuditorService financeAuditorService;
+    @Resource
+    private HttpServletRequest request;
+
+    @RequestMapping("/save")
+    public HttpRespMsg save(FinanceAuditor item) {
+        HttpRespMsg msg = new HttpRespMsg();
+        financeAuditorService.saveOrUpdate(item);
+        return msg;
+    }
+
+    @RequestMapping("/get")
+    public HttpRespMsg get(Integer companyId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        FinanceAuditor item = financeAuditorService.getById(companyId);
+        msg.data = item;
+        return msg;
+    }
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/FinanceCalculateController.java

@@ -0,0 +1,20 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-04-13
+ */
+@RestController
+@RequestMapping("/finance-calculate")
+public class FinanceCalculateController {
+
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/FinanceFixedcolnameController.java

@@ -0,0 +1,20 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-15
+ */
+@RestController
+@RequestMapping("/finance-fixedcolname")
+public class FinanceFixedcolnameController {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/FinanceProjectsController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-02-26
+ */
+@RestController
+@RequestMapping("/finance-projects")
+public class FinanceProjectsController {
+
+}
+

+ 198 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/FinanceTblcuscolController.java

@@ -0,0 +1,198 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.FinanceCalculate;
+import com.management.platform.entity.FinanceFixedcolname;
+import com.management.platform.entity.FinanceTblcuscol;
+import com.management.platform.mapper.FinanceCalculateMapper;
+import com.management.platform.mapper.FinanceTblcuscolMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.FinanceCalculateService;
+import com.management.platform.service.FinanceFixedcolnameService;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-12-17
+ */
+@RestController
+@RequestMapping("/finance-tblcuscol")
+public class FinanceTblcuscolController {
+
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private FinanceTblcuscolMapper financeTblcuscolMapper;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private FinanceFixedcolnameService financeFixedcolnameService;
+    @Resource
+    private FinanceCalculateMapper financeCalculateMapper;
+    @Resource
+    private FinanceCalculateService financeCalculateService;
+
+//    @RequestMapping("/get")
+//    public HttpRespMsg get(Integer companyId) {
+//        List<FinanceTblcuscol> list = financeTblcuscolMapper.selectList(new QueryWrapper<FinanceTblcuscol>().eq("company_id", companyId));
+//        HttpRespMsg msg = new HttpRespMsg();
+//        msg.data = list;
+//        return msg;
+//    }
+
+    @RequestMapping("/getAll")
+    public HttpRespMsg getAll(Integer companyId) {
+        List<FinanceTblcuscol> list = financeTblcuscolMapper.selectList(new QueryWrapper<FinanceTblcuscol>().eq("company_id", companyId));
+        HttpRespMsg msg = new HttpRespMsg();
+        FinanceFixedcolname item = financeFixedcolnameService.getFixed(companyId);
+        if (list.size() > 0) {
+            item.setField1(list.get(0).getFieldName());
+            item.setField1Calculate(list.get(0).getNeedCalculate());
+        }
+        if (list.size() > 1) {
+            item.setField2(list.get(1).getFieldName());
+            item.setField2Calculate(list.get(1).getNeedCalculate());
+        }
+        if (list.size() > 2) {
+            item.setField3(list.get(2).getFieldName());
+            item.setField3Calculate(list.get(2).getNeedCalculate());
+        }
+        if (list.size() > 3) {
+            item.setField4(list.get(3).getFieldName());
+            item.setField4Calculate(list.get(3).getNeedCalculate());
+        }
+        if (list.size() > 4) {
+            item.setField5(list.get(4).getFieldName());
+            item.setField5Calculate(list.get(4).getNeedCalculate());
+        }
+        if (list.size() > 5) {
+            item.setField6(list.get(5).getFieldName());
+            item.setField6Calculate(list.get(5).getNeedCalculate());
+        }
+        if (list.size() > 6) {
+            item.setField7(list.get(6).getFieldName());
+            item.setField7Calculate(list.get(6).getNeedCalculate());
+        }
+        msg.data = item;
+
+        return msg;
+    }
+//
+//    @RequestMapping("/getFixed")
+//    public HttpRespMsg getFixed(Integer companyId) {
+//        HttpRespMsg msg = new HttpRespMsg();
+//        msg.data = financeFixedcolnameService.getFixed(companyId);
+//        return msg;
+//    }
+
+    @RequestMapping("/save")
+    public HttpRespMsg addOrMod(FinanceFixedcolname item) {
+        String token = request.getHeader("TOKEN");
+        int companyId = userMapper.selectById(token).getCompanyId();
+        financeTblcuscolMapper.delete(new QueryWrapper<FinanceTblcuscol>().eq("company_id", companyId));
+        if (!StringUtils.isEmpty(item.getField1())) {
+            FinanceTblcuscol col = new FinanceTblcuscol();
+            col.setCompanyId(companyId);
+            col.setFieldName(item.getField1());
+            col.setNeedCalculate(item.getField1Calculate());
+            financeTblcuscolMapper.insert(col);
+        }
+        financeCalculateMapper.delete(new QueryWrapper<FinanceCalculate>().eq("company_id", companyId));
+
+
+        if (!StringUtils.isEmpty(item.getField2())) {
+            FinanceTblcuscol col = new FinanceTblcuscol();
+            col.setCompanyId(companyId);
+            col.setFieldName(item.getField2());
+            col.setNeedCalculate(item.getField2Calculate());
+            financeTblcuscolMapper.insert(col);
+        }
+
+        if (!StringUtils.isEmpty(item.getField3())) {
+            FinanceTblcuscol col = new FinanceTblcuscol();
+            col.setCompanyId(companyId);
+            col.setFieldName(item.getField3());
+            col.setNeedCalculate(item.getField3Calculate());
+            financeTblcuscolMapper.insert(col);
+        }
+
+        if (!StringUtils.isEmpty(item.getField4())) {
+            FinanceTblcuscol col = new FinanceTblcuscol();
+            col.setCompanyId(companyId);
+            col.setFieldName(item.getField4());
+            col.setNeedCalculate(item.getField4Calculate());
+            financeTblcuscolMapper.insert(col);
+        }
+
+        if (!StringUtils.isEmpty(item.getField5())) {
+            FinanceTblcuscol col = new FinanceTblcuscol();
+            col.setCompanyId(companyId);
+            col.setFieldName(item.getField5());
+            col.setNeedCalculate(item.getField5Calculate());
+            financeTblcuscolMapper.insert(col);
+        }
+
+        if (!StringUtils.isEmpty(item.getField6())) {
+            FinanceTblcuscol col = new FinanceTblcuscol();
+            col.setCompanyId(companyId);
+            col.setFieldName(item.getField6());
+            col.setNeedCalculate(item.getField6Calculate());
+            financeTblcuscolMapper.insert(col);
+        }
+
+        if (!StringUtils.isEmpty(item.getField7())) {
+            FinanceTblcuscol col = new FinanceTblcuscol();
+            col.setCompanyId(companyId);
+            col.setFieldName(item.getField7());
+            col.setNeedCalculate(item.getField7Calculate());
+            financeTblcuscolMapper.insert(col);
+        }
+
+        //存储自定义的固定字段
+        if (item.getMonthCost() != null || item.getBonus() != null || item.getAllowance() != null || item.getInsuranceInjury() != null
+            || item.getInsuranceLosejob() != null || item.getInsuranceMedical() != null || item.getInsuranceOld() != null || item.getHouseFund() != null) {
+            item.setCompanyId(companyId);
+            financeFixedcolnameService.saveOrUpdate(item);
+        }
+
+        FinanceCalculate calculate = item.toCalculateObj();
+        //存储自定义的固定字段
+        if (calculate.getMonthCostCalculate() != null || calculate.getBonusCalculate() != null || calculate.getAllowanceCalculate() != null || calculate.getInsuranceInjuryCalculate() != null
+                || calculate.getInsuranceLosejobCalculate() != null || calculate.getInsuranceMedicalCalculate() != null || calculate.getInsuranceOldCalculate() != null || calculate.getHouseFundCalculate() != null) {
+            calculate.setCompanyId(companyId);
+            financeCalculateService.saveOrUpdate(calculate);
+        }
+
+        return new HttpRespMsg();
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        int companyId = userMapper.selectById(token).getCompanyId();
+        FinanceTblcuscol financeTblcuscol = financeTblcuscolMapper.selectById(id);
+        if (financeTblcuscol.getCompanyId() == companyId) {
+            financeTblcuscolMapper.deleteById(id);
+        } else {
+            //msg.setError("无权操作");
+            msg.setError(MessageUtils.message("access.operationError"));
+        }
+        return msg;
+    }
+}
+

+ 212 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/GroupBudgetReviewController.java

@@ -0,0 +1,212 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.ProjectMapper;
+import com.management.platform.mapper.TaskGroupMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.mapper.WxCorpInfoMapper;
+import com.management.platform.service.ExcelExportService;
+import com.management.platform.service.GroupBudgetReviewService;
+import com.management.platform.service.TaskService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-12-28
+ */
+@RestController
+@RequestMapping("/group-budget-review")
+public class GroupBudgetReviewController {
+
+    @Resource
+    private GroupBudgetReviewService groupBudgetReviewService;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private TaskGroupMapper taskGroupMapper;
+    @Resource
+    private ProjectMapper projectMapper;
+    @Resource
+    private TaskService taskService;
+    @Value(value = "${upload.path}")
+    private String path;
+    @Resource
+    private WxCorpInfoMapper wxCorpInfoMapper;
+    @Resource
+    private ExcelExportService excelExportService;
+
+    @RequestMapping("/add")
+    public HttpRespMsg add(Integer groupId,Integer oldManDay,Integer changeManDay,Integer nowManDay,String remark){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        if(changeManDay==null||changeManDay==0){
+            httpRespMsg.setError("预估工时未发生变更");
+            return httpRespMsg;
+        }
+        User user = userMapper.selectById(request.getHeader("token"));
+        GroupBudgetReview groupBudgetReview=new GroupBudgetReview();
+        TaskGroup taskGroup = taskGroupMapper.selectById(groupId);
+        Project project = projectMapper.selectById(taskGroup.getProjectId());
+//        if(project.getCategory()!=null&&project.getCategory()==696){
+//            List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().select(Task::getPlanHours,Task::getGroupId).isNotNull(Task::getPlanHours).eq(Task::getGroupId, groupId));
+//            int sum = taskList.stream().mapToInt(Task::getPlanHours).sum();
+//            if(sum>((nowManDay==null?0:nowManDay)*8)){
+//                httpRespMsg.setError("任务分组["+taskGroup.getName()+"]的预估工时需大于等于已分配任务的总计划工时["+sum+"]小时");
+//                return httpRespMsg;
+//            }
+//        }
+        groupBudgetReview.setGroupId(groupId).setGroupName(taskGroup.getName())
+                .setOldManDay(oldManDay)
+                .setChangeManDay(changeManDay)
+                .setNowManDay(nowManDay)
+                .setCompanyId(user.getCompanyId())
+                .setProjectId(project.getId()).setProjectName(project.getProjectName())
+                .setCreatorId(user.getId())
+                .setCreator(user.getName())
+                .setRemark(remark);
+        if(!groupBudgetReviewService.save(groupBudgetReview)){
+            httpRespMsg.setError("验证失败");
+        }
+        return  httpRespMsg;
+    }
+
+    @RequestMapping("/check")
+    public HttpRespMsg check(Integer id,Integer checkType,String rejectReason){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        GroupBudgetReview groupBudgetReview=groupBudgetReviewService.getById(id);
+        if(rejectReason!=null&&!StringUtils.isEmpty(rejectReason)){
+            groupBudgetReview.setRejectReason(rejectReason);
+        }
+        groupBudgetReview.setStatus(checkType);
+        if(!groupBudgetReviewService.updateById(groupBudgetReview)){
+            httpRespMsg.setError("验证失败");
+            return httpRespMsg;
+        }
+        if(checkType==1){
+            //审核通过计算到任务分组的项目人天
+            Integer groupId = groupBudgetReview.getGroupId();
+            TaskGroup taskGroup = taskGroupMapper.selectById(groupId);
+            Integer manDay = taskGroup.getManDay();
+            BigDecimal bigDecimal = new BigDecimal(manDay==null?0:manDay);
+            bigDecimal=bigDecimal.add(new BigDecimal(groupBudgetReview.getChangeManDay()==null?0:groupBudgetReview.getChangeManDay()));
+            taskGroup.setManDay(bigDecimal.intValue());
+            taskGroupMapper.updateById(taskGroup);
+            //项目人天按照分组工时增加
+            Project project = projectMapper.selectById(taskGroup.getProjectId());
+            Integer day = project.getManDay();
+            day=day+groupBudgetReview.getChangeManDay();
+            project.setManDay(day);
+            projectMapper.updateById(project);
+        }
+        return  httpRespMsg;
+    }
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(String startDate,String endDate,Integer projectId,Integer status,String submitUserId){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        LambdaQueryWrapper<GroupBudgetReview> queryWrapper = new LambdaQueryWrapper<GroupBudgetReview>().eq(GroupBudgetReview::getCompanyId, companyId).orderByDesc(GroupBudgetReview::getCreateTime);
+        if(startDate!=null && endDate!=null){
+            queryWrapper.between(GroupBudgetReview::getCreateTime,startDate,endDate);
+        }
+        if(projectId!=null){
+            queryWrapper.eq(GroupBudgetReview::getProjectId,projectId);
+        }
+        if(status!=null){
+            queryWrapper.eq(GroupBudgetReview::getStatus,status-1);
+        }
+        if(!StringUtils.isEmpty(submitUserId)){
+            queryWrapper.eq(GroupBudgetReview::getCreatorId,submitUserId);
+        }
+        List<GroupBudgetReview> list = groupBudgetReviewService.list(queryWrapper);
+        httpRespMsg.setData(list);
+        return httpRespMsg;
+    }
+
+    @RequestMapping("/export")
+    public HttpRespMsg export(String startDate,String endDate,Integer projectId,Integer status,String submitUserId){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
+        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, companyId));
+        LambdaQueryWrapper<GroupBudgetReview> queryWrapper = new LambdaQueryWrapper<GroupBudgetReview>().eq(GroupBudgetReview::getCompanyId, companyId).orderByDesc(GroupBudgetReview::getCreateTime);
+        if(startDate!=null && endDate!=null){
+            queryWrapper.between(GroupBudgetReview::getCreateTime,startDate,endDate);
+        }
+        if(projectId!=null){
+            queryWrapper.eq(GroupBudgetReview::getProjectId,projectId);
+        }
+        if(status!=null){
+            queryWrapper.eq(GroupBudgetReview::getStatus,status);
+        }
+        if(!StringUtils.isEmpty(submitUserId)){
+            queryWrapper.eq(GroupBudgetReview::getCreatorId,submitUserId);
+        }
+        List<GroupBudgetReview> list = groupBudgetReviewService.list(queryWrapper);
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        titleList.add("项目名称");
+        titleList.add("分组名称");
+        titleList.add("提交人");
+        titleList.add("提交时间");
+        titleList.add("变更前预估工时");
+        titleList.add("预估工时变更");
+        titleList.add("变更后预估工时");
+        titleList.add("变更理由");
+        titleList.add("驳回理由");
+        titleList.add("状态");
+        dataList.add(titleList);
+        for (GroupBudgetReview groupBudgetReview : list) {
+            List<String> item=new ArrayList<>();
+            item.add(groupBudgetReview.getProjectName());
+            item.add(groupBudgetReview.getGroupName());
+            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                Optional<User> first = userList.stream().filter(u -> u.getId().equals(groupBudgetReview.getCreatorId())).findFirst();
+                if(first.isPresent()){
+                    item.add("$userName="+first.get().getName()+"$");
+                }else {
+                    item.add("");
+                }
+            }
+            item.add(df.format(groupBudgetReview.getCreateTime()));
+            item.add(String.valueOf(groupBudgetReview.getOldManDay()*8)+"h");
+            item.add(String.valueOf(groupBudgetReview.getChangeManDay()*8)+"h");
+            item.add(String.valueOf(groupBudgetReview.getNowManDay()*8)+"h");
+            item.add(String.valueOf(groupBudgetReview.getRemark()));
+            item.add(String.valueOf(groupBudgetReview.getRejectReason()==null?"":groupBudgetReview.getRejectReason()));
+            item.add(groupBudgetReview.getStatus()==0?"待审核":groupBudgetReview.getStatus()==1?"审核通过":"已驳回");
+            dataList.add(item);
+        }
+        String fileUrlSuffix = "预估工时审核表_" + System.currentTimeMillis();
+        try {
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileUrlSuffix,dataList,path);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return httpRespMsg;
+    }
+
+
+
+}
+

+ 47 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/GroupParticipatorController.java

@@ -0,0 +1,47 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.GroupParticipator;
+import com.management.platform.service.GroupParticipatorService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-04-21
+ */
+@RestController
+@RequestMapping("/group-participator")
+public class GroupParticipatorController {
+    @Resource
+    private GroupParticipatorService groupParticipatorService;
+
+    @RequestMapping("/save")
+    public HttpRespMsg save(Integer groupId, String idsJson) {
+        return groupParticipatorService.save(groupId, idsJson);
+    }
+
+    @RequestMapping("/get")
+    public HttpRespMsg get(Integer groupId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        List<GroupParticipator> gpList = groupParticipatorService.list(new QueryWrapper<GroupParticipator>().eq("group_id", groupId));
+        msg.data = gpList.stream().map(GroupParticipator::getUserId).collect(Collectors.toList());
+        return msg;
+    }
+
+    @RequestMapping("/importData")
+    public HttpRespMsg importData(){
+        return null;
+    }
+}
+

+ 125 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/GroupTemplateController.java

@@ -0,0 +1,125 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.GroupTemplate;
+import com.management.platform.entity.GroupTmpstages;
+import com.management.platform.entity.OperationRecord;
+import com.management.platform.entity.User;
+import com.management.platform.service.GroupTemplateService;
+import com.management.platform.service.GroupTmpstagesService;
+import com.management.platform.service.OperationRecordService;
+import com.management.platform.service.UserService;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-05-05
+ */
+@RestController
+@RequestMapping("/group-template")
+public class GroupTemplateController {
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private GroupTemplateService groupTemplateService;
+    @Resource
+    private GroupTmpstagesService groupTmpstagesService;
+    @Resource
+    private UserService userService;
+    @Resource
+    private OperationRecordService operationRecordService;
+
+    @RequestMapping("/initData")
+    public HttpRespMsg initData() {
+        if (groupTemplateService.count() == 0) {
+            //系统中没有数据,需要初始化
+            //String[] templateNames = {"工程设计","软硬件研发","客服工单处理"};
+            String[] templateNames = {MessageUtils.message("stages.engineering"),MessageUtils.message("stages.research"),MessageUtils.message("stages.service")};
+            /*String[][] stages = {{"信息收集","策划","原型图","效果图","审核中","修改调整","完成"},
+                                {"需求分析","设计中","研发中","测试中","修改BUG","已发布"},
+                                {"用户问题","解决中","已解决","反馈用户&问题解决"}
+                                };*/
+            String[][] stages = {{MessageUtils.message("stages.infoCollect"),MessageUtils.message("stages.plan"),MessageUtils.message("stages.proDrawing"),MessageUtils.message("stages.designSketch"),MessageUtils.message("stages.underReview"),MessageUtils.message("stages.modify"),MessageUtils.message("stages.complete")},
+                    {MessageUtils.message("stages.requirement"),MessageUtils.message("stages.design"),MessageUtils.message("stages.development"),MessageUtils.message("stages.test"),MessageUtils.message("stages.BUG"),MessageUtils.message("stages.release")},
+                    {MessageUtils.message("stages.userPro"),MessageUtils.message("stages.inSettlement"),MessageUtils.message("stages.resolved"),MessageUtils.message("stages.feedbackAndProblem")}
+            };
+            for (int i=0;i<templateNames.length;i++) {
+                String s = templateNames[i];
+                GroupTemplate template = new GroupTemplate();
+                template.setName(s);
+                template.setIsSystem(1);
+                groupTemplateService.save(template);
+                String[] curStages = stages[i];
+                int seq = 1;
+                for(String name:curStages) {
+                    GroupTmpstages sItem = new GroupTmpstages();
+                    sItem.setSequence(seq);
+                    sItem.setTemplateId(template.getId());
+                    sItem.setStagesName(name);
+                    groupTmpstagesService.save(sItem);
+                    seq++;
+                }
+            }
+        }
+        return new HttpRespMsg();
+    }
+
+    @RequestMapping("/getList")
+    public HttpRespMsg getList() {
+        if (groupTemplateService.count() == 0) {
+            initData();
+        }
+        String uid = request.getHeader("Token");
+        User user = userService.getById(uid);
+        QueryWrapper<GroupTemplate> templateQueryWrapper = new QueryWrapper<>();
+        templateQueryWrapper.eq("company_id", user.getCompanyId()).or().eq("is_system",1).orderByDesc("id");
+        List<GroupTemplate> list = groupTemplateService.list(templateQueryWrapper);
+        //查找任务列表名称
+        for (GroupTemplate template:list) {
+            List<GroupTmpstages> groupTmpstages = groupTmpstagesService.list(new QueryWrapper<GroupTmpstages>().eq("template_id", template.getId()));
+            template.setStagesList(groupTmpstages);
+
+            //TODO: 查找每个阶段模板任务/里程碑/风险
+
+        }
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = list;
+        return msg;
+    }
+
+    @RequestMapping("/addTemplate")
+    public HttpRespMsg addTemplate(Integer groupId, String name, Boolean saveTask, Boolean saveMileStone, Boolean saveRisk,Boolean automatically) {
+        String uid = request.getHeader("Token");
+        return groupTemplateService.addTemplate(uid, groupId, name, saveTask, saveMileStone, saveRisk,automatically);
+    }
+
+    @RequestMapping("/deleteTemplate")
+    public HttpRespMsg deleteTemplate(Integer id) {
+        User user = userService.getById(request.getHeader("token"));
+        if(groupTemplateService.removeById(id)){
+            OperationRecord operationRecord=new OperationRecord();
+            operationRecord.setOperatorName(user.getName());
+            operationRecord.setModuleName("项目管理");
+            operationRecord.setCompanyId(user.getCompanyId());
+            operationRecord.setOperationTime(LocalDateTime.now());
+            operationRecord.setContent("删除了模板");
+            operationRecordService.save(operationRecord);
+        }
+        return new HttpRespMsg();
+    }
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/GroupTmpstagesController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-05-05
+ */
+@RestController
+@RequestMapping("/group-tmpstages")
+public class GroupTmpstagesController {
+
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/GtemplateTaskController.java

@@ -0,0 +1,20 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-27
+ */
+@RestController
+@RequestMapping("/gtemplate-task")
+public class GtemplateTaskController {
+
+}
+

+ 13 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/HealthCheckController.java

@@ -0,0 +1,13 @@
+package com.management.platform.controller;
+
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class HealthCheckController {
+    @RequestMapping("/healthcheck")
+    public HttpRespMsg healthcheck() {
+        return new HttpRespMsg();
+    }
+}

+ 47 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/InformationController.java

@@ -0,0 +1,47 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.service.InformationService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author 吴涛涛
+ * @since 2020-02-18
+ */
+@RestController
+@RequestMapping("/information")
+public class InformationController {
+    @Autowired
+    private InformationService informationService;
+
+    @RequestMapping("/list")
+    public HttpRespMsg getInformationList(HttpServletRequest request) {
+        return informationService.getInformationList(request);
+    }
+
+    @RequestMapping("/check")
+    public HttpRespMsg checkInformation(@RequestParam Integer id, HttpServletRequest request) {
+        return informationService.checkInformation(id, request);
+    }
+
+    /**
+     * 将所有未读消息标记为已读
+     * @param request
+     * @return
+     */
+    @RequestMapping("/checkAll")
+    public HttpRespMsg allCheck(HttpServletRequest request) {
+        return informationService.checkAllInformation(request);
+    }
+}
+

+ 36 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/LeaveAuditLogController.java

@@ -0,0 +1,36 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.LeaveAuditLog;
+import com.management.platform.mapper.LeaveAuditLogMapper;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-12-10
+ */
+@RestController
+@RequestMapping("/leave-audit-log")
+public class LeaveAuditLogController {
+    @Resource
+    LeaveAuditLogMapper leaveAuditLogMapper;
+
+    @RequestMapping("/getBySheetId")
+    public HttpRespMsg getBySheetId(int sheetId) {
+        List<LeaveAuditLog> list = leaveAuditLogMapper.selectList(new QueryWrapper<LeaveAuditLog>().eq("sheet_id", sheetId));
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = list;
+        return msg;
+    }
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/LeavePmauditController.java

@@ -0,0 +1,20 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-04-21
+ */
+@RestController
+@RequestMapping("/leave-pmaudit")
+public class LeavePmauditController {
+
+}
+

+ 0 - 0
fhKeeper/formulahousekeeper/management-crmNew/src/main/java/com/management/platform/controller/LeaveQuotaNumController.java


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