Kaynağa Gözat

车间工时管家代码初始化

seyason 1 yıl önce
ebeveyn
işleme
db41977ff3
100 değiştirilmiş dosya ile 8100 ekleme ve 0 silme
  1. BIN
      fhKeeper/formulahousekeeper/management-workshop/0AAE1300
  2. BIN
      fhKeeper/formulahousekeeper/management-workshop/20230302项目导入模板.xlsx
  3. BIN
      fhKeeper/formulahousekeeper/management-workshop/ED622300
  4. 1 0
      fhKeeper/formulahousekeeper/management-workshop/build_package.bat
  5. 56 0
      fhKeeper/formulahousekeeper/management-workshop/my_prod.cnf
  6. BIN
      fhKeeper/formulahousekeeper/management-workshop/opencv/opencv-420.jar
  7. BIN
      fhKeeper/formulahousekeeper/management-workshop/opencv/x64/opencv_java420.dll
  8. BIN
      fhKeeper/formulahousekeeper/management-workshop/opencv/x86/opencv_java420.dll
  9. 274 0
      fhKeeper/formulahousekeeper/management-workshop/pom.xml
  10. 42 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/PlatformStartApplication.java
  11. 82 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/aop/AopLogConfiguration.java
  12. 59 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/aop/LimitRequestAspect.java
  13. 97 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/aop/SensitiveWordConfig.java
  14. 35 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/config/BeanConfig.java
  15. 67 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/config/Config.java
  16. 42 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/config/LdapConfig.java
  17. 12 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/config/LimitRequest.java
  18. 19 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/config/PropertyMsg.java
  19. 87 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/config/RefererInterceptor.java
  20. 23 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/config/RefererProperties.java
  21. 22 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/config/SchedulerConfig.java
  22. 28 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/config/WebConfig.java
  23. 50 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/config/WebMvcConfig.java
  24. 61 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/constant/Constant.java
  25. 27 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/constant/MybatisPlusPageConfig.java
  26. 44 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/constant/Parameter.java
  27. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/AlertTimeController.java
  28. 466 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/AuthRedirectController.java
  29. 69 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/CommonUploadController.java
  30. 110 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/CompanyCertController.java
  31. 219 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/CompanyController.java
  32. 43 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/CompanyCustomerContactController.java
  33. 100 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/CompanyDingdingController.java
  34. 81 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/CompanyReportController.java
  35. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ContactSyncLogController.java
  36. 122 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ContractController.java
  37. 81 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ContractDocumentController.java
  38. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ContractLogController.java
  39. 37 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ContractModifyRecordController.java
  40. 38 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ContractPaymentController.java
  41. 52 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ContractTypeController.java
  42. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/CorpwxJobResultController.java
  43. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/CorpwxPreAuthCodeController.java
  44. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/CorpwxRegisterCodeController.java
  45. 186 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/CustomerInfoController.java
  46. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/DdCallbackController.java
  47. 151 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/DepartmentController.java
  48. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/DepartmentDingdingController.java
  49. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/DepartmentFeishuController.java
  50. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/DepartmentOtherManagerController.java
  51. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/DepartmentWxController.java
  52. 282 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/DingDingController.java
  53. 47 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/DirtyCleanController.java
  54. 101 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/EarningSnapshotController.java
  55. 39 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ExpenseItemController.java
  56. 193 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ExpenseMainTypeController.java
  57. 109 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ExpenseSheetController.java
  58. 118 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ExpenseTypeController.java
  59. 789 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/FeishuInfoController.java
  60. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/FeishuSendController.java
  61. 48 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/FinanceAuditorController.java
  62. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/FinanceCalculateController.java
  63. 184 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/FinanceController.java
  64. 23 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/FinanceFixedcolnameController.java
  65. 97 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/FinanceImportController.java
  66. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/FinanceProjectsController.java
  67. 153 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/FinanceTblcuscolController.java
  68. 48 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/GroupParticipatorController.java
  69. 125 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/GroupTemplateController.java
  70. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/GroupTmpstagesController.java
  71. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/GtemplateTaskController.java
  72. 13 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/HealthCheckController.java
  73. 47 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/InformationController.java
  74. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/LocaleInformationController.java
  75. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/MaterialController.java
  76. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/MaterialUnitController.java
  77. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/MilestoneTaskRefController.java
  78. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/OperationRecordController.java
  79. 20 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ParticipationController.java
  80. 101 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/PermissionController.java
  81. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/PpMembsController.java
  82. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProDocumentTemDetailController.java
  83. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProdMaterialController.java
  84. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProdProcedureController.java
  85. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProductController.java
  86. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectAddcostItemController.java
  87. 56 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectAddcostRecordController.java
  88. 40 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectAuditorController.java
  89. 69 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectBasecostController.java
  90. 145 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectBasecostSettingController.java
  91. 125 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectCategoryController.java
  92. 1186 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectController.java
  93. 86 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectCurrentcostController.java
  94. 125 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectCustomController.java
  95. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectDocfolderController.java
  96. 70 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectLevelController.java
  97. 66 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectMainController.java
  98. 74 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectNotifyUserController.java
  99. 50 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectPercentageController.java
  100. 0 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectStageController.java

BIN
fhKeeper/formulahousekeeper/management-workshop/0AAE1300


BIN
fhKeeper/formulahousekeeper/management-workshop/20230302项目导入模板.xlsx


BIN
fhKeeper/formulahousekeeper/management-workshop/ED622300


+ 1 - 0
fhKeeper/formulahousekeeper/management-workshop/build_package.bat

@@ -0,0 +1 @@
+mvn package

+ 56 - 0
fhKeeper/formulahousekeeper/management-workshop/my_prod.cnf

@@ -0,0 +1,56 @@
+# For advice on how to change settings please see
+# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
+[mysqld_multi]
+
+mysqld =/usr/sbin/mysqld
+mysqladmin = /usr/bin/mysqladmin
+[mysqld]
+#
+# Remove leading # and set to the amount of RAM for the most important data
+# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
+# innodb_buffer_pool_size = 128M
+#
+# Remove leading # to turn on a very important data integrity option: logging
+# changes to the binary log between backups.
+# log_bin
+#
+# Remove leading # to set options mainly useful for reporting servers.
+# The server defaults are faster for transactions and fast SELECTs.
+# Adjust sizes as needed, experiment to find the optimal values.
+# join_buffer_size = 128M
+# sort_buffer_size = 2M
+# read_rnd_buffer_size = 2M
+port=7644
+datadir=/var/lib/mysql
+socket=/var/lib/mysql/mysql.sock
+server_id=2 
+# Disabling symbolic-links is recommended to prevent assorted security risks
+symbolic-links=0
+
+max_allowed_packet = 10M
+
+log-error=/var/log/mysqld.log
+pid-file=/var/run/mysqld/mysqld.pid
+sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
+[mysqld1] 
+basedir=/usr
+
+datadir = /data/mysql1      
+
+port = 3307
+server_id=3
+socket = /tmp/mysql3307.sock
+
+skip-host-cache
+
+skip-name-resolve
+
+character-set-server=utf8
+
+sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
+
+wait_timeout=2147483 
+
+interactive_timeout=2147483
+
+max_allowed_packet = 10M

BIN
fhKeeper/formulahousekeeper/management-workshop/opencv/opencv-420.jar


BIN
fhKeeper/formulahousekeeper/management-workshop/opencv/x64/opencv_java420.dll


BIN
fhKeeper/formulahousekeeper/management-workshop/opencv/x86/opencv_java420.dll


+ 274 - 0
fhKeeper/formulahousekeeper/management-workshop/pom.xml

