ControlDream hai 1 ano
achega
d42680eb83
Modificáronse 100 ficheiros con 4519 adicións e 0 borrados
  1. 37 0
      .gitignore
  2. 44 0
      code/pom.xml
  3. 17 0
      code/src/test/java/BaseDataSource.java
  4. 63 0
      hx-admin/pom.xml
  5. 19 0
      hx-admin/src/main/java/com/fjhx/admin/BytesailingApplication.java
  6. 56 0
      hx-admin/src/main/resources/application-dev.yml
  7. 59 0
      hx-admin/src/main/resources/application-prod.yml
  8. 60 0
      hx-admin/src/main/resources/application-test.yml
  9. 165 0
      hx-admin/src/main/resources/application.yml
  10. 27 0
      hx-common/pom.xml
  11. 62 0
      hx-common/src/main/java/com/fjhx/common/aspect/DataSourceAspect.java
  12. 52 0
      hx-common/src/main/java/com/fjhx/common/constant/SourceConstant.java
  13. 44 0
      hx-common/src/main/java/com/fjhx/common/controller/coding/CodingRuleController.java
  14. 72 0
      hx-common/src/main/java/com/fjhx/common/controller/contract/ContractTemplateController.java
  15. 71 0
      hx-common/src/main/java/com/fjhx/common/controller/corporation/CorporationController.java
  16. 36 0
      hx-common/src/main/java/com/fjhx/common/controller/country/CountryController.java
  17. 44 0
      hx-common/src/main/java/com/fjhx/common/controller/currency/CurrencyRateController.java
  18. 68 0
      hx-common/src/main/java/com/fjhx/common/controller/documentary/DocumentaryController.java
  19. 63 0
      hx-common/src/main/java/com/fjhx/common/controller/documentary/DocumentaryRecordController.java
  20. 58 0
      hx-common/src/main/java/com/fjhx/common/controller/multilingual/MultilingualController.java
  21. 31 0
      hx-common/src/main/java/com/fjhx/common/controller/on/OnLineInfoController.java
  22. 62 0
      hx-common/src/main/java/com/fjhx/common/controller/problem/ProblemFeedbackController.java
  23. 79 0
      hx-common/src/main/java/com/fjhx/common/controller/send/SendMegController.java
  24. 20 0
      hx-common/src/main/java/com/fjhx/common/entity/coding/bo/CustomerCodeAndCountryId.java
  25. 24 0
      hx-common/src/main/java/com/fjhx/common/entity/coding/dto/CodingRuleDto.java
  26. 17 0
      hx-common/src/main/java/com/fjhx/common/entity/coding/dto/CodingRuleSelectDto.java
  27. 30 0
      hx-common/src/main/java/com/fjhx/common/entity/coding/dto/DefaultRule.java
  28. 20 0
      hx-common/src/main/java/com/fjhx/common/entity/coding/dto/RuleVo.java
  29. 41 0
      hx-common/src/main/java/com/fjhx/common/entity/coding/po/CodingRule.java
  30. 28 0
      hx-common/src/main/java/com/fjhx/common/entity/coding/po/CodingRuleAuto.java
  31. 60 0
      hx-common/src/main/java/com/fjhx/common/entity/coding/vo/CodingRulePageVo.java
  32. 17 0
      hx-common/src/main/java/com/fjhx/common/entity/contract/dto/ContractTemplateDto.java
  33. 22 0
      hx-common/src/main/java/com/fjhx/common/entity/contract/dto/ContractTemplateSelectDto.java
  34. 53 0
      hx-common/src/main/java/com/fjhx/common/entity/contract/po/ContractTemplate.java
  35. 29 0
      hx-common/src/main/java/com/fjhx/common/entity/contract/vo/ContractTemplateVo.java
  36. 51 0
      hx-common/src/main/java/com/fjhx/common/entity/corporation/dto/CorporationDto.java
  37. 17 0
      hx-common/src/main/java/com/fjhx/common/entity/corporation/dto/CorporationSelectDto.java
  38. 137 0
      hx-common/src/main/java/com/fjhx/common/entity/corporation/po/Corporation.java
  39. 25 0
      hx-common/src/main/java/com/fjhx/common/entity/corporation/vo/CorporationVo.java
  40. 26 0
      hx-common/src/main/java/com/fjhx/common/entity/country/po/Country.java
  41. 33 0
      hx-common/src/main/java/com/fjhx/common/entity/currency/po/CurrencyRate.java
  42. 20 0
      hx-common/src/main/java/com/fjhx/common/entity/documentary/bo/DocumentaryData.java
  43. 17 0
      hx-common/src/main/java/com/fjhx/common/entity/documentary/dto/DocumentaryDto.java
  44. 25 0
      hx-common/src/main/java/com/fjhx/common/entity/documentary/dto/DocumentaryRecordDto.java
  45. 34 0
      hx-common/src/main/java/com/fjhx/common/entity/documentary/dto/DocumentaryRecordSelectDto.java
  46. 17 0
      hx-common/src/main/java/com/fjhx/common/entity/documentary/dto/DocumentarySelectDto.java
  47. 57 0
      hx-common/src/main/java/com/fjhx/common/entity/documentary/eums/DocumentaryTypeEnum.java
  48. 47 0
      hx-common/src/main/java/com/fjhx/common/entity/documentary/po/Documentary.java
  49. 46 0
      hx-common/src/main/java/com/fjhx/common/entity/documentary/po/DocumentaryRecord.java
  50. 24 0
      hx-common/src/main/java/com/fjhx/common/entity/documentary/vo/DocumentaryRecordInfoVo.java
  51. 22 0
      hx-common/src/main/java/com/fjhx/common/entity/documentary/vo/DocumentaryRecordVo.java
  52. 22 0
      hx-common/src/main/java/com/fjhx/common/entity/documentary/vo/DocumentaryVo.java
  53. 17 0
      hx-common/src/main/java/com/fjhx/common/entity/on/dto/OnLineInfoDto.java
  54. 17 0
      hx-common/src/main/java/com/fjhx/common/entity/on/dto/OnLineInfoSelectDto.java
  55. 48 0
      hx-common/src/main/java/com/fjhx/common/entity/on/po/OnLineInfo.java
  56. 33 0
      hx-common/src/main/java/com/fjhx/common/entity/on/vo/OnLineInfoReturnData.java
  57. 27 0
      hx-common/src/main/java/com/fjhx/common/entity/on/vo/OnLineInfoVo.java
  58. 17 0
      hx-common/src/main/java/com/fjhx/common/entity/problem/dto/ProblemFeedbackDto.java
  59. 27 0
      hx-common/src/main/java/com/fjhx/common/entity/problem/dto/ProblemFeedbackSelectDto.java
  60. 61 0
      hx-common/src/main/java/com/fjhx/common/entity/problem/po/ProblemFeedback.java
  61. 17 0
      hx-common/src/main/java/com/fjhx/common/entity/problem/vo/ProblemFeedbackVo.java
  62. 19 0
      hx-common/src/main/java/com/fjhx/common/entity/send/dto/SendMegDto.java
  63. 27 0
      hx-common/src/main/java/com/fjhx/common/entity/send/dto/SendMegSelectDto.java
  64. 59 0
      hx-common/src/main/java/com/fjhx/common/entity/send/po/SendMeg.java
  65. 17 0
      hx-common/src/main/java/com/fjhx/common/entity/send/vo/SendMegVo.java
  66. 169 0
      hx-common/src/main/java/com/fjhx/common/enums/CodingRuleEnum.java
  67. 44 0
      hx-common/src/main/java/com/fjhx/common/enums/FlowStatusEnum1.java
  68. 48 0
      hx-common/src/main/java/com/fjhx/common/enums/PushBusinessTypeEnum.java
  69. 41 0
      hx-common/src/main/java/com/fjhx/common/enums/RuleTypeEnum.java
  70. 17 0
      hx-common/src/main/java/com/fjhx/common/mapper/coding/CodingRuleAutoMapper.java
  71. 17 0
      hx-common/src/main/java/com/fjhx/common/mapper/coding/CodingRuleMapper.java
  72. 26 0
      hx-common/src/main/java/com/fjhx/common/mapper/contract/ContractTemplateMapper.java
  73. 26 0
      hx-common/src/main/java/com/fjhx/common/mapper/corporation/CorporationMapper.java
  74. 17 0
      hx-common/src/main/java/com/fjhx/common/mapper/country/CountryMapper.java
  75. 16 0
      hx-common/src/main/java/com/fjhx/common/mapper/currency/CurrencyRateMapper.java
  76. 26 0
      hx-common/src/main/java/com/fjhx/common/mapper/documentary/DocumentaryMapper.java
  77. 21 0
      hx-common/src/main/java/com/fjhx/common/mapper/documentary/DocumentaryRecordMapper.java
  78. 27 0
      hx-common/src/main/java/com/fjhx/common/mapper/on/OnLineInfoMapper.java
  79. 26 0
      hx-common/src/main/java/com/fjhx/common/mapper/problem/ProblemFeedbackMapper.java
  80. 26 0
      hx-common/src/main/java/com/fjhx/common/mapper/send/SendMegMapper.java
  81. 17 0
      hx-common/src/main/java/com/fjhx/common/service/coding/CodingRuleAutoService.java
  82. 9 0
      hx-common/src/main/java/com/fjhx/common/service/coding/CodingRuleCustomerService.java
  83. 33 0
      hx-common/src/main/java/com/fjhx/common/service/coding/CodingRuleService.java
  84. 21 0
      hx-common/src/main/java/com/fjhx/common/service/coding/impl/CodingRuleAutoServiceImpl.java
  85. 284 0
      hx-common/src/main/java/com/fjhx/common/service/coding/impl/CodingRuleServiceImpl.java
  86. 46 0
      hx-common/src/main/java/com/fjhx/common/service/contract/ContractTemplateService.java
  87. 60 0
      hx-common/src/main/java/com/fjhx/common/service/contract/impl/ContractTemplateServiceImpl.java
  88. 46 0
      hx-common/src/main/java/com/fjhx/common/service/corporation/CorporationService.java
  89. 100 0
      hx-common/src/main/java/com/fjhx/common/service/corporation/impl/CorporationServiceImpl.java
  90. 17 0
      hx-common/src/main/java/com/fjhx/common/service/country/CountryService.java
  91. 21 0
      hx-common/src/main/java/com/fjhx/common/service/country/impl/CountryServiceImpl.java
  92. 28 0
      hx-common/src/main/java/com/fjhx/common/service/currency/CurrencyRateService.java
  93. 32 0
      hx-common/src/main/java/com/fjhx/common/service/currency/impl/CurrencyRateServiceImpl.java
  94. 40 0
      hx-common/src/main/java/com/fjhx/common/service/documentary/DocumentaryRecordService.java
  95. 46 0
      hx-common/src/main/java/com/fjhx/common/service/documentary/DocumentaryService.java
  96. 22 0
      hx-common/src/main/java/com/fjhx/common/service/documentary/GetDocumentaryBusinessTemplate.java
  97. 233 0
      hx-common/src/main/java/com/fjhx/common/service/documentary/impl/DocumentaryRecordServiceImpl.java
  98. 59 0
      hx-common/src/main/java/com/fjhx/common/service/documentary/impl/DocumentaryServiceImpl.java
  99. 19 0
      hx-common/src/main/java/com/fjhx/common/service/on/OnLineInfoService.java
  100. 183 0
      hx-common/src/main/java/com/fjhx/common/service/on/impl/OnLineInfoServiceImpl.java

+ 37 - 0
.gitignore