@@ -0,0 +1,274 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>formulahousekeeper</artifactId>
+        <groupId>com.hssx.parent</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.hssx.parent</groupId>
+    <artifactId>timesheet-workshop</artifactId>
+    <version>3.4.0</version>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper-spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </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>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+        </dependency>
+        <!--Map依赖 -->
+        <dependency>
+            <groupId>net.jodah</groupId>
+            <artifactId>expiringmap</artifactId>
+            <version>0.5.10</version>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+        </dependency>
+        <!-- mybatis-plus代码生成器依赖 -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId>
+        </dependency>
+
+        <!-- velocity模板引擎 -->
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity-engine-core</artifactId>
+        </dependency>
+
+        <!-- freemarker 模板引擎-->
+        <dependency>
+            <groupId>org.freemarker</groupId>
+            <artifactId>freemarker</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+        <!-- fastjson -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+
+        <!-- openoffice -->
+        <dependency>
+            <groupId>com.artofsolving</groupId>
+            <artifactId>jodconverter</artifactId>
+            <version>2.2.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.artofsolving</groupId>
+            <artifactId>jodconverter-core-3.0.jar</artifactId>
+            <version>1.0</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/src/main/resources/lib/jodconverter-core-3.0.jar</systemPath>
+        </dependency>
+        <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>com.aliyun</groupId>
+            <artifactId>dingtalk</artifactId>
+            <version>1.1.50</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baidu.aip</groupId>
+            <artifactId>java-sdk</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+        </dependency>
+        <!--开启aop支持-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-logging</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.aspectj</groupId>
+            <artifactId>aspectjweaver</artifactId>
+        </dependency>
+
+        <!-- logback -->
+        <!--<dependency>
+            <groupId>net.logstash.logback</groupId>
+            <artifactId>logstash-logback-encoder</artifactId>
+            <version>6.3</version>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>1.2.3</version>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-core</artifactId>
+            <version>1.2.3</version>
+        </dependency>-->
+
+
+        <!--     tess4j相关依赖   -->
+        <!-- https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j -->
+        <dependency>
+            <groupId>net.sourceforge.tess4j</groupId>
+            <artifactId>tess4j</artifactId>
+        </dependency>
+
+        <!--手动引入opencv 否则无法maven打包-->
+        <dependency>
+            <groupId>org.opencv</groupId>
+            <artifactId>opencv</artifactId>
+            <version>4.2.0</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/opencv/opencv-420.jar</systemPath>
+        </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>
+
+        <!--ladp集成 AD域认证-->
+        <dependency>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-data-ldap</artifactId>
+        <version>2.3.12.RELEASE</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-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <!-- 获取客户端信息 -->
+        <!-- https://mvnrepository.com/artifact/eu.bitwalker/UserAgentUtils -->
+        <dependency>
+            <groupId>eu.bitwalker</groupId>
+            <artifactId>UserAgentUtils</artifactId>
+            <version>1.21</version>
+        </dependency>
+        <!--热部署-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <version>2.0.1.RELEASE</version>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <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>

+ 42 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/PlatformStartApplication.java

@@ -0,0 +1,42 @@
+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.transaction.annotation.EnableTransactionManagement;
+/**
+ * Author: 吴涛涛
+ * Date : 2019 - 12 - 31 9:23
+ * Description:<描述>
+ * Version: 1.0
+ */
+@SpringBootApplication
+@MapperScan("com.management.platform.mapper")
+@EnableTransactionManagement //开启事务支持
+@EnableAsync
+public class PlatformStartApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(PlatformStartApplication.class, args);
+        //ldap ssl链接很关键的
+        System.setProperty("com.sun.jndi.ldap.object.disableEndpointIdentification","true");
+    }
+
+    //防止存入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;
+    }
+}

+ 82 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/aop/AopLogConfiguration.java

@@ -0,0 +1,82 @@
+package com.management.platform.aop;
+
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.*;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.stereotype.Component;
+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;
+import java.util.stream.Stream;
+
+/**
+ * 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-workshop/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;
+    }
+
+}

+ 97 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/aop/SensitiveWordConfig.java

@@ -0,0 +1,97 @@
+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.aspectj.lang.annotation.Aspect;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+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 {
+    @Autowired
+    RedisUtil redisUtils;
+    @Autowired
+    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-workshop/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("worktime-");
+        // 设置拒绝策略
+        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+        // 等待所有任务结束后再关闭线程池
+        executor.setWaitForTasksToCompleteOnShutdown(true);
+        System.out.println("初始化TaskExecutor");
+        return executor;
+    }
+}

+ 67 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/config/Config.java

@@ -0,0 +1,67 @@
+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.NoopHostnameVerifier;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.conn.ssl.TrustStrategy;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.ssl.SSLContexts;
+import org.apache.tomcat.jni.SSL;
+import org.springframework.boot.web.client.RestTemplateBuilder;
+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;
+
+import javax.net.ssl.SSLContext;
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+
+@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();
+  }
+}

+ 42 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/config/LdapConfig.java

@@ -0,0 +1,42 @@
+package com.management.platform.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.ldap.core.LdapTemplate;
+import org.springframework.ldap.core.support.LdapContextSource;
+
+@Configuration
+public class LdapConfig {
+    @Value("${spring.ldap.urls}")
+    private String ldapUrl;
+    @Value("${spring.ldap.username}")
+    private String userName;
+    @Value("${spring.ldap.password}")
+    private String passWord;
+    @Value("${spring.ldap.base.dcFirst}")
+    private String dcFirst;
+    @Value("${spring.ldap.base.dcSecond}")
+    private String dcSecond;
+
+
+
+    @Bean
+    public LdapContextSource ldapContextSource(){
+        LdapContextSource source = new LdapContextSource();
+        source.setBase("DC="+dcFirst+",DC="+dcSecond);
+        source.setUrl(ldapUrl);
+        source.setPassword(passWord);
+        source.setUserDn(userName);
+        source.setReferral("follow");
+        return source;
+    }
+
+    @Bean
+    public LdapTemplate ldapTemplate(){
+        return new LdapTemplate(ldapContextSource());
+    }
+
+
+}
+

+ 12 - 0
fhKeeper/formulahousekeeper/management-workshop/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; // 允许请求的次数
+}

+ 19 - 0
fhKeeper/formulahousekeeper/management-workshop/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();
+}

+ 87 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/config/RefererInterceptor.java

@@ -0,0 +1,87 @@
+package com.management.platform.config;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+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-workshop/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-workshop/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;
+    }
+}
+

+ 28 - 0
fhKeeper/formulahousekeeper/management-workshop/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-workshop/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 localeResolver(){
+//		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());
+    }
+
+}
+

+ 61 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/constant/Constant.java

@@ -0,0 +1,61 @@
+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= {"审核结果","审核人","请假时间","备注"};
+}

+ 27 - 0
fhKeeper/formulahousekeeper/management-workshop/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-workshop/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());
+//    }
+
+}

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/AlertTimeController.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-31
+ */
+@RestController
+@RequestMapping("/alert-time")
+public class AlertTimeController {
+
+}
+

+ 466 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/AuthRedirectController.java

@@ -0,0 +1,466 @@
+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.entity.vo.UserVO;
+import com.management.platform.mapper.*;
+import com.management.platform.service.FeishuInfoService;
+import com.management.platform.service.UserService;
+import com.management.platform.service.WxCorpInfoService;
+import com.management.platform.service.impl.FeishuInfoServiceImpl;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import com.management.platform.util.UserAgentUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+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.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@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 = WeiXinCorpController.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://mobworktime.ttkuaiban.com/#/" + router;
+        } else {
+            redirecUrl = "https://worktime.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 scanningAuth(String auth_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 = WeiXinCorpController.GET_CORP_SCANNING_CODE_LOGININFO_URL.replace("PROVIDER_ACCESS_TOKEN",wxCorpInfoService.getProviderAccessToken());
+        HttpHeaders headers = new HttpHeaders();
+        RestTemplate restTemplate = new RestTemplate();
+        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
+        headers.setContentType(type);
+        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
+        JSONObject ob = new JSONObject();
+        ob.put("auth_code", auth_code);
+        HttpEntity<JSONObject> Entity = new HttpEntity<>(ob, headers);
+        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, Entity, String.class);
+        String redirecUrl = null;
+        if (responseEntity.getStatusCode() == HttpStatus.OK) {
+            String resp = responseEntity.getBody();
+            System.err.println(resp);
+            JSONObject obj = JSONObject.parseObject(resp);
+            if (obj.getIntValue("errcode") == 0) {
+                JSONObject userInfo = obj.getJSONObject("user_info");
+                System.out.println(obj.toString());
+                String wxUserId = userInfo.getString("userid");
+                String openUserId = userInfo.getString("open_userid");
+                JSONObject corpInfo = obj.getJSONObject("corp_info");
+                String corpId = corpInfo.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", "尚未绑定企业微信,请使用账号密码登录。");
+                        }
+
+                    }
+                }
+                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://worktime.ttkuaiban.com/#/" + router;
+            }
+        }
+        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) {
+                    WeiXinCorpController.SUITE_ACCESS_TOKEN = obj.getString("suite_access_token");
+                    WeiXinCorpController.suiteTokenExpireTime = System.currentTimeMillis() + obj.getIntValue("expires_in")*1000;
+                }
+            }
+        }
+        return WeiXinCorpController.SUITE_ACCESS_TOKEN;
+    }
+
+
+    //获取企业通讯录的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();
+    }
+
+}