@@ -0,0 +1,37 @@
+# Created by .ignore support plugin (hsz.mobi)
+### Java template
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs
+hs_err_pid*
+
+.idea/.gitignore
+.idea/misc.xml
+.idea/modules.xml
+.idea/vcs.xml
+
+.idea
+app-log
+**/target
+**/libraries
+**/*.iml
+

+ 44 - 0
code/pom.xml

@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.fjhx</groupId>
+        <artifactId>bytesailing</artifactId>
+        <version>1.0</version>
+    </parent>
+
+    <artifactId>code</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.fly</groupId>
+            <artifactId>fly-generator</artifactId>
+            <version>1.0.hx</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+            <version>1.2.17</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <version>1.7.7</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-log4j12</artifactId>
+            <version>1.7.7</version>
+        </dependency>
+    </dependencies>
+
+</project>

+ 17 - 0
code/src/test/java/BaseDataSource.java

@@ -0,0 +1,17 @@
+import fly.generator.GeneratorApplication;
+
+public class BaseDataSource {
+
+    public static void main(String[] args) {
+        GeneratorApplication.builder()
+                .url("jdbc:mysql://36.134.91.96:17330/bytesailing_base?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true")
+                .username("fjhx2012mysql")
+                .password("3PN-Mzn#vnP&q6d")
+                .port(9989)
+                .module("hx-area")
+                .parent("com.fjhx.area")
+                .superServiceClass("com.ruoyi.common.core.service.BaseService")
+                .build();
+    }
+
+}

+ 63 - 0
hx-admin/pom.xml

@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>com.fjhx</groupId>
+        <artifactId>bytesailing</artifactId>
+        <version>1.0</version>
+    </parent>
+
+    <artifactId>hx-admin</artifactId>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>com.fjhx</groupId>
+            <artifactId>hx-base</artifactId>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <version>3.1.0</version>
+                <configuration>
+                    <failOnMissingWebXml>false</failOnMissingWebXml>
+                    <warName>${project.artifactId}</warName>
+                </configuration>
+            </plugin>
+        </plugins>
+        <finalName>${project.artifactId}</finalName>
+    </build>
+
+</project>

+ 19 - 0
hx-admin/src/main/java/com/fjhx/admin/BytesailingApplication.java

@@ -0,0 +1,19 @@
+package com.fjhx.admin;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@Slf4j
+@SpringBootApplication(scanBasePackages = "com.fjhx.**")
+public class BytesailingApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(BytesailingApplication.class, args);
+
+        log.info("\r\n==================================================================\r\n"
+                + ">>>>> " + BytesailingApplication.class.getSimpleName() + " is success!\r\n"
+                + "==================================================================");
+    }
+
+}

+ 56 - 0
hx-admin/src/main/resources/application-dev.yml

@@ -0,0 +1,56 @@
+# 数据源配置
+spring:
+  datasource:
+    dynamic:
+      strict: true
+      primary: base
+      datasource:
+        base:
+          url: jdbc:mysql://121.37.194.75:30102/bytesailing_base1?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=Asia/Shanghai
+          username: xmhjc
+          password: 2j^q9*DF
+        common:
+          url: jdbc:mysql://121.37.194.75:30102/bytesailing_common1?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=Asia/Shanghai
+          username: xmhjc
+          password: 2j^q9*DF
+
+
+  # redis 配置
+  redis:
+    # 地址
+    host: 121.37.194.75
+    # 端口,默认为6379
+    port: 30103
+    # 数据库索引
+    database: 5
+    # 密码
+    password: Fjhx@pwd123
+    # 连接超时时间
+    timeout: 10s
+    lettuce:
+      pool:
+        # 连接池中的最小空闲连接
+        min-idle: 0
+        # 连接池中的最大空闲连接
+        max-idle: 8
+        # 连接池的最大数据库连接数
+        max-active: 8
+        # #连接池最大阻塞等待时间(使用负值表示没有限制)
+        max-wait: -1ms
+
+mail:
+  # 调用邮箱服务url前缀
+  urlPrefix:
+  abroadUrlPrefix:
+
+hx:
+  httpUrl: http://localhost:9898/
+
+# token配置
+token:
+  # 令牌自定义标识
+  header: Authorization
+  # 令牌密钥
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 令牌有效期(默认30分钟)
+  expireTime: 2880

+ 59 - 0
hx-admin/src/main/resources/application-prod.yml

@@ -0,0 +1,59 @@
+# 数据源配置
+spring:
+  datasource:
+    dynamic:
+      strict: true
+      primary: base
+      datasource:
+        base:
+          url: jdbc:mysql://121.37.194.75:30102/bytesailing_base?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=Asia/Shanghai
+          username: root
+          password: 5fWD*oa^nso@kmKa
+        common:
+          url: jdbc:mysql://121.37.194.75:30102/bytesailing_common?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=Asia/Shanghai
+          username: root
+          password: 5fWD*oa^nso@kmKa
+
+  # redis 配置
+  redis:
+    # 地址
+    host: 127.0.0.1
+    # 端口,默认为6379
+    port: 31347
+    # 数据库索引
+    database: 1
+    # 密码
+    password: w3G_11h4YjrsO_6P5Oi
+    # 连接超时时间
+    timeout: 10s
+    lettuce:
+      pool:
+        # 连接池中的最小空闲连接
+        min-idle: 0
+        # 连接池中的最大空闲连接
+        max-idle: 8
+        # 连接池的最大数据库连接数
+        max-active: 8
+        # #连接池最大阻塞等待时间(使用负值表示没有限制)
+        max-wait: -1ms
+
+server:
+  servlet:
+    context-path: /prod-api
+
+mail:
+  # 调用邮箱服务url前缀
+  urlPrefix:
+  abroadUrlPrefix:
+
+hx:
+  httpUrl: http://139.159.251.109:81/prod-api/
+
+# token配置
+token:
+  # 令牌自定义标识
+  header: Authorization
+  # 令牌密钥
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 令牌有效期(默认30分钟)
+  expireTime: 240

+ 60 - 0
hx-admin/src/main/resources/application-test.yml

@@ -0,0 +1,60 @@
+# 数据源配置
+spring:
+  datasource:
+    dynamic:
+      strict: true
+      primary: base
+      datasource:
+        base:
+          url: jdbc:mysql://121.37.194.75:30102/bytesailing_base?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=Asia/Shanghai
+          username: root
+          password: 5fWD*oa^nso@kmKa
+        common:
+          url: jdbc:mysql://121.37.194.75:30102/bytesailing_common?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=Asia/Shanghai
+          username: root
+          password: 5fWD*oa^nso@kmKa
+
+  # redis 配置
+  redis:
+    # 地址
+    host: 127.0.0.1
+    # 端口,默认为6379
+    port: 30103
+    # 数据库索引
+    database: 5
+    # 密码
+    password: Fjhx@pwd123
+    # 连接超时时间
+    timeout: 10s
+    lettuce:
+      pool:
+        # 连接池中的最小空闲连接
+        min-idle: 0
+        # 连接池中的最大空闲连接
+        max-idle: 8
+        # 连接池的最大数据库连接数
+        max-active: 8
+        # #连接池最大阻塞等待时间(使用负值表示没有限制)
+        max-wait: -1ms
+
+server:
+  port: 20001
+  servlet:
+    context-path: /test-api
+
+mail:
+  # 调用邮箱服务url前缀
+  urlPrefix:
+  abroadUrlPrefix:
+
+hx:
+  httpUrl: http://121.37.194.75:10006/test-api/
+
+# token配置
+token:
+  # 令牌自定义标识
+  header: Authorization
+  # 令牌密钥
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 令牌有效期(默认30分钟)
+  expireTime: 2880

+ 165 - 0
hx-admin/src/main/resources/application.yml

@@ -0,0 +1,165 @@
+# 项目相关配置
+ruoyi:
+  # 名称
+  name: xmhjc
+  # 版本
+  version: 3.8.5
+  # 版权年份
+  copyrightYear: 2023
+  # 实例演示开关
+  demoEnabled: true
+  # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
+  profile: D:/ruoyi/uploadPath
+  # 获取ip地址开关
+  addressEnabled: false
+  # 验证码类型 math 数组计算 char 字符验证
+  captchaType: math
+
+# 开发环境配置
+server:
+  # 服务器的HTTP端口,默认为8080
+  port: 9898
+  tomcat:
+    # tomcat的URI编码
+    uri-encoding: UTF-8
+    # 连接数满后的排队数,默认为100
+    accept-count: 1000
+    threads:
+      # tomcat最大线程数,默认为200
+      max: 800
+      # Tomcat启动初始化的线程数,默认值10
+      min-spare: 100
+
+# 日志配置
+logging:
+  level:
+    com.ruoyi: info
+    com.fjhx: info
+    org.springframework: warn
+
+# 用户配置
+user:
+  password:
+    # 密码最大错误次数
+    maxRetryCount: 5
+    # 密码锁定时间(默认10分钟)
+    lockTime: 10
+
+# Spring配置
+spring:
+  mvc:
+    path-match:
+      matching-strategy: ant_path_matcher
+  # 资源信息
+  messages:
+    # 国际化资源文件路径
+    basename: i18n/messages
+  profiles:
+    active: dev
+  # 文件上传
+  servlet:
+    multipart:
+      # 单个文件大小
+      max-file-size: 10MB
+      # 设置总上传的文件大小
+      max-request-size: 20MB
+  main:
+    allow-circular-references: true
+
+  autoconfigure:
+    # 排除 Druid 自动配置
+    exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
+
+  datasource:
+    # 指定使用 Druid 数据源
+    type: com.alibaba.druid.pool.DruidDataSource
+
+    dynamic:
+      druid:
+        # 初始连接数
+        initialSize: 3
+        # 最小连接池数量
+        minIdle: 10
+        # 最大连接池数量
+        maxActive: 100
+        # 配置获取连接等待超时的时间
+        maxWait: 60000
+        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+        timeBetweenEvictionRunsMillis: 60000
+        # 配置一个连接在池中最小生存的时间,单位是毫秒
+        minEvictableIdleTimeMillis: 300000
+        # 配置一个连接在池中最大生存的时间,单位是毫秒
+        maxEvictableIdleTimeMillis: 900000
+        validationQueryTimeout: 10000
+        # 配置检测连接是否有效
+        validationQuery: SELECT 1
+        testWhileIdle: true
+        testOnBorrow: false
+        testOnReturn: false
+        poolPreparedStatements: true
+        maxPoolPreparedStatementPerConnectionSize: 20
+
+    druid:
+      webStatFilter:
+        enabled: true
+        exclusions:
+          - "*.js"
+          - "/druid/*"
+      statViewServlet:
+        enabled: true
+        # 设置白名单,不填则允许所有访问
+        allow:
+        urlPattern: /druid/*
+        # 控制台管理用户名和密码
+        loginUsername: superAdmin
+        loginPassword: 123456
+      filter:
+        # 配置StatFilter (SQL监控配置)
+        stat:
+          enabled: true # 开启 SQL 监控
+          logSlowSql: true  # 记录慢查询 SQL
+          slowSqlMillis: 1000 # 多长时间算慢查询
+          mergeSql: true # 条件参数化作为一条sql统计
+
+        # 配置WallFilter (防火墙配置)
+        wall:
+          enabled: true # 开启防火墙
+          config:
+            dropTableAllow: true # 允许删表操作
+            updateAllow: true # 允许更新操作
+            insertAllow: true # 允许插入操作
+            deleteAllow: true # 允许删除操作
+            multiStatementAllow: true # 支持一次执行多条sql
+
+# MyBatis Plus配置
+mybatis-plus:
+  # 搜索指定包别名
+  typeAliasesPackage: com.ruoyi.**.domain,com.fjhx.**.entity.po
+  # 配置mapper的扫描,找到所有的mapper.xml映射文件
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 加载全局的配置文件
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    banner: false
+
+# PageHelper分页插件
+page-helper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# 防止XSS攻击
+xss:
+  # 过滤开关
+  enabled: true
+  # 排除链接(多个用逗号分隔)
+  excludes: /system/notice
+  # 匹配链接
+  urlPatterns: /system/*,/monitor/*,/tool/*
+
+obs:
+  ak: 9HNBVBHO7F3GLUCGTK5C
+  sk: ZowLEoMJrICA9tOyln0yWVm0xGSiupe0gnbsZimk
+  endPoint: obs.cn-south-1.myhuaweicloud.com
+  url: https://os.winfaster.cn/
+  bucketName: winfaster

+ 27 - 0
hx-common/pom.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.fjhx</groupId>
+        <artifactId>bytesailing</artifactId>
+        <version>1.0</version>
+    </parent>
+
+    <artifactId>hx-common</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.fjhx</groupId>
+            <artifactId>hx-base</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

+ 62 - 0
hx-common/src/main/java/com/fjhx/common/aspect/DataSourceAspect.java

@@ -0,0 +1,62 @@
+package com.fjhx.common.aspect;
+
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import com.fjhx.common.constant.SourceConstant;
+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.core.Ordered;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Field;
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Set;
+
+@Aspect
+@Component
+@Order(Ordered.HIGHEST_PRECEDENCE)
+public class DataSourceAspect {
+
+    private static final Set<String> dataSourceSet = new HashSet<>();
+
+    static {
+        Class<SourceConstant> sourceConstantClass = SourceConstant.class;
+        Field[] declaredFields = sourceConstantClass.getDeclaredFields();
+        for (Field declaredField : declaredFields) {
+            dataSourceSet.add(declaredField.getName().toLowerCase());
+        }
+    }
+
+    @Pointcut("execution (* com.fjhx.*.service.*.*.*(..))")
+    public void pointcut() {
+
+    }
+
+    @Around(value = "pointcut()")
+    public Object before(ProceedingJoinPoint point) throws Throwable {
+        Object target = point.getTarget();
+        String name = target.getClass().getName();
+        String moduleName = name.split("\\.")[2];
+
+        String peek = DynamicDataSourceContextHolder.peek();
+        if (Objects.equals(peek, moduleName)) {
+            return point.proceed();
+        }
+
+        if (dataSourceSet.contains(moduleName)) {
+            try {
+                DynamicDataSourceContextHolder.push(moduleName);
+                return point.proceed();
+            } finally {
+                DynamicDataSourceContextHolder.poll();
+            }
+        } else {
+            return point.proceed();
+        }
+    }
+
+
+}

+ 52 - 0
hx-common/src/main/java/com/fjhx/common/constant/SourceConstant.java

@@ -0,0 +1,52 @@
+package com.fjhx.common.constant;
+
+
+public interface SourceConstant {
+    
+    String ITEM = "item";
+
+    String SUPPLY = "supply";
+
+    String IOT = "iot";
+
+    String WMS = "wms";
+
+    String MES = "mes";
+
+    String OA = "oa";
+
+    String CUSTOMER = "customer";
+
+    String PURCHASE = "purchase";
+
+    String BASE = "base";
+
+    String ACCOUNT = "account";
+
+    String SALE = "sale";
+
+    String MAIL = "mail";
+
+    String COMMON = "common";
+
+    String VICTORIATOURIST = "victoriatourist";
+    String KD100 = "kd100";
+
+    /**
+     * ehsd定制数据库
+     */
+    String EHSD = "ehsd";
+
+    String DINGDING = "dingding";
+
+    /**
+     * 数据处理
+     */
+    String DATA = "data";
+
+    /**
+     * 嘉新双拓定制
+     */
+    String JXST = "jxst";
+
+}

+ 44 - 0
hx-common/src/main/java/com/fjhx/common/controller/coding/CodingRuleController.java

@@ -0,0 +1,44 @@
+package com.fjhx.common.controller.coding;
+
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.common.entity.coding.vo.CodingRulePageVo;
+import com.fjhx.common.entity.coding.dto.CodingRuleSelectDto;
+import com.fjhx.common.entity.coding.dto.CodingRuleDto;
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import com.fjhx.common.service.coding.CodingRuleService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+
+/**
+ * <p>
+ * 编码规则 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-04-13
+ */
+@RestController
+@RequestMapping("/codingRule")
+public class CodingRuleController {
+
+    @Autowired
+    private CodingRuleService codingRuleService;
+
+    /**
+     * 编码规则分页
+     */
+    @PostMapping("/page")
+    public Page<CodingRulePageVo> page(@RequestBody CodingRuleSelectDto dto) {
+        return codingRuleService.getPage(dto);
+    }
+
+    /**
+     * 编码规则编辑
+     */
+    @PostMapping("/edit")
+    public void edit(@RequestBody CodingRuleDto codingRuleDto) {
+        codingRuleService.edit(codingRuleDto);
+    }
+
+}

+ 72 - 0
hx-common/src/main/java/com/fjhx/common/controller/contract/ContractTemplateController.java

@@ -0,0 +1,72 @@
+package com.fjhx.common.controller.contract;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.common.entity.contract.dto.ContractTemplateDto;
+import com.fjhx.common.entity.contract.dto.ContractTemplateSelectDto;
+import com.fjhx.common.entity.contract.vo.ContractTemplateVo;
+import com.fjhx.common.service.contract.ContractTemplateService;
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+/**
+ * <p>
+ * 合同模板 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2023-04-14
+ */
+@RestController
+@RequestMapping("/contractTemplate")
+public class ContractTemplateController {
+
+    @Autowired
+    private ContractTemplateService contractTemplateService;
+
+    /**
+     * 合同模板分页
+     */
+    @PostMapping("/page")
+    public Page<ContractTemplateVo> page(@Validated @RequestBody ContractTemplateSelectDto dto) {
+        return contractTemplateService.getPage(dto);
+    }
+
+    /**
+     * 合同模板明细
+     */
+    @PostMapping("/detail")
+    public ContractTemplateVo detail(@RequestBody BaseSelectDto dto) {
+        return contractTemplateService.detail(dto.getId());
+    }
+
+    /**
+     * 合同模板新增
+     */
+    @PostMapping("/add")
+    public void add(@RequestBody ContractTemplateDto contractTemplateDto) {
+        contractTemplateService.add(contractTemplateDto);
+    }
+
+    /**
+     * 合同模板编辑
+     */
+    @PostMapping("/edit")
+    public void edit(@RequestBody ContractTemplateDto contractTemplateDto) {
+        contractTemplateService.edit(contractTemplateDto);
+    }
+
+    /**
+     * 合同模板删除
+     */
+    @PostMapping("/delete")
+    public void delete(@RequestBody BaseSelectDto dto) {
+        contractTemplateService.delete(dto.getId());
+    }
+
+}

+ 71 - 0
hx-common/src/main/java/com/fjhx/common/controller/corporation/CorporationController.java

@@ -0,0 +1,71 @@
+package com.fjhx.common.controller.corporation;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.common.entity.corporation.dto.CorporationDto;
+import com.fjhx.common.entity.corporation.dto.CorporationSelectDto;
+import com.fjhx.common.entity.corporation.vo.CorporationVo;
+import com.fjhx.common.service.corporation.CorporationService;
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+/**
+ * <p>
+ * 多公司配置 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-04-10
+ */
+@RestController
+@RequestMapping("/corporation")
+public class CorporationController {
+
+    @Autowired
+    private CorporationService corporationService;
+
+    /**
+     * 多公司配置分页
+     */
+    @PostMapping("/page")
+    public Page<CorporationVo> page(@RequestBody CorporationSelectDto dto) {
+        return corporationService.getPage(dto);
+    }
+
+    /**
+     * 多公司配置明细
+     */
+    @PostMapping("/detail")
+    public CorporationVo detail(@RequestBody BaseSelectDto dto) {
+        return corporationService.detail(dto.getId());
+    }
+
+    /**
+     * 多公司配置新增
+     */
+    @PostMapping("/add")
+    public void add(@RequestBody CorporationDto corporationDto) {
+        corporationService.add(corporationDto);
+    }
+
+    /**
+     * 多公司配置编辑
+     */
+    @PostMapping("/edit")
+    public void edit(@RequestBody CorporationDto corporationDto) {
+        corporationService.edit(corporationDto);
+    }
+
+    /**
+     * 多公司配置删除
+     */
+    @PostMapping("/delete")
+    public void delete(@RequestBody BaseSelectDto dto) {
+        corporationService.delete(dto.getId());
+    }
+
+}

+ 36 - 0
hx-common/src/main/java/com/fjhx/common/controller/country/CountryController.java

@@ -0,0 +1,36 @@
+package com.fjhx.common.controller.country;
+
+import com.fjhx.common.entity.country.po.Country;
+import com.fjhx.common.service.country.CountryService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+
+/**
+ * <p>
+ * 国家代码 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2023-04-12
+ */
+@RestController
+@RequestMapping("/country")
+public class CountryController {
+
+    @Autowired
+    private CountryService countryService;
+
+    /**
+     * 国家代码列表
+     */
+    @PostMapping("/list")
+    public List<Country> list() {
+        return countryService.list();
+    }
+
+}

+ 44 - 0
hx-common/src/main/java/com/fjhx/common/controller/currency/CurrencyRateController.java

@@ -0,0 +1,44 @@
+package com.fjhx.common.controller.currency;
+
+import com.fjhx.common.entity.currency.po.CurrencyRate;
+import com.fjhx.common.service.currency.CurrencyRateService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 币种默认汇率 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2023-04-24
+ */
+@RestController
+@RequestMapping("/currencyRate")
+public class CurrencyRateController {
+
+    @Autowired
+    private CurrencyRateService currencyRateService;
+
+    /**
+     * 币种默认汇率列表
+     */
+    @PostMapping("/list")
+    public List<CurrencyRate> list() {
+        return currencyRateService.getList();
+    }
+
+    /**
+     * 币种默认汇率编辑
+     */
+    @PostMapping("/edit")
+    public void edit(@RequestBody List<CurrencyRate> currencyRateList) {
+        currencyRateService.edit(currencyRateList);
+    }
+
+}

+ 68 - 0
hx-common/src/main/java/com/fjhx/common/controller/documentary/DocumentaryController.java