+ 69 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/CommonUploadController.java

@@ -0,0 +1,69 @@
+package com.management.platform.controller;
+
+import com.management.platform.task.SFTPAsyncUploader;
+import com.management.platform.util.HttpRespMsg;
+import org.apache.log4j.LogManager;
+import org.apache.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 javax.annotation.Resource;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+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;
+    }
+}

+ 110 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/CompanyCertController.java

@@ -0,0 +1,110 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.CompanyCert;
+import com.management.platform.entity.Project;
+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;
+    }
+}
+

+ 219 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/CompanyController.java

@@ -0,0 +1,219 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+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 com.taobao.api.ApiException;
+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.HashMap;
+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;
+
+    @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() {
+        return new HttpRespMsg();
+//        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;
+    }
+
+}
+

+ 43 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/CompanyCustomerContactController.java

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

+ 100 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/CompanyDingdingController.java

@@ -0,0 +1,100 @@
+//package com.management.platform.controller;
+//
+//
+//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+//import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
+//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();
+//    }
+//}
+//

+ 81 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/CompanyReportController.java

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

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ContactSyncLogController.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-11-14
+ */
+@RestController
+@RequestMapping("/contact-sync-log")
+public class ContactSyncLogController {
+
+}
+

+ 122 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ContractController.java

@@ -0,0 +1,122 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.Contract;
+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.service.ContractTypeService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.http.HttpRequest;
+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.ArrayList;
+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;
+
+    /**
+     * 分页查询合同
+     */
+    @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){
+        return contractService.getContractPage(request,pageIndex,pageSize,number,name,typeName,status,startDate,endDate, paymentStartDate, paymentEndDate);
+    }
+
+    /**
+     * 导出合同
+     */
+    @RequestMapping("/ExportContract")
+    public HttpRespMsg ExportContract (HttpServletRequest request, String number,String name,String typeName,Integer status,String startDate,String endDate, String paymentStartDate, String paymentEndDate){
+        return contractService.ExportContract(request,number,name,typeName,status,startDate,endDate, paymentStartDate, paymentEndDate);
+    }
+
+    /**
+     * 导入合同
+     */
+    @RequestMapping("/importContract")
+    public HttpRespMsg importContract (HttpServletRequest request, MultipartFile file){
+        return contractService.importContract(request,file);
+    }
+
+    /**
+     * 新增合同
+     */
+    @RequestMapping("/addContract")
+    public HttpRespMsg addContract (HttpServletRequest request,Contract contract, String paymentListStr){
+        return contractService.addContract(request,contract, paymentListStr);
+    }
+
+    /**
+     * 编辑合同
+     */
+    @RequestMapping("/editContract")
+    public HttpRespMsg editContract (HttpServletRequest request,Contract contract, String paymentListStr){
+        return contractService.editContract(request,contract, 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;
+    }
+
+
+}
+

+ 81 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ContractDocumentController.java

@@ -0,0 +1,81 @@
+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.RequestBody;
+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.util.List;
+
+/**
+ * <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);
+    }
+
+    /**
+     * 在线预览
+     * @param inputFilePath
+     * @return
+     */
+    @RequestMapping("/onlineShow")
+    public HttpRespMsg onlineShow (@RequestParam String inputFilePath){
+        return contractDocumentService.onlineShow(inputFilePath);
+    }
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ContractLogController.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-12-16
+ */
+@RestController
+@RequestMapping("/contract-log")
+public class ContractLogController {
+
+}
+

+ 37 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ContractModifyRecordController.java

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

+ 38 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ContractPaymentController.java

@@ -0,0 +1,38 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.ContractPayment;
+import com.management.platform.service.ContractPaymentService;
+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 2023-05-26
+ */
+@RestController
+@RequestMapping("/contract-payment")
+public class ContractPaymentController {
+
+    @Resource
+    private ContractPaymentService contractPaymentService;
+
+    @RequestMapping("/getList")
+    public HttpRespMsg getList(Integer contractId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = contractPaymentService.list(new QueryWrapper<ContractPayment>().eq("contract_id", contractId));
+        return msg;
+    }
+
+
+}
+