@@ -0,0 +1,68 @@
+package com.fjhx.common.controller.documentary;
+
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.common.entity.documentary.vo.DocumentaryVo;
+import com.fjhx.common.entity.documentary.dto.DocumentarySelectDto;
+import com.fjhx.common.entity.documentary.dto.DocumentaryDto;
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import com.fjhx.common.service.documentary.DocumentaryService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+
+/**
+ * <p>
+ * 跟单配置 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-04-19
+ */
+@RestController
+@RequestMapping("/documentary")
+public class DocumentaryController {
+
+    @Autowired
+    private DocumentaryService documentaryService;
+
+    /**
+     * 跟单配置分页
+     */
+    @PostMapping("/page")
+    public Page<DocumentaryVo> page(@RequestBody DocumentarySelectDto dto) {
+        return documentaryService.getPage(dto);
+    }
+
+    /**
+     * 跟单配置明细
+     */
+    @PostMapping("/detail")
+    public DocumentaryVo detail(@RequestBody BaseSelectDto dto) {
+        return documentaryService.detail(dto.getId());
+    }
+
+    /**
+     * 跟单配置新增
+     */
+    @PostMapping("/add")
+    public void add(@RequestBody DocumentaryDto documentaryDto) {
+        documentaryService.add(documentaryDto);
+    }
+
+    /**
+     * 跟单配置编辑
+     */
+    @PostMapping("/edit")
+    public void edit(@RequestBody DocumentaryDto documentaryDto) {
+        documentaryService.edit(documentaryDto);
+    }
+
+    /**
+     * 跟单配置删除
+     */
+    @PostMapping("/delete")
+    public void delete(@RequestBody BaseSelectDto dto) {
+        documentaryService.delete(dto.getId());
+    }
+
+}

+ 63 - 0
hx-common/src/main/java/com/fjhx/common/controller/documentary/DocumentaryRecordController.java

@@ -0,0 +1,63 @@
+package com.fjhx.common.controller.documentary;
+
+import com.fjhx.common.entity.documentary.dto.DocumentaryRecordDto;
+import com.fjhx.common.entity.documentary.dto.DocumentaryRecordSelectDto;
+import com.fjhx.common.entity.documentary.vo.DocumentaryRecordInfoVo;
+import com.fjhx.common.service.documentary.DocumentaryRecordService;
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+/**
+ * <p>
+ * 跟单记录 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2023-04-20
+ */
+@RestController
+@RequestMapping("/documentaryRecord")
+public class DocumentaryRecordController {
+
+    @Autowired
+    private DocumentaryRecordService documentaryRecordService;
+
+    /**
+     * 跟单记录信息
+     */
+    @PostMapping("/info")
+    public DocumentaryRecordInfoVo page(@RequestBody DocumentaryRecordSelectDto dto) {
+        return documentaryRecordService.getInfo(dto);
+    }
+
+    /**
+     * 添加跟单记录
+     */
+    @PostMapping("/add")
+    public void add(@Validated @RequestBody DocumentaryRecordDto dto) {
+        documentaryRecordService.add(dto);
+    }
+
+    /**
+     * 编辑跟单记录
+     */
+    @PostMapping("/edit")
+    public void edit(@RequestBody DocumentaryRecordDto dto) {
+        documentaryRecordService.edit(dto);
+    }
+
+    /**
+     * 删除跟单记录
+     */
+    @PostMapping("/delete")
+    public void delete(@RequestBody BaseSelectDto dto) {
+        documentaryRecordService.delete(dto.getId());
+    }
+
+}

+ 58 - 0
hx-common/src/main/java/com/fjhx/common/controller/multilingual/MultilingualController.java

@@ -0,0 +1,58 @@
+package com.fjhx.common.controller.multilingual;
+
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fjhx.common.constant.SourceConstant;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.system.domain.SysConfig;
+import com.ruoyi.system.service.ISysConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/open/multilingual")
+public class MultilingualController {
+
+    @Autowired
+    private ISysConfigService sysConfigService;
+
+    @GetMapping("/getJson")
+    public String getJson() {
+        DynamicDataSourceContextHolder.push(SourceConstant.BASE);
+        SysConfig config = sysConfigService.getOne(Wrappers.<SysConfig>lambdaQuery().eq(SysConfig::getConfigKey, "multilingualJson"));
+        if (config == null) {
+            config = new SysConfig();
+            config.setConfigName("多语言json");
+            config.setConfigKey("multilingualJson");
+            config.setConfigValue("");
+            config.setConfigType("Y");
+            config.setRemark("多语言json");
+            sysConfigService.save(config);
+        }
+        DynamicDataSourceContextHolder.poll();
+        return config.getConfigValue();
+    }
+
+    @PostMapping("/setJson")
+    public void setJson(@RequestBody SysConfig sysConfig) {
+        DynamicDataSourceContextHolder.push(SourceConstant.BASE);
+        LoginUser loginUser;
+        try {
+            loginUser = SecurityUtils.getLoginUser();
+        } catch (Exception e) {
+            throw new ServiceException("无操作权限");
+        }
+        if (loginUser == null) {
+            throw new ServiceException("无操作权限");
+        }
+
+        sysConfigService.update(Wrappers.<SysConfig>lambdaUpdate()
+                .eq(SysConfig::getConfigKey, "multilingualJson")
+                .set(SysConfig::getConfigValue, sysConfig.getConfigValue())
+        );
+        DynamicDataSourceContextHolder.poll();
+    }
+
+}

+ 31 - 0
hx-common/src/main/java/com/fjhx/common/controller/on/OnLineInfoController.java

@@ -0,0 +1,31 @@
+package com.fjhx.common.controller.on;
+
+import com.fjhx.common.entity.on.vo.OnLineInfoReturnData;
+import com.fjhx.common.service.on.OnLineInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+/**
+ * <p>
+ * 在线时长信息 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2023-08-08
+ */
+@RestController
+@RequestMapping("/onLineInfo")
+public class OnLineInfoController {
+
+    @Autowired
+    private OnLineInfoService onLineInfoService;
+
+    @GetMapping("/info")
+    OnLineInfoReturnData onLineInfo() {
+        return onLineInfoService.onLineInfo();
+    }
+
+}

+ 62 - 0
hx-common/src/main/java/com/fjhx/common/controller/problem/ProblemFeedbackController.java

@@ -0,0 +1,62 @@
+package com.fjhx.common.controller.problem;
+
+import com.ruoyi.common.annotation.TenantIgnore;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.common.entity.problem.vo.ProblemFeedbackVo;
+import com.fjhx.common.entity.problem.dto.ProblemFeedbackSelectDto;
+import com.fjhx.common.entity.problem.dto.ProblemFeedbackDto;
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import com.fjhx.common.service.problem.ProblemFeedbackService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+
+/**
+ * <p>
+ * 问题反馈 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-04
+ */
+@RestController
+@RequestMapping("/problemFeedback")
+public class ProblemFeedbackController {
+
+    @Autowired
+    private ProblemFeedbackService problemFeedbackService;
+
+    /**
+     * 问题反馈分页
+     */
+    @TenantIgnore
+    @PostMapping("/page")
+    public Page<ProblemFeedbackVo> page(@RequestBody ProblemFeedbackSelectDto dto) {
+        return problemFeedbackService.getPage(dto);
+    }
+
+    /**
+     * 问题反馈明细
+     */
+    @PostMapping("/detail")
+    public ProblemFeedbackVo detail(@RequestBody BaseSelectDto dto) {
+        return problemFeedbackService.detail(dto.getId());
+    }
+
+    /**
+     * 问题反馈新增
+     */
+    @PostMapping("/add")
+    public void add(@RequestBody ProblemFeedbackDto problemFeedbackDto) {
+        problemFeedbackService.add(problemFeedbackDto);
+    }
+
+    /**
+     * 问题反馈编辑
+     */
+    @PostMapping("/edit")
+    public void edit(@RequestBody ProblemFeedbackDto problemFeedbackDto) {
+        problemFeedbackService.edit(problemFeedbackDto);
+    }
+
+}

+ 79 - 0
hx-common/src/main/java/com/fjhx/common/controller/send/SendMegController.java

@@ -0,0 +1,79 @@
+//package com.fjhx.common.controller.send;
+//
+//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+//import com.fjhx.common.entity.send.dto.SendMegDto;
+//import com.fjhx.common.entity.send.dto.SendMegSelectDto;
+//import com.fjhx.common.entity.send.vo.SendMegVo;
+//import com.fjhx.common.service.send.SendMegService;
+//import com.ruoyi.common.core.domain.BaseSelectDto;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.scheduling.annotation.EnableScheduling;
+//import org.springframework.scheduling.annotation.Scheduled;
+//import org.springframework.web.bind.annotation.PostMapping;
+//import org.springframework.web.bind.annotation.RequestBody;
+//import org.springframework.web.bind.annotation.RequestMapping;
+//import org.springframework.web.bind.annotation.RestController;
+//
+//
+///**
+// * <p>
+// * 前端控制器
+// * </p>
+// *
+// * @author
+// * @since 2023-05-22
+// */
+//@EnableScheduling
+//@RestController
+//@RequestMapping("/sendMeg")
+//public class SendMegController {
+//
+//    @Autowired
+//    private SendMegService sendMegService;
+//
+//    /**
+//     * 分页
+//     */
+//    @PostMapping("/page")
+//    public Page<SendMegVo> page(@RequestBody SendMegSelectDto dto) {
+//        return sendMegService.getPage(dto);
+//    }
+//
+//    /**
+//     * 明细
+//     */
+//    @PostMapping("/detail")
+//    public SendMegVo detail(@RequestBody BaseSelectDto dto) {
+//        return sendMegService.detail(dto.getId());
+//    }
+//
+//    /**
+//     * 新增
+//     */
+//    @PostMapping("/add")
+//    public void add(@RequestBody SendMegDto sendMegDto) {
+//        sendMegService.add(sendMegDto);
+//    }
+//
+//    /**
+//     * 编辑
+//     */
+//    @PostMapping("/edit")
+//    public void edit(@RequestBody SendMegDto sendMegDto) {
+//        sendMegService.edit(sendMegDto);
+//    }
+//
+//    /**
+//     * 删除
+//     */
+//    @PostMapping("/delete")
+//    public void delete(@RequestBody BaseSelectDto dto) {
+//        sendMegService.delete(dto.getId());
+//    }
+//
+//    @Scheduled(cron = "0 0/1 *  * * ? ")   // 每1分钟执行一次
+//    public void execute() {
+//        sendMegService.executeSend();
+//    }
+//
+//}

+ 20 - 0
hx-common/src/main/java/com/fjhx/common/entity/coding/bo/CustomerCodeAndCountryId.java

@@ -0,0 +1,20 @@
+package com.fjhx.common.entity.coding.bo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class CustomerCodeAndCountryId {
+
+    /**
+     * 客户编码
+     */
+    private String customerCode;
+
+    /**
+     * 国家id
+     */
+    private Long CountryId;
+
+}

+ 24 - 0
hx-common/src/main/java/com/fjhx/common/entity/coding/dto/CodingRuleDto.java

@@ -0,0 +1,24 @@
+package com.fjhx.common.entity.coding.dto;
+
+import com.fjhx.common.entity.coding.po.CodingRule;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 编码规则新增编辑入参实体
+ *
+ * @author 
+ * @since 2023-04-13
+ */
+@Getter
+@Setter
+public class CodingRuleDto extends CodingRule {
+
+    /**
+     * 编码配置规则
+     */
+    private List<RuleVo> ruleVoList;
+
+}

+ 17 - 0
hx-common/src/main/java/com/fjhx/common/entity/coding/dto/CodingRuleSelectDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.common.entity.coding.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 编码规则列表查询入参实体
+ *
+ * @author 
+ * @since 2023-04-13
+ */
+@Getter
+@Setter
+public class CodingRuleSelectDto extends BaseSelectDto {
+
+}

+ 30 - 0
hx-common/src/main/java/com/fjhx/common/entity/coding/dto/DefaultRule.java

@@ -0,0 +1,30 @@
+package com.fjhx.common.entity.coding.dto;
+
+import com.fjhx.common.enums.RuleTypeEnum;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class DefaultRule {
+
+    /**
+     * 编码规则
+     */
+    private RuleTypeEnum ruleTypeEnum;
+
+    /**
+     * 值
+     */
+    private String value;
+
+    public DefaultRule(RuleTypeEnum ruleTypeEnum) {
+        this.ruleTypeEnum = ruleTypeEnum;
+    }
+
+    public DefaultRule(RuleTypeEnum ruleTypeEnum, String value) {
+        this.ruleTypeEnum = ruleTypeEnum;
+        this.value = value;
+    }
+
+}

+ 20 - 0
hx-common/src/main/java/com/fjhx/common/entity/coding/dto/RuleVo.java

@@ -0,0 +1,20 @@
+package com.fjhx.common.entity.coding.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class RuleVo {
+
+    /**
+     * 编码规则
+     */
+    private Integer ruleType;
+
+    /**
+     * 值
+     */
+    private String value;
+
+}

+ 41 - 0
hx-common/src/main/java/com/fjhx/common/entity/coding/po/CodingRule.java

@@ -0,0 +1,41 @@
+package com.fjhx.common.entity.coding.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BasePo;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 编码规则
+ * </p>
+ *
+ * @author 
+ * @since 2023-04-13
+ */
+@Getter
+@Setter
+@TableName("coding_rule")
+public class CodingRule extends BasePo {
+
+    /**
+     * 规则key
+     */
+    private String codingKey;
+
+    /**
+     * 功能名称
+     */
+    private String codingName;
+
+    /**
+     * demo
+     */
+    private String codingDemo;
+
+    /**
+     * 规则json
+     */
+    private String ruleJson;
+
+}

+ 28 - 0
hx-common/src/main/java/com/fjhx/common/entity/coding/po/CodingRuleAuto.java

@@ -0,0 +1,28 @@
+package com.fjhx.common.entity.coding.po;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ruoyi.common.core.domain.BasePo;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 规则配置自增编码
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-18
+ */
+@Getter
+@Setter
+@TableName("coding_rule_auto")
+public class CodingRuleAuto extends BasePo {
+
+    @TableField("`key`")
+    private String key;
+
+    private Integer num;
+
+}

+ 60 - 0
hx-common/src/main/java/com/fjhx/common/entity/coding/vo/CodingRulePageVo.java

@@ -0,0 +1,60 @@
+package com.fjhx.common.entity.coding.vo;
+
+import com.fjhx.common.entity.coding.dto.RuleVo;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 编码规则列表查询返回值实体
+ *
+ * @author
+ * @since 2023-04-13
+ */
+@Getter
+@Setter
+public class CodingRulePageVo {
+
+    /**
+     * 编码规则id
+     */
+    private Long id;
+
+    /**
+     * 规则key
+     */
+    private String codingKey;
+
+    /**
+     * 功能名称
+     */
+    private String codingName;
+
+    /**
+     * demo
+     */
+    private String codingDemo;
+
+    /**
+     * 编码配置规则
+     */
+    private List<RuleVo> ruleVoList;
+
+    /**
+     * 更新人
+     */
+    private Long updateUser;
+
+    /**
+     * 更新人名称
+     */
+    private String updateUserName;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+}

+ 17 - 0
hx-common/src/main/java/com/fjhx/common/entity/contract/dto/ContractTemplateDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.common.entity.contract.dto;
+
+import com.fjhx.common.entity.contract.po.ContractTemplate;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 合同模板新增编辑入参实体
+ *
+ * @author 
+ * @since 2023-04-14
+ */
+@Getter
+@Setter
+public class ContractTemplateDto extends ContractTemplate {
+
+}

+ 22 - 0
hx-common/src/main/java/com/fjhx/common/entity/contract/dto/ContractTemplateSelectDto.java

@@ -0,0 +1,22 @@
+package com.fjhx.common.entity.contract.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 合同模板列表查询入参实体
+ *
+ * @author 
+ * @since 2023-04-14
+ */
+@Getter
+@Setter
+public class ContractTemplateSelectDto extends BaseSelectDto {
+
+    /**
+     * 公司id
+     */
+    private Long corporationId;
+
+}

+ 53 - 0
hx-common/src/main/java/com/fjhx/common/entity/contract/po/ContractTemplate.java

@@ -0,0 +1,53 @@
+package com.fjhx.common.entity.contract.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BasePo;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * <p>
+ * 合同模板
+ * </p>
+ *
+ * @author
+ * @since 2023-04-14
+ */
+@Getter
+@Setter
+@TableName("contract_template")
+public class ContractTemplate extends BasePo {
+
+    /**
+     * 模板名称
+     */
+    @NotBlank(message = "模板名称不能为空")
+    private String templateName;
+
+    /**
+     * 公司id
+     */
+    @NotNull(message = "公司id不能为空")
+    private Long corporationId;
+
+    /**
+     * 联系人名称
+     */
+    @NotBlank(message = "联系人名称不能为空")
+    private String contactName;
+
+    /**
+     * 联系人电话
+     */
+    @NotBlank(message = "联系人电话不能为空")
+    private String contactNumber;
+
+    /**
+     * 模板内容
+     */
+    private String templateContent;
+
+}

+ 29 - 0
hx-common/src/main/java/com/fjhx/common/entity/contract/vo/ContractTemplateVo.java

@@ -0,0 +1,29 @@
+package com.fjhx.common.entity.contract.vo;
+
+import com.fjhx.common.entity.contract.po.ContractTemplate;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 合同模板列表查询返回值实体
+ *
+ * @author
+ * @since 2023-04-14
+ */
+@Getter
+@Setter
+public class ContractTemplateVo extends ContractTemplate {
+
+    /**
+     * 公司名称
+     */
+    private String corporationName;
+
+    /**
+     * 客户电话
+     */
+    private String corporationNumber;
+
+
+
+}

+ 51 - 0
hx-common/src/main/java/com/fjhx/common/entity/corporation/dto/CorporationDto.java

@@ -0,0 +1,51 @@
+package com.fjhx.common.entity.corporation.dto;
+
+import com.fjhx.area.service.SetCustomizeAreaId;
+import com.fjhx.common.entity.corporation.po.Corporation;
+import com.fjhx.file.entity.ObsFile;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 多公司配置新增编辑入参实体
+ *
+ * @author
+ * @since 2023-04-10
+ */
+@Getter
+@Setter
+public class CorporationDto extends Corporation implements SetCustomizeAreaId {
+
+    /**
+     * 企业logo
+     */
+    List<ObsFile> enterpriseLogoList;
+
+    /**
+     * 法人签名
+     */
+    List<ObsFile> larSignList;
+
+    /**
+     * 公章
+     */
+    List<ObsFile> officialSealList;
+
+    /**
+     * 合同章
+     */
+    List<ObsFile> contractSealList;
+
+    /**
+     * 省/州名称
+     */
+    private String provinceName;
+
+    /**
+     * 市名称
+     */
+    private String cityName;
+
+}

+ 17 - 0
hx-common/src/main/java/com/fjhx/common/entity/corporation/dto/CorporationSelectDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.common.entity.corporation.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 多公司配置列表查询入参实体
+ *
+ * @author 
+ * @since 2023-04-10
+ */
+@Getter
+@Setter
+public class CorporationSelectDto extends BaseSelectDto {
+
+}

+ 137 - 0
hx-common/src/main/java/com/fjhx/common/entity/corporation/po/Corporation.java

@@ -0,0 +1,137 @@
+package com.fjhx.common.entity.corporation.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.core.domain.BasePo;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * <p>
+ * 多公司配置
+ * </p>
+ *
+ * @author
+ * @since 2023-04-10
+ */
+@Getter
+@Setter
+@TableName("corporation")
+public class Corporation extends BasePo {
+
+    /**
+     * 公司名称
+     */
+    private String name;
+
+    /**
+     * 公司英文名称
+     */
+    private String nameEn;
+
+    /**
+     * 企业类型
+     */
+    private String type;
+
+    /**
+     * 统一信用代码
+     */
+    private String uscCode;
+
+    /**
+     * 法定代表人
+     */
+    private String legalPersonName;
+
+    /**
+     * 注册资本
+     */
+    private String registeredCapital;
+
+    /**
+     * 营业开始日期
+     */
+//    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    private String startDate;
+
+    /**
+     * 营业结束日期
+     */
+//    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    private String stopDate;
+
+    /**
+     * 纳税人资质
+     */
+    private String taxpayerQualification;
+
+    /**
+     * 进出口企业代码
+     */
+    private String iaeeCode;
+
+    /**
+     * 进出口企业代码
+     */
+    private String yfId;
+    /**
+     * 公司电话
+     */
+    @NotBlank(message = "公司电话不能为空")
+    private String corporationNumber;
+
+    /**
+     * 国家表id
+     */
+    @NotBlank(message = "国家id不能为空")
+    private Long countryId;
+
+    /**
+     * 省份id
+     */
+    @NotBlank(message = "省份id不能为空")
+    private Long provinceId;
+
+    /**
+     * 城市id
+     */
+    @NotBlank(message = "城市id不能为空")
+    private Long cityId;
+
+    /**
+     * 详细地址
+     */
+    private String address;
+
+    /**
+     * 国家表英文字符串
+     */
+    @NotBlank(message = "国家英文名称不能为空")
+    private String countryEnStr;
+
+    /**
+     * 省份英文字符串
+     */
+    @NotBlank(message = "省份英文名称不能为空")
+    private String provinceEnStr;
+
+    /**
+     * 城市英文字符串
+     */
+    @NotBlank(message = "城市英文名称不能为空")
+    private String cityEnStr;
+
+    /**
+     * 详细地址英文
+     */
+    private String addressEn;
+
+    /**
+     * 海关注册代码
+     */
+    private String crCode;
+}

+ 25 - 0
hx-common/src/main/java/com/fjhx/common/entity/corporation/vo/CorporationVo.java

@@ -0,0 +1,25 @@
+package com.fjhx.common.entity.corporation.vo;
+
+import com.fjhx.area.service.ISetAreaName;
+import com.fjhx.area.service.SetCustomizeAreaName;
+import com.fjhx.common.entity.corporation.po.Corporation;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 多公司配置列表查询返回值实体
+ *
+ * @author 
+ * @since 2023-04-10
+ */
+@Getter
+@Setter
+public class CorporationVo extends Corporation implements SetCustomizeAreaName {
+
+    private String countryName;
+
+    private String provinceName;
+
+    private String cityName;
+
+}

+ 26 - 0
hx-common/src/main/java/com/fjhx/common/entity/country/po/Country.java

@@ -0,0 +1,26 @@
+package com.fjhx.common.entity.country.po;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 国家代码
+ * </p>
+ *
+ * @author
+ * @since 2023-04-12
+ */
+@Getter
+@Setter
+@TableName("country")
+public class Country {
+
+    @TableId
+    private String countryCode;
+
+    private String countryName;
+
+}

+ 33 - 0
hx-common/src/main/java/com/fjhx/common/entity/currency/po/CurrencyRate.java

@@ -0,0 +1,33 @@
+package com.fjhx.common.entity.currency.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BasePo;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * <p>
+ * 币种默认汇率
+ * </p>
+ *
+ * @author
+ * @since 2023-04-24
+ */
+@Getter
+@Setter
+@TableName("currency_rate")
+public class CurrencyRate extends BasePo {
+
+    /**
+     * 币种类型
+     */
+    private String type;
+
+    /**
+     * 汇率
+     */
+    private BigDecimal rate;
+
+}

+ 20 - 0
hx-common/src/main/java/com/fjhx/common/entity/documentary/bo/DocumentaryData.java

@@ -0,0 +1,20 @@
+package com.fjhx.common.entity.documentary.bo;
+
+import com.fjhx.common.entity.documentary.vo.DocumentaryRecordVo;
+
+import java.util.List;
+import java.util.Map;
+
+public interface DocumentaryData {
+
+    /**
+     * 获取业务id
+     */
+    Long getId();
+
+    /**
+     * 赋值跟单记录
+     */
+    void setDocumentaryRecord(Map<Long, List<DocumentaryRecordVo>> documentaryRecord);
+
+}

+ 17 - 0
hx-common/src/main/java/com/fjhx/common/entity/documentary/dto/DocumentaryDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.common.entity.documentary.dto;
+
+import com.fjhx.common.entity.documentary.po.Documentary;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 跟单配置新增编辑入参实体
+ *
+ * @author 
+ * @since 2023-04-19
+ */
+@Getter
+@Setter
+public class DocumentaryDto extends Documentary {
+
+}

+ 25 - 0
hx-common/src/main/java/com/fjhx/common/entity/documentary/dto/DocumentaryRecordDto.java

@@ -0,0 +1,25 @@
+package com.fjhx.common.entity.documentary.dto;
+
+import com.fjhx.common.entity.documentary.po.DocumentaryRecord;
+import com.fjhx.file.entity.ObsFile;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 跟单记录新增编辑入参实体
+ *
+ * @author
+ * @since 2023-04-21
+ */
+@Getter
+@Setter
+public class DocumentaryRecordDto extends DocumentaryRecord {
+
+    /**
+     * 文件列表
+     */
+    private List<ObsFile> fileList;
+
+}

+ 34 - 0
hx-common/src/main/java/com/fjhx/common/entity/documentary/dto/DocumentaryRecordSelectDto.java

@@ -0,0 +1,34 @@
+package com.fjhx.common.entity.documentary.dto;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 跟单记录列表查询入参实体
+ *
+ * @author
+ * @since 2023-04-20
+ */
+@Getter
+@Setter
+public class DocumentaryRecordSelectDto extends BaseSelectDto {
+
+    /**
+     * 跟单类型
+     * {@link com.fjhx.common.entity.documentary.eums.DocumentaryTypeEnum}
+     */
+    private Integer type;
+
+    /**
+     * 搜索条件
+     */
+    private JSONObject condition;
+
+    /**
+     * 无跟单记录配置id
+     */
+    private Long noRecordDocumentaryId;
+
+}

+ 17 - 0
hx-common/src/main/java/com/fjhx/common/entity/documentary/dto/DocumentarySelectDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.common.entity.documentary.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 跟单配置列表查询入参实体
+ *
+ * @author 
+ * @since 2023-04-19
+ */
+@Getter
+@Setter
+public class DocumentarySelectDto extends BaseSelectDto {
+
+}

+ 57 - 0
hx-common/src/main/java/com/fjhx/common/entity/documentary/eums/DocumentaryTypeEnum.java

@@ -0,0 +1,57 @@
+package com.fjhx.common.entity.documentary.eums;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.fjhx.common.service.documentary.GetDocumentaryBusinessTemplate;
+import com.ruoyi.common.exception.ServiceException;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Getter
+@AllArgsConstructor
+public enum DocumentaryTypeEnum {
+
+    sales(1, "销售跟单", "contractServiceImpl"),
+
+    purchase(2, "采购跟单", "purchaseServiceImpl");
+
+    /**
+     * 跟单类型
+     */
+    private final Integer key;
+
+    /**
+     * 类型名称
+     */
+    private final String name;
+
+    /**
+     * 实现bean名称
+     */
+    private final String beanName;
+
+    private final static Map<Integer, DocumentaryTypeEnum> map = new HashMap<>();
+
+    static {
+        for (DocumentaryTypeEnum value : DocumentaryTypeEnum.values()) {
+            map.put(value.key, value);
+        }
+    }
+
+    public static DocumentaryTypeEnum getEnum(Integer key) {
+        return map.computeIfAbsent(key, item -> {
+            throw new ServiceException("未知跟单类型");
+        });
+    }
+
+    public GetDocumentaryBusinessTemplate getBusinessBean() {
+        GetDocumentaryBusinessTemplate bean = SpringUtil.getBean(beanName, GetDocumentaryBusinessTemplate.class);
+        if (bean == null) {
+            throw new ServiceException("未配置 " + name + " 跟单业务bean");
+        }
+        return bean;
+    }
+
+}

+ 47 - 0
hx-common/src/main/java/com/fjhx/common/entity/documentary/po/Documentary.java