+ 52 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ContractTypeController.java

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

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/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 {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/CorpwxPreAuthCodeController.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-11-22
+ */
+@RestController
+@RequestMapping("/corpwx-pre-auth-code")
+public class CorpwxPreAuthCodeController {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/CorpwxRegisterCodeController.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-11-22
+ */
+@RestController
+@RequestMapping("/corpwx-register-code")
+public class CorpwxRegisterCodeController {
+
+}
+

+ 186 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/CustomerInfoController.java

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

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/DdCallbackController.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-11-01
+ */
+@RestController
+@RequestMapping("/dd-callback")
+public class DdCallbackController {
+
+}
+

+ 151 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/DepartmentController.java

@@ -0,0 +1,151 @@
+package com.management.platform.controller;
+
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+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("/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, HttpServletRequest request) {
+        return departmentService.updateDepartment(id, name, managerId, reportAuditUserid,otherManagerIds, 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(String startDate, String endDate, String userIds, HttpServletRequest request) {
+        return departmentService.exportUserStatistic(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);
+    }
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/DepartmentDingdingController.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-06-27
+ */
+@RestController
+@RequestMapping("/department-dingding")
+public class DepartmentDingdingController {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/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 {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/DepartmentOtherManagerController.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-07-26
+ */
+@RestController
+@RequestMapping("/department-other-manager")
+public class DepartmentOtherManagerController {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/DepartmentWxController.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-11-28
+ */
+@RestController
+@RequestMapping("/department-wx")
+public class DepartmentWxController {
+
+}
+

+ 282 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/DingDingController.java

@@ -0,0 +1,282 @@
+//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.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("/syncUserWorkData")
+//    public HttpRespMsg syncUserWorkData(Integer companyId, String userId, String startDate, String endDate) {
+//        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);
+//                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);
+//                }
+//                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-workshop/src/main/java/com/management/platform/controller/DirtyCleanController.java

@@ -0,0 +1,47 @@
+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-workshop/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;
+    }
+}
+

+ 39 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ExpenseItemController.java

@@ -0,0 +1,39 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.ExpenseItem;
+import com.management.platform.entity.vo.ExpenseItemVO;
+import com.management.platform.mapper.ExpenseItemMapper;
+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 2021-05-17
+ */
+@RestController
+@RequestMapping("/expense-item")
+public class ExpenseItemController {
+
+    @Resource
+    private ExpenseItemMapper expenseItemMapper;
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(Integer projectId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        List<ExpenseItemVO> userExpenseDetail = expenseItemMapper.getUserExpenseDetail(projectId);
+        msg.data = userExpenseDetail;
+        return msg;
+    }
+}
+

+ 193 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ExpenseMainTypeController.java

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

+ 109 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ExpenseSheetController.java

@@ -0,0 +1,109 @@
+package com.management.platform.controller;
+
+
+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.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.List;
+
+/**
+ * <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;
+
+    @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,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) {
+            //普通员工只能看自己的
+            sheet.setOwnerId(user.getId());
+        }
+        sheet.setCompanyId(user.getCompanyId());
+        return expenseSheetService.queryList(sheet, startDate, endDate, pageIndex, pageSize);
+    }
+
+    @RequestMapping("/getDetail")
+    public HttpRespMsg getDetail(Integer id) {
+
+        return expenseSheetService.getDetail(id);
+
+    }
+
+    @RequestMapping("/approve")
+    public HttpRespMsg approve(Integer id) {
+
+        return expenseSheetService.approve(id);
+
+    }
+    @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,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, startDate, endDate);
+    }
+}
+

+ 118 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ExpenseTypeController.java

@@ -0,0 +1,118 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.ExpenseItem;
+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;
+    }
+
+}
+

+ 789 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/FeishuInfoController.java

@@ -0,0 +1,789 @@
+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 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(String appId) throws Exception {
+        //初始化数据生成公司
+        System.out.println("========接收到initSystem请求===appid="+appId);
+        HttpRespMsg msg = new HttpRespMsg();
+        //查找公司对应的记录是否已经添加
+        FeishuInfo feishuInfo = feishuInfoMapper.selectOne(new QueryWrapper<FeishuInfo>().eq("app_id",appId));
+        if (feishuInfo == null) {
+            msg.setError("请在feishu_info表中增加appid:" + 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());
+            feishuInfoMapper.updateById(feishuInfo);
+            //生成工作时长
+            TimeType timeType = new TimeType();
+            timeType.setCompanyId(company.getId());
+            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);
+            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());
+            //获取当前角色的权限菜单
+            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){
+
+            }
+        }
+    }
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/FeishuSendController.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-02
+ */
+@RestController
+@RequestMapping("/feishu-send")
+public class FeishuSendController {
+
+}
+

+ 48 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/FinanceAuditorController.java

@@ -0,0 +1,48 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.entity.Finance;
+import com.management.platform.entity.FinanceAuditor;
+import com.management.platform.mapper.FinanceAuditorMapper;
+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;
+    }
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/FinanceCalculateController.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-04-13
+ */
+@RestController
+@RequestMapping("/finance-calculate")
+public class FinanceCalculateController {
+
+}
+

+ 184 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/FinanceController.java

@@ -0,0 +1,184 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.CompanyMapper;
+import com.management.platform.mapper.FinanceTblcuscolMapper;
+import com.management.platform.mapper.TimeTypeMapper;
+import com.management.platform.mapper.WxCorpInfoMapper;
+import com.management.platform.service.ExcelExportService;
+import com.management.platform.service.FinanceFixedcolnameService;
+import com.management.platform.service.FinanceService;
+import com.management.platform.util.ExcelUtil;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import com.management.platform.util.UserNotFoundException;
+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 java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-02-18
+ */
+@RestController
+@RequestMapping("/finance")
+public class FinanceController {
+
+    @Resource
+    private FinanceService financeService;
+    @Resource
+    private FinanceTblcuscolMapper financeTblcuscolMapper;
+    @Resource
+    private CompanyMapper companyMapper;
+    @Resource
+    private FinanceFixedcolnameService financeFixedcolnameService;
+    @Resource
+    private TimeTypeMapper timeTypeMapper;
+    @Resource
+    private WxCorpInfoMapper wxCorpInfoMapper;
+    @Resource
+    private ExcelExportService excelExportService;
+
+    @Value(value = "${upload.path}")
+    private String path;
+
+    @RequestMapping("/getByMonth")
+    public HttpRespMsg getByMonth(Integer companyId, String yearMonth) {
+        return financeService.getByMonth(companyId, yearMonth);
+    }
+
+    @RequestMapping("/getProjects")
+    public HttpRespMsg getProjects(Integer companyId, String yearMonth) {
+        return financeService.getProjects(companyId, yearMonth);
+    }
+
+    @RequestMapping("/importData")
+    public HttpRespMsg importData(Integer companyId, String yearMonth,
+                                  Boolean syncUserCost, Boolean syncHistoryReport,
+                                  MultipartFile file, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        try {
+            return financeService.importData(companyId, yearMonth, syncUserCost, syncHistoryReport, file, request);
+        } catch (IOException e) {
+            e.printStackTrace();
+            //msg.setError("文件处理出错");
+            msg.setError(MessageUtils.message("file.error"));
+            return msg;
+        } catch (UserNotFoundException e) {
+            e.printStackTrace();
+            msg.setError(e.getMessage());
+            return msg;
+        } catch (NullPointerException e) {
+            e.printStackTrace();
+            //msg.setError("数据格式有误或存在空数据 导入失败");
+            msg.setError(MessageUtils.message("file.dataFormatError"));
+            return msg;
+        } catch (Exception e) {
+            e.printStackTrace();
+            //msg.setError("发生其他错误");
+            msg.setError(MessageUtils.message("other.error"));
+            return msg;
+        }
+    }
+
+    //导出分摊数据
+    @RequestMapping("/exportData")
+    public HttpRespMsg exportData(@RequestParam(required = false, defaultValue = "0") Integer groupByCategory,
+                                  @RequestParam String date, Boolean assignNoProUser,HttpServletRequest request) {
+        return financeService.exportData(groupByCategory, date, assignNoProUser, request);
+    }
+
+    /**
+     * 导出薪资数据
+     * @param date
+     * @param request
+     * @return
+     */
+    @RequestMapping("/exportFinance")
+    public HttpRespMsg exportFinance(@RequestParam String date, HttpServletRequest request) {
+        return financeService.exportFinance(date, request);
+    }
+
+    //按照项目分配财务成本
+    @RequestMapping("/getTimeCost")
+    public HttpRespMsg getTimeCost(String yearMonth, Boolean assignNoProUser,HttpServletRequest request) {
+        return financeService.getTimeCost(yearMonth, assignNoProUser,request);
+    }
+
+    @RequestMapping("/getNoProjectUsers")
+    public HttpRespMsg getNoProjectUsers(String yearMonth, HttpServletRequest request) {
+        return financeService.getNoProjectUsers(yearMonth, request);
+    }
+
+
+    /**
+     * 获取财务报表模板
+     * @param companyId
+     * @return
+     */
+    @RequestMapping("/getTemplate")
+    public HttpRespMsg getTemplate(Integer companyId) throws Exception {
+        List<FinanceTblcuscol> list = financeTblcuscolMapper.selectList(new QueryWrapper<FinanceTblcuscol>().eq("company_id", companyId));
+        HttpRespMsg msg = new HttpRespMsg();
+        FinanceFixedcolname item = financeFixedcolnameService.getById(companyId);
+
+        List<String> heads = new ArrayList<>();
+        Company company = companyMapper.selectById(companyId);
+//        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        //判断是否启用了工号模式
+        TimeType timeType = timeTypeMapper.selectById(companyId);
+        if (timeType.getFinanceJobnumEnabled() == 1) {
+            //heads.add("工号");
+            heads.add(MessageUtils.message("entry.No"));
+        }
+        //heads.add("姓名");
+        heads.add(MessageUtils.message("entry.name"));
+        heads.add(item.getMonthCost());//heads.add("工资");
+        heads.add(item.getBonus());//heads.add("奖金");
+        heads.add(item.getAllowance());//heads.add("津贴");
+        heads.add(item.getInsuranceOld());//heads.add("养老保险");
+        heads.add(item.getInsuranceMedical());//heads.add("医疗保险");
+        heads.add(item.getInsuranceLosejob());//heads.add("失业保险");
+        heads.add(item.getInsuranceInjury());//heads.add("工伤保险");
+        heads.add(item.getHouseFund());//heads.add("住房公积金");
+        if (list.size() > 0) {
+            List<String> collect = list.stream().map(FinanceTblcuscol::getFieldName).collect(Collectors.toList());
+            heads.addAll(collect);
+        }
+        List<List<String>> allList = new ArrayList<>();
+        allList.add(heads);
+        //String fileName = company.getCompanyName()+"_财务人员成本模板";
+        String fileName = MessageUtils.message("fileName.financialCost",company.getCompanyName());
+        //导出模板不需要转译,不传wxCorpInfo
+        return excelExportService.exportGeneralExcelByTitleAndList(null, fileName, allList, path);
+    }
+    @RequestMapping("/batchRemove")
+    public HttpRespMsg batchRemove(String ids){
+        HttpRespMsg msg=new HttpRespMsg();
+        String[] split = ids.split(",");
+        List<String> list = Arrays.asList(split);
+        if(financeService.removeByIds(list)){
+            return msg;
+        }
+        //msg.setError("删除失败");
+        msg.setError(MessageUtils.message("file.deleteError"));
+        return msg;
+    }
+}
+

+ 23 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/FinanceFixedcolnameController.java

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

+ 97 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/FinanceImportController.java

@@ -0,0 +1,97 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.FinanceImport;
+import com.management.platform.entity.User;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.FinanceImportService;
+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 org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-22
+ */
+@RestController
+@RequestMapping("/finance-import")
+public class FinanceImportController {
+
+    @Resource
+    private FinanceImportService financeImportService;
+    @Resource
+    private UserMapper userMapper;
+
+    @RequestMapping("submitImport")
+    public HttpRespMsg submitImport(Integer companyId, String yearMonth,
+                                  Boolean syncUserCost, Boolean syncHistoryReport,
+                                  MultipartFile file, HttpServletRequest request) {
+        return financeImportService.submitImport(companyId, yearMonth, syncUserCost, syncHistoryReport, file, request);
+    }
+
+    @RequestMapping("list")
+    public HttpRespMsg list(Integer companyId, HttpServletRequest request) {
+        return financeImportService.list(companyId, request);
+    }
+
+    @RequestMapping("/agree")
+    public HttpRespMsg agree(Integer id, HttpServletRequest request) {
+
+        return financeImportService.agree(id, request);
+    }
+
+    @RequestMapping("/getStatus")
+    public HttpRespMsg getStatus(Integer companyId, String yearMonth) {
+        FinanceImport item = financeImportService.getOne(new QueryWrapper<FinanceImport>().eq("company_id", companyId).eq("ymonth", yearMonth).orderByDesc("indate").last("limit 1"));
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = item;
+        return msg;
+    }
+
+    @RequestMapping("/deny")
+    public HttpRespMsg deny(Integer id, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        FinanceImport item = new FinanceImport();
+        item.setId(id);
+        item.setState(2);
+        FinanceImport old = financeImportService.getById(id);
+        if (old.getState() == 0) {
+            User auditor = userMapper.selectById(request.getHeader("TOKEN"));
+            item.setAuditorId(auditor.getId());
+            item.setAuditorName(auditor.getName());
+            financeImportService.updateById(item);
+        } else {
+            //msg.setError("只有待审核状态才可以操作");
+            msg.setError(MessageUtils.message("finance.operationStateError"));
+        }
+        return msg;
+    }
+
+    @RequestMapping("/cancel")
+    public HttpRespMsg cancel(Integer id, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        FinanceImport item = new FinanceImport();
+        item.setId(id);
+        item.setState(-1);
+        FinanceImport old = financeImportService.getById(id);
+        if (old.getState() == 1) {
+            financeImportService.updateById(item);
+        } else {
+            //msg.setError("只有审核通过状态才可以撤销");
+            msg.setError(MessageUtils.message("finance.revokeStateError"));
+        }
+        return msg;
+    }
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/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 {
+
+}
+

+ 153 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/FinanceTblcuscolController.java

@@ -0,0 +1,153 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.Finance;
+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.FinanceFixedcolnameMapper;
+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.HashMap;
+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());
+        }
+        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 (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;
+    }
+}
+

+ 48 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/GroupParticipatorController.java

@@ -0,0 +1,48 @@
+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-workshop/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-workshop/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 {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/GtemplateTaskController.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-03-27
+ */
+@RestController
+@RequestMapping("/gtemplate-task")
+public class GtemplateTaskController {
+
+}
+

+ 13 - 0
fhKeeper/formulahousekeeper/management-workshop/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-workshop/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);
+    }
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/LocaleInformationController.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-09-15
+ */
+@RestController
+@RequestMapping("/locale-information")
+public class LocaleInformationController {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/MaterialController.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-07-02
+ */
+@RestController
+@RequestMapping("/material")
+public class MaterialController {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/MaterialUnitController.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-07-02
+ */
+@RestController
+@RequestMapping("/material-unit")
+public class MaterialUnitController {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/MilestoneTaskRefController.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-04-19
+ */
+@RestController
+@RequestMapping("/milestone-task-ref")
+public class MilestoneTaskRefController {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/OperationRecordController.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-08-18
+ */
+@RestController
+@RequestMapping("/operation-record")
+public class OperationRecordController {
+
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ParticipationController.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 吴涛涛
+ * @since 2020-02-12
+ */
+@RestController
+@RequestMapping("/participation")
+public class ParticipationController {
+
+}
+

+ 101 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/PermissionController.java

@@ -0,0 +1,101 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.SysRole;
+import com.management.platform.service.PermissionService;
+import com.management.platform.service.SysRoleService;
+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.RequestMethod;
+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;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-10-28
+ */
+@RestController
+@RequestMapping("/permission")
+public class PermissionController {
+    @Autowired
+    private PermissionService permissionService;
+    @Resource
+    private HttpServletRequest httpServletRequest;
+    @Resource
+    private SysRoleService sysRoleService;
+
+    @RequestMapping("/getFrontRoleList")
+    public HttpRespMsg getFrontRoleList(Integer companyId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        List<SysRole> list = sysRoleService.list(new QueryWrapper<SysRole>().eq("company_id", companyId));
+        msg.data = list.stream().filter(item->!item.getRolename().equals("超级管理员")).collect(Collectors.toList());
+        return msg;
+    }
+
+    @RequestMapping("/getCrewByPage")
+    public HttpRespMsg getCrewByPage(@RequestParam Integer pageIndex, @RequestParam Integer pageSize) {
+        return permissionService.getCrewByPage(pageIndex, pageSize);
+    }
+
+    @RequestMapping("/switchRole")
+    public HttpRespMsg switchRole(@RequestParam Integer[] ids, @RequestParam Integer roleId) {
+        return permissionService.switchRole(ids, roleId, httpServletRequest);
+    }
+
+    @RequestMapping("/getSimpleUserList")
+    public HttpRespMsg getSimpleUserList() {
+        return permissionService.getSimpleUserList();
+    }
+
+    @RequestMapping("/getRoleList")
+    public HttpRespMsg getRoleList(Integer companyId) {
+        return permissionService.getRoleList(companyId);
+    }
+
+    @RequestMapping("/editRole")
+    public HttpRespMsg editRole(Integer id, @RequestParam String name, @RequestParam String description, Integer companyId) {
+        return permissionService.editRole(id, name, description, companyId);
+    }
+
+    @RequestMapping("/setDefaultRole")
+    public HttpRespMsg setDefaultRole(Integer id, Integer companyId) {
+        return permissionService.setDefaultRole(id, companyId);
+    }
+
+    @RequestMapping("/deleteRole")
+    public HttpRespMsg deleteRole(@RequestParam Integer id) {
+        return permissionService.deleteRole(id);
+    }
+
+    @RequestMapping("/getAuthority")
+    public HttpRespMsg getAuthority(@RequestParam Integer role, @RequestParam Integer companyId,HttpServletRequest request) {
+        return permissionService.getAuthority(role, companyId,request);
+    }
+
+    @RequestMapping("/exportData")
+    public HttpRespMsg exportData(@RequestParam Integer role, @RequestParam Integer companyId,HttpServletRequest request){
+        return permissionService.exportData(role,companyId,request);
+    }
+
+    @RequestMapping("/switchAuthority")
+    public HttpRespMsg switchAuthority(@RequestParam Integer role, @RequestParam Integer id) {
+        return permissionService.switchAuthority(role, id);
+    }
+
+    @RequestMapping(value = "/savePermission", method = RequestMethod.POST)
+    public HttpRespMsg savePermission(@RequestParam Integer role, @RequestParam String moduleList) {
+        return permissionService.savePermission(role, moduleList);
+    }
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/PpMembsController.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-08-28
+ */
+@RestController
+@RequestMapping("/pp-membs")
+public class PpMembsController {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProDocumentTemDetailController.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-04-07
+ */
+@RestController
+@RequestMapping("/pro-document-tem-detail")
+public class ProDocumentTemDetailController {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProdMaterialController.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-07-02
+ */
+@RestController
+@RequestMapping("/prod-material")
+public class ProdMaterialController {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProdProcedureController.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-07-02
+ */
+@RestController
+@RequestMapping("/prod-procedure")
+public class ProdProcedureController {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProductController.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-07-02
+ */
+@RestController
+@RequestMapping("/product")
+public class ProductController {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectAddcostItemController.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-05-07
+ */
+@RestController
+@RequestMapping("/project-addcost-item")
+public class ProjectAddcostItemController {
+
+}
+

+ 56 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectAddcostRecordController.java

@@ -0,0 +1,56 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.entity.ProjectAddcostRecord;
+import com.management.platform.service.ProjectAddcostRecordService;
+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 2022-05-07
+ */
+@RestController
+@RequestMapping("/project-addcost-record")
+public class ProjectAddcostRecordController {
+    @Resource
+    ProjectAddcostRecordService projectAddcostRecordService;
+
+    /**
+     * 下拨预算
+     * @param item
+     * @param itemList
+     * @return
+     */
+    @RequestMapping("/add")
+    public HttpRespMsg add(ProjectAddcostRecord item, String itemList) {
+        return projectAddcostRecordService.add(item, itemList);
+    }
+
+    /**
+     * 撤销下拨
+     * @param id
+     * @return
+     */
+    @RequestMapping("/revert")
+    public HttpRespMsg revert(Integer id) {
+        return projectAddcostRecordService.revert(id);
+    }
+
+    /**
+     *
+     */
+    @RequestMapping("/getAddList")
+    public HttpRespMsg getAddList(Integer companyId, Integer projectId) {
+        return projectAddcostRecordService.getAddList(companyId, projectId);
+    }
+}
+

+ 40 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectAuditorController.java

@@ -0,0 +1,40 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.ProjectAuditor;
+import com.management.platform.mapper.ProjectAuditorMapper;
+import com.management.platform.service.ProjectAuditorService;
+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-03-13
+ */
+@RestController
+@RequestMapping("/project-auditor")
+public class ProjectAuditorController {
+
+    @Resource
+    private ProjectAuditorMapper projectAuditorMapper;
+
+    @RequestMapping("/getList")
+    private HttpRespMsg getList(Integer projectId) {
+        List<ProjectAuditor> auditorList = projectAuditorMapper.selectList(new QueryWrapper<ProjectAuditor>().eq("project_id", projectId));
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = auditorList;
+        return msg;
+    }
+}
+

+ 69 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectBasecostController.java

@@ -0,0 +1,69 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.ProjectBasecost;
+import com.management.platform.entity.ProjectBasecostSetting;
+import com.management.platform.entity.User;
+import com.management.platform.mapper.ProjectBasecostMapper;
+import com.management.platform.mapper.ProjectBasecostSettingMapper;
+import com.management.platform.mapper.UserMapper;
+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.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-08-02
+ */
+@RestController
+@RequestMapping("/project-basecost")
+public class ProjectBasecostController {
+
+    @Resource
+    ProjectBasecostMapper projectBasecostMapper;
+    @Resource
+    ProjectBasecostSettingMapper projectBasecostSettingMapper;
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    HttpServletRequest request;
+
+    @RequestMapping("/get")
+    public HttpRespMsg get(Integer projectId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        List<ProjectBasecost> list = projectBasecostMapper.selectList(new QueryWrapper<ProjectBasecost>().eq("project_id", projectId));
+        //检查最新的字段是否有
+        User user = userMapper.selectById(request.getHeader("TOKEN"));
+        List<ProjectBasecostSetting> allSettings = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", user.getCompanyId()));
+        List<ProjectBasecost> additionalList = new ArrayList<>();
+        allSettings.forEach(all->{
+            if (!list.stream().filter(costItem->costItem.getBaseId().equals(all.getId())).findAny().isPresent()) {
+                ProjectBasecost add = new ProjectBasecost();
+                add.setBaseName(all.getName());
+                add.setBaseId(all.getId());
+                add.setProjectId(projectId);
+                add.setBaseAmount(0.0);
+                additionalList.add(add);
+            }
+        });
+        if (additionalList.size() > 0) {
+            list.addAll(additionalList);
+        }
+        msg.data = list;
+        return msg;
+    }
+
+
+}
+

+ 145 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectBasecostSettingController.java

@@ -0,0 +1,145 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.constant.Constant;
+import com.management.platform.entity.ProjectAddcostItem;
+import com.management.platform.entity.ProjectBasecost;
+import com.management.platform.entity.ProjectBasecostSetting;
+import com.management.platform.entity.ProjectCurrentcost;
+import com.management.platform.mapper.*;
+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-08-02
+ */
+@RestController
+@RequestMapping("/project-basecost-setting")
+public class ProjectBasecostSettingController {
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    ProjectBasecostSettingMapper projectBasecostSettingMapper;
+
+    @Resource
+    ProjectBasecostMapper projectBasecostMapper;
+    @Resource
+    ProjectAddcostItemMapper projectAddcostItemMapper;
+    @Resource
+    ProjectCurrentcostMapper projectCurrentcostMapper;
+
+    @RequestMapping("/addOrMod")
+    public HttpRespMsg addOrMod(ProjectBasecostSetting setting) {
+        HttpRespMsg msg = new HttpRespMsg();
+        if (StringUtils.isEmpty(setting.getName())) {
+            //msg.setError("名称不能为空");
+            msg.setError(MessageUtils.message("name.nullNameError"));
+            return msg;
+        }
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        if (setting.getId() == null) {
+            setting.setCompanyId(companyId);
+            int count = projectBasecostSettingMapper.selectCount(new QueryWrapper<ProjectBasecostSetting>().eq("name", setting.getName()).eq("company_id", setting.getCompanyId()));
+            if (count > 0) {
+                //msg.setError("该名称已存在");
+                msg.setError(MessageUtils.message("name.nameRepeat"));
+            } else {
+                projectBasecostSettingMapper.insert(setting);
+                msg.data = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId));
+            }
+        } else {
+            int count = projectBasecostSettingMapper.selectCount(new QueryWrapper<ProjectBasecostSetting>().eq("name", setting.getName())
+                    .eq("company_id", companyId).ne("id", setting.getId()));
+            if (count > 0) {
+                //msg.setError("该名称已存在");
+                msg.setError(MessageUtils.message("name.nameRepeat"));
+            } else {
+                //检查名称是否有变化
+                ProjectBasecostSetting oldSetting = projectBasecostSettingMapper.selectById(setting.getId());
+                if (!setting.getName().equals(oldSetting.getName()) || !setting.getAlarmType().equals(oldSetting.getAlarmType())) {
+                    projectBasecostSettingMapper.updateById(setting);
+                    if (!setting.getName().equals(oldSetting.getName())) {
+                        //名称发生变化了,要更新关联表
+                        ProjectBasecost cost = new ProjectBasecost();
+                        cost.setBaseName(setting.getName());
+                        projectBasecostMapper.update(cost, new QueryWrapper<ProjectBasecost>().eq("base_id", setting.getId()));
+                        ProjectAddcostItem addItem = new ProjectAddcostItem();
+                        addItem.setBaseName(setting.getName());
+                        projectAddcostItemMapper.update(addItem, new QueryWrapper<ProjectAddcostItem>().eq("base_id", setting.getId()));
+                        ProjectCurrentcost currentcost = new ProjectCurrentcost();
+                        currentcost.setBaseName(setting.getName());
+                        projectCurrentcostMapper.update(currentcost, new QueryWrapper<ProjectCurrentcost>().eq("base_id", setting.getId()));
+                    }
+                }
+                msg.data = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId));
+            }
+        }
+
+        return msg;
+    }
+
+    @RequestMapping("/list")
+    public HttpRespMsg list() {
+        HttpRespMsg msg = new HttpRespMsg();
+
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        List<ProjectBasecostSetting> list = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId));
+        if (list.size() == 0) {
+            //生成项目的成本基线默认条目
+            String[] array = Constant.DEFAULT_BASE_COST_ITEMS;
+            for (String baseItem : array) {
+                ProjectBasecostSetting setting = new ProjectBasecostSetting();
+                setting.setName(baseItem);
+                setting.setCompanyId(companyId);
+                projectBasecostSettingMapper.insert(setting);
+            }
+            list = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId));
+        }
+        msg.data = list;
+
+        return msg;
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id) {
+        HttpRespMsg msg = new HttpRespMsg();
+        ProjectBasecostSetting projectBasecostSetting = projectBasecostSettingMapper.selectById(id);
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        if (!projectBasecostSetting.getCompanyId().equals(companyId)) {
+            //msg.setError("无权操作");
+            msg.setError(MessageUtils.message("access.operationError"));
+        } else {
+            projectBasecostSettingMapper.deleteById(id);
+        }
+
+        return msg;
+    }
+
+
+    @RequestMapping("/getReportBasecostList")
+    public HttpRespMsg getReportBasecostList(Integer companyId) {
+        //返回公司的项目工时预警的成本项列表
+        HttpRespMsg msg = new HttpRespMsg();
+        List<ProjectBasecostSetting> timeBasecostList = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId).eq("alarm_type", 1));
+        msg.data = timeBasecostList;
+        return msg;
+    }
+
+}
+

+ 125 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectCategoryController.java

@@ -0,0 +1,125 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.Project;
+import com.management.platform.entity.ProjectCategory;
+import com.management.platform.entity.ProjectMain;
+import com.management.platform.mapper.ProjectCategoryMapper;
+import com.management.platform.mapper.ProjectMainMapper;
+import com.management.platform.mapper.ProjectMapper;
+import com.management.platform.mapper.UserMapper;
+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-03-24
+ */
+@RestController
+@RequestMapping("/project-category")
+public class ProjectCategoryController {
+
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    ProjectCategoryMapper projectCategoryMapper;
+    @Resource
+    ProjectMainMapper projectMainMapper;
+
+    @Resource
+    ProjectMapper projectMapper;
+
+    @RequestMapping("/addOrMod")
+    public HttpRespMsg addOrMod(ProjectCategory setting) {
+        HttpRespMsg msg = new HttpRespMsg();
+        if (StringUtils.isEmpty(setting.getName())) {
+            //msg.setError("名称不能为空");
+            msg.setError(MessageUtils.message("name.nullNameError"));
+            return msg;
+        }
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        if (setting.getId() == null) {
+            setting.setCompanyId(companyId);
+            int count = projectCategoryMapper.selectCount(new QueryWrapper<ProjectCategory>().eq("name", setting.getName()).eq("company_id", setting.getCompanyId()));
+            if (count > 0) {
+                //msg.setError("该名称已存在");
+                msg.setError(MessageUtils.message("name.nameRepeat"));
+            } else {
+                projectCategoryMapper.insert(setting);
+                msg.data = projectCategoryMapper.selectList(new QueryWrapper<ProjectCategory>().eq("company_id", companyId));
+            }
+        } else {
+            int count = projectCategoryMapper.selectCount(new QueryWrapper<ProjectCategory>().eq("name", setting.getName())
+                    .eq("company_id", companyId).ne("id", setting.getId()));
+            if (count > 0) {
+                //msg.setError("该名称已存在");
+                msg.setError(MessageUtils.message("name.nameRepeat"));
+            } else {
+                //检查名称是否有变化
+                ProjectCategory oldSetting = projectCategoryMapper.selectById(setting.getId());
+                if ((!setting.getName().equals(oldSetting.getName()))||(!setting.getProBuAudit().equals(oldSetting.getProBuAudit()))||(!setting.getProInchargerAudit().equals(oldSetting.getProInchargerAudit()))) {
+                    projectCategoryMapper.updateById(setting);
+                    Project cost = new Project();
+                    cost.setCategoryName(setting.getName());
+                    projectMapper.update(cost, new QueryWrapper<Project>().eq("category", setting.getId()));
+                }
+                msg.data = projectCategoryMapper.selectList(new QueryWrapper<ProjectCategory>().eq("company_id", companyId));
+            }
+        }
+
+        return msg;
+    }
+
+    @RequestMapping("/list")
+    public HttpRespMsg list() {
+        HttpRespMsg msg = new HttpRespMsg();
+
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        List<ProjectCategory> list = projectCategoryMapper.selectList(new QueryWrapper<ProjectCategory>().eq("company_id", companyId));
+        msg.data = list;
+
+        return msg;
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id) {
+        HttpRespMsg msg = new HttpRespMsg();
+        ProjectCategory ProjectCategory = projectCategoryMapper.selectById(id);
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        Integer cut = projectMapper.selectCount(new QueryWrapper<Project>().eq("category", id));
+        Integer cnt = projectMainMapper.selectCount(new QueryWrapper<ProjectMain>().eq("category_id", id));
+        if(cut>0){
+            //msg.setError("删除失败,已绑定项目");
+            msg.setError(MessageUtils.message("project.deleteErrorByProject"));
+            return msg;
+        }
+        if(cnt>0){
+            //msg.setError("删除失败,已绑定主项目");
+            msg.setError(MessageUtils.message("project.deleteErrorByMaster"));
+            return msg;
+        }
+        if (!ProjectCategory.getCompanyId().equals(companyId)) {
+            //msg.setError("无权操作");
+            msg.setError(MessageUtils.message("access.operationError"));
+        } else {
+            projectCategoryMapper.deleteById(id);
+        }
+        return msg;
+    }
+
+}
+

Dosya farkı çok büyük olduğundan ihmal edildi
+ 1186 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectController.java


+ 86 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectCurrentcostController.java

@@ -0,0 +1,86 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.ProjectBasecostSetting;
+import com.management.platform.entity.ProjectCurrentcost;
+import com.management.platform.mapper.ProjectBasecostSettingMapper;
+import com.management.platform.mapper.ProjectCurrentcostMapper;
+import com.management.platform.mapper.ReportMapper;
+import com.management.platform.service.ProjectCurrentcostService;
+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.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-07
+ */
+@RestController
+@RequestMapping("/project-currentcost")
+public class ProjectCurrentcostController {
+    @Resource
+    private ProjectCurrentcostService projectCurrentcostService;
+    @Resource
+    private ReportMapper reportMapper;
+    @Resource
+    ProjectBasecostSettingMapper projectBasecostSettingMapper;
+
+    @RequestMapping("/get")
+    public HttpRespMsg get(Integer companyId, Integer projectId) {
+        List<ProjectCurrentcost> projectCurrentcosts = projectCurrentcostService.list(new QueryWrapper<ProjectCurrentcost>().eq("project_id", projectId));
+        HttpRespMsg msg = new HttpRespMsg();
+        List<ProjectBasecostSetting> basecostSettingList = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId).eq("alarm_type", 1));
+        List<Integer> projectIds = new ArrayList<>();
+        projectIds.add(projectId);
+        List<Map<String, Object>> projectCost = reportMapper.getOneProjectBaseCost(projectId);
+
+        //设置alarmType类型, 实际成本
+        projectCurrentcosts.forEach(cur->{
+            Optional<ProjectBasecostSetting> first = basecostSettingList.stream().filter(base -> base.getId().equals(cur.getBaseId())).findFirst();
+            if (first.isPresent()) {
+                cur.setAlarmType(first.get().getAlarmType());
+            }
+            for (Map<String, Object> map : projectCost) {
+                int bid = (int)map.get("basecostId");
+                if (bid == cur.getBaseId()) {
+                    double cost = ((BigDecimal)map.get("cost")).doubleValue();
+                    cur.setRealCost(cost);
+                    break;
+                }
+            }
+        });
+
+//        double cost = reportMapper.getOneProjectCost(projectId);
+//        HashMap map = new HashMap();
+//        map.put("list", projectCurrentcosts);
+//        map.put("reportCost", cost);
+        msg.data = projectCurrentcosts;
+        return msg;
+    }
+
+    @RequestMapping("/getTimeSheetCostListByProject")
+    public HttpRespMsg getTimeSheetCostListByProject(Integer companyId, Integer projectId) {
+        List<ProjectCurrentcost> projectCurrentcosts = projectCurrentcostService.list(new QueryWrapper<ProjectCurrentcost>().eq("project_id", projectId));
+        HttpRespMsg msg = new HttpRespMsg();
+        List<ProjectBasecostSetting> basecostSettingList = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId).eq("alarm_type", 1));
+        //取alarmType为1的,即是工时预警类型的
+        projectCurrentcosts = projectCurrentcosts.stream().filter(cur->{
+            int alarmType = basecostSettingList.stream().filter(base->base.getId().equals(cur.getBaseId())).findFirst().get().getAlarmType();
+            return alarmType == 1;
+        }).collect(Collectors.toList());
+        msg.data = projectCurrentcosts;
+        return msg;
+    }
+}
+

+ 125 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectCustomController.java

@@ -0,0 +1,125 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.Project;
+import com.management.platform.entity.ProjectCustom;
+import com.management.platform.mapper.ProjectCustomMapper;
+import com.management.platform.mapper.ProjectMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ProjectCustomService;
+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 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 2023-03-20
+ */
+@RestController
+@RequestMapping("/project-custom")
+public class ProjectCustomController {
+    @Autowired
+    private ProjectCustomService projectCustomService;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private ProjectCustomMapper projectCustomMapper;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private ProjectMapper projectMapper;
+    @RequestMapping("/editProjectCustom")
+    public HttpRespMsg editProjectCustom(ProjectCustom projectCustom){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<ProjectCustom> projectCustomList = projectCustomMapper.selectList(new QueryWrapper<ProjectCustom>().eq("company_id", companyId));
+        List<String> nameList=new ArrayList<>();
+        List<ProjectCustom> customList = projectCustomList.stream().filter(pl -> pl.getCustomType().equals(projectCustom.getCustomType())).collect(Collectors.toList());
+        customList.forEach(pc->{
+            nameList.add(pc.getCustomName());
+        });
+        if(nameList.contains(projectCustom.getCustomName())){
+            httpRespMsg.setError("名称已存在");
+            return httpRespMsg;
+        }
+        projectCustomService.saveOrUpdate(projectCustom);
+        return httpRespMsg;
+    }
+    @RequestMapping("/getProjectCustom")
+    public HttpRespMsg getProjectCustom(HttpServletRequest request){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<ProjectCustom> projectCustomList = projectCustomMapper.selectList(new QueryWrapper<ProjectCustom>().eq("company_id", companyId));
+        httpRespMsg.data=projectCustomList;
+        return httpRespMsg;
+    }
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id,HttpServletRequest request){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<ProjectCustom> projectCustomList = projectCustomMapper.selectList(new QueryWrapper<ProjectCustom>().eq("company_id", companyId));
+        Integer num=null;
+        Object result=null;
+        for(int i=0;i<projectCustomList.size();i++){
+            if(id.equals(projectCustomList.get(i).getId())){
+                num=i;
+            }
+        }
+        List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", companyId));
+        for(Project project:projectList) {
+            switch (num){
+                case 0:
+                    result=project.getPlate1();
+                    break;
+                case 1:
+                    result=project.getPlate2();
+                    break;
+                case 2:
+                    result=project.getPlate3();
+                    break;
+                case 3:
+                    result=project.getPlate4();
+                    break;
+                case 4:
+                    result=project.getPlate5();
+                    break;
+                case 5:
+                    result=project.getPlate6();
+                    break;
+                case 6:
+                    result=project.getPlate7();
+                    break;
+                case 7:
+                    result=project.getPlate8();
+                    break;
+                case 8:
+                    result=project.getPlate9();
+                    break;
+                case 9:
+                    result=project.getPlate10();
+                    break;
+            }
+            if(result!=null){
+                httpRespMsg.setError("当前配置下已存在数据");
+                return httpRespMsg;
+            }
+        }
+        projectCustomService.removeById(id);
+        return new HttpRespMsg();
+    }
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectDocfolderController.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-04-19
+ */
+@RestController
+@RequestMapping("/project-docfolder")
+public class ProjectDocfolderController {
+
+}
+