@@ -0,0 +1,47 @@
+package com.fjhx.common.entity.documentary.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BasePo;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 跟单配置
+ * </p>
+ *
+ * @author 
+ * @since 2023-04-19
+ */
+@Getter
+@Setter
+@TableName("documentary")
+public class Documentary extends BasePo {
+
+    /**
+     * 跟单类型 字典documentary_type
+     */
+    private Integer type;
+
+    /**
+     * 节点名称
+     */
+    private String name;
+
+    /**
+     * 节点排序
+     */
+    private Integer sort;
+
+    /**
+     * 绑定类型 字典 documentary_bind
+     */
+    private Integer bind;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 46 - 0
hx-common/src/main/java/com/fjhx/common/entity/documentary/po/DocumentaryRecord.java

@@ -0,0 +1,46 @@
+package com.fjhx.common.entity.documentary.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BasePo;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * <p>
+ * 跟单记录
+ * </p>
+ *
+ * @author
+ * @since 2023-04-20
+ */
+@Getter
+@Setter
+@TableName("documentary_record")
+public class DocumentaryRecord extends BasePo {
+
+    /**
+     * 跟单id
+     */
+    @NotNull(message = "跟单id不能为空")
+    private Long documentaryId;
+
+    /**
+     * 业务id
+     */
+    @NotNull(message = "业务id不能为空")
+    private Long businessId;
+
+    /**
+     * 完成时间
+     */
+    private Date completionTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 24 - 0
hx-common/src/main/java/com/fjhx/common/entity/documentary/vo/DocumentaryRecordInfoVo.java

@@ -0,0 +1,24 @@
+package com.fjhx.common.entity.documentary.vo;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.common.entity.documentary.bo.DocumentaryData;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+public class DocumentaryRecordInfoVo {
+
+    /**
+     * 跟单配置
+     */
+    private List<DocumentaryVo> documentaryList;
+
+    /**
+     * 分页
+     */
+    private Page<? extends DocumentaryData> page;
+
+}

+ 22 - 0
hx-common/src/main/java/com/fjhx/common/entity/documentary/vo/DocumentaryRecordVo.java

@@ -0,0 +1,22 @@
+package com.fjhx.common.entity.documentary.vo;
+
+import com.fjhx.common.entity.documentary.po.DocumentaryRecord;
+import com.fjhx.file.entity.FileInfoVo;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 跟单记录列表查询返回值实体
+ *
+ * @author
+ * @since 2023-04-20
+ */
+@Getter
+@Setter
+public class DocumentaryRecordVo extends DocumentaryRecord {
+
+    private List<FileInfoVo> fileList;
+
+}

+ 22 - 0
hx-common/src/main/java/com/fjhx/common/entity/documentary/vo/DocumentaryVo.java

@@ -0,0 +1,22 @@
+package com.fjhx.common.entity.documentary.vo;
+
+import com.fjhx.common.entity.documentary.po.Documentary;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 跟单配置列表查询返回值实体
+ *
+ * @author
+ * @since 2023-04-19
+ */
+@Getter
+@Setter
+public class DocumentaryVo extends Documentary {
+
+    /**
+     * 数量
+     */
+    private Long count;
+
+}

+ 17 - 0
hx-common/src/main/java/com/fjhx/common/entity/on/dto/OnLineInfoDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.common.entity.on.dto;
+
+import com.fjhx.common.entity.on.po.OnLineInfo;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 在线时长信息新增编辑入参实体
+ *
+ * @author
+ * @since 2023-08-08
+ */
+@Getter
+@Setter
+public class OnLineInfoDto extends OnLineInfo {
+
+}

+ 17 - 0
hx-common/src/main/java/com/fjhx/common/entity/on/dto/OnLineInfoSelectDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.common.entity.on.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 在线时长信息列表查询入参实体
+ *
+ * @author
+ * @since 2023-08-08
+ */
+@Getter
+@Setter
+public class OnLineInfoSelectDto extends BaseSelectDto {
+
+}

+ 48 - 0
hx-common/src/main/java/com/fjhx/common/entity/on/po/OnLineInfo.java

@@ -0,0 +1,48 @@
+package com.fjhx.common.entity.on.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BasePo;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * <p>
+ * 在线时长信息
+ * </p>
+ *
+ * @author
+ * @since 2023-08-08
+ */
+@Getter
+@Setter
+@TableName("on_line_info")
+public class OnLineInfo extends BasePo {
+
+    /**
+     * 用户id
+     */
+    private Long userId;
+
+    /**
+     * 每日在线时长(秒)
+     */
+    private Long onLineDuration;
+
+    /**
+     * 在线日期
+     */
+    private Date onLineDate;
+
+    /**
+     * 最后一次在线时间
+     */
+    private Date lastOnlineTime;
+
+    /**
+     * 租户id
+     */
+    private String tenantId;
+
+}

+ 33 - 0
hx-common/src/main/java/com/fjhx/common/entity/on/vo/OnLineInfoReturnData.java

@@ -0,0 +1,33 @@
+package com.fjhx.common.entity.on.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Getter
+@Setter
+public
+class OnLineInfoReturnData {
+    private BigDecimal onLineTime;
+    private List<Dept> deptList;
+
+
+    @Getter
+    @Setter
+    public static class Dept {
+        private String deptName;
+        private BigDecimal onLineTime;
+        private List<User> userList;
+        private List<Dept> deptList;
+    }
+
+    @Getter
+    @Setter
+    public static class User {
+        private String userName;
+        private BigDecimal onLineTime;
+    }
+}
+

+ 27 - 0
hx-common/src/main/java/com/fjhx/common/entity/on/vo/OnLineInfoVo.java

@@ -0,0 +1,27 @@
+package com.fjhx.common.entity.on.vo;
+
+import com.fjhx.common.entity.on.po.OnLineInfo;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 在线时长信息列表查询返回值实体
+ *
+ * @author
+ * @since 2023-08-08
+ */
+@Getter
+@Setter
+public class OnLineInfoVo extends OnLineInfo {
+
+    /**
+     * 部门id
+     */
+    private Long deptId;
+
+    /**
+     * 用户名
+     */
+    private String userName;
+
+}

+ 17 - 0
hx-common/src/main/java/com/fjhx/common/entity/problem/dto/ProblemFeedbackDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.common.entity.problem.dto;
+
+import com.fjhx.common.entity.problem.po.ProblemFeedback;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 问题反馈新增编辑入参实体
+ *
+ * @author 
+ * @since 2023-05-04
+ */
+@Getter
+@Setter
+public class ProblemFeedbackDto extends ProblemFeedback {
+
+}

+ 27 - 0
hx-common/src/main/java/com/fjhx/common/entity/problem/dto/ProblemFeedbackSelectDto.java

@@ -0,0 +1,27 @@
+package com.fjhx.common.entity.problem.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 问题反馈列表查询入参实体
+ *
+ * @author 
+ * @since 2023-05-04
+ */
+@Getter
+@Setter
+public class ProblemFeedbackSelectDto extends BaseSelectDto {
+
+    /**
+     * 租户id
+     */
+    private String tenantId;
+
+    /**
+     * 回复状态 0待回复 1已回复
+     */
+    private Integer status;
+
+}

+ 61 - 0
hx-common/src/main/java/com/fjhx/common/entity/problem/po/ProblemFeedback.java

@@ -0,0 +1,61 @@
+package com.fjhx.common.entity.problem.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BasePo;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 问题反馈
+ * </p>
+ *
+ * @author
+ * @since 2023-05-04
+ */
+@Getter
+@Setter
+@TableName("problem_feedback")
+public class ProblemFeedback extends BasePo {
+
+    /**
+     * 姓名
+     */
+    private String name;
+
+    /**
+     * 公司名称
+     */
+    private String companyName;
+
+    /**
+     * 联系方式
+     */
+    private String contactInformation;
+
+    /**
+     * 模块类型
+     */
+    private String moduleType;
+
+    /**
+     * 问题说明
+     */
+    private String problemStatement;
+
+    /**
+     * 0待回复 1已回复
+     */
+    private Integer status;
+
+    /**
+     * 回复内容
+     */
+    private String replyContent;
+
+    /**
+     * 租户id
+     */
+    private String tenantId;
+
+}

+ 17 - 0
hx-common/src/main/java/com/fjhx/common/entity/problem/vo/ProblemFeedbackVo.java

@@ -0,0 +1,17 @@
+package com.fjhx.common.entity.problem.vo;
+
+import com.fjhx.common.entity.problem.po.ProblemFeedback;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 问题反馈列表查询返回值实体
+ *
+ * @author 
+ * @since 2023-05-04
+ */
+@Getter
+@Setter
+public class ProblemFeedbackVo extends ProblemFeedback {
+
+}

+ 19 - 0
hx-common/src/main/java/com/fjhx/common/entity/send/dto/SendMegDto.java

@@ -0,0 +1,19 @@
+package com.fjhx.common.entity.send.dto;
+
+import com.fjhx.common.entity.send.po.SendMeg;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 新增编辑入参实体
+ *
+ * @author 
+ * @since 2023-05-22
+ */
+@Getter
+@Setter
+public class SendMegDto extends SendMeg {
+
+
+
+}

+ 27 - 0
hx-common/src/main/java/com/fjhx/common/entity/send/dto/SendMegSelectDto.java

@@ -0,0 +1,27 @@
+package com.fjhx.common.entity.send.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 列表查询入参实体
+ *
+ * @author 
+ * @since 2023-05-22
+ */
+@Getter
+@Setter
+public class SendMegSelectDto extends BaseSelectDto {
+
+    /**
+     * 状态 0待发送 1以发送
+     */
+    private Integer status;
+
+    /**
+     * 消息类型 1系统公告
+     */
+    private Integer type;
+
+}

+ 59 - 0
hx-common/src/main/java/com/fjhx/common/entity/send/po/SendMeg.java

@@ -0,0 +1,59 @@
+package com.fjhx.common.entity.send.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BasePo;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author
+ * @since 2023-05-22
+ */
+@Getter
+@Setter
+@TableName("send_meg")
+public class SendMeg extends BasePo {
+
+    /**
+     * 消息类型 1系统公告
+     */
+    @NotNull(message = "消息类型不能为空")
+    private Integer type;
+
+    /**
+     * 标题
+     */
+    @NotEmpty(message = "标题不能为空")
+    private String title;
+
+    /**
+     * 内容
+     */
+    @NotEmpty(message = "消息正文不能为空")
+    private String content;
+
+    /**
+     * 发送时间
+     */
+    @NotEmpty(message = "发送时间不能为空")
+    private Date sendTime;
+
+    /**
+     * 结束时间
+     */
+    private Date endTime;
+
+    /**
+     * 状态 0待发送 1已发送
+     */
+    private Integer status;
+
+}

+ 17 - 0
hx-common/src/main/java/com/fjhx/common/entity/send/vo/SendMegVo.java

@@ -0,0 +1,17 @@
+package com.fjhx.common.entity.send.vo;
+
+import com.fjhx.common.entity.send.po.SendMeg;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 列表查询返回值实体
+ *
+ * @author 
+ * @since 2023-05-22
+ */
+@Getter
+@Setter
+public class SendMegVo extends SendMeg {
+
+}

+ 169 - 0
hx-common/src/main/java/com/fjhx/common/enums/CodingRuleEnum.java

@@ -0,0 +1,169 @@
+package com.fjhx.common.enums;
+
+import com.fjhx.common.entity.coding.dto.DefaultRule;
+import com.fjhx.common.entity.coding.dto.RuleVo;
+import com.ruoyi.common.exception.ServiceException;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Getter
+@AllArgsConstructor
+public enum CodingRuleEnum {
+
+    /**
+     * 外销合同
+     */ 
+    CONTRACT("contract", "外销合同", Arrays.asList(
+            getDefaultRule(RuleTypeEnum.CUSTOMIZE, "SC-"),
+            getDefaultRule(RuleTypeEnum.DATE_FORMAT, "yyyyMM-"),
+            getDefaultRule(RuleTypeEnum.AUTOINCREMENT, "3")
+    )),
+    /**
+     * 样品单
+     */
+    SAMPLE("sample", "样品单", Arrays.asList(
+            getDefaultRule(RuleTypeEnum.CUSTOMIZE, "YP-"),
+            getDefaultRule(RuleTypeEnum.DATE_FORMAT, "yyyyMM-"),
+            getDefaultRule(RuleTypeEnum.AUTOINCREMENT, "3")
+    )),
+    /**
+     * EHSD采购编码
+     */
+    EHSD_PURCHASE("ehsd_purchase", "EHSD采购单", Arrays.asList(
+            getDefaultRule(RuleTypeEnum.CUSTOMIZE, "PO-"),
+            getDefaultRule(RuleTypeEnum.DATE_FORMAT, "yyyyMM-"),
+            getDefaultRule(RuleTypeEnum.AUTOINCREMENT, "3")
+    )),
+    /**
+     * 报价单
+     */
+    SALE_QUOTATION("sale_quotation", "报价单", Arrays.asList(
+            getDefaultRule(RuleTypeEnum.CUSTOMIZE, "GSQT-"),
+            getDefaultRule(RuleTypeEnum.DATE_FORMAT, "yyyyMM-"),
+            getDefaultRule(RuleTypeEnum.AUTOINCREMENT, "3")
+    )),
+    /**
+     * 包装
+     */
+    PACK("pack", "包装", Arrays.asList(
+            getDefaultRule(RuleTypeEnum.CUSTOMIZE, "PACK-"),
+            getDefaultRule(RuleTypeEnum.DATE_FORMAT, "yyyyMM-"),
+            getDefaultRule(RuleTypeEnum.AUTOINCREMENT, "3")
+    )),
+    /**
+     * 采购编码
+     */
+    PURCHASE("purchase", "采购单", Arrays.asList(
+            getDefaultRule(RuleTypeEnum.CUSTOMIZE, "SC-"),
+            getDefaultRule(RuleTypeEnum.DATE_FORMAT, "yyyyMM-"),
+            getDefaultRule(RuleTypeEnum.AUTOINCREMENT, "3")
+    )),
+
+    /**
+     * 服务合同
+     */
+    SERVICE_CONTRACT("service_contract", "服务合同", Arrays.asList(
+            getDefaultRule(RuleTypeEnum.CUSTOMIZE, "PO-"),
+            getDefaultRule(RuleTypeEnum.DATE_FORMAT, "yyyyMM-"),
+            getDefaultRule(RuleTypeEnum.AUTOINCREMENT, "3")
+    )),
+
+    //---------------------------采购模块-----------------------------
+
+    /**
+     * 申购单
+     */
+    SUBSCRIBE("subscribe", "申购单", Arrays.asList(
+            getDefaultRule(RuleTypeEnum.CUSTOMIZE, "PR-"),
+            getDefaultRule(RuleTypeEnum.DATE_FORMAT, "yyyyMM-"),
+            getDefaultRule(RuleTypeEnum.AUTOINCREMENT, "3")
+    )),
+    /**
+     * 到货
+     */
+    ARRIVAL("arrival", "到货", Arrays.asList(
+            getDefaultRule(RuleTypeEnum.CUSTOMIZE, "PA-"),
+            getDefaultRule(RuleTypeEnum.DATE_FORMAT, "yyyyMM-"),
+            getDefaultRule(RuleTypeEnum.AUTOINCREMENT, "3")
+    )),
+    /**
+     * 质检
+     */
+    QUALITY("quality", "质检", Arrays.asList(
+            getDefaultRule(RuleTypeEnum.CUSTOMIZE, "ZJ-"),
+            getDefaultRule(RuleTypeEnum.DATE_FORMAT, "yyyyMM-"),
+            getDefaultRule(RuleTypeEnum.AUTOINCREMENT, "3")
+    )),
+    /**
+     * 退货
+     */
+    SALES_RETURN("sales_return", "退货", Arrays.asList(
+            getDefaultRule(RuleTypeEnum.CUSTOMIZE, "TH-"),
+            getDefaultRule(RuleTypeEnum.DATE_FORMAT, "yyyyMM-"),
+            getDefaultRule(RuleTypeEnum.AUTOINCREMENT, "3")
+    )),
+    /**
+     * EHSD到货检验编码
+     */
+    EHSD_QUALITY("ehsd_quality", "到货检验编码", Arrays.asList(
+            getDefaultRule(RuleTypeEnum.CUSTOMIZE, "EHSD-QUALITY-"),
+            getDefaultRule(RuleTypeEnum.DATE_FORMAT, "yyyyMM-"),
+            getDefaultRule(RuleTypeEnum.AUTOINCREMENT, "3")
+    )),
+    ;
+
+    /**
+     * 编码规则key
+     */
+    private final String key;
+
+    /**
+     * 功能名称
+     */
+    private final String name;
+
+    /**
+     * 默认规则
+     */
+    private final List<DefaultRule> defaultRuleList;
+
+    private static final Map<String, CodingRuleEnum> map = new HashMap<>();
+
+    static {
+        for (CodingRuleEnum value : CodingRuleEnum.values()) {
+            map.put(value.key, value);
+        }
+    }
+
+    private static DefaultRule getDefaultRule(RuleTypeEnum ruleTypeEnum) {
+        return new DefaultRule(ruleTypeEnum);
+    }
+
+    private static DefaultRule getDefaultRule(RuleTypeEnum ruleTypeEnum, String value) {
+        return new DefaultRule(ruleTypeEnum, value);
+    }
+
+    public List<RuleVo> getDefaultRuleVoList() {
+        return defaultRuleList.stream().map(item -> {
+            RuleVo ruleVo = new RuleVo();
+            ruleVo.setRuleType(item.getRuleTypeEnum().getType());
+            ruleVo.setValue(item.getValue());
+            return ruleVo;
+        }).collect(Collectors.toList());
+    }
+
+    public static List<RuleVo> getDefaultRuleVoList(String key) {
+        CodingRuleEnum codingRuleEnum = map.get(key);
+        if (codingRuleEnum == null) {
+            throw new ServiceException("编码规则key不存在");
+        }
+        return codingRuleEnum.getDefaultRuleVoList();
+    }
+
+}

+ 44 - 0
hx-common/src/main/java/com/fjhx/common/enums/FlowStatusEnum1.java

@@ -0,0 +1,44 @@
+package com.fjhx.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * 流程审批状态--数据状态枚举
+ */
+@Getter
+@AllArgsConstructor
+public enum FlowStatusEnum1 {
+
+    DRAFT(0, "草稿"),
+    UNDER_REVIEW(10, "审批中"),
+    REJECT(20, "驳回"),
+    PASS(30, "通过"),
+    UPDATE_LOADING(60, "变更中"),
+    UPDATE(70, "变更"),
+    CANCELLATION(88, "作废"),
+    TERMINATION(99, "终止"),
+    ;
+
+    private static final Map<Integer, String> map = new LinkedHashMap<>();
+
+    static {
+        for (FlowStatusEnum1 ms : values()) {
+            map.put(ms.key, ms.value);
+        }
+    }
+
+    private final int key;
+    private final String value;
+
+    /**
+     * 获取枚举map
+     */
+    public static Map<Integer, String> getMap() {
+        return map;
+    }
+
+}

+ 48 - 0
hx-common/src/main/java/com/fjhx/common/enums/PushBusinessTypeEnum.java

@@ -0,0 +1,48 @@
+package com.fjhx.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 推送业务类型
+ */
+@Getter
+@AllArgsConstructor
+public enum PushBusinessTypeEnum {
+    /**
+     * 流程专用
+     */
+    FLOW(0),
+    /**
+     * 未读日报
+     */
+    UNREAD_DAILY(1),
+    /**
+     * 发布日志
+     */
+    RELEASE_LOG(2),
+    /**
+     * 分享日报
+     */
+    SHARE_DAILY(3),
+    /**
+     * 日程提醒
+     */
+    SCHEDULE_REMINDER(4),
+    /**
+     * 到账
+     */
+    TO_THE_ACCOUNT(5),
+    /**
+     * 异常处理
+     */
+    EXCEPTION_HANDLING(6),
+
+    /**
+     * 单证被删除
+     */
+    DOCUMENTS_DEL(7);
+
+    private final int type;
+
+}

+ 41 - 0
hx-common/src/main/java/com/fjhx/common/enums/RuleTypeEnum.java

@@ -0,0 +1,41 @@
+package com.fjhx.common.enums;
+
+import com.ruoyi.common.exception.ServiceException;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Getter
+@AllArgsConstructor
+public enum RuleTypeEnum {
+
+    CUSTOMIZE(1, "自定义字符"),
+    COUNTRY_CODE(2, "客户国家编码"),
+    SALESMAN_CODE(3, "业务员代码"),
+    CUSTOMER_CODE(4, "客户编码"),
+    AUTOINCREMENT(5, "自增编号"),
+    DATE_FORMAT(6, "日期");
+
+    private final Integer type;
+
+    private final String name;
+
+    private static final Map<Integer, RuleTypeEnum> map = new HashMap<>();
+
+    static {
+        for (RuleTypeEnum value : RuleTypeEnum.values()) {
+            map.put(value.getType(), value);
+        }
+    }
+
+    public static RuleTypeEnum getRuleTypeEnum(Integer type) {
+        RuleTypeEnum ruleTypeEnum = map.get(type);
+        if (ruleTypeEnum == null) {
+            throw new ServiceException("编码规则类型不存在");
+        }
+        return ruleTypeEnum;
+    }
+
+}

+ 17 - 0
hx-common/src/main/java/com/fjhx/common/mapper/coding/CodingRuleAutoMapper.java

@@ -0,0 +1,17 @@
+package com.fjhx.common.mapper.coding;
+
+import com.fjhx.common.entity.coding.po.CodingRuleAuto;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+
+/**
+ * <p>
+ * 规则配置自增编码 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-18
+ */
+public interface CodingRuleAutoMapper extends BaseMapper<CodingRuleAuto> {
+
+}

+ 17 - 0
hx-common/src/main/java/com/fjhx/common/mapper/coding/CodingRuleMapper.java

@@ -0,0 +1,17 @@
+package com.fjhx.common.mapper.coding;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fjhx.common.entity.coding.po.CodingRule;
+
+
+/**
+ * <p>
+ * 编码规则 Mapper 接口
+ * </p>
+ *
+ * @author
+ * @since 2023-04-13
+ */
+public interface CodingRuleMapper extends BaseMapper<CodingRule> {
+
+}

+ 26 - 0
hx-common/src/main/java/com/fjhx/common/mapper/contract/ContractTemplateMapper.java

@@ -0,0 +1,26 @@
+package com.fjhx.common.mapper.contract;
+
+import com.fjhx.common.entity.contract.po.ContractTemplate;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.common.entity.contract.vo.ContractTemplateVo;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import org.apache.ibatis.annotations.Param;
+
+
+/**
+ * <p>
+ * 合同模板 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-04-14
+ */
+public interface ContractTemplateMapper extends BaseMapper<ContractTemplate> {
+
+    /**
+     * 合同模板分页
+     */
+    Page<ContractTemplateVo> getPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<ContractTemplate> wrapper);
+
+}

+ 26 - 0
hx-common/src/main/java/com/fjhx/common/mapper/corporation/CorporationMapper.java

@@ -0,0 +1,26 @@
+package com.fjhx.common.mapper.corporation;
+
+import com.fjhx.common.entity.corporation.po.Corporation;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.common.entity.corporation.vo.CorporationVo;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import org.apache.ibatis.annotations.Param;
+
+
+/**
+ * <p>
+ * 多公司配置 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-04-10
+ */
+public interface CorporationMapper extends BaseMapper<Corporation> {
+
+    /**
+     * 多公司配置分页
+     */
+    Page<CorporationVo> getPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<Corporation> wrapper);
+
+}

+ 17 - 0
hx-common/src/main/java/com/fjhx/common/mapper/country/CountryMapper.java