+ 70 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectLevelController.java

@@ -0,0 +1,70 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.Project;
+import com.management.platform.entity.ProjectLevel;
+import com.management.platform.entity.TimeType;
+import com.management.platform.mapper.TimeTypeMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ProjectLevelService;
+import com.management.platform.service.ProjectService;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+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-07-25
+ */
+@RestController
+@RequestMapping("/project-level")
+public class ProjectLevelController {
+    @Autowired
+    private ProjectLevelService projectLevelService;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private ProjectService projectService;
+    @Resource
+    private TimeTypeMapper timeTypeMapper;
+    @RequestMapping("/addOrMod")
+    public HttpRespMsg addOrMod(HttpServletRequest request, ProjectLevel projectLevel){
+        return projectLevelService.addOrMod(request,projectLevel);
+    }
+    @RequestMapping("/list")
+    public HttpRespMsg list(HttpServletRequest request){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<ProjectLevel> projectLevelList = projectLevelService.list(new QueryWrapper<ProjectLevel>().eq("company_id", companyId));
+        httpRespMsg.data=projectLevelList;
+        return httpRespMsg;
+    }
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id,HttpServletRequest request){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        TimeType timeType = timeTypeMapper.selectById(companyId);
+        if(timeType.getProjectLevelState()==1){
+            int cut = projectService.count(new QueryWrapper<Project>().eq("level", id).eq("company_id",companyId));
+            if(cut>0){
+                //httpRespMsg.setError("已绑定项目");
+                httpRespMsg.setError(MessageUtils.message("project.BoundItems"));
+                return httpRespMsg;
+            }
+            projectLevelService.removeById(id);
+        }
+        return httpRespMsg;
+    }
+}
+