@@ -0,0 +1,17 @@
+package com.fjhx.common.mapper.country;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fjhx.common.entity.country.po.Country;
+
+
+/**
+ * <p>
+ * 国家代码 Mapper 接口
+ * </p>
+ *
+ * @author
+ * @since 2023-04-12
+ */
+public interface CountryMapper extends BaseMapper<Country> {
+
+}

+ 16 - 0
hx-common/src/main/java/com/fjhx/common/mapper/currency/CurrencyRateMapper.java

@@ -0,0 +1,16 @@
+package com.fjhx.common.mapper.currency;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fjhx.common.entity.currency.po.CurrencyRate;
+
+/**
+ * <p>
+ * 币种默认汇率 Mapper 接口
+ * </p>
+ *
+ * @author
+ * @since 2023-04-24
+ */
+public interface CurrencyRateMapper extends BaseMapper<CurrencyRate> {
+
+}

+ 26 - 0
hx-common/src/main/java/com/fjhx/common/mapper/documentary/DocumentaryMapper.java

@@ -0,0 +1,26 @@
+package com.fjhx.common.mapper.documentary;
+
+import com.fjhx.common.entity.documentary.po.Documentary;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.common.entity.documentary.vo.DocumentaryVo;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import org.apache.ibatis.annotations.Param;
+
+
+/**
+ * <p>
+ * 跟单配置 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-04-19
+ */
+public interface DocumentaryMapper extends BaseMapper<Documentary> {
+
+    /**
+     * 跟单配置分页
+     */
+    Page<DocumentaryVo> getPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<Documentary> wrapper);
+
+}

+ 21 - 0
hx-common/src/main/java/com/fjhx/common/mapper/documentary/DocumentaryRecordMapper.java

@@ -0,0 +1,21 @@
+package com.fjhx.common.mapper.documentary;
+
+import com.fjhx.common.entity.documentary.po.DocumentaryRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.common.entity.documentary.vo.DocumentaryRecordVo;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import org.apache.ibatis.annotations.Param;
+
+
+/**
+ * <p>
+ * 跟单记录 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-04-20
+ */
+public interface DocumentaryRecordMapper extends BaseMapper<DocumentaryRecord> {
+
+}

+ 27 - 0
hx-common/src/main/java/com/fjhx/common/mapper/on/OnLineInfoMapper.java

@@ -0,0 +1,27 @@
+package com.fjhx.common.mapper.on;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fjhx.common.entity.on.po.OnLineInfo;
+import com.fjhx.common.entity.on.vo.OnLineInfoVo;
+
+import java.util.List;
+
+
+/**
+ * <p>
+ * 在线时长信息 Mapper 接口
+ * </p>
+ *
+ * @author
+ * @since 2023-08-08
+ */
+public interface OnLineInfoMapper extends BaseMapper<OnLineInfo> {
+
+    /**
+     * 获取7天内的在线时长
+     */
+    Long getOnLineTimeByUserId(Long userId);
+
+    List<OnLineInfoVo> getOnLineTimeByDeptIds(List<Long> deptIds);
+
+}

+ 26 - 0
hx-common/src/main/java/com/fjhx/common/mapper/problem/ProblemFeedbackMapper.java

@@ -0,0 +1,26 @@
+package com.fjhx.common.mapper.problem;
+
+import com.fjhx.common.entity.problem.po.ProblemFeedback;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.common.entity.problem.vo.ProblemFeedbackVo;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import org.apache.ibatis.annotations.Param;
+
+
+/**
+ * <p>
+ * 问题反馈 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-04
+ */
+public interface ProblemFeedbackMapper extends BaseMapper<ProblemFeedback> {
+
+    /**
+     * 问题反馈分页
+     */
+    Page<ProblemFeedbackVo> getPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<ProblemFeedback> wrapper);
+
+}

+ 26 - 0
hx-common/src/main/java/com/fjhx/common/mapper/send/SendMegMapper.java

@@ -0,0 +1,26 @@
+//package com.fjhx.common.mapper.send;
+//
+//import com.fjhx.common.entity.send.po.SendMeg;
+//import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+//import com.fjhx.common.entity.send.vo.SendMegVo;
+//import com.ruoyi.common.utils.wrapper.IWrapper;
+//import org.apache.ibatis.annotations.Param;
+//
+//
+///**
+// * <p>
+// *  Mapper 接口
+// * </p>
+// *
+// * @author
+// * @since 2023-05-22
+// */
+//public interface SendMegMapper extends BaseMapper<SendMeg> {
+//
+//    /**
+//     * 分页
+//     */
+//    Page<SendMegVo> getPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<SendMeg> wrapper);
+//
+//}

+ 17 - 0
hx-common/src/main/java/com/fjhx/common/service/coding/CodingRuleAutoService.java

@@ -0,0 +1,17 @@
+package com.fjhx.common.service.coding;
+
+import com.fjhx.common.entity.coding.po.CodingRuleAuto;
+import com.ruoyi.common.core.service.BaseService;
+
+
+/**
+ * <p>
+ * 规则配置自增编码 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-18
+ */
+public interface CodingRuleAutoService extends BaseService<CodingRuleAuto> {
+
+}

+ 9 - 0
hx-common/src/main/java/com/fjhx/common/service/coding/CodingRuleCustomerService.java

@@ -0,0 +1,9 @@
+package com.fjhx.common.service.coding;
+
+import com.fjhx.common.entity.coding.bo.CustomerCodeAndCountryId;
+
+public interface CodingRuleCustomerService {
+
+//    CustomerCodeAndCountryId getCustomerCodeAndCountryId(Long customerId);
+
+}

+ 33 - 0
hx-common/src/main/java/com/fjhx/common/service/coding/CodingRuleService.java

@@ -0,0 +1,33 @@
+package com.fjhx.common.service.coding;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.common.entity.coding.dto.CodingRuleDto;
+import com.fjhx.common.entity.coding.dto.CodingRuleSelectDto;
+import com.fjhx.common.entity.coding.po.CodingRule;
+import com.fjhx.common.entity.coding.vo.CodingRulePageVo;
+import com.ruoyi.common.core.service.BaseService;
+
+
+/**
+ * <p>
+ * 编码规则 服务类
+ * </p>
+ *
+ * @author
+ * @since 2023-04-13
+ */
+public interface CodingRuleService extends BaseService<CodingRule> {
+
+    /**
+     * 编码规则分页
+     */
+    Page<CodingRulePageVo> getPage(CodingRuleSelectDto dto);
+
+    /**
+     * 编码规则编辑
+     */
+    void edit(CodingRuleDto codingRuleDto);
+
+    String createCode(String key, Long customerId);
+
+}

+ 21 - 0
hx-common/src/main/java/com/fjhx/common/service/coding/impl/CodingRuleAutoServiceImpl.java

@@ -0,0 +1,21 @@
+package com.fjhx.common.service.coding.impl;
+
+import com.fjhx.common.entity.coding.po.CodingRuleAuto;
+import com.fjhx.common.mapper.coding.CodingRuleAutoMapper;
+import com.fjhx.common.service.coding.CodingRuleAutoService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * <p>
+ * 规则配置自增编码 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-18
+ */
+@Service
+public class CodingRuleAutoServiceImpl extends ServiceImpl<CodingRuleAutoMapper, CodingRuleAuto> implements CodingRuleAutoService {
+
+}

+ 284 - 0
hx-common/src/main/java/com/fjhx/common/service/coding/impl/CodingRuleServiceImpl.java

@@ -0,0 +1,284 @@
+package com.fjhx.common.service.coding.impl;
+
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson2.JSON;
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.area.entity.po.CustomizeArea;
+import com.fjhx.area.service.CustomizeAreaService;
+import com.fjhx.common.constant.SourceConstant;
+import com.fjhx.common.entity.coding.bo.CustomerCodeAndCountryId;
+import com.fjhx.common.entity.coding.dto.CodingRuleDto;
+import com.fjhx.common.entity.coding.dto.CodingRuleSelectDto;
+import com.fjhx.common.entity.coding.dto.RuleVo;
+import com.fjhx.common.entity.coding.po.CodingRule;
+import com.fjhx.common.entity.coding.po.CodingRuleAuto;
+import com.fjhx.common.entity.coding.vo.CodingRulePageVo;
+import com.fjhx.common.enums.CodingRuleEnum;
+import com.fjhx.common.enums.RuleTypeEnum;
+import com.fjhx.common.mapper.coding.CodingRuleMapper;
+import com.fjhx.common.service.coding.CodingRuleAutoService;
+import com.fjhx.common.service.coding.CodingRuleCustomerService;
+import com.fjhx.common.service.coding.CodingRuleService;
+import com.ruoyi.common.core.domain.BaseIdPo;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.system.service.ISysUserService;
+import com.ruoyi.system.utils.UserUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * <p>
+ * 编码规则 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2023-04-13
+ */
+@Service
+public class CodingRuleServiceImpl extends ServiceImpl<CodingRuleMapper, CodingRule> implements CodingRuleService {
+
+//    @Autowired
+//    private CodingRuleCustomerService codingRuleCustomerService;
+
+    @Autowired
+    private CustomizeAreaService customizeAreaService;
+
+    @Autowired
+    private ISysUserService sysUserService;
+
+    @Autowired
+    private CodingRuleAutoService codingRuleAutoService;
+
+    @Override
+    public Page<CodingRulePageVo> getPage(CodingRuleSelectDto dto) {
+
+        Integer pageNum = dto.getPageNum();
+        Integer pageSize = dto.getPageSize();
+
+        int startIndex = (pageNum - 1) * pageSize;
+        int endIndex = pageNum * pageSize;
+
+        int tempIndex = 0;
+
+        List<CodingRulePageVo> codingRulePageVoList = new ArrayList<>();
+        List<String> keyList = new ArrayList<>();
+
+        for (CodingRuleEnum codingRuleEnum : CodingRuleEnum.values()) {
+            if (StrUtil.isNotBlank(dto.getKeyword())) {
+
+                if (codingRuleEnum.getName().contains(dto.getKeyword())) {
+                    tempIndex = getTempIndex(startIndex, endIndex, tempIndex, codingRulePageVoList, keyList, codingRuleEnum);
+                }
+
+            } else {
+                tempIndex = getTempIndex(startIndex, endIndex, tempIndex, codingRulePageVoList, keyList, codingRuleEnum);
+            }
+
+        }
+
+        Page<CodingRulePageVo> page = dto.getPage();
+        page.setRecords(codingRulePageVoList);
+        page.setTotal(tempIndex);
+
+        if (keyList.size() == 0) {
+            return page;
+        }
+
+        Map<String, CodingRule> kEntity = mapKEntity(CodingRule::getCodingKey, q -> q.in(CodingRule::getCodingKey, keyList));
+
+        for (CodingRulePageVo codingRulePageVo : codingRulePageVoList) {
+            CodingRule codingRule = kEntity.get(codingRulePageVo.getCodingKey());
+            if (codingRule == null) {
+                continue;
+            }
+            codingRulePageVo.setId(codingRule.getId());
+            codingRulePageVo.setCodingDemo(codingRule.getCodingDemo());
+            codingRulePageVo.setRuleVoList(JSON.parseArray(codingRule.getRuleJson(), RuleVo.class));
+            codingRulePageVo.setUpdateTime(codingRule.getUpdateTime());
+            codingRulePageVo.setUpdateUser(codingRule.getUpdateUser());
+        }
+
+        UserUtil.assignmentNickName(codingRulePageVoList, CodingRulePageVo::getUpdateUser, CodingRulePageVo::setUpdateUserName);
+
+        return page;
+    }
+
+    @Override
+    public void edit(CodingRuleDto codingRuleDto) {
+        codingRuleDto.setRuleJson(JSON.toJSONString(codingRuleDto.getRuleVoList()));
+        this.saveOrUpdate(codingRuleDto);
+    }
+
+    /**
+     * 生成编码
+     *
+     * @param key        编码key
+     * @param customerId 客户id
+     * @return 生成的编码
+     */
+    @Override
+    public String createCode(String key, Long customerId) {
+
+        StringBuilder codeBuilder = new StringBuilder();
+
+        CustomerCodeAndCountryId customerCodeAndCountryId = null;
+        Integer autoNum = null;
+        String countryCode = null;
+        String userCode = null;
+        Date data = null;
+
+        List<RuleVo> ruleVoList = getRuleVoList(key);
+        for (RuleVo ruleVo : ruleVoList) {
+            Integer ruleType = ruleVo.getRuleType();
+            RuleTypeEnum ruleTypeEnum = RuleTypeEnum.getRuleTypeEnum(ruleType);
+
+            switch (ruleTypeEnum) {
+                case CUSTOMIZE:
+                    codeBuilder.append(ruleVo.getValue());
+                    break;
+                case COUNTRY_CODE:
+                    if (customerCodeAndCountryId == null) {
+//                        customerCodeAndCountryId = codingRuleCustomerService.getCustomerCodeAndCountryId(customerId);
+                    }
+                    if (countryCode == null) {
+                        countryCode = getCountryCode(customerCodeAndCountryId.getCountryId());
+                    }
+                    codeBuilder.append(countryCode);
+                    break;
+                case SALESMAN_CODE:
+                    if (userCode == null) {
+                        userCode = getUserCode();
+                    }
+                    codeBuilder.append(userCode);
+                    break;
+                case CUSTOMER_CODE:
+                    if (customerCodeAndCountryId == null) {
+//                        customerCodeAndCountryId = codingRuleCustomerService.getCustomerCodeAndCountryId(customerId);
+                    }
+                    codeBuilder.append(customerCodeAndCountryId.getCustomerCode());
+                    break;
+                case AUTOINCREMENT:
+                    if (autoNum == null) {
+                        autoNum = getAutoCode(key);
+                    }
+                    String value = ruleVo.getValue();
+                    codeBuilder.append(autoGenericCode(value, autoNum));
+                    break;
+                case DATE_FORMAT:
+                    String dataFormat = ruleVo.getValue();
+                    try {
+                        if (data == null) {
+                            data = new Date();
+                        }
+                        String format = DateUtil.format(data, dataFormat);
+                        codeBuilder.append(format);
+                    } catch (Exception e) {
+                        throw new ServiceException("生成编码配置日期生成格式错误");
+                    }
+                    break;
+            }
+        }
+
+        return codeBuilder.toString();
+    }
+
+    private synchronized Integer getAutoCode(String key) {
+        CodingRuleAuto codingRuleAuto = codingRuleAutoService.getOne(q -> q.eq(CodingRuleAuto::getKey, key));
+        if (codingRuleAuto == null) {
+            codingRuleAuto = new CodingRuleAuto();
+            codingRuleAuto.setKey(key);
+            codingRuleAuto.setNum(1);
+            codingRuleAutoService.save(codingRuleAuto);
+            return 1;
+        }
+
+        codingRuleAuto.setNum(codingRuleAuto.getNum() + 1);
+        codingRuleAutoService.updateById(codingRuleAuto);
+        return codingRuleAuto.getNum();
+    }
+
+
+    private int getTempIndex(int startIndex, int endIndex, int tempIndex,
+                             List<CodingRulePageVo> codingRulePageVoList,
+                             List<String> keyList,
+                             CodingRuleEnum codingRuleEnum) {
+
+        if (tempIndex >= startIndex && tempIndex < endIndex) {
+            CodingRulePageVo codingRulePageVo = new CodingRulePageVo();
+            codingRulePageVo.setCodingKey(codingRuleEnum.getKey());
+            codingRulePageVo.setCodingName(codingRuleEnum.getName());
+            codingRulePageVo.setRuleVoList(codingRuleEnum.getDefaultRuleVoList());
+            codingRulePageVoList.add(codingRulePageVo);
+            keyList.add(codingRuleEnum.getKey());
+        }
+
+        return ++tempIndex;
+    }
+
+    private List<RuleVo> getRuleVoList(String key) {
+        CodingRule codingRule = getOne(q -> q.eq(CodingRule::getCodingKey, key));
+
+        if (codingRule != null) {
+            List<RuleVo> ruleVoList = JSON.parseArray(codingRule.getRuleJson(), RuleVo.class);
+            if (ruleVoList.size() == 0) {
+                throw new ServiceException("编码生成规则为空");
+            }
+            return ruleVoList;
+        }
+        return CodingRuleEnum.getDefaultRuleVoList(key);
+    }
+
+    private String getCountryCode(Long countryId) {
+        DynamicDataSourceContextHolder.push(SourceConstant.BASE);
+        CustomizeArea customizeArea = customizeAreaService.getOne(q -> q
+                .eq(BaseIdPo::getId, countryId)
+                .eq(CustomizeArea::getLevelCode, 1));
+        DynamicDataSourceContextHolder.poll();
+
+        if (customizeArea == null) {
+            throw new ServiceException("国家为空");
+        }
+
+        return customizeArea.getCode();
+    }
+
+
+    /**
+     * 获取业务员编码
+     */
+    private String getUserCode() {
+        DynamicDataSourceContextHolder.push(SourceConstant.BASE);
+        SysUser sysUser = sysUserService.getById(SecurityUtils.getUserId());
+        DynamicDataSourceContextHolder.poll();
+        String userCode = sysUser.getUserCode();
+        if (StrUtil.isBlank(userCode)) {
+            throw new ServiceException("业务员代码未配置,生成编码失败");
+        }
+        return userCode;
+    }
+
+    /**
+     * 不够位数的在前面补0,保留num的长度位数字
+     */
+    private static String autoGenericCode(Object length, Integer codeNum) {
+        Integer integer = Convert.toInt(length);
+        if (integer == null) {
+            throw new ServiceException("自定义编码长度不为数字");
+        }
+
+        return String.format("%0" + integer + "d", codeNum);
+    }
+
+}