+ 66 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectMainController.java

@@ -0,0 +1,66 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.Project;
+import com.management.platform.entity.ProjectMain;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ProjectMainService;
+import com.management.platform.service.ProjectService;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+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-06-28
+ */
+@RestController
+@RequestMapping("/project-main")
+public class ProjectMainController {
+    @Autowired
+    private ProjectMainService projectMainService;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private ProjectService projectService;
+    @RequestMapping("/addOrMod")
+    public HttpRespMsg addOrMod(HttpServletRequest request,ProjectMain projectMain){
+       return projectMainService.addOrMod(request,projectMain);
+    }
+    @RequestMapping("/list")
+    public HttpRespMsg list(HttpServletRequest request){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<ProjectMain> projectMainList = projectMainService.list(new QueryWrapper<ProjectMain>().eq("company_id", companyId));
+        httpRespMsg.data=projectMainList;
+        return httpRespMsg;
+    }
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        int cut = projectService.count(new QueryWrapper<Project>().eq("project_main_id", id));
+        if(cut>0){
+            //httpRespMsg.setError("已绑定项目");
+            httpRespMsg.setError(MessageUtils.message("project.BoundItems"));
+            return httpRespMsg;
+        }
+        projectMainService.removeById(id);
+        return httpRespMsg;
+    }
+    @RequestMapping("/getListByCategory")
+    public HttpRespMsg getListByCategory(Integer categoryId){
+        return projectMainService.getListByCategory(categoryId);
+    }
+}
+

+ 74 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectNotifyUserController.java

@@ -0,0 +1,74 @@
+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.ProjectNotifyUser;
+import com.management.platform.service.ProjectNotifyUserService;
+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 java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-09-01
+ */
+@RestController
+@RequestMapping("/project-notify-user")
+public class ProjectNotifyUserController {
+    @Resource
+    ProjectNotifyUserService projectNotifyUserService;
+
+    @RequestMapping("/modify")
+    public HttpRespMsg add(Integer projectId, String chosenLeaders) {
+        HttpRespMsg msg = new HttpRespMsg();
+        projectNotifyUserService.remove(new QueryWrapper<ProjectNotifyUser>().eq("project_id", projectId));
+
+        if (chosenLeaders != null && chosenLeaders.length() > 0) {
+            JSONArray array = JSONArray.parseArray(chosenLeaders);
+            List<ProjectNotifyUser> notifyUsers = new ArrayList<>();
+            for (int i = 0;i<array.size(); i++) {
+                JSONObject jsonObject = array.getJSONObject(i);
+                ProjectNotifyUser projectNotifyUser = JSONObject.toJavaObject(jsonObject, ProjectNotifyUser.class);
+                projectNotifyUser.setProjectId(projectId);
+                notifyUsers.add(projectNotifyUser);
+            }
+            projectNotifyUserService.saveBatch(notifyUsers);
+        }
+        return msg;
+
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id) {
+        HttpRespMsg msg = new HttpRespMsg();
+        boolean success = projectNotifyUserService.removeById(id);
+        if (!success) {
+            //msg.setError("记录不存在,操作失败");
+            msg.setError(MessageUtils.message("project.RecordNotExist"));
+        }
+        return msg;
+    }
+
+    @RequestMapping("/get")
+    public HttpRespMsg get(Integer projectId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data= projectNotifyUserService.list(new QueryWrapper<ProjectNotifyUser>().eq("project_id", projectId));
+        return msg;
+    }
+
+
+
+}
+

+ 50 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectPercentageController.java

@@ -0,0 +1,50 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.service.ProjectPercentageService;
+import com.management.platform.util.HttpRespMsg;
+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;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-02-26
+ */
+@RestController
+@RequestMapping("/project-percentage")
+public class ProjectPercentageController {
+
+    @Resource
+    private ProjectPercentageService projectPercentageService;
+
+    @RequestMapping("/saveMonthSetting")
+    public HttpRespMsg saveMonthSetting(String projectCols, String userSettings, String ymonth) {
+        return projectPercentageService.saveMonthSetting(projectCols, userSettings, ymonth);
+    }
+
+    @RequestMapping("/getMonthSetting")
+    public HttpRespMsg getMonthSetting(String ymonth) {
+        return projectPercentageService.getMonthSetting(ymonth);
+    }
+
+    @RequestMapping("/importData")
+    public HttpRespMsg importData(Integer companyId, Integer withCheckIn,
+                                  MultipartFile file, HttpServletRequest request,String ymonth) throws Exception {
+        return projectPercentageService.importData(companyId,withCheckIn, file, request,ymonth);
+    }
+
+    @RequestMapping("/getTemplate")
+    public HttpRespMsg getTemplate(String ymonth) throws Exception {
+        return projectPercentageService.getTemplate(ymonth);
+    }
+}
+

+ 0 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProjectStageController.java


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