+ 46 - 0
hx-common/src/main/java/com/fjhx/common/service/contract/ContractTemplateService.java

@@ -0,0 +1,46 @@
+package com.fjhx.common.service.contract;
+
+import com.fjhx.common.entity.contract.po.ContractTemplate;
+import com.ruoyi.common.core.service.BaseService;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.common.entity.contract.vo.ContractTemplateVo;
+import com.fjhx.common.entity.contract.dto.ContractTemplateSelectDto;
+import com.fjhx.common.entity.contract.dto.ContractTemplateDto;
+
+
+/**
+ * <p>
+ * 合同模板 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-04-14
+ */
+public interface ContractTemplateService extends BaseService<ContractTemplate> {
+
+    /**
+     * 合同模板分页
+     */
+    Page<ContractTemplateVo> getPage(ContractTemplateSelectDto dto);
+
+    /**
+     * 合同模板明细
+     */
+    ContractTemplateVo detail(Long id);
+
+    /**
+     * 合同模板新增
+     */
+    void add(ContractTemplateDto contractTemplateDto);
+
+    /**
+     * 合同模板编辑
+     */
+    void edit(ContractTemplateDto contractTemplateDto);
+
+    /**
+     * 合同模板删除
+     */
+    void delete(Long id);
+
+}

+ 60 - 0
hx-common/src/main/java/com/fjhx/common/service/contract/impl/ContractTemplateServiceImpl.java

@@ -0,0 +1,60 @@
+package com.fjhx.common.service.contract.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.common.entity.contract.dto.ContractTemplateDto;
+import com.fjhx.common.entity.contract.dto.ContractTemplateSelectDto;
+import com.fjhx.common.entity.contract.po.ContractTemplate;
+import com.fjhx.common.entity.contract.vo.ContractTemplateVo;
+import com.fjhx.common.mapper.contract.ContractTemplateMapper;
+import com.fjhx.common.service.contract.ContractTemplateService;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.ruoyi.common.utils.wrapper.SqlField;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * <p>
+ * 合同模板 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2023-04-14
+ */
+@Service
+public class ContractTemplateServiceImpl extends ServiceImpl<ContractTemplateMapper, ContractTemplate> implements ContractTemplateService {
+
+    @Override
+    public Page<ContractTemplateVo> getPage(ContractTemplateSelectDto dto) {
+        IWrapper<ContractTemplate> wrapper = getWrapper();
+        wrapper.eq("ct", ContractTemplate::getCorporationId, dto.getCorporationId());
+        wrapper.keyword(dto, new SqlField("ct", ContractTemplate::getTemplateName));
+        wrapper.orderByDesc("ct", ContractTemplate::getId);
+
+        return this.baseMapper.getPage(dto.getPage(), wrapper);
+    }
+
+    @Override
+    public ContractTemplateVo detail(Long id) {
+        ContractTemplate ContractTemplate = this.getById(id);
+        ContractTemplateVo result = BeanUtil.toBean(ContractTemplate, ContractTemplateVo.class);
+        return result;
+    }
+
+    @Override
+    public void add(ContractTemplateDto contractTemplateDto) {
+        this.save(contractTemplateDto);
+    }
+
+    @Override
+    public void edit(ContractTemplateDto contractTemplateDto) {
+        this.updateById(contractTemplateDto);
+    }
+
+    @Override
+    public void delete(Long id) {
+        this.removeById(id);
+    }
+
+}

+ 46 - 0
hx-common/src/main/java/com/fjhx/common/service/corporation/CorporationService.java

@@ -0,0 +1,46 @@
+package com.fjhx.common.service.corporation;
+
+import com.fjhx.common.entity.corporation.po.Corporation;
+import com.ruoyi.common.core.service.BaseService;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.common.entity.corporation.vo.CorporationVo;
+import com.fjhx.common.entity.corporation.dto.CorporationSelectDto;
+import com.fjhx.common.entity.corporation.dto.CorporationDto;
+
+
+/**
+ * <p>
+ * 多公司配置 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-04-10
+ */
+public interface CorporationService extends BaseService<Corporation> {
+
+    /**
+     * 多公司配置分页
+     */
+    Page<CorporationVo> getPage(CorporationSelectDto dto);
+
+    /**
+     * 多公司配置明细
+     */
+    CorporationVo detail(Long id);
+
+    /**
+     * 多公司配置新增
+     */
+    void add(CorporationDto corporationDto);
+
+    /**
+     * 多公司配置编辑
+     */
+    void edit(CorporationDto corporationDto);
+
+    /**
+     * 多公司配置删除
+     */
+    void delete(Long id);
+
+}

+ 100 - 0
hx-common/src/main/java/com/fjhx/common/service/corporation/impl/CorporationServiceImpl.java

@@ -0,0 +1,100 @@
+package com.fjhx.common.service.corporation.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.area.utils.CustomizeAreaUtil;
+import com.fjhx.common.constant.SourceConstant;
+import com.fjhx.common.entity.corporation.dto.CorporationDto;
+import com.fjhx.common.entity.corporation.dto.CorporationSelectDto;
+import com.fjhx.common.entity.corporation.po.Corporation;
+import com.fjhx.common.entity.corporation.vo.CorporationVo;
+import com.fjhx.common.mapper.corporation.CorporationMapper;
+import com.fjhx.common.service.corporation.CorporationService;
+import com.fjhx.file.utils.ObsFileUtil;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+
+/**
+ * <p>
+ * 多公司配置 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-04-10
+ */
+@DS(SourceConstant.COMMON)
+@Service
+public class CorporationServiceImpl extends ServiceImpl<CorporationMapper, Corporation> implements CorporationService {
+
+    @Override
+    public Page<CorporationVo> getPage(CorporationSelectDto dto) {
+        IWrapper<Corporation> wrapper = getWrapper();
+        wrapper.orderByDesc("c", Corporation::getId);
+        if(ObjectUtil.isNotEmpty(dto.getKeyword())){
+            wrapper.and(q->q.like(Corporation::getName,dto.getKeyword())
+                    .or().like(Corporation::getLegalPersonName,dto.getKeyword())
+                    .or().like(Corporation::getNameEn,dto.getKeyword()));
+        }
+        Page<CorporationVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
+        List<CorporationVo> records = page.getRecords();
+        // 赋值国省市
+        CustomizeAreaUtil.setAreaName(records);
+        return page;
+    }
+
+    @Override
+    public CorporationVo detail(Long id) {
+        Corporation Corporation = this.getById(id);
+        CorporationVo result = BeanUtil.toBean(Corporation, CorporationVo.class);
+        // 赋值国省市
+        CustomizeAreaUtil.setAreaName(result);
+        return result;
+    }
+
+    @DSTransactional
+    @Override
+    public void add(CorporationDto corporationDto) {
+
+        CustomizeAreaUtil.setAreaId(corporationDto);
+
+        this.save(corporationDto);
+        // 企业logo
+        ObsFileUtil.saveFile(corporationDto.getEnterpriseLogoList(), corporationDto.getId(), 1);
+        // 法人签名
+        ObsFileUtil.saveFile(corporationDto.getLarSignList(), corporationDto.getId(), 2);
+        // 公章
+        ObsFileUtil.saveFile(corporationDto.getOfficialSealList(), corporationDto.getId(), 3);
+        // 合同章
+        ObsFileUtil.saveFile(corporationDto.getContractSealList(), corporationDto.getId(), 4);
+    }
+
+    @DSTransactional
+    @Override
+    public void edit(CorporationDto corporationDto) {
+
+        CustomizeAreaUtil.setAreaId(corporationDto);
+
+        this.updateById(corporationDto);
+        // 企业logo
+        ObsFileUtil.editFile(corporationDto.getEnterpriseLogoList(), corporationDto.getId(), 1);
+        // 法人签名
+        ObsFileUtil.editFile(corporationDto.getLarSignList(), corporationDto.getId(), 2);
+        // 公章
+        ObsFileUtil.editFile(corporationDto.getOfficialSealList(), corporationDto.getId(), 3);
+        // 合同章
+        ObsFileUtil.editFile(corporationDto.getContractSealList(), corporationDto.getId(), 4);
+    }
+
+    @Override
+    public void delete(Long id) {
+        this.removeById(id);
+    }
+
+}

+ 17 - 0
hx-common/src/main/java/com/fjhx/common/service/country/CountryService.java

@@ -0,0 +1,17 @@
+package com.fjhx.common.service.country;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fjhx.common.entity.country.po.Country;
+
+
+/**
+ * <p>
+ * 国家代码 服务类
+ * </p>
+ *
+ * @author
+ * @since 2023-04-12
+ */
+public interface CountryService extends IService<Country> {
+
+}

+ 21 - 0
hx-common/src/main/java/com/fjhx/common/service/country/impl/CountryServiceImpl.java

@@ -0,0 +1,21 @@
+package com.fjhx.common.service.country.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.common.entity.country.po.Country;
+import com.fjhx.common.mapper.country.CountryMapper;
+import com.fjhx.common.service.country.CountryService;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * <p>
+ * 国家代码 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2023-04-12
+ */
+@Service
+public class CountryServiceImpl extends ServiceImpl<CountryMapper, Country> implements CountryService {
+
+}

+ 28 - 0
hx-common/src/main/java/com/fjhx/common/service/currency/CurrencyRateService.java

@@ -0,0 +1,28 @@
+package com.fjhx.common.service.currency;
+
+import com.fjhx.common.entity.currency.po.CurrencyRate;
+import com.ruoyi.common.core.service.BaseService;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 币种默认汇率 服务类
+ * </p>
+ *
+ * @author
+ * @since 2023-04-24
+ */
+public interface CurrencyRateService extends BaseService<CurrencyRate> {
+
+    /**
+     * 币种默认汇率列表
+     */
+    List<CurrencyRate> getList();
+
+    /**
+     * 币种默认汇率编辑
+     */
+    void edit(List<CurrencyRate> currencyRateList);
+
+}

+ 32 - 0
hx-common/src/main/java/com/fjhx/common/service/currency/impl/CurrencyRateServiceImpl.java

@@ -0,0 +1,32 @@
+package com.fjhx.common.service.currency.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.common.entity.currency.po.CurrencyRate;
+import com.fjhx.common.mapper.currency.CurrencyRateMapper;
+import com.fjhx.common.service.currency.CurrencyRateService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 币种默认汇率 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2023-04-24
+ */
+@Service
+public class CurrencyRateServiceImpl extends ServiceImpl<CurrencyRateMapper, CurrencyRate> implements CurrencyRateService {
+
+    @Override
+    public List<CurrencyRate> getList() {
+        return list();
+    }
+
+    @Override
+    public void edit(List<CurrencyRate> currencyRateList) {
+        saveOrUpdateBatch(currencyRateList);
+    }
+
+}

+ 40 - 0
hx-common/src/main/java/com/fjhx/common/service/documentary/DocumentaryRecordService.java

@@ -0,0 +1,40 @@
+package com.fjhx.common.service.documentary;
+
+import com.fjhx.common.entity.documentary.dto.DocumentaryRecordDto;
+import com.fjhx.common.entity.documentary.dto.DocumentaryRecordSelectDto;
+import com.fjhx.common.entity.documentary.po.DocumentaryRecord;
+import com.fjhx.common.entity.documentary.vo.DocumentaryRecordInfoVo;
+import com.ruoyi.common.core.service.BaseService;
+
+
+/**
+ * <p>
+ * 跟单记录 服务类
+ * </p>
+ *
+ * @author
+ * @since 2023-04-20
+ */
+public interface DocumentaryRecordService extends BaseService<DocumentaryRecord> {
+
+    /**
+     * 跟单记录信息
+     */
+    DocumentaryRecordInfoVo getInfo(DocumentaryRecordSelectDto dto);
+
+    /**
+     * 添加跟单记录
+     */
+    void add(DocumentaryRecordDto dto);
+
+    /**
+     * 编辑跟单记录
+     */
+    void edit(DocumentaryRecordDto dto);
+
+    /**
+     * 删除跟单记录
+     */
+    void delete(Long id);
+
+}

+ 46 - 0
hx-common/src/main/java/com/fjhx/common/service/documentary/DocumentaryService.java

@@ -0,0 +1,46 @@
+package com.fjhx.common.service.documentary;
+
+import com.fjhx.common.entity.documentary.po.Documentary;
+import com.ruoyi.common.core.service.BaseService;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.common.entity.documentary.vo.DocumentaryVo;
+import com.fjhx.common.entity.documentary.dto.DocumentarySelectDto;
+import com.fjhx.common.entity.documentary.dto.DocumentaryDto;
+
+
+/**
+ * <p>
+ * 跟单配置 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-04-19
+ */
+public interface DocumentaryService extends BaseService<Documentary> {
+
+    /**
+     * 跟单配置分页
+     */
+    Page<DocumentaryVo> getPage(DocumentarySelectDto dto);
+
+    /**
+     * 跟单配置明细
+     */
+    DocumentaryVo detail(Long id);
+
+    /**
+     * 跟单配置新增
+     */
+    void add(DocumentaryDto documentaryDto);
+
+    /**
+     * 跟单配置编辑
+     */
+    void edit(DocumentaryDto documentaryDto);
+
+    /**
+     * 跟单配置删除
+     */
+    void delete(Long id);
+
+}

+ 22 - 0
hx-common/src/main/java/com/fjhx/common/service/documentary/GetDocumentaryBusinessTemplate.java

@@ -0,0 +1,22 @@
+package com.fjhx.common.service.documentary;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.common.entity.documentary.bo.DocumentaryData;
+import com.ruoyi.common.core.domain.BaseSelectDto;
+
+import java.util.List;
+
+public interface GetDocumentaryBusinessTemplate {
+
+    /**
+     * 获取跟单分页数据
+     *
+     * @param selectData        筛选条件
+     * @param dto               分页参数
+     * @param excludeBusinessId 排除业务id
+     * @return 分页数据
+     */
+    Page<? extends DocumentaryData> getDocumentaryPage(JSONObject selectData, BaseSelectDto dto, List<Long> excludeBusinessId);
+
+}

+ 233 - 0
hx-common/src/main/java/com/fjhx/common/service/documentary/impl/DocumentaryRecordServiceImpl.java

@@ -0,0 +1,233 @@
+package com.fjhx.common.service.documentary.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.common.constant.SourceConstant;
+import com.fjhx.common.entity.documentary.bo.DocumentaryData;
+import com.fjhx.common.entity.documentary.dto.DocumentaryRecordDto;
+import com.fjhx.common.entity.documentary.dto.DocumentaryRecordSelectDto;
+import com.fjhx.common.entity.documentary.eums.DocumentaryTypeEnum;
+import com.fjhx.common.entity.documentary.po.Documentary;
+import com.fjhx.common.entity.documentary.po.DocumentaryRecord;
+import com.fjhx.common.entity.documentary.vo.DocumentaryRecordInfoVo;
+import com.fjhx.common.entity.documentary.vo.DocumentaryRecordVo;
+import com.fjhx.common.entity.documentary.vo.DocumentaryVo;
+import com.fjhx.common.mapper.documentary.DocumentaryRecordMapper;
+import com.fjhx.common.service.documentary.DocumentaryRecordService;
+import com.fjhx.common.service.documentary.DocumentaryService;
+import com.fjhx.common.service.documentary.GetDocumentaryBusinessTemplate;
+import com.fjhx.file.entity.FileInfoVo;
+import com.fjhx.file.utils.ObsFileUtil;
+import com.ruoyi.common.core.domain.BaseIdPo;
+import com.ruoyi.common.exception.ServiceException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.context.SecurityContext;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Service;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+
+/**
+ * <p>
+ * 跟单记录 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2023-04-20
+ */
+@Service
+public class DocumentaryRecordServiceImpl extends ServiceImpl<DocumentaryRecordMapper, DocumentaryRecord> implements DocumentaryRecordService {
+
+    ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
+            4,
+            20,
+            60,
+            TimeUnit.SECONDS,
+            new ArrayBlockingQueue<>(20),
+            new ThreadPoolExecutor.CallerRunsPolicy()
+    );
+
+    @Autowired
+    private DocumentaryService documentaryService;
+
+    @Override
+    public DocumentaryRecordInfoVo getInfo(DocumentaryRecordSelectDto dto) {
+
+        // 获取跟单类型
+        DocumentaryTypeEnum typeEnum = DocumentaryTypeEnum.getEnum(dto.getType());
+        GetDocumentaryBusinessTemplate bean = typeEnum.getBusinessBean();
+
+        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        SecurityContext context = SecurityContextHolder.getContext();
+
+        CompletableFuture<? extends Page<? extends DocumentaryData>> pageCompletableFuture =
+                CompletableFuture.supplyAsync(() -> {
+                    // 设置子线程共享
+                    RequestContextHolder.setRequestAttributes(servletRequestAttributes, true);
+                    SecurityContextHolder.setContext(context);
+                    DynamicDataSourceContextHolder.push(SourceConstant.COMMON);
+
+                    List<Long> excludeBusinessId = null;
+                    Long noRecordDocumentaryId = dto.getNoRecordDocumentaryId();
+                    if (noRecordDocumentaryId != null) {
+                        // 排除业务id
+                        excludeBusinessId = listObject(DocumentaryRecord::getBusinessId,
+                                q -> q.eq(DocumentaryRecord::getDocumentaryId, noRecordDocumentaryId));
+                    }
+
+                    Page<? extends DocumentaryData> page = bean.getDocumentaryPage(dto.getCondition(), dto, excludeBusinessId);
+                    setDocumentaryRecord(page);
+
+                    DynamicDataSourceContextHolder.poll();
+                    return page;
+                }, threadPoolExecutor).exceptionally(e -> {
+                    if (e instanceof ServiceException) {
+                        throw (ServiceException) e;
+                    }
+                    throw new RuntimeException(e);
+                });
+
+        CompletableFuture<List<DocumentaryVo>> getDocumentaryListFuture =
+                CompletableFuture.supplyAsync(() -> {
+                    // 设置子线程共享
+                    RequestContextHolder.setRequestAttributes(servletRequestAttributes, true);
+                    SecurityContextHolder.setContext(context);
+                    DynamicDataSourceContextHolder.push(SourceConstant.COMMON);
+
+                    List<DocumentaryVo> documentaryList = getDocumentaryList(typeEnum.getKey());
+                    if (documentaryList.size() > 0) {
+                        setDocumentaryRecordCount(documentaryList);
+                    }
+
+                    DynamicDataSourceContextHolder.poll();
+                    return documentaryList;
+                }, threadPoolExecutor).exceptionally(e -> {
+                    if (e instanceof ServiceException) {
+                        throw (ServiceException) e;
+                    }
+                    throw new RuntimeException(e);
+                });
+
+
+        Page<? extends DocumentaryData> documentaryDataPage = pageCompletableFuture.join();
+        List<DocumentaryVo> documentaryList = getDocumentaryListFuture.join();
+
+        DocumentaryRecordInfoVo vo = new DocumentaryRecordInfoVo();
+        vo.setDocumentaryList(documentaryList);
+        vo.setPage(documentaryDataPage);
+        return vo;
+    }
+
+    @DSTransactional
+    @Override
+    public void add(DocumentaryRecordDto dto) {
+        save(dto);
+        ObsFileUtil.saveFile(dto.getFileList(), dto.getId());
+    }
+
+    @DSTransactional
+    @Override
+    public void edit(DocumentaryRecordDto dto) {
+        if (dto.getId() == null) {
+            throw new ServiceException("跟单记录id不能为空");
+        }
+
+        updateById(dto);
+        ObsFileUtil.editFile(dto.getFileList(), dto.getId());
+    }
+
+    @DSTransactional
+    @Override
+    public void delete(Long id) {
+        removeById(id);
+        ObsFileUtil.removeFile(id);
+    }
+
+    /**
+     * 获取跟单配置
+     *
+     * @param type 跟单类型
+     * @return 跟单列表
+     */
+    private List<DocumentaryVo> getDocumentaryList(Integer type) {
+        List<Documentary> list = documentaryService.list(q -> q
+                .eq(Documentary::getType, type)
+                .orderByAsc(Documentary::getSort)
+        );
+        return BeanUtil.copyToList(list, DocumentaryVo.class);
+    }
+
+    /**
+     * 设置跟单记录总条数
+     *
+     * @param documentaryList 跟单配置
+     */
+    private void setDocumentaryRecordCount(List<DocumentaryVo> documentaryList) {
+        List<Long> documentaryIdList = documentaryList.stream().map(BaseIdPo::getId).collect(Collectors.toList());
+
+        Map<Object, Long> countMap = listMaps(Wrappers.<DocumentaryRecord>query()
+                .select("documentary_id as documentaryId", "count(0) as count")
+                .lambda()
+                .in(DocumentaryRecord::getDocumentaryId, documentaryIdList)
+                .groupBy(DocumentaryRecord::getDocumentaryId)
+        ).stream().collect(Collectors.toMap(
+                item -> item.get("documentaryId"),
+                item -> (Long) item.get("count")));
+
+        for (DocumentaryVo documentaryVo : documentaryList) {
+            documentaryVo.setCount(countMap.getOrDefault(documentaryVo.getId(), 0L));
+        }
+
+    }
+
+    /**
+     * 赋值跟单记录明细
+     */
+    private void setDocumentaryRecord(Page<? extends DocumentaryData> page) {
+        List<? extends DocumentaryData> records = page.getRecords();
+
+        if (records.size() == 0) {
+            return;
+        }
+
+        // 业务id
+        List<Long> businessIdList = records.stream().map(DocumentaryData::getId).collect(Collectors.toList());
+
+        // 根据业务id查询跟单记录
+        List<DocumentaryRecord> list = list(q -> q.in(DocumentaryRecord::getBusinessId, businessIdList));
+
+        // 查询跟单记录文件
+        List<Long> documentaryRecordList = list.stream().map(BaseIdPo::getId).collect(Collectors.toList());
+        Map<Long, List<FileInfoVo>> fileMap = ObsFileUtil.getFileMap(documentaryRecordList);
+
+        List<DocumentaryRecordVo> documentaryRecordVoList = BeanUtil.copyToList(list, DocumentaryRecordVo.class);
+
+        Map<Long, Map<Long, List<DocumentaryRecordVo>>> map = documentaryRecordVoList.stream()
+                .peek(item -> item.setFileList(fileMap.getOrDefault(item.getId(), new ArrayList<>())))
+                .collect(Collectors.groupingBy(DocumentaryRecord::getBusinessId,
+                        Collectors.groupingBy(DocumentaryRecord::getDocumentaryId)));
+
+        // 赋值
+        for (DocumentaryData record : records) {
+            record.setDocumentaryRecord(map.getOrDefault(record.getId(), new HashMap<>()));
+        }
+
+    }
+
+
+}

+ 59 - 0
hx-common/src/main/java/com/fjhx/common/service/documentary/impl/DocumentaryServiceImpl.java

@@ -0,0 +1,59 @@
+package com.fjhx.common.service.documentary.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.common.entity.documentary.dto.DocumentaryDto;
+import com.fjhx.common.entity.documentary.dto.DocumentarySelectDto;
+import com.fjhx.common.entity.documentary.po.Documentary;
+import com.fjhx.common.entity.documentary.vo.DocumentaryVo;
+import com.fjhx.common.mapper.documentary.DocumentaryMapper;
+import com.fjhx.common.service.documentary.DocumentaryService;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * <p>
+ * 跟单配置 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-04-19
+ */
+@Service
+public class DocumentaryServiceImpl extends ServiceImpl<DocumentaryMapper, Documentary> implements DocumentaryService {
+
+    @Override
+    public Page<DocumentaryVo> getPage(DocumentarySelectDto dto) {
+        IWrapper<Documentary> wrapper = getWrapper();
+
+        wrapper.orderByAsc("d", Documentary::getType);
+        wrapper.orderByAsc("d", Documentary::getSort);
+        Page<DocumentaryVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
+        return page;
+    }
+
+    @Override
+    public DocumentaryVo detail(Long id) {
+        Documentary Documentary = this.getById(id);
+        DocumentaryVo result = BeanUtil.toBean(Documentary, DocumentaryVo.class);
+        return result;
+    }
+
+    @Override
+    public void add(DocumentaryDto documentaryDto) {
+        this.save(documentaryDto);
+    }
+
+    @Override
+    public void edit(DocumentaryDto documentaryDto) {
+        this.updateById(documentaryDto);
+    }
+
+    @Override
+    public void delete(Long id) {
+        this.removeById(id);
+    }
+
+}

+ 19 - 0
hx-common/src/main/java/com/fjhx/common/service/on/OnLineInfoService.java

@@ -0,0 +1,19 @@
+package com.fjhx.common.service.on;
+
+import com.fjhx.common.entity.on.po.OnLineInfo;
+import com.fjhx.common.entity.on.vo.OnLineInfoReturnData;
+import com.ruoyi.common.core.service.BaseService;
+
+
+/**
+ * <p>
+ * 在线时长信息 服务类
+ * </p>
+ *
+ * @author
+ * @since 2023-08-08
+ */
+public interface OnLineInfoService extends BaseService<OnLineInfo> {
+
+    OnLineInfoReturnData onLineInfo();
+}

+ 183 - 0
hx-common/src/main/java/com/fjhx/common/service/on/impl/OnLineInfoServiceImpl.java

@@ -0,0 +1,183 @@
+package com.fjhx.common.service.on.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.common.constant.SourceConstant;
+import com.fjhx.common.entity.on.po.OnLineInfo;
+import com.fjhx.common.entity.on.vo.OnLineInfoReturnData;
+import com.fjhx.common.entity.on.vo.OnLineInfoVo;
+import com.fjhx.common.mapper.on.OnLineInfoMapper;
+import com.fjhx.common.service.on.OnLineInfoService;
+import com.fjhx.socket.core.WebSocketServer;
+import com.fjhx.socket.core.event.WebSocketOnMessageEvent;
+import com.fjhx.socket.core.event.WebSocketOnOpenEvent;
+import com.ruoyi.common.annotation.TenantIgnore;
+import com.ruoyi.common.core.domain.entity.SysDept;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.system.service.ISysDeptService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * <p>
+ * 在线时长信息 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2023-08-08
+ */
+@Service
+public class OnLineInfoServiceImpl extends ServiceImpl<OnLineInfoMapper, OnLineInfo> implements OnLineInfoService {
+
+    @Autowired
+    private ISysDeptService sysDeptService;
+
+    @Override
+    public OnLineInfoReturnData onLineInfo() {
+        Long userId = SecurityUtils.getUserId();
+
+
+        //部门负责人:可查看负责部门/部门总监:可以查看对应部门及级联部门
+        DynamicDataSourceContextHolder.push(SourceConstant.BASE);
+        List<SysDept> deptList = sysDeptService.list(Wrappers.<SysDept>lambdaQuery()
+                .eq(SysDept::getLeaderId, userId)
+                .or()
+                .eq(SysDept::getDirectorId, userId)
+        );
+        DynamicDataSourceContextHolder.poll();
+
+        //递归获取子数据
+        List<OnLineInfoReturnData.Dept> deptList1 = getDeptList(deptList, userId, 0);
+
+        //返回数据
+        OnLineInfoReturnData onLineInfoReturnData = new OnLineInfoReturnData();
+        //我的在线时长
+        BigDecimal divide = BigDecimal.valueOf(baseMapper.getOnLineTimeByUserId(userId)).divide(BigDecimal.valueOf(3600), 2, BigDecimal.ROUND_HALF_UP);
+        onLineInfoReturnData.setOnLineTime(divide);
+        //部门列表
+        onLineInfoReturnData.setDeptList(deptList1);
+
+        return onLineInfoReturnData;
+    }
+
+    List<OnLineInfoReturnData.Dept> getDeptList(List<SysDept> deptList, Long userId, Integer type) {
+        List<OnLineInfoReturnData.Dept> deptList1 = new ArrayList<>();
+        for (SysDept sysDept : deptList) {
+            List<OnLineInfoReturnData.User> userList = new ArrayList<>();
+            //获取用户列表
+            List<OnLineInfoVo> onLineTimeByDeptIds = baseMapper.getOnLineTimeByDeptIds(Collections.singletonList(sysDept.getDeptId()));
+            BigDecimal deptOnLineTime = BigDecimal.ZERO;
+            for (OnLineInfoVo onLineTimeByDeptId : onLineTimeByDeptIds) {
+                OnLineInfoReturnData.User user = new OnLineInfoReturnData.User();
+                user.setUserName(onLineTimeByDeptId.getUserName());
+
+                BigDecimal divide = BigDecimal.valueOf(onLineTimeByDeptId.getOnLineDuration()).divide(BigDecimal.valueOf(3600), 2, BigDecimal.ROUND_HALF_UP);
+                user.setOnLineTime(divide);
+                userList.add(user);
+
+                deptOnLineTime = deptOnLineTime.add(divide);
+            }
+
+            OnLineInfoReturnData.Dept dept1 = new OnLineInfoReturnData.Dept();
+            dept1.setDeptName(sysDept.getDeptName());
+            dept1.setUserList(userList);
+            dept1.setOnLineTime(deptOnLineTime);
+
+
+            //如果部门总监是我 查询部门下的子部门(type=1是递归进来的需要查子部门)
+            if (type == 1 || userId.equals(sysDept.getDirectorId())) {
+                DynamicDataSourceContextHolder.push(SourceConstant.BASE);
+                List<SysDept> deptList11 = sysDeptService.list(Wrappers.<SysDept>lambdaQuery().eq(SysDept::getParentId, sysDept.getDeptId()));
+                DynamicDataSourceContextHolder.poll();
+                //赋值子部门
+                List<OnLineInfoReturnData.Dept> deptList2 = getDeptList(deptList11, userId, 1);
+                dept1.setDeptList(deptList2);
+                //计算子部门列表的时长和加到当前部门上
+                BigDecimal onLineTimeCount = deptList2.stream().map(OnLineInfoReturnData.Dept::getOnLineTime).reduce(BigDecimal.ZERO, BigDecimal::add);
+                dept1.setOnLineTime(dept1.getOnLineTime().add(onLineTimeCount));
+            }
+
+            //返回数据
+            deptList1.add(dept1);
+        }
+        return deptList1;
+    }
+
+    /**
+     * 用户连接websock监听
+     */
+    @EventListener
+    @TenantIgnore
+    public void webSocketOnOpenEvent(WebSocketOnOpenEvent webSocketOnOpenEvent) {
+        WebSocketServer webSocketServer = webSocketOnOpenEvent.getWebSocketServer();
+        Long userId = webSocketServer.getUserId();
+        //记录上线时间
+        DynamicDataSourceContextHolder.push(SourceConstant.COMMON);
+        OnLineInfo onLineInfo = this.getOne(q -> q.eq(OnLineInfo::getUserId, userId).apply("DATE(on_line_date) = DATE(NOW())"));
+        DynamicDataSourceContextHolder.poll();
+        if (ObjectUtil.isEmpty(onLineInfo)) {
+            onLineInfo = new OnLineInfo();
+            onLineInfo.setOnLineDuration(0L);
+            onLineInfo.setOnLineDate(new Date());
+            onLineInfo.setUserId(userId);
+            onLineInfo.setTenantId(webSocketServer.getTenantId());
+        }
+        onLineInfo.setLastOnlineTime(new Date());
+        DynamicDataSourceContextHolder.push(SourceConstant.COMMON);
+        this.saveOrUpdate(onLineInfo);
+        DynamicDataSourceContextHolder.poll();
+    }
+
+    /**
+     * 收到websock消息监听
+     */
+    @EventListener
+    @TenantIgnore
+    public void webSocketOnMessageEvent(WebSocketOnMessageEvent webSocketOnMessageEvent) {
+        WebSocketServer webSocketServer = webSocketOnMessageEvent.getWebSocketServer();
+        Long userId = webSocketServer.getUserId();
+
+        String message = webSocketOnMessageEvent.getMessage();
+        JSONObject json = JSONObject.parseObject(message);
+        if (ObjectUtil.isNotEmpty(json.get("heartbeat"))) {
+            //保存在线时长信息
+            DynamicDataSourceContextHolder.push(SourceConstant.COMMON);
+            OnLineInfo onLineInfo = this.getOne(q -> q.eq(OnLineInfo::getUserId, userId).apply("DATE(on_line_date) = DATE(NOW())"));
+            DynamicDataSourceContextHolder.poll();
+            if (ObjectUtil.isEmpty(onLineInfo)) {
+                onLineInfo = new OnLineInfo();
+                onLineInfo.setOnLineDuration(0L);
+                onLineInfo.setOnLineDate(new Date());
+                onLineInfo.setUserId(userId);
+                onLineInfo.setTenantId(webSocketServer.getTenantId());
+            }
+
+
+            Long startTime = onLineInfo.getLastOnlineTime().getTime();
+            Date endDate = new Date();
+            //在线时长(秒)
+            long onLineTime = (endDate.getTime() - startTime) / 1000;
+
+            //记录在线时长
+            onLineInfo.setOnLineDuration(onLineInfo.getOnLineDuration() + onLineTime);
+            onLineInfo.setLastOnlineTime(endDate);
+            DynamicDataSourceContextHolder.push(SourceConstant.COMMON);
+            this.saveOrUpdate(onLineInfo);
+            DynamicDataSourceContextHolder.poll();
+        }
+    }
+
+}
+
+

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio