raojiang 6 bulan lalu
induk
melakukan
b3cca60bbe
100 mengubah file dengan 6782 tambahan dan 0 penghapusan
  1. 46 0
      .gitignore
  2. 13 0
      api/load-transfer-bf-api/pom.xml
  3. 116 0
      api/load-transfer-bf-api/src/main/java/com/hdkj/fhzg/request/WorkOrderRequest.java
  4. 80 0
      api/load-transfer-bf-api/src/main/java/com/hdkj/fhzg/response/WorkOrderResponse.java
  5. 47 0
      api/pom.xml
  6. 19 0
      api/ruoyi-api-system/pom.xml
  7. 75 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteActivityService.java
  8. 41 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteDeptService.java
  9. 30 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteFileService.java
  10. 41 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteLogService.java
  11. 58 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteTodoService.java
  12. 114 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteUserService.java
  13. 293 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDept.java
  14. 177 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictData.java
  15. 97 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictType.java
  16. 50 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysFile.java
  17. 103 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysLogininfor.java
  18. 268 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysOperLog.java
  19. 252 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysRole.java
  20. 354 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java
  21. 46 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteDeptFallbackFactory.java
  22. 35 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteFileFallbackFactory.java
  23. 42 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteLogFallbackFactory.java
  24. 61 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteTodoFallbackFactory.java
  25. 93 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteUserFallbackFactory.java
  26. 151 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/LoginUser.java
  27. 66 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/todo/request/ActivitiRequest.java
  28. 23 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/todo/request/CancelProcessRequest.java
  29. 60 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/todo/request/CreateTodoRequest.java
  30. 23 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/todo/request/OrderBusinessRequest.java
  31. 18 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/todo/request/QueryTaskRequest.java
  32. 21 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/todo/request/TodoTypeRequest.java
  33. 24 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/todo/request/UpdateProcessVarsRequest.java
  34. 81 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/todo/request/UpdateTodoRequest.java
  35. 66 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/todo/response/TodoHistory.java
  36. 21 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/todo/response/TodoInfoResponse.java
  37. 94 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/todo/response/TodoInst.java
  38. 31 0
      api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/todo/response/WorkFlowDTO.java
  39. 14 0
      common/common-core/pom.xml
  40. 5 0
      common/common-core/src/main/java/com/hdkj/fhzg/constant/BusinessConstant.java
  41. 59 0
      common/common-core/src/main/java/com/hdkj/fhzg/constant/CacheConstants.java
  42. 141 0
      common/common-core/src/main/java/com/hdkj/fhzg/constant/Constants.java
  43. 22 0
      common/common-core/src/main/java/com/hdkj/fhzg/constant/ExcelImportError.java
  44. 120 0
      common/common-core/src/main/java/com/hdkj/fhzg/constant/GenConstants.java
  45. 88 0
      common/common-core/src/main/java/com/hdkj/fhzg/constant/RegexPatternConstant.java
  46. 50 0
      common/common-core/src/main/java/com/hdkj/fhzg/constant/ScheduleConstants.java
  47. 54 0
      common/common-core/src/main/java/com/hdkj/fhzg/constant/SecurityConstants.java
  48. 24 0
      common/common-core/src/main/java/com/hdkj/fhzg/constant/ServiceNameConstants.java
  49. 20 0
      common/common-core/src/main/java/com/hdkj/fhzg/constant/TokenConstants.java
  50. 83 0
      common/common-core/src/main/java/com/hdkj/fhzg/constant/UserConstants.java
  51. 22 0
      common/common-core/src/main/java/com/hdkj/fhzg/entity/Page.java
  52. 217 0
      common/common-core/src/main/java/com/hdkj/fhzg/entity/ResultEnum.java
  53. 17 0
      common/common-core/src/main/java/com/hdkj/fhzg/entity/ResultHttpModel.java
  54. 100 0
      common/common-core/src/main/java/com/hdkj/fhzg/entity/ResultModel.java
  55. 28 0
      common/pom.xml
  56. 160 0
      common/ruoyi-common-core/pom.xml
  57. 34 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/annotation/EnumValid.java
  58. 214 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/annotation/Excel.java
  59. 18 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/annotation/Excels.java
  60. 36 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/annotation/RegexValid.java
  61. 32 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/config/ThreadPoolConfig.java
  62. 21 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/config/ThreadPoolProperties.java
  63. 29 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/AutoScoreConstants.java
  64. 13 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/BusinessConstant.java
  65. 59 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/CacheConstants.java
  66. 102 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/Constant.java
  67. 141 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/Constants.java
  68. 22 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/ExcelImportError.java
  69. 120 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/GenConstants.java
  70. 94 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/HttpStatus.java
  71. 24 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/MessageErrorConstant.java
  72. 88 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/RegexPatternConstant.java
  73. 50 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/ScheduleConstants.java
  74. 54 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/SecurityConstants.java
  75. 24 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/ServiceNameConstants.java
  76. 20 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/TokenConstants.java
  77. 83 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/UserConstants.java
  78. 88 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constraints/EnumValidator.java
  79. 57 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constraints/StringContentValidator.java
  80. 99 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/context/SecurityContextHolder.java
  81. 54 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/domain/PaginationParam.java
  82. 102 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/domain/R.java
  83. 32 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/enums/AutoScoreStatusEnum.java
  84. 50 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/enums/BaseValidEnum.java
  85. 36 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/enums/ElementTypeEnum.java
  86. 44 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/enums/GradeTypeEnum.java
  87. 28 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/enums/GroupTypeEnum.java
  88. 28 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/enums/ImportErrorTypeEnum.java
  89. 32 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/enums/InitialEvaluationResultEnum.java
  90. 70 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/enums/ProjectFileEnum.java
  91. 34 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/enums/ScheduleType.java
  92. 41 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/enums/UserStatus.java
  93. 28 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/enums/YesOrNoEnum.java
  94. 16 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/exception/CaptchaException.java
  95. 31 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/exception/CheckedException.java
  96. 16 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/exception/DemoModeException.java
  97. 58 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/exception/GlobalException.java
  98. 16 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/exception/InnerAuthException.java
  99. 16 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/exception/PreAuthorizeException.java
  100. 74 0
      common/ruoyi-common-core/src/main/java/com/hdkj/common/core/exception/ServiceException.java

+ 46 - 0
.gitignore

@@ -0,0 +1,46 @@
+######################################################################
+# Build Tools
+
+.gradle
+/build/
+!gradle/wrapper/gradle-wrapper.jar
+
+target/
+!.mvn/wrapper/maven-wrapper.jar
+
+######################################################################
+# IDE
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### JRebel ###
+rebel.xml
+### NetBeans ###
+nbproject/private/
+build/*
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
+
+######################################################################
+# Others
+*.log
+*.xml.versionsBackup
+*.swp
+
+!*/build/*.java
+!*/build/*.html
+!*/build/*.xml

+ 13 - 0
api/load-transfer-bf-api/pom.xml

@@ -0,0 +1,13 @@
+<?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.hdkj</groupId>
+		<artifactId>api</artifactId>
+		<version>${revision}</version>
+	</parent>
+
+	<artifactId>load-transfer-bf-api</artifactId>
+
+</project>

+ 116 - 0
api/load-transfer-bf-api/src/main/java/com/hdkj/fhzg/request/WorkOrderRequest.java

@@ -0,0 +1,116 @@
+package com.hdkj.fhzg.request;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Author: hyh
+ * @Date: 2025/5/29
+ * @Description:
+ */
+@Data
+public class WorkOrderRequest implements Serializable {
+
+    /**
+     * 用户ID
+     */
+    @ApiModelProperty("用户ID(分页)")
+    private Long userId;
+    /**
+     * 当前页
+     */
+    @ApiModelProperty("当前页(分页)")
+    protected Long current;
+
+    /**
+     * 分页大小
+     */
+    @ApiModelProperty("分页大小(分页)")
+    protected Long size;
+
+    /**
+     * 待办类型
+     * 列表筛选
+     * 0-验收入库, 1-领料出库
+     */
+    @ApiModelProperty("业务;类型(分页、详情)")
+    private Integer businessType;
+    /**
+     * 工厂code
+     */
+    @ApiModelProperty("工厂code(分页)")
+    private String factoryCode;
+    /**
+     * 仓库id
+     */
+    @ApiModelProperty("仓库code(分页)")
+    private String warehouseCode;
+
+    /**
+     * 工厂id
+     */
+    @ApiModelProperty("工厂id(分页)")
+    private String factoryId;
+    /**
+     * 仓库id
+     */
+    @ApiModelProperty("仓库id(分页)")
+    private String warehouseId;
+    /**
+     * 仓库地点ID或者专业仓ID
+     */
+    @ApiModelProperty("仓库地点ID列表")
+    private List<Long> warehouseIdList;
+
+    @ApiModelProperty("单据状态")
+    private String status;
+    /**
+     * 单据编号
+     */
+    @ApiModelProperty("单据编号(分页)")
+    private String orderNo;
+    /**
+     * 项目名称
+     */
+    @ApiModelProperty("项目名称(分页)")
+    private String projectName;
+
+    /**
+     * 开始时间
+     */
+    @ApiModelProperty("开始时间(分页)")
+    private String startTime;
+
+    /**
+     * 结束时间
+     */
+    @ApiModelProperty("结束时间(分页)")
+    private String endTime;
+
+    @ApiModelProperty("业务id(详情)")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long businessId;
+
+    @ApiModelProperty("来源,1、app,2、pc")
+    private Integer origin;
+
+
+    /**
+     * 工厂code
+     */
+    @ApiModelProperty("工厂code")
+    private List<String> factoryCodeList;
+    /**
+     * 仓库code
+     */
+    @ApiModelProperty("仓库code")
+    private List<String> warehouseCodeList;
+
+    @ApiModelProperty("物料来源")
+    private String materialResource;
+}

+ 80 - 0
api/load-transfer-bf-api/src/main/java/com/hdkj/fhzg/response/WorkOrderResponse.java

@@ -0,0 +1,80 @@
+package com.hdkj.fhzg.response;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author: hyh
+ * @Date: 2025/6/2
+ * @Description:
+ */
+@Data
+public class WorkOrderResponse {
+    /**
+     * 业务id
+     */
+    @ApiModelProperty("业务id")
+    private Long businessId;
+    /**
+     * 业务类型
+     */
+    @ApiModelProperty("业务类型")
+    private Integer type;
+    /**
+     * 业务类型
+     */
+    @ApiModelProperty("业务类型")
+    private String businessType;
+    /**
+     * 工厂code
+     */
+    @ApiModelProperty("工厂code")
+    private String factoryCode;
+    /**
+     * 工厂名称
+     */
+    @ApiModelProperty("工厂名称")
+    private String factoryName;
+    /**
+     * 库存code
+     */
+    @ApiModelProperty("库存code")
+    private String warehouseCode;
+    /**
+     * 库存地点
+     */
+    @ApiModelProperty("库存地点")
+    private String warehouseName;
+
+    @ApiModelProperty("库存id")
+    private Long warehouseId;
+    /**
+     * 单据号
+     */
+    @ApiModelProperty("单据号")
+    private String orderNo;
+    /**
+     * 项目名称
+     */
+    @ApiModelProperty("项目名称")
+    private String projectName;
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    private String createTime;
+    /**
+     * 状态
+     */
+    @ApiModelProperty("状态、0、已提交 1、进行中 2、已完成")
+    private Integer status;
+    /**
+     * 预警数
+     */
+    @ApiModelProperty("预警数")
+    private Integer warningCount;
+
+    @ApiModelProperty("物料来源/去向")
+    private String materialResource;
+
+}

+ 47 - 0
api/pom.xml

@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>com.hdkj</groupId>
+        <artifactId>fhzg</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>api</artifactId>
+    <packaging>pom</packaging>
+
+    <modules>
+        <module>ruoyi-api-system</module>
+        <module>load-transfer-bf-api</module>
+<!--        <module>load-transfer-mq-api</module>-->
+<!--        <module>load-transfer-si-api</module>-->
+    </modules>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.hdkj</groupId>
+            <artifactId>common-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.hdkj</groupId>
+            <artifactId>ruoyi-common-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+        </dependency>
+
+    </dependencies>
+
+</project>

+ 19 - 0
api/ruoyi-api-system/pom.xml

@@ -0,0 +1,19 @@
+<?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.hdkj</groupId>
+        <artifactId>api</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>ruoyi-api-system</artifactId>
+
+    <description>ruoyi-api-system系统接口模块</description>
+
+    <dependencies>
+    </dependencies>
+
+</project>

+ 75 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteActivityService.java

@@ -0,0 +1,75 @@
+package com.ruoyi.system.api;
+
+
+import com.hdkj.fhzg.constant.ServiceNameConstants;
+import com.hdkj.fhzg.entity.ResultModel;
+import com.ruoyi.system.api.factory.RemoteUserFallbackFactory;
+import com.ruoyi.system.api.todo.request.ActivitiRequest;
+import com.ruoyi.system.api.todo.request.CancelProcessRequest;
+import com.ruoyi.system.api.todo.request.QueryTaskRequest;
+import com.ruoyi.system.api.todo.request.UpdateProcessVarsRequest;
+import com.ruoyi.system.api.todo.response.WorkFlowDTO;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * 获取待办
+ *
+ */
+@FeignClient(contextId = "remoteActivityService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class)
+public interface RemoteActivityService
+{
+    /**
+     * @return 启动流程
+     */
+    @PostMapping("/processInstance/start-process")
+    ResultModel<WorkFlowDTO> startProcessInstance(@RequestBody ActivitiRequest request);
+
+
+    /**
+     * 作废
+     *
+     * @param
+     * @return
+     */
+    @PostMapping("/processInstance/cancel-process")
+    ResultModel<String> cancelProcessInstance(@RequestBody CancelProcessRequest cancelProcessRequest);
+
+
+    /**
+     * 发起流程并提交
+     *
+     * @param activitiRequest
+     * @return
+     */
+    @PostMapping("/task/start-process-and-complete")
+    ResultModel<WorkFlowDTO> startProcessAndComplete(@RequestBody ActivitiRequest activitiRequest);
+
+    /**
+     * 执行流程
+     *
+     * @param activitiRequest
+     * @return
+     */
+    @PostMapping("/task/complete-task")
+    ResultModel<WorkFlowDTO> completeTask(@RequestBody ActivitiRequest activitiRequest);
+
+    /**
+     * 根据流程实例id或者业务id获取待办任务
+     *
+     * @param queryTaskRequest
+     * @return
+     */
+    @PostMapping("/todo/get-user-task-by-process-instance-or-business")
+    ResultModel<WorkFlowDTO> getUserTaskByProcessInstanceOrBusiness(@RequestBody QueryTaskRequest queryTaskRequest);
+
+    /**
+     * 更新流程变量
+     *
+     * @param request
+     * @return
+     */
+    @PostMapping("/task/update-task-variables")
+    ResultModel<String> updateTaskVariables(@RequestBody UpdateProcessVarsRequest request);
+}

+ 41 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteDeptService.java

@@ -0,0 +1,41 @@
+package com.ruoyi.system.api;
+
+import com.hdkj.fhzg.constant.ServiceNameConstants;
+import com.ruoyi.system.api.domain.SysDept;
+import com.ruoyi.system.api.factory.RemoteDeptFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import java.util.List;
+
+/**
+ * 组织机构服务
+ * 
+ * @author ruoyi
+ */
+@FeignClient(contextId = "remoteDeptService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteDeptFallbackFactory.class)
+public interface RemoteDeptService
+{
+    /**
+     * 组织机构列表
+     * @return 结果
+     */
+    @RequestMapping("/dept/getAllDeptList")
+    List<SysDept> getAllDeptList();
+
+    /**
+     * 组织机构子列表
+     * @return 结果
+     */
+    @RequestMapping("/dept/getSubDeptList/{deptId}")
+    List<SysDept> getSubDeptList(@PathVariable("deptId") Long deptId);
+
+    /**
+     * 更新组织机构的工厂代码
+     * @return 结果
+     */
+    @RequestMapping("/dept/editFactoryCode/{deptId}/{factoryCode}")
+    int editFactoryCode(@PathVariable("deptId") Long deptId, @PathVariable("factoryCode") String factoryCode);
+
+}

+ 30 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteFileService.java

@@ -0,0 +1,30 @@
+package com.ruoyi.system.api;
+
+import com.hdkj.common.core.domain.R;
+import com.hdkj.fhzg.constant.ServiceNameConstants;
+import com.ruoyi.system.api.domain.SysFile;
+import com.ruoyi.system.api.factory.RemoteFileFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.multipart.MultipartFile;
+
+
+/**
+ * 文件服务
+ * 
+ * @author ruoyi
+ */
+@FeignClient(contextId = "remoteFileService", value = ServiceNameConstants.FILE_SERVICE, fallbackFactory = RemoteFileFallbackFactory.class)
+public interface RemoteFileService
+{
+    /**
+     * 上传文件
+     *
+     * @param file 文件信息
+     * @return 结果
+     */
+    @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public R<SysFile> upload(@RequestPart(value = "file") MultipartFile file);
+}

+ 41 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteLogService.java

@@ -0,0 +1,41 @@
+package com.ruoyi.system.api;
+
+import com.ruoyi.system.api.domain.SysLogininfor;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
+import com.hdkj.common.core.constant.SecurityConstants;
+import com.hdkj.common.core.constant.ServiceNameConstants;
+import com.hdkj.common.core.domain.R;
+import com.ruoyi.system.api.domain.SysOperLog;
+import com.ruoyi.system.api.factory.RemoteLogFallbackFactory;
+
+/**
+ * 日志服务
+ * 
+ * @author ruoyi
+ */
+@FeignClient(contextId = "remoteLogService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteLogFallbackFactory.class)
+public interface RemoteLogService
+{
+    /**
+     * 保存系统日志
+     *
+     * @param sysOperLog 日志实体
+     * @param source 请求来源
+     * @return 结果
+     */
+    @PostMapping("/operlog")
+    public R<Boolean> saveLog(@RequestBody SysOperLog sysOperLog, @RequestHeader(SecurityConstants.FROM_SOURCE) String source) throws Exception;
+
+    /**
+     * 保存访问记录
+     *
+     * @param sysLogininfor 访问实体
+     * @param source 请求来源
+     * @return 结果
+     */
+    @PostMapping("/logininfor")
+    public R<Boolean> saveLogininfor(@RequestBody SysLogininfor sysLogininfor, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+}

+ 58 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteTodoService.java

@@ -0,0 +1,58 @@
+package com.ruoyi.system.api;
+
+import com.hdkj.common.core.constant.ServiceNameConstants;
+import com.hdkj.fhzg.entity.ResultModel;
+import com.ruoyi.system.api.factory.RemoteTodoFallbackFactory;
+import com.ruoyi.system.api.todo.request.CreateTodoRequest;
+import com.ruoyi.system.api.todo.request.OrderBusinessRequest;
+import com.ruoyi.system.api.todo.request.TodoTypeRequest;
+import com.ruoyi.system.api.todo.request.UpdateTodoRequest;
+import com.ruoyi.system.api.todo.response.TodoInfoResponse;
+import com.ruoyi.system.api.todo.response.TodoInst;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+
+/**
+ * 获取待办
+ *
+ */
+@FeignClient(contextId = "remoteTodoService",path = "/warehouse-order-todo", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteTodoFallbackFactory.class)
+public interface RemoteTodoService
+{
+    /**
+     * @param request
+     * @return 新增待办
+     */
+    @PostMapping("/create-todo")
+    ResultModel<Boolean> addTodo(@RequestBody CreateTodoRequest request);
+
+
+    /**
+     * @param request 用户ID
+     * @return 更新待办
+     */
+    @PostMapping("/update-todo")
+    ResultModel<Boolean> updateTodo(@RequestBody UpdateTodoRequest request);
+
+
+    @PostMapping("/find-todo-by-businessId")
+    ResultModel<TodoInfoResponse> findTodoByBusinessId(@RequestBody TodoTypeRequest request);
+    /**
+     * 根据业务id 待办类型获取待办列表
+     * @param request
+     * @return
+     */
+    @PostMapping("/get-todo-list-by-business")
+    ResultModel<List<TodoInst>> getTodoListByBusinessIds(@RequestBody OrderBusinessRequest request);
+
+    /**
+     * 根据业务id 待办类型获取待办列表
+     * @param request
+     * @return
+     */
+    @PostMapping("/get-todo-list-by-business2")
+    ResultModel<List<TodoInst>> getTodoListByBusinessIds2(@RequestBody OrderBusinessRequest request);
+}

+ 114 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteUserService.java

@@ -0,0 +1,114 @@
+package com.ruoyi.system.api;
+
+import com.ruoyi.system.api.domain.SysDept;
+import com.ruoyi.system.api.domain.SysUser;
+import com.ruoyi.system.api.factory.RemoteUserFallbackFactory;
+import com.ruoyi.system.api.model.LoginUser;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
+import com.hdkj.common.core.constant.SecurityConstants;
+import com.hdkj.common.core.constant.ServiceNameConstants;
+import com.hdkj.common.core.domain.R;
+
+import java.util.List;
+
+/**
+ * 用户服务
+ * 
+ * @author ruoyi
+ */
+@FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class)
+public interface RemoteUserService
+{
+    /**
+     * 通过用户名查询用户信息
+     *
+     * @param username 用户名
+     * @param source 请求来源
+     * @return 结果
+     */
+    @GetMapping("/user/info/{username}")
+    public R<LoginUser> getUserInfo(@PathVariable("username") String username, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+    /**
+     * 注册用户信息
+     *
+     * @param sysUser 用户信息
+     * @param source 请求来源
+     * @return 结果
+     */
+    @PostMapping("/user/register")
+    public R<Boolean> registerUserInfo(@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+    /**
+     * 记录用户登录IP地址和登录时间
+     *
+     * @param sysUser 用户信息
+     * @param source 请求来源
+     * @return 结果
+     */
+    @PutMapping("/user/recordlogin")
+    public R<Boolean> recordUserLogin(@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+
+    /**
+     * 通过用户名查询用户信息
+     *
+     * @param parentId 父级id
+     * @return 结果
+     */
+    @GetMapping("/dept/listByParentId/{id}")
+    public List<SysDept> listByParentId(@PathVariable("id") Long parentId);
+
+
+    /**
+     * 通过用户名查询用户信息
+     *
+     * @param userId 父级id
+     * @return 结果
+     */
+    @GetMapping("/dept/listByUserId/{id}")
+    public List<SysDept> listByUserId(@PathVariable("id") Long userId);
+    /**
+     * 根据用户id获取用户信息
+     *
+     * @param userIds 用户id
+     * @return 结果
+     */
+    @PostMapping("/user/getUserInfo")
+    public R<List<SysUser>> getUserInfo(@RequestBody List<Long> userIds);
+
+    /**
+     * 根据用户id获取用户信息
+     *
+     * @param userIds 用户id
+     * @return 结果
+     */
+    @PostMapping("/user/getUserInfoNoAuth")
+    public R<List<SysUser>> getUserInfoNoAuth(@RequestBody List<Long> userIds);
+
+
+    /**
+     * 根据用户id获取用户信息
+     *
+     * @param userIds 用户id
+     * @return 结果
+     */
+    @PostMapping("/user/getUserInfoOut")
+    public R<List<SysUser>> getUserInfoOut(@RequestBody List<Long> userIds);
+
+
+    @GetMapping("/dept/listByCode/{deptCode}")
+    public List<SysDept> listByCode(@PathVariable("deptCode") String deptCode);
+
+    @PostMapping("/dept/listByCodes")
+    List<SysDept> listByCodes(@RequestBody List<String> deptCodes);
+
+    @PostMapping("/dept/getCityDeptByCodes")
+    List<SysDept> getCityDeptByCodes(@RequestBody List<String> factoryCodes);
+}

+ 293 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDept.java

@@ -0,0 +1,293 @@
+package com.ruoyi.system.api.domain;
+
+import com.hdkj.common.core.web.domain.BaseEntity;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 部门表 sys_dept
+ * 
+ * @author ruoyi
+ */
+@Data
+public class SysDept extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /** 部门ID */
+    private Long deptId;
+
+    /** 父部门ID */
+    private Long parentId;
+
+    /** 祖级列表 */
+    private String ancestors;
+
+    /** 部门名称 */
+    private String deptName;
+
+    /** 显示顺序 */
+    private Integer orderNum;
+
+    /** 负责人 */
+    private String leader;
+
+    /** 联系电话 */
+    private String phone;
+
+    /** 邮箱 */
+    private String email;
+
+    /** 部门状态:0正常,1停用 */
+    private String status;
+
+    /** 删除标志(0代表存在 2代表删除) */
+    private String delFlag;
+
+    /** 父部门名称 */
+    private String parentName;
+    /** 仓数量 **/
+    private Integer specialCount;
+    /** 库数量 **/
+    private Integer terminalCount;
+    /** 工厂编码 */
+    private String factoryCode;
+
+    private List<String> factoryCodeList;
+    public Long getFactoryId() {
+        return factoryId;
+    }
+
+    public void setFactoryId(Long factoryId) {
+        this.factoryId = factoryId;
+    }
+
+    /** 工厂ID */
+    private Long factoryId;
+
+    /** 工厂名称 */
+    private String shortName;
+    private String factoryName;
+    private String deptLv;
+    private String deptLvName;
+    private String deptCode;
+    /** 子部门 */
+    private List<SysDept> children = new ArrayList<SysDept>();
+
+    public String getShortName() {
+        return shortName;
+    }
+
+    public void setShortName(String shortName) {
+        this.shortName = shortName;
+    }
+
+    public Long getDeptId()
+    {
+        return deptId;
+    }
+
+    public void setDeptId(Long deptId)
+    {
+        this.deptId = deptId;
+    }
+
+    public Long getParentId()
+    {
+        return parentId;
+    }
+
+    public void setParentId(Long parentId)
+    {
+        this.parentId = parentId;
+    }
+
+    public String getAncestors()
+    {
+        return ancestors;
+    }
+
+    public void setAncestors(String ancestors)
+    {
+        this.ancestors = ancestors;
+    }
+
+    @NotBlank(message = "部门名称不能为空")
+    @Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符")
+    public String getDeptName()
+    {
+        return deptName;
+    }
+
+    public void setDeptName(String deptName)
+    {
+        this.deptName = deptName;
+    }
+
+    @NotNull(message = "显示顺序不能为空")
+    public Integer getOrderNum()
+    {
+        return orderNum;
+    }
+
+    public void setOrderNum(Integer orderNum)
+    {
+        this.orderNum = orderNum;
+    }
+
+    public String getLeader()
+    {
+        return leader;
+    }
+
+    public void setLeader(String leader)
+    {
+        this.leader = leader;
+    }
+
+    @Size(min = 0, max = 11, message = "联系电话长度不能超过11个字符")
+    public String getPhone()
+    {
+        return phone;
+    }
+
+    public void setPhone(String phone)
+    {
+        this.phone = phone;
+    }
+
+    @Email(message = "邮箱格式不正确")
+    @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
+    public String getEmail()
+    {
+        return email;
+    }
+
+    public void setEmail(String email)
+    {
+        this.email = email;
+    }
+
+    public String getStatus()
+    {
+        return status;
+    }
+
+    public void setStatus(String status)
+    {
+        this.status = status;
+    }
+
+    public String getDelFlag()
+    {
+        return delFlag;
+    }
+
+    public void setDelFlag(String delFlag)
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getParentName()
+    {
+        return parentName;
+    }
+
+    public void setParentName(String parentName)
+    {
+        this.parentName = parentName;
+    }
+
+    public List<SysDept> getChildren()
+    {
+        return children;
+    }
+
+    public void setChildren(List<SysDept> children)
+    {
+        this.children = children;
+    }
+
+    public Integer getSpecialCount() {
+        return specialCount;
+    }
+
+    public void setSpecialCount(Integer specialCount) {
+        this.specialCount = specialCount;
+    }
+
+    public Integer getTerminalCount() {
+        return terminalCount;
+    }
+
+    public void setTerminalCount(Integer terminalCount) {
+        this.terminalCount = terminalCount;
+    }
+
+    public String getFactoryCode() {
+        return factoryCode;
+    }
+
+    public void setFactoryCode(String factoryCode) {
+        this.factoryCode = factoryCode;
+    }
+
+    public String getFactoryName() {
+        return factoryName;
+    }
+
+    public void setFactoryName(String factoryName) {
+        this.factoryName = factoryName;
+    }
+
+    public String getDeptLv() {
+        return deptLv;
+    }
+
+    public void setDeptLv(String deptLv) {
+        this.deptLv = deptLv;
+    }
+
+    public String getDeptLvName() {
+        return deptLvName;
+    }
+
+    public void setDeptLvName(String deptLvName) {
+        this.deptLvName = deptLvName;
+    }
+
+    public String getDeptCode() {
+        return deptCode;
+    }
+
+    public void setDeptCode(String deptCode) {
+        this.deptCode = deptCode;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("deptId", getDeptId())
+            .append("parentId", getParentId())
+            .append("ancestors", getAncestors())
+            .append("deptName", getDeptName())
+            .append("orderNum", getOrderNum())
+            .append("leader", getLeader())
+            .append("phone", getPhone())
+            .append("email", getEmail())
+            .append("status", getStatus())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .toString();
+    }
+}

+ 177 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictData.java

@@ -0,0 +1,177 @@
+package com.ruoyi.system.api.domain;
+
+import com.hdkj.common.core.annotation.Excel;
+import com.hdkj.common.core.annotation.Excel.ColumnType;
+import com.hdkj.common.core.constant.UserConstants;
+import com.hdkj.common.core.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+
+/**
+ * 字典数据表 sys_dict_data
+ * 
+ * @author ruoyi
+ */
+public class SysDictData extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 字典编码 */
+    @Excel(name = "字典编码", cellType = ColumnType.NUMERIC)
+    private Long dictCode;
+
+    /** 字典排序 */
+    @Excel(name = "字典排序", cellType = ColumnType.NUMERIC)
+    private Long dictSort;
+
+    /** 字典标签 */
+    @Excel(name = "字典标签")
+    private String dictLabel;
+
+    /** 字典键值 */
+    @Excel(name = "字典键值")
+    private String dictValue;
+
+    /** 字典类型 */
+    @Excel(name = "字典类型")
+    private String dictType;
+
+    /** 样式属性(其他样式扩展) */
+    private String cssClass;
+
+    /** 表格字典样式 */
+    private String listClass;
+
+    /** 是否默认(Y是 N否) */
+    @Excel(name = "是否默认", readConverterExp = "Y=是,N=否")
+    private String isDefault;
+
+    /** 状态(0正常 1停用) */
+    @Excel(name = "状态", readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    public Long getDictCode()
+    {
+        return dictCode;
+    }
+
+    public void setDictCode(Long dictCode)
+    {
+        this.dictCode = dictCode;
+    }
+
+    public Long getDictSort()
+    {
+        return dictSort;
+    }
+
+    public void setDictSort(Long dictSort)
+    {
+        this.dictSort = dictSort;
+    }
+
+    @NotBlank(message = "字典标签不能为空")
+    @Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符")
+    public String getDictLabel()
+    {
+        return dictLabel;
+    }
+
+    public void setDictLabel(String dictLabel)
+    {
+        this.dictLabel = dictLabel;
+    }
+
+    @NotBlank(message = "字典键值不能为空")
+    @Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符")
+    public String getDictValue()
+    {
+        return dictValue;
+    }
+
+    public void setDictValue(String dictValue)
+    {
+        this.dictValue = dictValue;
+    }
+
+    @NotBlank(message = "字典类型不能为空")
+    @Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符")
+    public String getDictType()
+    {
+        return dictType;
+    }
+
+    public void setDictType(String dictType)
+    {
+        this.dictType = dictType;
+    }
+
+    @Size(min = 0, max = 100, message = "样式属性长度不能超过100个字符")
+    public String getCssClass()
+    {
+        return cssClass;
+    }
+
+    public void setCssClass(String cssClass)
+    {
+        this.cssClass = cssClass;
+    }
+
+    public String getListClass()
+    {
+        return listClass;
+    }
+
+    public void setListClass(String listClass)
+    {
+        this.listClass = listClass;
+    }
+
+    public boolean getDefault()
+    {
+        return UserConstants.YES.equals(this.isDefault);
+    }
+
+    public String getIsDefault()
+    {
+        return isDefault;
+    }
+
+    public void setIsDefault(String isDefault)
+    {
+        this.isDefault = isDefault;
+    }
+
+    public String getStatus()
+    {
+        return status;
+    }
+
+    public void setStatus(String status)
+    {
+        this.status = status;
+    }
+    
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("dictCode", getDictCode())
+            .append("dictSort", getDictSort())
+            .append("dictLabel", getDictLabel())
+            .append("dictValue", getDictValue())
+            .append("dictType", getDictType())
+            .append("cssClass", getCssClass())
+            .append("listClass", getListClass())
+            .append("isDefault", getIsDefault())
+            .append("status", getStatus())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 97 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictType.java

@@ -0,0 +1,97 @@
+package com.ruoyi.system.api.domain;
+
+import com.hdkj.common.core.annotation.Excel;
+import com.hdkj.common.core.annotation.Excel.ColumnType;
+import com.hdkj.common.core.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
+
+/**
+ * 字典类型表 sys_dict_type
+ * 
+ * @author ruoyi
+ */
+public class SysDictType extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 字典主键 */
+    @Excel(name = "字典主键", cellType = ColumnType.NUMERIC)
+    private Long dictId;
+
+    /** 字典名称 */
+    @Excel(name = "字典名称")
+    private String dictName;
+
+    /** 字典类型 */
+    @Excel(name = "字典类型")
+    private String dictType;
+
+    /** 状态(0正常 1停用) */
+    @Excel(name = "状态", readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    public Long getDictId()
+    {
+        return dictId;
+    }
+
+    public void setDictId(Long dictId)
+    {
+        this.dictId = dictId;
+    }
+
+    @NotBlank(message = "字典名称不能为空")
+    @Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符")
+    public String getDictName()
+    {
+        return dictName;
+    }
+
+    public void setDictName(String dictName)
+    {
+        this.dictName = dictName;
+    }
+
+    @NotBlank(message = "字典类型不能为空")
+    @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符")
+    @Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)")
+    public String getDictType()
+    {
+        return dictType;
+    }
+
+    public void setDictType(String dictType)
+    {
+        this.dictType = dictType;
+    }
+
+    public String getStatus()
+    {
+        return status;
+    }
+
+    public void setStatus(String status)
+    {
+        this.status = status;
+    }
+    
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("dictId", getDictId())
+            .append("dictName", getDictName())
+            .append("dictType", getDictType())
+            .append("status", getStatus())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 50 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysFile.java

@@ -0,0 +1,50 @@
+package com.ruoyi.system.api.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 文件信息
+ * 
+ * @author ruoyi
+ */
+public class SysFile
+{
+    /**
+     * 文件名称
+     */
+    private String name;
+
+    /**
+     * 文件地址
+     */
+    private String url;
+
+    public String getName()
+    {
+        return name;
+    }
+
+    public void setName(String name)
+    {
+        this.name = name;
+    }
+
+    public String getUrl()
+    {
+        return url;
+    }
+
+    public void setUrl(String url)
+    {
+        this.url = url;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("name", getName())
+            .append("url", getUrl())
+            .toString();
+    }
+}

+ 103 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysLogininfor.java

@@ -0,0 +1,103 @@
+package com.ruoyi.system.api.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.hdkj.common.core.annotation.Excel;
+import com.hdkj.common.core.annotation.Excel.ColumnType;
+import com.hdkj.common.core.web.domain.BaseEntity;
+
+import java.util.Date;
+
+/**
+ * 系统访问记录表 sys_logininfor
+ * 
+ * @author ruoyi
+ */
+public class SysLogininfor extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** ID */
+    @Excel(name = "序号", cellType = ColumnType.NUMERIC)
+    private Long infoId;
+
+    /** 用户账号 */
+    @Excel(name = "用户账号")
+    private String userName;
+
+    /** 状态 0成功 1失败 */
+    @Excel(name = "状态", readConverterExp = "0=成功,1=失败")
+    private String status;
+
+    /** 地址 */
+    @Excel(name = "地址")
+    private String ipaddr;
+
+    /** 描述 */
+    @Excel(name = "描述")
+    private String msg;
+
+    /** 访问时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "访问时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date accessTime;
+
+    public Long getInfoId()
+    {
+        return infoId;
+    }
+
+    public void setInfoId(Long infoId)
+    {
+        this.infoId = infoId;
+    }
+
+    public String getUserName()
+    {
+        return userName;
+    }
+
+    public void setUserName(String userName)
+    {
+        this.userName = userName;
+    }
+
+    public String getStatus()
+    {
+        return status;
+    }
+
+    public void setStatus(String status)
+    {
+        this.status = status;
+    }
+
+    public String getIpaddr()
+    {
+        return ipaddr;
+    }
+
+    public void setIpaddr(String ipaddr)
+    {
+        this.ipaddr = ipaddr;
+    }
+
+    public String getMsg()
+    {
+        return msg;
+    }
+
+    public void setMsg(String msg)
+    {
+        this.msg = msg;
+    }
+
+    public Date getAccessTime()
+    {
+        return accessTime;
+    }
+
+    public void setAccessTime(Date accessTime)
+    {
+        this.accessTime = accessTime;
+    }
+}

+ 268 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysOperLog.java

@@ -0,0 +1,268 @@
+package com.ruoyi.system.api.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.hdkj.common.core.annotation.Excel;
+import com.hdkj.common.core.annotation.Excel.ColumnType;
+import com.hdkj.common.core.web.domain.BaseEntity;
+
+import java.util.Date;
+
+/**
+ * 操作日志记录表 oper_log
+ * 
+ * @author ruoyi
+ */
+public class SysOperLog extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 日志主键 */
+    @Excel(name = "操作序号", cellType = ColumnType.NUMERIC)
+    private Long operId;
+
+    /** 操作模块 */
+    @Excel(name = "操作模块")
+    private String title;
+
+    /** 业务类型(0其它 1新增 2修改 3删除) */
+    @Excel(name = "业务类型", readConverterExp = "0=其它,1=新增,2=修改,3=删除,4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据")
+    private Integer businessType;
+
+    /** 业务类型数组 */
+    private Integer[] businessTypes;
+
+    /** 请求方法 */
+    @Excel(name = "请求方法")
+    private String method;
+
+    /** 请求方式 */
+    @Excel(name = "请求方式")
+    private String requestMethod;
+
+    /** 操作类别(0其它 1后台用户 2手机端用户) */
+    @Excel(name = "操作类别", readConverterExp = "0=其它,1=后台用户,2=手机端用户")
+    private Integer operatorType;
+
+    /** 操作人员 */
+    @Excel(name = "操作人员")
+    private String operName;
+
+    /** 部门名称 */
+    @Excel(name = "部门名称")
+    private String deptName;
+
+    /** 请求url */
+    @Excel(name = "请求地址")
+    private String operUrl;
+
+    /** 操作地址 */
+    @Excel(name = "操作地址")
+    private String operIp;
+
+    /** 请求参数 */
+    @Excel(name = "请求参数")
+    private String operParam;
+
+    /** 返回参数 */
+    @Excel(name = "返回参数")
+    private String jsonResult;
+
+    /** 返回参数 */
+    @Excel(name = "严重等级")
+    private Integer level;
+
+    /** 操作状态(0正常 1异常) */
+    @Excel(name = "状态", readConverterExp = "0=正常,1=异常")
+    private Integer status;
+
+    /** 错误消息 */
+    @Excel(name = "错误消息")
+    private String errorMsg;
+
+    /** 操作时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date operTime;
+
+    /** 消耗时间 */
+    @Excel(name = "消耗时间", suffix = "毫秒")
+    private Long costTime;
+
+    public Long getOperId()
+    {
+        return operId;
+    }
+
+    public void setOperId(Long operId)
+    {
+        this.operId = operId;
+    }
+
+    public String getTitle()
+    {
+        return title;
+    }
+
+    public void setTitle(String title)
+    {
+        this.title = title;
+    }
+
+    public Integer getBusinessType()
+    {
+        return businessType;
+    }
+
+    public void setBusinessType(Integer businessType)
+    {
+        this.businessType = businessType;
+    }
+
+    public Integer[] getBusinessTypes()
+    {
+        return businessTypes;
+    }
+
+    public void setBusinessTypes(Integer[] businessTypes)
+    {
+        this.businessTypes = businessTypes;
+    }
+
+    public String getMethod()
+    {
+        return method;
+    }
+
+    public void setMethod(String method)
+    {
+        this.method = method;
+    }
+
+    public String getRequestMethod()
+    {
+        return requestMethod;
+    }
+
+    public void setRequestMethod(String requestMethod)
+    {
+        this.requestMethod = requestMethod;
+    }
+
+    public Integer getOperatorType()
+    {
+        return operatorType;
+    }
+
+    public void setOperatorType(Integer operatorType)
+    {
+        this.operatorType = operatorType;
+    }
+
+    public String getOperName()
+    {
+        return operName;
+    }
+
+    public void setOperName(String operName)
+    {
+        this.operName = operName;
+    }
+
+    public String getDeptName()
+    {
+        return deptName;
+    }
+
+    public void setDeptName(String deptName)
+    {
+        this.deptName = deptName;
+    }
+
+    public String getOperUrl()
+    {
+        return operUrl;
+    }
+
+    public void setOperUrl(String operUrl)
+    {
+        this.operUrl = operUrl;
+    }
+
+    public String getOperIp()
+    {
+        return operIp;
+    }
+
+    public void setOperIp(String operIp)
+    {
+        this.operIp = operIp;
+    }
+
+    public String getOperParam()
+    {
+        return operParam;
+    }
+
+    public void setOperParam(String operParam)
+    {
+        this.operParam = operParam;
+    }
+
+    public String getJsonResult()
+    {
+        return jsonResult;
+    }
+
+    public void setJsonResult(String jsonResult)
+    {
+        this.jsonResult = jsonResult;
+    }
+
+    public Integer getStatus()
+    {
+        return status;
+    }
+
+    public void setStatus(Integer status)
+    {
+        this.status = status;
+    }
+
+    public String getErrorMsg()
+    {
+        return errorMsg;
+    }
+
+    public void setErrorMsg(String errorMsg)
+    {
+        this.errorMsg = errorMsg;
+    }
+
+    public Date getOperTime()
+    {
+        return operTime;
+    }
+
+    public void setOperTime(Date operTime)
+    {
+        this.operTime = operTime;
+    }
+
+    public Long getCostTime()
+    {
+        return costTime;
+    }
+
+    public void setCostTime(Long costTime)
+    {
+        this.costTime = costTime;
+    }
+
+    public Integer getLevel() {
+        return level;
+    }
+
+    public void setLevel(Integer level) {
+        this.level = level;
+    }
+}

+ 252 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysRole.java

@@ -0,0 +1,252 @@
+package com.ruoyi.system.api.domain;
+
+import com.hdkj.common.core.annotation.Excel;
+import com.hdkj.common.core.annotation.Excel.ColumnType;
+import com.hdkj.common.core.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.util.Set;
+
+/**
+ * 角色表 sys_role
+ * 
+ * @author ruoyi
+ */
+public class SysRole extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 角色ID */
+    @Excel(name = "角色序号", cellType = ColumnType.NUMERIC)
+    private Long roleId;
+
+    /** 角色名称 */
+    @Excel(name = "角色名称")
+    private String roleName;
+
+    /** 角色权限 */
+    @Excel(name = "角色权限")
+    private String roleKey;
+
+    /** 角色排序 */
+    @Excel(name = "角色排序")
+    private Integer roleSort;
+
+    /** 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) */
+    @Excel(name = "数据范围", readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限")
+    private String dataScope;
+
+    /** 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) */
+    private boolean menuCheckStrictly;
+
+    /** 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 ) */
+    private boolean deptCheckStrictly;
+
+    /** 角色状态(0正常 1停用) */
+    @Excel(name = "角色状态", readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /** 删除标志(0代表存在 2代表删除) */
+    private String delFlag;
+
+    /** 用户是否存在此角色标识 默认不存在 */
+    private boolean flag = false;
+
+    /** 菜单组 */
+    private Long[] menuIds;
+
+    /** 部门组(数据权限) */
+    private Long[] deptIds;
+    /** 是否独占 0: 独占 1: 共享  */
+    private String singleRole;
+
+    /** 角色菜单权限 */
+    private Set<String> permissions;
+
+    public SysRole()
+    {
+
+    }
+
+    public String getSingleRole() {
+        return singleRole;
+    }
+
+    public void setSingleRole(String singleRole) {
+        this.singleRole = singleRole;
+    }
+
+    public SysRole(Long roleId)
+    {
+        this.roleId = roleId;
+    }
+
+    public Long getRoleId()
+    {
+        return roleId;
+    }
+
+    public void setRoleId(Long roleId)
+    {
+        this.roleId = roleId;
+    }
+
+    public boolean isAdmin()
+    {
+        return isAdmin(this.roleId);
+    }
+
+    public static boolean isAdmin(Long roleId)
+    {
+        return roleId != null && 1L == roleId;
+    }
+
+    @NotBlank(message = "角色名称不能为空")
+    @Size(min = 0, max = 30, message = "角色名称长度不能超过30个字符")
+    public String getRoleName()
+    {
+        return roleName;
+    }
+
+    public void setRoleName(String roleName)
+    {
+        this.roleName = roleName;
+    }
+
+    @NotBlank(message = "权限字符不能为空")
+    @Size(min = 0, max = 100, message = "权限字符长度不能超过100个字符")
+    public String getRoleKey()
+    {
+        return roleKey;
+    }
+
+    public void setRoleKey(String roleKey)
+    {
+        this.roleKey = roleKey;
+    }
+
+    @NotNull(message = "显示顺序不能为空")
+    public Integer getRoleSort()
+    {
+        return roleSort;
+    }
+
+    public void setRoleSort(Integer roleSort)
+    {
+        this.roleSort = roleSort;
+    }
+
+    public String getDataScope()
+    {
+        return dataScope;
+    }
+
+    public void setDataScope(String dataScope)
+    {
+        this.dataScope = dataScope;
+    }
+
+    public boolean isMenuCheckStrictly()
+    {
+        return menuCheckStrictly;
+    }
+
+    public void setMenuCheckStrictly(boolean menuCheckStrictly)
+    {
+        this.menuCheckStrictly = menuCheckStrictly;
+    }
+
+    public boolean isDeptCheckStrictly()
+    {
+        return deptCheckStrictly;
+    }
+
+    public void setDeptCheckStrictly(boolean deptCheckStrictly)
+    {
+        this.deptCheckStrictly = deptCheckStrictly;
+    }
+
+    public String getStatus()
+    {
+        return status;
+    }
+
+    public void setStatus(String status)
+    {
+        this.status = status;
+    }
+
+    public String getDelFlag()
+    {
+        return delFlag;
+    }
+
+    public void setDelFlag(String delFlag)
+    {
+        this.delFlag = delFlag;
+    }
+
+    public boolean isFlag()
+    {
+        return flag;
+    }
+
+    public void setFlag(boolean flag)
+    {
+        this.flag = flag;
+    }
+
+    public Long[] getMenuIds()
+    {
+        return menuIds;
+    }
+
+    public void setMenuIds(Long[] menuIds)
+    {
+        this.menuIds = menuIds;
+    }
+
+    public Long[] getDeptIds()
+    {
+        return deptIds;
+    }
+
+    public void setDeptIds(Long[] deptIds)
+    {
+        this.deptIds = deptIds;
+    }
+
+    public Set<String> getPermissions()
+    {
+        return permissions;
+    }
+
+    public void setPermissions(Set<String> permissions)
+    {
+        this.permissions = permissions;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("roleId", getRoleId())
+            .append("roleName", getRoleName())
+            .append("roleKey", getRoleKey())
+            .append("roleSort", getRoleSort())
+            .append("dataScope", getDataScope())
+            .append("menuCheckStrictly", isMenuCheckStrictly())
+            .append("deptCheckStrictly", isDeptCheckStrictly())
+            .append("status", getStatus())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 354 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java

@@ -0,0 +1,354 @@
+package com.ruoyi.system.api.domain;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.hdkj.common.core.annotation.Excel;
+import com.hdkj.common.core.annotation.Excel.ColumnType;
+import com.hdkj.common.core.annotation.Excel.Type;
+import com.hdkj.common.core.annotation.Excels;
+import com.hdkj.common.core.web.domain.BaseEntity;
+import com.hdkj.common.core.xss.Xss;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+import java.util.List;
+/**
+ * 用户对象 sys_user
+ * 
+ * @author ruoyi
+ */
+@Data
+public class SysUser extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 用户ID */
+    @Excel(name = "用户序号", type = Type.EXPORT, cellType = ColumnType.NUMERIC, prompt = "用户编号")
+    private Long userId;
+
+    /** 部门ID */
+    @Excel(name = "部门编号", type = Type.IMPORT)
+    private Long deptId;
+
+    /** 用户账号 */
+    @Excel(name = "登录名称")
+    private String userName;
+
+    /** 用户昵称 */
+    @Excel(name = "用户名称")
+    private String nickName;
+
+    /** 用户邮箱 */
+    @Excel(name = "用户邮箱")
+    private String email;
+
+    /** 手机号码 */
+    @Excel(name = "手机号码", cellType = ColumnType.TEXT)
+    private String phonenumber;
+
+    /** 用户性别 */
+    @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知")
+    private String sex;
+
+    /** 用户头像 */
+    private String avatar;
+
+    /** 密码 */
+    private String password;
+
+    /** 帐号状态(0正常 1停用) */
+    @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /** 删除标志(0代表存在 2代表删除) */
+    private String delFlag;
+
+    /**
+     * 供应商生成的id
+     */
+    @ApiModelProperty(value = "供应商生成的id")
+    private Long supplierId;
+
+
+    /**
+     * 联系人
+     */
+    @ApiModelProperty(value = "联系人")
+    private String person;
+
+
+    /**
+     * uk唯一标识
+     */
+    @ApiModelProperty(value = "uk唯一标识")
+    private String subjectId;
+
+    /**
+     * 父级Id
+     */
+    @ApiModelProperty(value = "父级Id")
+    private String  parentUserId;
+
+    /** 最后登录IP */
+    @Excel(name = "最后登录IP", type = Type.EXPORT)
+    private String loginIp;
+
+
+    /** 部门对象 */
+    @Excels({
+        @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT),
+        @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT)
+    })
+    private SysDept dept;
+
+    /** 角色对象 */
+    private List<SysRole> roles;
+
+    /** 角色组 */
+    private Long[] roleIds;
+
+    /** 岗位组 */
+    private Long[] postIds;
+
+    /** 角色ID */
+    private Long roleId;
+
+    /**
+     * 招标代理机构
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long tenderAgentOrgan;
+
+    public SysUser()
+    {
+
+    }
+
+    public SysUser(Long userId)
+    {
+        this.userId = userId;
+    }
+
+    public Long getUserId()
+    {
+        return userId;
+    }
+
+    public void setUserId(Long userId)
+    {
+        this.userId = userId;
+    }
+
+    public boolean isAdmin()
+    {
+        return isAdmin(this.userId);
+    }
+
+    public static boolean isAdmin(Long userId)
+    {
+        return userId != null && 1L == userId;
+    }
+
+    public Long getDeptId()
+    {
+        return deptId;
+    }
+
+    public void setDeptId(Long deptId)
+    {
+        this.deptId = deptId;
+    }
+
+    @Xss(message = "用户昵称不能包含脚本字符")
+    @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
+    public String getNickName()
+    {
+        return nickName;
+    }
+
+    public void setNickName(String nickName)
+    {
+        this.nickName = nickName;
+    }
+
+    @Xss(message = "用户账号不能包含脚本字符")
+    @NotBlank(message = "用户账号不能为空")
+    @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")
+    public String getUserName()
+    {
+        return userName;
+    }
+
+    public void setUserName(String userName)
+    {
+        this.userName = userName;
+    }
+
+    @Email(message = "邮箱格式不正确")
+    @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
+    public String getEmail()
+    {
+        return email;
+    }
+
+    public void setEmail(String email)
+    {
+        this.email = email;
+    }
+
+    @Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符")
+    public String getPhonenumber()
+    {
+        return phonenumber;
+    }
+
+    public void setPhonenumber(String phonenumber)
+    {
+        this.phonenumber = phonenumber;
+    }
+
+    public String getSex()
+    {
+        return sex;
+    }
+
+    public void setSex(String sex)
+    {
+        this.sex = sex;
+    }
+
+    public String getAvatar()
+    {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar)
+    {
+        this.avatar = avatar;
+    }
+
+    public String getPassword()
+    {
+        return password;
+    }
+
+    public void setPassword(String password)
+    {
+        this.password = password;
+    }
+
+    public String getStatus()
+    {
+        return status;
+    }
+
+    public void setStatus(String status)
+    {
+        this.status = status;
+    }
+
+    public String getDelFlag()
+    {
+        return delFlag;
+    }
+
+    public void setDelFlag(String delFlag)
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getLoginIp()
+    {
+        return loginIp;
+    }
+
+    public void setLoginIp(String loginIp)
+    {
+        this.loginIp = loginIp;
+    }
+
+
+    public SysDept getDept()
+    {
+        return dept;
+    }
+
+    public void setDept(SysDept dept)
+    {
+        this.dept = dept;
+    }
+
+    public List<SysRole> getRoles()
+    {
+        return roles;
+    }
+
+    public void setRoles(List<SysRole> roles)
+    {
+        this.roles = roles;
+    }
+
+    public Long[] getRoleIds()
+    {
+        return roleIds;
+    }
+
+    public void setRoleIds(Long[] roleIds)
+    {
+        this.roleIds = roleIds;
+    }
+
+    public Long[] getPostIds()
+    {
+        return postIds;
+    }
+
+    public void setPostIds(Long[] postIds)
+    {
+        this.postIds = postIds;
+    }
+
+    public Long getRoleId()
+    {
+        return roleId;
+    }
+
+    public void setRoleId(Long roleId)
+    {
+        this.roleId = roleId;
+    }
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("userId", getUserId())
+            .append("deptId", getDeptId())
+            .append("userName", getUserName())
+            .append("nickName", getNickName())
+            .append("email", getEmail())
+            .append("phonenumber", getPhonenumber())
+            .append("sex", getSex())
+            .append("avatar", getAvatar())
+            .append("password", getPassword())
+            .append("status", getStatus())
+            .append("delFlag", getDelFlag())
+            .append("loginIp", getLoginIp())
+            .append("remark", getRemark())
+            .append("dept", getDept())
+            .toString();
+    }
+
+    private String creditCode;
+
+    public String getCreditCode() {
+        return creditCode;
+    }
+
+    public void setCreditCode(String creditCode) {
+        this.creditCode = creditCode;
+    }
+}

+ 46 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteDeptFallbackFactory.java

@@ -0,0 +1,46 @@
+package com.ruoyi.system.api.factory;
+
+import com.hdkj.common.core.domain.R;
+import com.ruoyi.system.api.RemoteDeptService;
+import com.ruoyi.system.api.domain.SysDept;
+import feign.hystrix.FallbackFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 组织机构服务降级处理
+ * 
+ * @author ruoyi
+ */
+@Component
+public class RemoteDeptFallbackFactory implements FallbackFactory<RemoteDeptService>
+{
+    private static final Logger log = LoggerFactory.getLogger(RemoteDeptFallbackFactory.class);
+
+    @Override
+    public RemoteDeptService create(Throwable throwable)
+    {
+        log.error("组织机构服务调用失败:{}", throwable.getMessage());
+        return new RemoteDeptService()
+        {
+            @Override
+            public List<SysDept> getAllDeptList() {
+                return null;
+            }
+
+            @Override
+            public List<SysDept> getSubDeptList(Long deptId) {
+                return null;
+            }
+
+            @Override
+            public int editFactoryCode(Long deptId, String factoryCode) {
+                return 0;
+            }
+
+        };
+    }
+}

+ 35 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteFileFallbackFactory.java

@@ -0,0 +1,35 @@
+package com.ruoyi.system.api.factory;
+
+import com.ruoyi.system.api.RemoteFileService;
+import feign.hystrix.FallbackFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+import com.hdkj.common.core.domain.R;
+import com.ruoyi.system.api.domain.SysFile;
+
+/**
+ * 文件服务降级处理
+ * 
+ * @author ruoyi
+ */
+@Component
+public class RemoteFileFallbackFactory implements FallbackFactory<RemoteFileService>
+{
+    private static final Logger log = LoggerFactory.getLogger(RemoteFileFallbackFactory.class);
+
+    @Override
+    public RemoteFileService create(Throwable throwable)
+    {
+        log.error("文件服务调用失败:{}", throwable.getMessage());
+        return new RemoteFileService()
+        {
+            @Override
+            public R<SysFile> upload(MultipartFile file)
+            {
+                return R.fail("上传文件失败:" + throwable.getMessage());
+            }
+        };
+    }
+}

+ 42 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteLogFallbackFactory.java

@@ -0,0 +1,42 @@
+package com.ruoyi.system.api.factory;
+
+import com.ruoyi.system.api.RemoteLogService;
+import com.ruoyi.system.api.domain.SysLogininfor;
+import feign.hystrix.FallbackFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import com.hdkj.common.core.domain.R;
+import com.ruoyi.system.api.domain.SysOperLog;
+
+/**
+ * 日志服务降级处理
+ * 
+ * @author ruoyi
+ */
+@Component
+public class RemoteLogFallbackFactory implements FallbackFactory<RemoteLogService>
+{
+    private static final Logger log = LoggerFactory.getLogger(RemoteLogFallbackFactory.class);
+
+    @Override
+    public RemoteLogService create(Throwable throwable)
+    {
+        log.error("日志服务调用失败:{}", throwable.getMessage());
+        return new RemoteLogService()
+        {
+            @Override
+            public R<Boolean> saveLog(SysOperLog sysOperLog, String source)
+            {
+                return R.fail("保存操作日志失败:" + throwable.getMessage());
+            }
+
+            @Override
+            public R<Boolean> saveLogininfor(SysLogininfor sysLogininfor, String source)
+            {
+                return R.fail("保存登录日志失败:" + throwable.getMessage());
+            }
+        };
+
+    }
+}

+ 61 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteTodoFallbackFactory.java

@@ -0,0 +1,61 @@
+package com.ruoyi.system.api.factory;
+
+import com.hdkj.fhzg.entity.ResultModel;
+import com.ruoyi.system.api.RemoteTodoService;
+import com.ruoyi.system.api.todo.request.CreateTodoRequest;
+import com.ruoyi.system.api.todo.request.OrderBusinessRequest;
+import com.ruoyi.system.api.todo.request.TodoTypeRequest;
+import com.ruoyi.system.api.todo.request.UpdateTodoRequest;
+import com.ruoyi.system.api.todo.response.TodoInfoResponse;
+import com.ruoyi.system.api.todo.response.TodoInst;
+import feign.hystrix.FallbackFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 用户服务降级处理
+ * 
+ * @author ruoyi
+ */
+@Component
+public class RemoteTodoFallbackFactory implements FallbackFactory<RemoteTodoService>
+{
+    private static final Logger log = LoggerFactory.getLogger(RemoteTodoFallbackFactory.class);
+
+    @Override
+    public RemoteTodoService create(Throwable throwable)
+    {
+        log.error("用户服务调用失败:{}", throwable.getMessage());
+        return new RemoteTodoService()
+        {
+
+            @Override
+            public ResultModel<Boolean> addTodo(CreateTodoRequest request) {
+                return null;
+            }
+
+            @Override
+            public ResultModel<Boolean> updateTodo(UpdateTodoRequest request) {
+                return null;
+            }
+
+            @Override
+            public ResultModel<TodoInfoResponse> findTodoByBusinessId(TodoTypeRequest request) {
+                return null;
+            }
+
+            @Override
+            public ResultModel<List<TodoInst>> getTodoListByBusinessIds(OrderBusinessRequest request) {
+                return null;
+            }
+
+            @Override
+            public ResultModel<List<TodoInst>> getTodoListByBusinessIds2(OrderBusinessRequest request) {
+                return null;
+            }
+        };
+    }
+}

+ 93 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteUserFallbackFactory.java

@@ -0,0 +1,93 @@
+package com.ruoyi.system.api.factory;
+
+import com.ruoyi.system.api.RemoteUserService;
+import com.ruoyi.system.api.domain.SysDept;
+import com.ruoyi.system.api.domain.SysUser;
+import feign.hystrix.FallbackFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import com.hdkj.common.core.domain.R;
+import com.ruoyi.system.api.model.LoginUser;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * 用户服务降级处理
+ * 
+ * @author ruoyi
+ */
+@Component
+public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserService>
+{
+    private static final Logger log = LoggerFactory.getLogger(RemoteUserFallbackFactory.class);
+
+    @Override
+    public RemoteUserService create(Throwable throwable)
+    {
+        log.error("用户服务调用失败:{}", throwable.getMessage());
+        return new RemoteUserService()
+        {
+            @Override
+            public R<LoginUser> getUserInfo(String username, String source)
+            {
+                return R.fail("获取用户失败:" + throwable.getMessage());
+            }
+
+            @Override
+            public R<Boolean> registerUserInfo(SysUser sysUser, String source)
+            {
+                return R.fail("注册用户失败:" + throwable.getMessage());
+            }
+
+            @Override
+            public R<Boolean> recordUserLogin(SysUser sysUser, String source)
+            {
+                return R.fail("记录用户登录信息失败:" + throwable.getMessage());
+            }
+
+            @Override
+            public List<SysDept> listByParentId(Long parentId) {
+                return null;
+            }
+
+            @Override
+            public List<SysDept> listByUserId(Long userId) {
+                return null;
+            }
+
+            @Override
+            public R<List<SysUser>> getUserInfo(List<Long> userIds) {
+                return null;
+            }
+
+            @Override
+            public R<List<SysUser>> getUserInfoNoAuth(List<Long> userIds) {
+                return null;
+            }
+
+            @Override
+            public R<List<SysUser>> getUserInfoOut(List<Long> userIds) {
+                return null;
+            }
+
+            @Override
+            public List<SysDept> listByCode(String deptCode) {
+                return Collections.emptyList();
+            }
+
+            @Override
+            public List<SysDept> listByCodes(List<String> deptCodes) {
+                return Collections.emptyList();
+            }
+
+            @Override
+            public List<SysDept> getCityDeptByCodes(List<String> deptCodes) {
+                return Collections.emptyList();
+            }
+
+
+        };
+    }
+}

+ 151 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/LoginUser.java

@@ -0,0 +1,151 @@
+package com.ruoyi.system.api.model;
+
+import com.ruoyi.system.api.domain.SysUser;
+
+import java.io.Serializable;
+import java.util.Set;
+
+/**
+ * 用户信息
+ *
+ * @author ruoyi
+ */
+public class LoginUser implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户唯一标识
+     */
+    private String token;
+
+    /**
+     * 用户名id
+     */
+    private Long userid;
+
+    /**
+     * 用户名
+     */
+    private String username;
+
+    /**
+     * 登录时间
+     */
+    private Long loginTime;
+
+    /**
+     * 过期时间
+     */
+    private Long expireTime;
+
+    /**
+     * 登录IP地址
+     */
+    private String ipaddr;
+
+    /**
+     * 权限列表
+     */
+    private Set<String> permissions;
+
+    /**
+     * 角色列表
+     */
+    private Set<String> roles;
+
+    /**
+     * 用户信息
+     */
+    private SysUser sysUser;
+
+    public String getToken()
+    {
+        return token;
+    }
+
+    public void setToken(String token)
+    {
+        this.token = token;
+    }
+
+    public Long getUserid()
+    {
+        return userid;
+    }
+
+    public void setUserid(Long userid)
+    {
+        this.userid = userid;
+    }
+
+    public String getUsername()
+    {
+        return username;
+    }
+
+    public void setUsername(String username)
+    {
+        this.username = username;
+    }
+
+    public Long getLoginTime()
+    {
+        return loginTime;
+    }
+
+    public void setLoginTime(Long loginTime)
+    {
+        this.loginTime = loginTime;
+    }
+
+    public Long getExpireTime()
+    {
+        return expireTime;
+    }
+
+    public void setExpireTime(Long expireTime)
+    {
+        this.expireTime = expireTime;
+    }
+
+    public String getIpaddr()
+    {
+        return ipaddr;
+    }
+
+    public void setIpaddr(String ipaddr)
+    {
+        this.ipaddr = ipaddr;
+    }
+
+    public Set<String> getPermissions()
+    {
+        return permissions;
+    }
+
+    public void setPermissions(Set<String> permissions)
+    {
+        this.permissions = permissions;
+    }
+
+    public Set<String> getRoles()
+    {
+        return roles;
+    }
+
+    public void setRoles(Set<String> roles)
+    {
+        this.roles = roles;
+    }
+
+    public SysUser getSysUser()
+    {
+        return sysUser;
+    }
+
+    public void setSysUser(SysUser sysUser)
+    {
+        this.sysUser = sysUser;
+    }
+}

+ 66 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/todo/request/ActivitiRequest.java

@@ -0,0 +1,66 @@
+package com.ruoyi.system.api.todo.request;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author: sqz
+ * @Date: 2025/05/27/15:25
+ * @Description:
+ */
+@Data
+@Accessors(chain = true)
+public class ActivitiRequest {
+
+    /**
+     * 节点Id
+     */
+    private String nodeId;
+
+    /**
+     * 业务id 例:单据id orderId
+     */
+    private String businessKey;
+
+    /**
+     * taskId
+     */
+    private String taskId;
+
+    /**
+     * userId 当前操作人
+     */
+    private Long userId;
+
+    /**
+     * flowInstId 流程实例id
+     */
+    private String flowInstId;
+
+    /**
+     * candicateUser
+     */
+    private List<String> candicateUser;
+
+    /**
+     * 消息引用
+     */
+    private String messageName;
+
+    /**
+     * 审批意见
+     */
+    private String comment;
+
+    /**
+     * 全局变量
+     */
+    private Map<String, Object> globalVars;
+    /**
+     * 局部变量
+     */
+    private Map<String, Object> localVars;
+}

+ 23 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/todo/request/CancelProcessRequest.java

@@ -0,0 +1,23 @@
+package com.ruoyi.system.api.todo.request;
+
+import lombok.Data;
+
+/**
+ * @Author: sqz
+ * @Date: 2025/05/27/15:25
+ * @Description:
+ */
+@Data
+public class CancelProcessRequest {
+
+    /**
+     * flowInstId 流程实例id
+     */
+    private String flowInstId;
+
+    /**
+     * 作废原因
+     */
+    private String reason;
+
+}

+ 60 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/todo/request/CreateTodoRequest.java

@@ -0,0 +1,60 @@
+package com.ruoyi.system.api.todo.request;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Author: sqz
+ * @Date: 2025/02/20/18:09
+ * @Description:
+ */
+@Data
+public class CreateTodoRequest {
+    /**
+     * 业务id
+     */
+    @NotNull(message = "业务ID不能为空")
+    private Long businessId;
+
+    /**
+     * 用户id
+     */
+    @NotNull(message = "用户id不能为空")
+    private Long userId;
+
+    /**
+     * 业务类型(枚举)
+     */
+    @NotNull(message = "业务类型不能为空")
+    private Integer businessType;
+
+    /**
+     * 待办类型(0-待办,1-告警)
+     */
+    @NotNull(message = "待办类型不能为空")
+    private Integer type;
+
+    /**
+     * 库存地点ID或者专业仓ID
+     */
+    @NotNull(message = "库存地点ID或者专业仓ID不能为空")
+    private Long warehouseId;
+
+    /**
+     * 仓库类型(0:库;1:仓)
+     */
+    @NotNull(message = "仓库类型不能为空")
+    private Integer warehouseType;
+
+    /**
+     * 业务环节
+     */
+    @NotNull(message = "业务环节不能为空")
+    private Integer businessProcess;
+
+    /**
+     * 业务单据号
+     */
+    private String businessNo;
+}

+ 23 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/todo/request/OrderBusinessRequest.java

@@ -0,0 +1,23 @@
+package com.ruoyi.system.api.todo.request;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author: sqz
+ * @Date: 2025/03/26/17:13
+ * @Description:
+ */
+@Data
+public class OrderBusinessRequest {
+
+    private List<Long> businessIds;
+
+    /**
+     * 待办类型(0-待办,1-告警)
+     */
+    private Integer type;
+
+    private Integer businessProcess;
+}

+ 18 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/todo/request/QueryTaskRequest.java

@@ -0,0 +1,18 @@
+package com.ruoyi.system.api.todo.request;
+
+import lombok.Data;
+
+/**
+ * @author
+ * @since: 2024/12/25 8:49
+ */
+@Data
+public class QueryTaskRequest {
+
+   private String businessKey;
+
+   private String flowInstId;
+
+   private String userId;
+
+}

+ 21 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/todo/request/TodoTypeRequest.java

@@ -0,0 +1,21 @@
+package com.ruoyi.system.api.todo.request;
+
+import lombok.Data;
+
+/**
+ * @Author: sqz
+ * @Date: 2025/03/25/9:45
+ * @Description:
+ */
+@Data
+public class TodoTypeRequest {
+    /**
+     * 业务id
+     */
+    private Long businessId;
+
+    /**
+     * 待办类型(0-待办,1-告警)
+     */
+    private Integer type;
+}

+ 24 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/todo/request/UpdateProcessVarsRequest.java

@@ -0,0 +1,24 @@
+package com.ruoyi.system.api.todo.request;
+
+import lombok.Data;
+
+import java.util.Map;
+
+/**
+ * @Author: sqz
+ * @Date: 2025/05/27/15:25
+ * @Description: 实时更新流程全局变量
+ */
+@Data
+public class UpdateProcessVarsRequest {
+    /**
+     * 流程实例id
+     */
+    private String flowInstId;
+
+    /**
+     * variables
+     */
+    private Map<String,Object> variables;
+
+}

+ 81 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/todo/request/UpdateTodoRequest.java

@@ -0,0 +1,81 @@
+package com.ruoyi.system.api.todo.request;
+
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Author: sqz
+ * @Date: 2025/02/20/18:09
+ * @Description:
+ */
+public class UpdateTodoRequest {
+    /**
+     * 业务id
+     */
+    @NotNull(message = "业务ID不能为空")
+    private Long businessId;
+
+    /**
+     * 业务环节
+     */
+    @NotNull(message = "业务环节不能为空")
+    private Integer businessProcess;
+
+    /**
+     * 用户id
+     */
+    @NotNull(message = "用户id不能为空")
+    private Long userId;
+
+    /**
+     * 执行状态:0:开始,1,执行中,2:结束
+     */
+    @NotNull(message = "[执行状态:0:开始,1,执行中,2:结束]不能为空")
+    private Integer status;
+
+    /**
+     * 待办类型(0-待办,1-告警)
+     */
+    private Integer type;
+
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Long getBusinessId() {
+        return businessId;
+    }
+
+    public void setBusinessId(Long businessId) {
+        this.businessId = businessId;
+    }
+
+    public Integer getBusinessProcess() {
+        return businessProcess;
+    }
+
+    public void setBusinessProcess(Integer businessProcess) {
+        this.businessProcess = businessProcess;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+}

+ 66 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/todo/response/TodoHistory.java

@@ -0,0 +1,66 @@
+package com.ruoyi.system.api.todo.response;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * @Author: sqz
+ * @Date: 2025/03/24/16:12
+ * @Description:
+ */
+@Data
+public class TodoHistory {
+
+    /**
+     *
+     */
+    @NotNull(message = "[]不能为空")
+    private Long id;
+    /**
+     * 业务id
+     */
+    private Long businessId;
+    /**
+     * 排序
+     */
+    private Integer sortIndex;
+    /**
+     * 业务环节
+     */
+    @NotNull(message = "[业务环节]不能为空")
+    private Integer businessProcess;
+    /**
+     * 作业下发时间
+     */
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    private Date deliverTime;
+    /**
+     * 乐观锁
+     */
+    private Integer revision;
+    /**
+     * 创建人
+     */
+    private Long createdBy;
+    /**
+     * 创建时间
+     */
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    private Date createdTime;
+    /**
+     * 更新人
+     */
+    private Long updatedBy;
+    /**
+     * 更新时间
+     */
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    private Date updatedTime;
+    /**
+     * 删除标记
+     */
+    private Integer isDeleted;
+}

+ 21 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/todo/response/TodoInfoResponse.java

@@ -0,0 +1,21 @@
+package com.ruoyi.system.api.todo.response;
+
+import lombok.Data;
+
+import java.util.List;
+
+
+/**
+ * @Author: sqz
+ * @Date: 2025/03/24/9:19
+ * @Description:
+ */
+@Data
+public class TodoInfoResponse {
+    private TodoInst orderTodo;
+    /**
+     * 待办过程
+     */
+    private List<TodoHistory> toProcessList;
+
+}

+ 94 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/todo/response/TodoInst.java

@@ -0,0 +1,94 @@
+package com.ruoyi.system.api.todo.response;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * @Author: sqz
+ * @Date: 2025/03/24/16:12
+ * @Description:
+ */
+@Data
+public class TodoInst {
+    private Long id;
+    /**
+     * 业务id
+     */
+    private Long businessId;
+    /**
+     * 业务单据号
+     */
+    private String businessNo;
+    /**
+     * 业务类型
+     */
+    private Integer businessType;
+    /**
+     * 业务环节
+     */
+    private Integer businessProcess;
+    /**
+     * 待办类型(0-待办,1-告警)
+     */
+    private Integer type;
+    /**
+     * 用户角色id
+     */
+    private Long roleId;
+    /**
+     * 库存地点或者专业仓id
+     */
+    private Long warehouseId;
+    /**
+     * 仓库类型(0:库;1:仓)
+     */
+    private Integer warehouseType;
+    /**
+     * 执行状态:0:开始,1,执行中,2:结束
+     */
+    private Integer status;
+    /**
+     * 作业下发时间
+     */
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    private Date deliverTime;
+    /**
+     * 作业开始时间
+     */
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    private Date startTime;
+    /**
+     * 作业结束时间
+     */
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    private Date endTime;
+    /**
+     * 乐观锁
+     */
+    private Integer revision;
+    /**
+     * 创建人
+     */
+    private Long createdBy;
+    /**
+     * 创建时间
+     */
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    private Date createdTime;
+    /**
+     * 更新人
+     */
+    private Long updatedBy;
+    /**
+     * 更新时间
+     */
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    private Date updatedTime;
+    /**
+     * 删除标记
+     */
+    private Integer isDeleted;
+}

+ 31 - 0
api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/todo/response/WorkFlowDTO.java

@@ -0,0 +1,31 @@
+package com.ruoyi.system.api.todo.response;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author: sqz
+ * @Date: 2025/05/28/11:12
+ * @Description:
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class WorkFlowDTO {
+    private List<TaskNode> tasks;
+    private String businessKey;
+    private String procInstId;
+    private Map<String,Object> vars;
+
+    @Data
+    public static class TaskNode{
+        private String nodeId;
+        private String taskId;
+    }
+}

+ 14 - 0
common/common-core/pom.xml

@@ -0,0 +1,14 @@
+<?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.hdkj</groupId>
+		<artifactId>common</artifactId>
+		<version>${revision}</version>
+	</parent>
+
+	<artifactId>common-core</artifactId>
+
+
+</project>

+ 5 - 0
common/common-core/src/main/java/com/hdkj/fhzg/constant/BusinessConstant.java

@@ -0,0 +1,5 @@
+package com.hdkj.fhzg.constant;
+
+public class BusinessConstant {
+
+}

+ 59 - 0
common/common-core/src/main/java/com/hdkj/fhzg/constant/CacheConstants.java

@@ -0,0 +1,59 @@
+package com.hdkj.fhzg.constant;
+
+/**
+ * 缓存常量信息
+ * 
+ * @author ruoyi
+ */
+public class CacheConstants
+{
+    /**
+     * 缓存有效期,默认720(分钟)
+     */
+    public final static long EXPIRATION = 720;
+
+    /**
+     * 缓存刷新时间,默认120(分钟)
+     */
+    public final static long REFRESH_TIME = 120;
+
+    /**
+     * 密码最大错误次数
+     */
+    public final static int PASSWORD_MAX_RETRY_COUNT = 5;
+
+    /**
+     * 密码锁定时间,默认10(分钟)
+     */
+    public final static long PASSWORD_LOCK_TIME = 10;
+
+    /**
+     * 权限缓存前缀
+     */
+    public final static String LOGIN_TOKEN_KEY = "login_tokens:";
+
+    /**
+     * 验证码 redis key
+     */
+    public static final String CAPTCHA_CODE_KEY = "captcha_codes:";
+
+    /**
+     * 参数管理 cache key
+     */
+    public static final String SYS_CONFIG_KEY = "sys_config:";
+
+    /**
+     * 字典管理 cache key
+     */
+    public static final String SYS_DICT_KEY = "sys_dict:";
+
+    /**
+     * 登录账户密码错误次数 redis key
+     */
+    public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:";
+
+    /**
+     * 登录IP黑名单 cache key
+     */
+    public static final String SYS_LOGIN_BLACKIPLIST = SYS_CONFIG_KEY + "sys.login.blackIPList";
+}

+ 141 - 0
common/common-core/src/main/java/com/hdkj/fhzg/constant/Constants.java

@@ -0,0 +1,141 @@
+package com.hdkj.fhzg.constant;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 通用常量信息
+ * 
+ * @author ruoyi
+ */
+public class Constants
+{
+    /**
+     * UTF-8 字符集
+     */
+    public static final String UTF8 = "UTF-8";
+
+    /**
+     * GBK 字符集
+     */
+    public static final String GBK = "GBK";
+
+    /**
+     * www主域
+     */
+    public static final String WWW = "www.";
+
+    /**
+     * RMI 远程方法调用
+     */
+    public static final String LOOKUP_RMI = "rmi:";
+
+    /**
+     * LDAP 远程方法调用
+     */
+    public static final String LOOKUP_LDAP = "ldap:";
+
+    /**
+     * LDAPS 远程方法调用
+     */
+    public static final String LOOKUP_LDAPS = "ldaps:";
+
+    /**
+     * http请求
+     */
+    public static final String HTTP = "http://";
+
+    /**
+     * https请求
+     */
+    public static final String HTTPS = "https://";
+
+    /**
+     * 成功标记
+     */
+    public static final Integer SUCCESS = 200;
+
+    /**
+     * 失败标记
+     */
+    public static final Integer FAIL = 500;
+
+    /**
+     * 登录成功状态
+     */
+    public static final String LOGIN_SUCCESS_STATUS = "0";
+
+    /**
+     * 登录失败状态
+     */
+    public static final String LOGIN_FAIL_STATUS = "1";
+
+    /**
+     * 登录成功
+     */
+    public static final String LOGIN_SUCCESS = "Success";
+
+    /**
+     * 注销
+     */
+    public static final String LOGOUT = "Logout";
+
+    /**
+     * 注册
+     */
+    public static final String REGISTER = "Register";
+
+    /**
+     * 登录失败
+     */
+    public static final String LOGIN_FAIL = "Error";
+
+    /**
+     * 当前记录起始索引
+     */
+    public static final String PAGE_NUM = "pageNum";
+
+    /**
+     * 每页显示记录数
+     */
+    public static final String PAGE_SIZE = "pageSize";
+
+    /**
+     * 排序列
+     */
+    public static final String ORDER_BY_COLUMN = "orderByColumn";
+
+    /**
+     * 排序的方向 "desc" 或者 "asc".
+     */
+    public static final String IS_ASC = "isAsc";
+
+    /**
+     * 验证码有效期(分钟)
+     */
+    public static final long CAPTCHA_EXPIRATION = 2;
+
+    /**
+     * 资源映射路径 前缀
+     */
+    public static final String RESOURCE_PREFIX = "/profile";
+
+    /**
+     * 自动识别json对象白名单配置(仅允许解析的包名,范围越小越安全)
+     */
+    public static final List<String> JSON_WHITELIST_STR = Arrays.asList("org.springframework", "com.ruoyi");
+
+    /**
+     * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加)
+     */
+    public static final List<String> JOB_WHITELIST_STR = Arrays.asList("com.hdkj.job.task");
+
+    /**
+     * 定时任务违规的字符
+     */
+    public static final List<String> JOB_ERROR_STR = Arrays.asList("java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
+            "org.springframework", "org.apache", "com.hdkj.common.core.utils.file");
+
+    public static final String PROJECT_FILE_PATH_TEMPLATE = "template/";
+
+}

+ 22 - 0
common/common-core/src/main/java/com/hdkj/fhzg/constant/ExcelImportError.java

@@ -0,0 +1,22 @@
+package com.hdkj.fhzg.constant;
+
+/**
+ * @author : luotingyu
+ * @version : 1.0
+ * @description : excel导入异常信息显示
+ * @createTime : 2025/8/23
+ */
+public class ExcelImportError {
+
+    public static final String SCHEDULE_TEMPLATE_VALID_ERROR = "开标一览表模板校验失败";
+
+    public static final String SCHEMA_TEMPLATE_VALID_ERROR = "抽取方案模板校验失败";
+
+    public static final String BATCH_INFO_ANALYSIS_FAILURE = "批次信息解析失败";
+
+    public static final String BATCH_INFO_NOT_SAME = "请上传正确批次的抽取方案信息";
+
+    public static final String SCHEDULE_NOT_EXIST_ERROR = "批次暂无开标一览表信息,请先导入开标一览表!";
+
+
+}

+ 120 - 0
common/common-core/src/main/java/com/hdkj/fhzg/constant/GenConstants.java

@@ -0,0 +1,120 @@
+package com.hdkj.fhzg.constant;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 代码生成通用常量
+ * 
+ * @author ruoyi
+ */
+public class GenConstants
+{
+    /** 单表(增删改查) */
+    public static final String TPL_CRUD = "crud";
+
+    /** 树表(增删改查) */
+    public static final String TPL_TREE = "tree";
+
+    /** 主子表(增删改查) */
+    public static final String TPL_SUB = "sub";
+
+    /** 树编码字段 */
+    public static final String TREE_CODE = "treeCode";
+
+    /** 树父编码字段 */
+    public static final String TREE_PARENT_CODE = "treeParentCode";
+
+    /** 树名称字段 */
+    public static final String TREE_NAME = "treeName";
+
+    /** 上级菜单ID字段 */
+    public static final String PARENT_MENU_ID = "parentMenuId";
+
+    /** 上级菜单名称字段 */
+    public static final String PARENT_MENU_NAME = "parentMenuName";
+
+    /** 文本框 */
+    public static final String HTML_INPUT = "input";
+
+    /** 文本域 */
+    public static final String HTML_TEXTAREA = "textarea";
+
+    /** 下拉框 */
+    public static final String HTML_SELECT = "select";
+
+    /** 单选框 */
+    public static final String HTML_RADIO = "radio";
+
+    /** 复选框 */
+    public static final String HTML_CHECKBOX = "checkbox";
+
+    /** 日期控件 */
+    public static final String HTML_DATETIME = "datetime";
+
+    /** 图片上传控件 */
+    public static final String HTML_IMAGE_UPLOAD = "imageUpload";
+
+    /** 文件上传控件 */
+    public static final String HTML_FILE_UPLOAD = "fileUpload";
+
+    /** 富文本控件 */
+    public static final String HTML_EDITOR = "editor";
+
+    /** 字符串类型 */
+    public static final String TYPE_STRING = "String";
+
+    /** 整型 */
+    public static final String TYPE_INTEGER = "Integer";
+
+    /** 长整型 */
+    public static final String TYPE_LONG = "Long";
+
+    /** 浮点型 */
+    public static final String TYPE_DOUBLE = "Double";
+
+    /** 高精度计算类型 */
+    public static final String TYPE_BIGDECIMAL = "BigDecimal";
+
+    /** 时间类型 */
+    public static final String TYPE_DATE = "Date";
+
+    /** 模糊查询 */
+    public static final String QUERY_LIKE = "LIKE";
+
+    /** 相等查询 */
+    public static final String QUERY_EQ = "EQ";
+
+    /** 需要 */
+    public static final String REQUIRE = "1";
+
+    /** 数据库字符串类型 */
+    public static final List<String> COLUMNTYPE_STR = Arrays.asList("char", "varchar", "nvarchar", "varchar2");
+
+    /** 数据库文本类型 */
+    public static final List<String> COLUMNTYPE_TEXT = Arrays.asList("tinytext", "text", "mediumtext", "longtext");
+
+    /** 数据库时间类型 */
+    public static final List<String> COLUMNTYPE_TIME = Arrays.asList(HTML_DATETIME, "time", "date", "timestamp");
+
+    /** 数据库数字类型 */
+    public static final List<String> COLUMNTYPE_NUMBER = Arrays.asList("tinyint", "smallint", "mediumint", "int", "number", "integer",
+            "bit", "bigint", "float", "double", "decimal");
+
+    /** 页面不需要编辑字段 */
+    public static final List<String> COLUMNNAME_NOT_EDIT = Arrays.asList("id", "create_by", "create_time", "del_flag");
+
+    /** 页面不需要显示的列表字段 */
+    public static final List<String> COLUMNNAME_NOT_LIST = Arrays.asList("id", "create_by", "create_time", "del_flag", "update_by",
+            "update_time");
+
+    /** 页面不需要查询字段 */
+    public static final List<String> COLUMNNAME_NOT_QUERY = Arrays.asList("id", "create_by", "create_time", "del_flag", "update_by",
+            "update_time", "remark");
+
+    /** Entity基类字段 */
+    public static final List<String> BASE_ENTITY = Arrays.asList("createBy", "createTime", "updateBy", "updateTime", "remark");
+
+    /** Tree基类字段 */
+    public static final List<String> TREE_ENTITY = Arrays.asList("parentName", "parentId", "orderNum", "ancestors");
+}

+ 88 - 0
common/common-core/src/main/java/com/hdkj/fhzg/constant/RegexPatternConstant.java

@@ -0,0 +1,88 @@
+package com.hdkj.fhzg.constant;
+
+import java.util.regex.Pattern;
+
+/**
+ * @Description: 正则表达式常量类
+ * @Author: wenhao
+ * @Create: 2022/10/18 11:04
+ * @Version: 1.0
+ */
+public final class RegexPatternConstant {
+
+    public final static String BASIC_REGEX = "^[\\u4E00-\\u9FA5A-Za-z0-9_]+$"; //只允许中文、英文、数字包括下划线
+
+    public final static String EMAIL_REGEX = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"; //Email地址
+
+    public final static String URL_REGEX = "[a-zA-z]+://[^\\s]*"; //URL格式
+
+    public final static String MOBILE_PHONE_REGEX = "^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$"; //移动电话
+
+    public final static String FIX_PHONE_REGEX = "\\d{3}-\\d{8}|\\d{4}-\\d{7}"; //固定电话
+
+    public final static String IDENTITY_REGEX = "(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}[0-9Xx]$)|(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)"; //身份证格式
+
+    public final static String NORM_DATE_REGEX = "^\\d{4}-\\d{1,2}-\\d{1,2}"; //日期(年月日)格式
+
+    public final static String NORM_TIME_REGEX = "^\\d{1,2}:\\d{1,2}:\\d{1,2}"; //时间(时分秒)格式
+
+    public final static String NORM_DATETIME_REGEX = "^\\d{4}-\\d{1,2}-\\d{1,2}\\s\\d{1,2}:\\d{1,2}:\\d{1,2}"; //日期(年月日时分秒)格式
+
+    public final static String ACCOUNT_REGEX = "^[a-zA-Z][a-zA-Z0-9_]{4,15}$"; //账号必须以字母开头,允许5-16字节,允许字母数字下划线
+
+    public final static String CIPHER_REGEX = "^(?=.*\\d)(?=.*[a-zA-Z])(?=.*[^a-zA-Z0-9]).{8,16}$"; //密码必须包含字母、数字和特殊字符的组合,长度在8-16之间
+
+    public final static String CHINESE_REGEX = "[\\u4e00-\\u9fa5]+"; //中文内容格式
+
+    public final static String DOUBLE_BYTE_REGEX = "[^\\x00-\\xff]{0,}$"; //双字节内容格式
+
+    public final static String ZIP_CODE_REGEX = "[1-9]\\d{5}(?!\\d)"; //邮政编码格式
+
+    public final static String IP_ADDRESS_REGEX = "\\d+\\.\\d+\\.\\d+\\.\\d+"; //IP地址格式
+
+    public final static String NONZERO_NUMBER_REGEX = "^[1-9]\\d{0,}$"; //非零数字格式
+
+    public final static String NORM_YEAR_REGEX = "^\\d{4}"; //日期(年)格式
+
+    public final static String NUM_FLOAT_REGEX = "^(100|[1-9]?\\d(\\.\\d\\d?\\d?)?)$"; //纯数字且包含小数点
+
+    public final static String MONEY_ALL_REGEX = "^([0-9]|([1-9][0-9]{0,9}))(\\.[0-9]{1,6})?$"; //金额,整数不超过10位,小数不超过6位,包含0
+
+    public final static String MONEY_REGEX = "^(([1-9][0-9]{0,9}(\\.[0-9]{1,6})?)|(0\\.[0-9]{1,6}))$"; //金额,整数不超过10位,小数不超过6位,大于0
+
+    public final static String KH_REGEX = "\\((.*?)\\)|\\((.*?)\\)"; //括号(中英文)
+
+    public final static String BIRTHDAY_REGEX = "^((?:19[2-9]\\d{1})|(?:20(?:(?:0[0-9])|(?:1[0-8]))))((?:0?[1-9])|(?:1[0-2]))((?:0?[1-9])|(?:[1-2][0-9])|30|31)$"; //出生日期
+
+    public final static String BATCH_NO_REGEX = "(?:\\(|()?([A-Z0-9]{2}\\d{2}[A-Z0-9]{2})(?:\\)|))?";//校验批次号,第3、4位可获取到年份
+
+    public final static String SCHEMA_GROUP_NAME_REGEX = "[((].*?[))]";
+
+    public final static String BIDNUM_WITH_PACK_REGEX = "分标编号[::]?\\s*(\\d+[-\\d]*)\\s*";
+
+    public final static String GROUP_NAME_INFO_REGEX = "^[^,,]+";
+
+    public static final Pattern CONTAINS_NUMBER = Pattern.compile(".*\\d+.*"); //字符串是否包含数字
+
+    public static final Pattern CONTAINS_NUMBER_SIGNED = Pattern.compile("[+-]?\\d+(?:\\.\\d+)?"); //字符串是否包含正负号的数字
+
+    public static final Pattern INTEGER_RANGE = Pattern.compile("^\\[\\d+,\\d+\\]$"); //整数范围
+
+    public static final Pattern DECIMAL_RANGE = Pattern.compile("^\\[\\d+,\\d+\\]\\.\\d+$"); //小数范围
+
+    // 1.检测首尾的长数字串(长度>=4),截取保留中文部分重新再查一次
+    public static final Pattern BOUNDARY_DIGITS = Pattern.compile("^\\d{4,}.*|.*\\d{4,}$");
+
+    public static final Pattern AHEAD_NUMBER = Pattern.compile("\\d+(?:\\.\\d+)?(?=\\[|\\()");
+
+    public static final Pattern CONTAINS_BATCH_NO = Pattern.compile("\\d+");
+
+    public static final Pattern TECHNICAL_GROUP_NAME_PATTERN = Pattern.compile(".*技术(一|二|三|四|五|六|七|八|九|十)组.*");
+
+    public static final Pattern BUSINESS_GROUP_NAME_PATTERN = Pattern.compile(".*商务(一|二|三|四|五|六|七|八|九|十)组.*");
+
+    public final static String BATCH_WITH_BID_NUMBER_REGEX = "^([A-Z0-9]+)-";
+
+    public final static String EXPERT_GROUP_NAME_REGEX = "^(技术|商务)([一二三四五六七八九十百千万零]{1,})组";
+
+}

+ 50 - 0
common/common-core/src/main/java/com/hdkj/fhzg/constant/ScheduleConstants.java

@@ -0,0 +1,50 @@
+package com.hdkj.fhzg.constant;
+
+/**
+ * 任务调度通用常量
+ * 
+ * @author ruoyi
+ */
+public class ScheduleConstants
+{
+    public static final String TASK_CLASS_NAME = "TASK_CLASS_NAME";
+
+    /** 执行目标key */
+    public static final String TASK_PROPERTIES = "TASK_PROPERTIES";
+
+    /** 默认 */
+    public static final String MISFIRE_DEFAULT = "0";
+
+    /** 立即触发执行 */
+    public static final String MISFIRE_IGNORE_MISFIRES = "1";
+
+    /** 触发一次执行 */
+    public static final String MISFIRE_FIRE_AND_PROCEED = "2";
+
+    /** 不触发立即执行 */
+    public static final String MISFIRE_DO_NOTHING = "3";
+
+    public enum Status
+    {
+        /**
+         * 正常
+         */
+        NORMAL("0"),
+        /**
+         * 暂停
+         */
+        PAUSE("1");
+
+        private String value;
+
+        private Status(String value)
+        {
+            this.value = value;
+        }
+
+        public String getValue()
+        {
+            return value;
+        }
+    }
+}

+ 54 - 0
common/common-core/src/main/java/com/hdkj/fhzg/constant/SecurityConstants.java

@@ -0,0 +1,54 @@
+package com.hdkj.fhzg.constant;
+
+/**
+ * 权限相关通用常量
+ * 
+ * @author ruoyi
+ */
+public class SecurityConstants
+{
+    /**
+     * 用户ID字段
+     */
+    public static final String DETAILS_USER_ID = "user_id";
+
+    /**
+     * 用户名字段
+     */
+    public static final String DETAILS_USERNAME = "username";
+
+    /**
+     * 授权信息字段
+     */
+    public static final String AUTHORIZATION_HEADER = "Authorization";
+
+    /**
+     * 请求来源
+     */
+    public static final String FROM_SOURCE = "from-source";
+
+    /**
+     * 内部请求
+     */
+    public static final String INNER = "inner";
+
+    /**
+     * 用户标识
+     */
+    public static final String USER_KEY = "user_key";
+
+    /**
+     * 登录用户
+     */
+    public static final String LOGIN_USER = "login_user";
+
+    /**
+     * 角色权限
+     */
+    public static final String ROLE_PERMISSION = "role_permission";
+
+    /**
+     * 主账号
+     */
+    public static final String MAIN_USER = "0";
+}

+ 24 - 0
common/common-core/src/main/java/com/hdkj/fhzg/constant/ServiceNameConstants.java

@@ -0,0 +1,24 @@
+package com.hdkj.fhzg.constant;
+
+/**
+ * 服务名称
+ * 
+ * @author ruoyi
+ */
+public class ServiceNameConstants
+{
+    /**
+     * 认证服务的serviceid
+     */
+    public static final String AUTH_SERVICE = "ruoyi-auth";
+
+    /**
+     * 系统模块的serviceid
+     */
+    public static final String SYSTEM_SERVICE = "ruoyi-system";
+
+    /**
+     * 文件服务的serviceid
+     */
+    public static final String FILE_SERVICE = "ruoyi-file";
+}

+ 20 - 0
common/common-core/src/main/java/com/hdkj/fhzg/constant/TokenConstants.java

@@ -0,0 +1,20 @@
+package com.hdkj.fhzg.constant;
+
+/**
+ * Token的Key常量
+ * 
+ * @author ruoyi
+ */
+public class TokenConstants
+{
+    /**
+     * 令牌前缀
+     */
+    public static final String PREFIX = "Bearer ";
+
+    /**
+     * 令牌秘钥
+     */
+    public final static String SECRET = "abcdefghijklmnopqrstuvwxyz";
+
+}

+ 83 - 0
common/common-core/src/main/java/com/hdkj/fhzg/constant/UserConstants.java

@@ -0,0 +1,83 @@
+package com.hdkj.fhzg.constant;
+
+/**
+ * 用户常量信息
+ * 
+ * @author ruoyi
+ */
+public class UserConstants
+{
+    /**
+     * 平台内系统用户的唯一标志
+     */
+    public static final String SYS_USER = "SYS_USER";
+
+    /** 正常状态 */
+    public static final String NORMAL = "0";
+
+    /** 异常状态 */
+    public static final String EXCEPTION = "1";
+
+    /** 用户封禁状态 */
+    public static final String USER_DISABLE = "1";
+
+    /** 角色正常状态 */
+    public static final String ROLE_NORMAL = "0";
+
+    /** 角色封禁状态 */
+    public static final String ROLE_DISABLE = "1";
+
+    /** 部门正常状态 */
+    public static final String DEPT_NORMAL = "0";
+
+    /** 部门停用状态 */
+    public static final String DEPT_DISABLE = "1";
+
+    /** 字典正常状态 */
+    public static final String DICT_NORMAL = "0";
+
+    /** 是否为系统默认(是) */
+    public static final String YES = "Y";
+
+    /** 是否菜单外链(是) */
+    public static final String YES_FRAME = "0";
+
+    /** 是否菜单外链(否) */
+    public static final String NO_FRAME = "1";
+
+    /** 菜单类型(目录) */
+    public static final String TYPE_DIR = "M";
+
+    /** 菜单类型(菜单) */
+    public static final String TYPE_MENU = "C";
+
+    /** 菜单类型(按钮) */
+    public static final String TYPE_BUTTON = "F";
+
+    /** Layout组件标识 */
+    public final static String LAYOUT = "Layout";
+
+    /** ParentView组件标识 */
+    public final static String PARENT_VIEW = "ParentView";
+
+    /** InnerLink组件标识 */
+    public final static String INNER_LINK = "InnerLink";
+
+    /** 校验是否唯一的返回标识 */
+    public final static boolean UNIQUE = true;
+    public final static boolean NOT_UNIQUE = false;
+
+    /**
+     * 用户名长度限制
+     */
+    public static final int USERNAME_MIN_LENGTH = 2;
+
+    public static final int USERNAME_MAX_LENGTH = 20;
+
+    /**
+     * 密码长度限制
+     */
+    public static final int PASSWORD_MIN_LENGTH = 5;
+
+    public static final int PASSWORD_MAX_LENGTH = 20;
+}

+ 22 - 0
common/common-core/src/main/java/com/hdkj/fhzg/entity/Page.java

@@ -0,0 +1,22 @@
+package com.hdkj.fhzg.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author : gr
+ * @version 1.0.0
+ * @date : 2025/7/14 15:00
+ */
+@Data
+public class Page<E> {
+    
+    long total;
+    
+    long size;
+
+    long current;
+
+    List<E> records;
+}

+ 217 - 0
common/common-core/src/main/java/com/hdkj/fhzg/entity/ResultEnum.java

@@ -0,0 +1,217 @@
+package com.hdkj.fhzg.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author zhangfan
+ * @date 2021/9/15/0015
+ */
+@Getter
+@AllArgsConstructor
+public enum ResultEnum{
+    /**
+     * 返回成功
+     */
+    SUCCESS(1000, "返回成功"),
+    /**
+     * 数据处理成功
+     */
+    PROCESS_SUCCESS(1001, "数据处理成功"),
+    /**
+     * 上传文件成功
+     */
+    UPLOAD_SUCCESS(1002, "上传文件成功"),
+    /**
+     * 数据模板导入成功
+     */
+    TEMPLATE_IMPORT_SUCCESS(1005, "数据模板导入成功"),
+    /**
+     * 数据处理失败
+     */
+    PROCESS_FAILED(-1001, "数据处理失败"),
+    /**
+     * 上传文件失败
+     */
+    UPLOAD_FAILED(-1002, "上传文件失败"),
+    /**
+     * 导出文件失败
+     */
+    DOWNLOAD_FAILED(-1003, "导出文件失败"),
+    /**
+     * token验证失败
+     */
+    TOKEN_FAILED(-1004, "token验证失败"),
+    /**
+     * token验证成功
+     */
+    TOKEN_SUCCESS(1004, "token验证成功"),
+    /**
+     * 数据模板导入失败
+     */
+    TEMPLATE_IMPORT_FAILED(-1005, "数据模板导入失败"),
+    /**
+     * 返回失败
+     */
+    FAILED(-1000, "返回失败"),
+    /**
+     * 参数校验错误
+     */
+    VALIDATE_FAILED(-1007, "参数校验错误"),
+    /**
+     * 登录失败
+     */
+    LOGIN_FAILED(-1006, "登录失败"),
+    /**
+     * 登录成功
+     */
+    LOGIN_SUCCESS(1006, "登录成功"),
+    /**
+     * 无访问权限
+     */
+    RESOURCES_SUCCESS(1009, "无访问权限"),
+    /**
+     * 无使用权限
+     */
+    NOT_ALLOWED(-1009, "无使用权限"),
+    /**
+     * 请稍后再试
+     */
+    BLOCK_HANDLER(-9999, "请稍后再试"),
+    /**
+     * 异常访问
+     */
+    FALLBACK(-9998, "异常访问"),
+    /**
+     * 服务异常,请联系管理员
+     */
+    EXCEPTION_HANDLER(-2500, "服务异常,请联系管理员"),
+    /**
+     * OK
+     */
+    OK(200, "OK"),
+    /**
+     * Created
+     */
+    CREATED(201, "Created"),
+    /**
+     * Accepted
+     */
+    ACCEPTED(202, "Accepted"),
+    /**
+     * No Content
+     */
+    NO_CONTENT(204, "No Content"),
+    /**
+     * Reset Content
+     */
+    RESET_CONTENT(205, "Reset Content"),
+    /**
+     * Bad Request
+     */
+    BAD_REQUEST(400, "Bad Request"),
+    /**
+     * Unauthorized
+     */
+    UNAUTHORIZED(401, "Unauthorized"),
+    /**
+     * Payment Required
+     */
+    PAYMENT_REQUIRED(402, "Payment Required"),
+    /**
+     * Forbidden
+     */
+    FORBIDDEN(403, "Forbidden"),
+    /**
+     * Not Found
+     */
+    NOT_FOUND(404, "Not Found"),
+    /**
+     * Method Not Allowed
+     */
+    METHOD_NOT_ALLOWED(405, "Method Not Allowed"),
+    /**
+     * Request Timeout
+     */
+    REQUEST_TIMEOUT(408, "Request Timeout"),
+    /**
+     * Internal Server Error
+     */
+    INTERNAL_SERVER_ERROR(500, "Internal Server Error"),
+    /**
+     * Not Implemented
+     */
+    NOT_IMPLEMENTED(501, "Not Implemented"),
+    /**
+     * Bad Gateway
+     */
+    BAD_GATEWAY(502, "Bad Gateway"),
+    /**
+     * Service Unavailable
+     */
+    SERVICE_UNAVAILABLE(503, "Service Unavailable"),
+    /**
+     * Gateway Timeout
+     */
+    GATEWAY_TIMEOUT(504, "Gateway Timeout"),
+
+    /**
+     *  待办开始
+     *  */
+    TODO_ERROR(12001, "工单待办失败"),
+    /**
+     * 待办已创建
+     */
+    TODO_EXIST(12002, "待办已创建"),
+    /* 待办定义结束 */
+    /**
+     * 同步ERP数据失败
+     */
+    ERP_SYNC_ERROR(-2001, "同步ERP数据失败"),
+    /**
+     * 同步设备管理数据失败
+     */
+    DEVICE_MANAGE_SYNC_ERROR(-2002, "同步设备管理数据失败"),
+    /**
+     * 格式校验失败
+     */
+    PATTERN_ERROR(-2003, "格式校验失败"),
+    /**
+     * 文件上传失败
+     */
+    FILE_IMPORT_ERROR(-2004, "文件上传失败"),
+    /**
+     * 已有同时间变更,请查实后填写
+     */
+    CHANGE_ERROR(-2006, "已有同时间变更,请查实后填写"),
+    /**
+     * 文件上传大小超过最大限制
+     */
+    FILE_SIZE_ERROR(-2005, "文件上传大小超过最大限制"),
+    /**
+     * 发送金现代接口请求失败
+     */
+    SEND_REQUEST_ERROR(-1000, "发送金现代接口请求失败"),
+    /**
+     * 生成模版失败
+     */
+    MAKE_TEMPLATE_ERROR(-1000, "生成模版失败"),
+    /**
+     * 参数错误或参数为空
+     */
+    PARAMETER_ERROR(40001, "参数错误或参数为空"),
+    BID_CODE_ERROR(40002, "系统已存在相同的招标采购项目编号,请重新确认!"),
+    /**
+     * 服务器内部错误
+     */
+    SERVER_ERROR(50001, "服务器内部错误"),
+    /* 基础数据结束 */
+            ;
+
+
+
+
+    private Integer code;
+    private String msg;
+
+}

+ 17 - 0
common/common-core/src/main/java/com/hdkj/fhzg/entity/ResultHttpModel.java

@@ -0,0 +1,17 @@
+package com.hdkj.fhzg.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author zhangfan
+ * @date 2021/9/15/0015
+ */
+@Data
+public class ResultHttpModel<T> implements Serializable {
+    private static final long serialVersionUID = -4544427215199386509L;
+    private Integer code;
+    private String success;
+    private T data;
+}

+ 100 - 0
common/common-core/src/main/java/com/hdkj/fhzg/entity/ResultModel.java

@@ -0,0 +1,100 @@
+package com.hdkj.fhzg.entity;
+
+import lombok.*;
+import lombok.experimental.Accessors;
+import org.springframework.lang.Nullable;
+import org.springframework.util.ObjectUtils;
+
+import java.io.Serializable;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+/**
+ * @author zhangfan
+ * @date 2021/9/15/0015
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ToString
+@Accessors(chain = true)
+@EqualsAndHashCode
+public class ResultModel<T> implements Serializable {
+    private static final long serialVersionUID = -4544427215199386509L;
+    private Integer code;
+    private String msg;
+    private T data;
+
+    public static <T> ResultModel<T> ok(ResultEnum result, T data) {
+        return result(result, data);
+    }
+
+    public static <T> ResultModel<T> ok(ResultEnum result) {
+        return result(result, null);
+    }
+    
+    public static <T> ResultModel<T> ok(T data) {
+        return result(ResultEnum.SUCCESS, data);
+    }
+
+    public static <T> ResultModel<T> ok(String msg) {
+        return custom(ResultEnum.SUCCESS.getCode(), msg);
+    }
+
+    public static <T> ResultModel<T> error(ResultEnum result, T data) {
+        return result(result, data);
+    }
+
+
+    public static <T> ResultModel<T> error(String msg) {
+        return custom(ResultEnum.FAILED.getCode(), msg);
+    }
+
+    public static <T> ResultModel<T> error(ResultEnum result) {
+        return result(result, null);
+    }
+
+    public static <T> ResultModel<T> result(ResultEnum result, T data) {
+        ResultModel<T> resultModel = new ResultModel<>();
+        resultModel.setCode(result.getCode()).setMsg(result.getMsg());
+        if (data != null) {
+            resultModel.setData(data);
+        }
+        return resultModel;
+    }
+
+    public static <T> ResultModel<T> custom(Integer code, String msg, T data) {
+        return new ResultModel<>(code, msg, data);
+    }
+
+    public static <T> ResultModel<T> custom(Integer code, String msg) {
+        return new ResultModel<>(code, msg, null);
+    }
+
+
+    public static boolean isSuccess(@Nullable ResultModel<?> result) {
+        return (Boolean) Optional.ofNullable(result).map((x) -> {
+            return ObjectUtils.nullSafeEquals(ResultEnum.SUCCESS.getCode(), x.code);
+        }).orElse(Boolean.FALSE);
+    }
+
+    public <E extends Throwable> T orElseThrow(Supplier<E> supplier) throws E{
+        if(!Objects.equals(getCode(), ResultEnum.SUCCESS.getCode()) || data == null){
+            throw supplier.get();
+        }
+        return data;
+    }
+
+    public <E extends Throwable> T orElseThrow(Function<ResultModel<T>,E> function) throws E{
+        if(!Objects.equals(getCode(), ResultEnum.SUCCESS.getCode())){
+            throw function.apply(this);
+        }
+        return data;
+    }
+
+    public static <T> ResultModel<T> ApiOk(T data) {
+        return result(ResultEnum.OK, data);
+    }
+}

+ 28 - 0
common/pom.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.hdkj</groupId>
+        <artifactId>fhzg</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>common</artifactId>
+    <packaging>pom</packaging>
+
+    <modules>
+        <module>common-core</module>
+        <module>ruoyi-common-core</module>
+    </modules>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <optional>true</optional>
+        </dependency>
+    </dependencies>
+
+</project>

+ 160 - 0
common/ruoyi-common-core/pom.xml

@@ -0,0 +1,160 @@
+<?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>
+        <artifactId>common</artifactId>
+        <groupId>com.hdkj</groupId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>ruoyi-common-core</artifactId>
+
+    <description>
+        ruoyi-common-core核心模块
+    </description>
+
+    <dependencies>
+
+        <!-- SpringCloud Openfeign -->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+
+        <!-- SpringCloud Loadbalancer -->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
+        </dependency>
+
+        <!-- Spring Context Support -->
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context-support</artifactId>
+        </dependency>
+
+        <!-- Spring Web -->
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+        </dependency>
+
+        <!-- Transmittable ThreadLocal -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>transmittable-thread-local</artifactId>
+            <version>2.14.4</version>
+        </dependency>
+
+        <!-- Pagehelper -->
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper-spring-boot-starter</artifactId>
+            <version>2.0.0</version>
+        </dependency>
+
+        <!-- Hibernate Validator -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+
+        <!-- Jackson -->
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+        </dependency>
+
+        <!-- Alibaba Fastjson -->
+        <dependency>
+            <groupId>com.alibaba.fastjson2</groupId>
+            <artifactId>fastjson2</artifactId>
+        </dependency>
+
+        <!-- Jwt -->
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.9.1</version>
+        </dependency>
+
+        <!-- Jaxb -->
+        <dependency>
+            <groupId>javax.xml.bind</groupId>
+            <artifactId>jaxb-api</artifactId>
+        </dependency>
+
+        <!-- Apache Lang3 -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+
+        <!-- Commons Io -->
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+        </dependency>
+
+<!--        excel工具-->
+<!--        <dependency>-->
+<!--            <groupId>org.apache.poi</groupId>-->
+<!--            <artifactId>poi-ooxml</artifactId>-->
+<!--            <version>4.1.2</version>-->
+<!--        </dependency>-->
+        <!--开源的excel 操作框架 -->
+        <dependency>
+            <groupId>cn.afterturn</groupId>
+            <artifactId>easypoi-base</artifactId>
+            <version>4.4.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.afterturn</groupId>
+            <artifactId>easypoi-web</artifactId>
+            <version>4.4.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.afterturn</groupId>
+            <artifactId>easypoi-annotation</artifactId>
+            <version>4.4.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>4.1.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>4.1.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml-schemas</artifactId>
+            <version>4.1.2</version>
+        </dependency>
+
+        <!-- Java Servlet -->
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>javax.servlet-api</artifactId>
+        </dependency>
+
+        <!-- MyBatis Plus -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+        </dependency>
+
+        <!-- Swagger -->
+        <dependency>
+            <groupId>io.swagger</groupId>
+            <artifactId>swagger-annotations</artifactId>
+        </dependency>
+
+    </dependencies>
+
+</project>

+ 34 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/annotation/EnumValid.java

@@ -0,0 +1,34 @@
+package com.hdkj.common.core.annotation;
+
+import com.hdkj.common.core.constraints.EnumValidator;
+import com.hdkj.common.core.enums.BaseValidEnum;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @Description: 枚举校验
+ * @Author: wenhao
+ * @Create: 2022/08/15 11:12
+ * @Version: 1.0
+ */
+@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE, ElementType.PARAMETER})
+@Retention(RetentionPolicy.RUNTIME)
+@Constraint(validatedBy = EnumValidator.class)
+@Documented
+public @interface EnumValid {
+
+    String message() default "枚举不符合规范";
+
+    Class<? extends BaseValidEnum> enumClass();
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+
+}

+ 214 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/annotation/Excel.java

@@ -0,0 +1,214 @@
+package com.hdkj.common.core.annotation;
+
+import com.hdkj.common.core.utils.poi.ExcelHandlerAdapter;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.usermodel.IndexedColors;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.math.BigDecimal;
+
+/**
+ * 自定义导出Excel数据注解
+ * 
+ * @author ruoyi
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface Excel
+{
+    /**
+     * 导出时在excel中排序
+     */
+    public int sort() default Integer.MAX_VALUE;
+
+    /**
+     * 导出到Excel中的名字.
+     */
+    public String name() default "";
+
+    /**
+     * 日期格式, 如: yyyy-MM-dd
+     */
+    public String dateFormat() default "";
+
+    /**
+     * 读取内容转表达式 (如: 0=男,1=女,2=未知)
+     */
+    public String readConverterExp() default "";
+
+    /**
+     * 分隔符,读取字符串组内容
+     */
+    public String separator() default ",";
+
+    /**
+     * BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化)
+     */
+    public int scale() default -1;
+
+    /**
+     * BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN
+     */
+    public int roundingMode() default BigDecimal.ROUND_HALF_EVEN;
+
+    /**
+     * 导出时在excel中每个列的高度
+     */
+    public double height() default 14;
+
+    /**
+     * 导出时在excel中每个列的宽度
+     */
+    public double width() default 16;
+
+    /**
+     * 文字后缀,如% 90 变成90%
+     */
+    public String suffix() default "";
+
+    /**
+     * 当值为空时,字段的默认值
+     */
+    public String defaultValue() default "";
+
+    /**
+     * 提示信息
+     */
+    public String prompt() default "";
+
+    /**
+     * 是否允许内容换行 
+     */
+    public boolean wrapText() default false;
+
+    /**
+     * 设置只能选择不能输入的列内容.
+     */
+    public String[] combo() default {};
+
+    /**
+     * 是否需要纵向合并单元格,应对需求:含有list集合单元格)
+     */
+    public boolean needMerge() default false;
+
+    /**
+     * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写.
+     */
+    public boolean isExport() default true;
+
+    /**
+     * 另一个类中的属性名称,支持多级获取,以小数点隔开
+     */
+    public String targetAttr() default "";
+
+    /**
+     * 是否自动统计数据,在最后追加一行统计数据总和
+     */
+    public boolean isStatistics() default false;
+
+    /**
+     * 导出类型(0数字 1字符串)
+     */
+    public ColumnType cellType() default ColumnType.STRING;
+
+    /**
+     * 导出列头背景颜色
+     */
+    public IndexedColors headerBackgroundColor() default IndexedColors.GREY_50_PERCENT;
+
+    /**
+     * 导出列头字体颜色
+     */
+    public IndexedColors headerColor() default IndexedColors.WHITE;
+
+    /**
+     * 导出单元格背景颜色
+     */
+    public IndexedColors backgroundColor() default IndexedColors.WHITE;
+
+    /**
+     * 导出单元格字体颜色
+     */
+    public IndexedColors color() default IndexedColors.BLACK;
+
+    /**
+     * 导出字段对齐方式
+     */
+    public HorizontalAlignment align() default HorizontalAlignment.CENTER;
+
+    /**
+     * 自定义数据处理器
+     */
+    public Class<?> handler() default ExcelHandlerAdapter.class;
+
+    /**
+     * 自定义数据处理器参数
+     */
+    public String[] args() default {};
+
+    /**
+     * 字段类型(0:导出导入;1:仅导出;2:仅导入)
+     */
+    Type type() default Type.ALL;
+
+    public enum Type
+    {
+        /**
+         * ALL
+         */
+        ALL(0),
+        /**
+         * EXPORT
+         */
+        EXPORT(1),
+        /**
+         * IMPORT
+         */
+        IMPORT(2);
+        private final int value;
+
+        Type(int value)
+        {
+            this.value = value;
+        }
+
+        public int value()
+        {
+            return this.value;
+        }
+    }
+
+    public enum ColumnType
+    {
+        /**
+         * NUMERIC
+         */
+        NUMERIC(0),
+        /**
+         * STRING
+         */
+        STRING(1),
+        /**
+         * IMAGE
+         */
+        IMAGE(2),
+        /**
+         * TEXT
+         */
+        TEXT(3);
+        private final int value;
+
+        ColumnType(int value)
+        {
+            this.value = value;
+        }
+
+        public int value()
+        {
+            return this.value;
+        }
+    }
+}

+ 18 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/annotation/Excels.java

@@ -0,0 +1,18 @@
+package com.hdkj.common.core.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Excel注解集
+ * 
+ * @author ruoyi
+ */
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Excels
+{
+    Excel[] value();
+}

+ 36 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/annotation/RegexValid.java

@@ -0,0 +1,36 @@
+package com.hdkj.common.core.annotation;
+
+import com.hdkj.common.core.constraints.StringContentValidator;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @Description: 字符串内容正则校验
+ * @Author: liuaini
+ * @Create: 2024/07/31 14:25
+ * @Version: 1.0
+ */
+@Target({ElementType.FIELD, ElementType.PARAMETER})
+@Retention(RetentionPolicy.RUNTIME)
+@Constraint(validatedBy = StringContentValidator.class)
+public @interface RegexValid {
+
+    // 提示信息
+    String message() default "params incorrect";
+
+    // 字符串正则校验属性
+    String regex() default "";
+
+    // 指定字符串值,格式如:01,02,03
+    String value() default "";
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+
+}

+ 32 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/config/ThreadPoolConfig.java

@@ -0,0 +1,32 @@
+package com.hdkj.common.core.config;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 线程池配置
+ */
+@EnableConfigurationProperties(ThreadPoolProperties.class)
+@ConditionalOnProperty(prefix = "thread-pool", value = "enable", havingValue = "true")
+@Configuration
+public class ThreadPoolConfig {
+
+    @Bean(name = "customThreadPoolExecutor")
+    public ThreadPoolExecutor customThreadPoolExecutor(ThreadPoolProperties config) {
+        return new ThreadPoolExecutor(config.getCoreSize(),
+                config.getMaxSize(),
+                config.getKeepAlive(),
+                TimeUnit.SECONDS,
+                new LinkedBlockingQueue<>(config.getQueueSize()),
+                Executors.defaultThreadFactory(),
+                new ThreadPoolExecutor.CallerRunsPolicy());
+    }
+
+}

+ 21 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/config/ThreadPoolProperties.java

@@ -0,0 +1,21 @@
+package com.hdkj.common.core.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * 线程池配置
+ */
+@ConfigurationProperties(prefix = "thread-pool.config")
+@Data
+public class ThreadPoolProperties {
+
+    private int coreSize = 8;
+
+    private int maxSize = 16;
+
+    private long keepAlive = 60;
+
+    private int queueSize = 500;
+    
+}

+ 29 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/AutoScoreConstants.java

@@ -0,0 +1,29 @@
+package com.hdkj.common.core.constant;
+
+import com.google.common.collect.Lists;
+
+import java.util.List;
+
+/**
+ * @Description:
+ * @Author: wenhao
+ * @Create: 2025/10/28 16:00
+ * @Version: 1.0
+ */
+public class AutoScoreConstants {
+
+    // 机器评分结果不需要赋值给专家结果的要素的规则
+    public static final List<String> NOT_SET_EXPERT_RESULT_RULE_NAMES = Lists.newArrayList("业绩", "投标响应情况", "关键技术参数", "其他技术参数", "项目经理提供", "不良行为", "报价质量");
+
+    public static final String BID_READ_RECORD_PLACEHOLDER = "\\$value\\$"; //阅标记录描述占位符
+
+    // 证书(正本)
+    public static final String FILED_NAME_CERTIFICATE_ORIGINAL = "certificateOriginal";
+    // 证书影印件
+    public static final String FILED_NAME_CERTIFICATE_PHOTOCOPY = "certificatePhotocopy";
+    // 有效期
+    public static final String FILED_NAME_VALIDITY_PERIOD = "validityPeriod";
+    // 检验证明附件
+    public static final String INSPECTION_CERTIFICATE_ATTACH = "inspectionCertificateAttach";
+
+}

+ 13 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/BusinessConstant.java

@@ -0,0 +1,13 @@
+package com.hdkj.common.core.constant;
+
+public class BusinessConstant {
+    /**
+     * 商务
+     */
+    public static final String BUSINESS = "business";
+
+    /**
+     * 技术
+     */
+    public static final String SKILL = "skill";
+}

+ 59 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/CacheConstants.java

@@ -0,0 +1,59 @@
+package com.hdkj.common.core.constant;
+
+/**
+ * 缓存常量信息
+ * 
+ * @author ruoyi
+ */
+public class CacheConstants
+{
+    /**
+     * 缓存有效期,默认720(分钟)
+     */
+    public final static long EXPIRATION = 720;
+
+    /**
+     * 缓存刷新时间,默认120(分钟)
+     */
+    public final static long REFRESH_TIME = 120;
+
+    /**
+     * 密码最大错误次数
+     */
+    public final static int PASSWORD_MAX_RETRY_COUNT = 5;
+
+    /**
+     * 密码锁定时间,默认10(分钟)
+     */
+    public final static long PASSWORD_LOCK_TIME = 10;
+
+    /**
+     * 权限缓存前缀
+     */
+    public final static String LOGIN_TOKEN_KEY = "login_tokens:";
+
+    /**
+     * 验证码 redis key
+     */
+    public static final String CAPTCHA_CODE_KEY = "captcha_codes:";
+
+    /**
+     * 参数管理 cache key
+     */
+    public static final String SYS_CONFIG_KEY = "sys_config:";
+
+    /**
+     * 字典管理 cache key
+     */
+    public static final String SYS_DICT_KEY = "sys_dict:";
+
+    /**
+     * 登录账户密码错误次数 redis key
+     */
+    public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:";
+
+    /**
+     * 登录IP黑名单 cache key
+     */
+    public static final String SYS_LOGIN_BLACKIPLIST = SYS_CONFIG_KEY + "sys.login.blackIPList";
+}

+ 102 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/Constant.java

@@ -0,0 +1,102 @@
+package com.hdkj.common.core.constant;
+
+import com.google.common.collect.Lists;
+
+import java.util.List;
+
+/**
+ * @author : luotingyu
+ * @version : 1.0
+ * @description : 常量
+ * @createTime : 2025/8/23
+ */
+public class Constant {
+
+    public static final String EXTRACTION_PLAN_EXCEL_NAME = "评标专家抽取预案";
+
+    public static final String EXPERT_SUGGECT = "专家建议";
+
+    public static final String VETO_TECH_TEMPLATE = "技术";
+
+    public static final String VETO_BUSINESS_TEMPLATE = "商务";
+
+    public static final String FIRST_LEVEL_ELEMENT = "一级要素";
+
+    public static final String SECOND_LEVEL_ELEMENT = "二级要素";
+
+    public static final String THIRD_LEVEL_ELEMENT = "三级要素";
+
+
+    public static final String STR_ZERO = "0";
+    public static final String STR_ONE = "1";
+    public static final String STR_TWO = "2";
+    public static final String STR_THREE = "3";
+    public static final String STR_FOUR = "4";
+    public static final String STR_EMPTY = "";
+    public static final Integer NUMBER_100 = 100;
+    public static final Integer NUMBER_99 = 99;
+    public static final Integer NUMBER_ZERO = 0;
+    public static final Integer NUMBER_ONE = 1;
+    public static final Integer NUMBER_TWO = 2;
+    public static final Integer NUMBER_FOUR = 4;
+    public static final Integer NUMBER_SIX = 6;
+    public static final Integer NUMBER_EIGHT = 8;
+    public static final Integer NUMBER_TWENTY = 20;
+    public static final String RESOURCE_DIRECTORY_NAME_EN = "资源目录表";
+    public static final String RESOURCE_DIRECTORY_NAME_EN_UPDATE = "资源目录表-更新";
+    public static final String RESOURCE_DIRECTORY_NAME_EN_DELETE = "资源目录表-删除";
+    public static final String RESOURCE_NAME_EN = "表字段名";
+    public static final String RESOURCE_NAME_ZH = "中文字段名";
+    public static final String RESOURCE_OPERATE = "操作";
+    public static final String BUSINESS_GROUP_NAME = "商务";
+    public static final String RESOURCE_OPERATE_UPDATE = "更新";
+    public static final String RESOURCE_OPERATE_DELETE = "删除";
+    public static final String RESOURCE_OPERATE_ADD = "新增";
+    /**
+     * 空格
+     */
+    public static final String RESOURCE_OPERATE_SPACE = "SPACE";
+
+    public static final String TOTAL_SCORE = "总分";
+    public static final String SEPARATOR = "/";
+    public static final String FILE_RECORD = "阅标记录";
+    public static final String QUALIFIED = "合格/不合格";
+    public static final String BAD_BEHAVIOUR = "不良行为";
+    public static final String BUSINESS_EVAL = "商务详评";
+    public static final String BATCH_NAME = "批次-";
+    public static final String BATCH_NAME2 = "批次";
+    public static final String ZIP_NAME = "阅标记录.zip";
+    public static final String RELATION_ZIP_NAME = "招标管理-关联模板-【%s】下载模板.zip";
+    public static final String RELATION_TEMPLATE_NAME = "template";
+    public static final String SKILL = "技术";
+    public static final String BUSINESS = "商务";
+    public static final String REMARK_HEAD = "备注";
+    public static final String PASS_HEAD = "否决";
+    public static final String COMMA = ",";
+    public static final String UNDERLINE = "-";
+    public static final String THREAD_NAME_PREFIX = "spring-thread-pool-";
+
+    public static final String RECHECK_PASSED = "复核通过";
+    public static final String MISCONDUCT_EXIST = "存在不良行为";
+
+    public static final String ITEM_FILE_DETAILS = "附件查看";
+    public static final String ITEM_TYPE_OBJECT = "object";
+    public static final String ITEM_TYPE_LIST = "list";
+    public static final String ITEM_TYPE_CUSTOM = "custom";
+    // 制造商资源目录
+    public static final List<String> ZZS_TABLE_LIST = Lists.newArrayList(
+            "code_contract_performance_info", "contract_invoice", "contract_invoice_detail", // 业绩的相关的表
+            "enterprise_produce_capacity", "production_equipment", "test_equipment", "commissioning_equipment", "type_test_report",
+            "inspection_and_test_report", "appraisal_report", "verification_report", "test_report", "calibration_certificate_or_report",
+            "carbon_emission_accounting_report", "other_report", "standard", "patent_info", "thesis", "copyright", "design_drawing",
+            "design_software", "production_equipment", "test_equipment", "commissioning_equipment", "product_quality_control");
+    // 代理商资源目录
+    public static final List<String> DLS_TABLE_LIST = Lists.newArrayList(
+            "material_info", "agent_contract_performance", "agent_contract_invoice", "agent_contract_invoice_detail", // 业绩的相关的表
+            "manufacturer_auth_info", "agent_production_equipment", "agent_test_equipment", "agent_commissioning_equipment",
+            "agent_type_test_report", "agent_inspection_and_test_report", "agent_appraisal_report", "agent_verification_report",
+            "agent_test_report", "agent_calibration_certificate_or_report", "agent_carbon_emission_accounting_report", "agent_other_report",
+            "agent_standard", "agent_patent_info", "agent_thesis", "agent_copyright", "agent_design_drawing", "agent_design_software",
+            "agent_production_equipment", "agent_test_equipment", "agent_commissioning_equipment", "agent_product_quality_control");
+
+}

+ 141 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/Constants.java

@@ -0,0 +1,141 @@
+package com.hdkj.common.core.constant;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 通用常量信息
+ * 
+ * @author ruoyi
+ */
+public class Constants
+{
+    /**
+     * UTF-8 字符集
+     */
+    public static final String UTF8 = "UTF-8";
+
+    /**
+     * GBK 字符集
+     */
+    public static final String GBK = "GBK";
+
+    /**
+     * www主域
+     */
+    public static final String WWW = "www.";
+
+    /**
+     * RMI 远程方法调用
+     */
+    public static final String LOOKUP_RMI = "rmi:";
+
+    /**
+     * LDAP 远程方法调用
+     */
+    public static final String LOOKUP_LDAP = "ldap:";
+
+    /**
+     * LDAPS 远程方法调用
+     */
+    public static final String LOOKUP_LDAPS = "ldaps:";
+
+    /**
+     * http请求
+     */
+    public static final String HTTP = "http://";
+
+    /**
+     * https请求
+     */
+    public static final String HTTPS = "https://";
+
+    /**
+     * 成功标记
+     */
+    public static final Integer SUCCESS = 200;
+
+    /**
+     * 失败标记
+     */
+    public static final Integer FAIL = 500;
+
+    /**
+     * 登录成功状态
+     */
+    public static final String LOGIN_SUCCESS_STATUS = "0";
+
+    /**
+     * 登录失败状态
+     */
+    public static final String LOGIN_FAIL_STATUS = "1";
+
+    /**
+     * 登录成功
+     */
+    public static final String LOGIN_SUCCESS = "Success";
+
+    /**
+     * 注销
+     */
+    public static final String LOGOUT = "Logout";
+
+    /**
+     * 注册
+     */
+    public static final String REGISTER = "Register";
+
+    /**
+     * 登录失败
+     */
+    public static final String LOGIN_FAIL = "Error";
+
+    /**
+     * 当前记录起始索引
+     */
+    public static final String PAGE_NUM = "pageNum";
+
+    /**
+     * 每页显示记录数
+     */
+    public static final String PAGE_SIZE = "pageSize";
+
+    /**
+     * 排序列
+     */
+    public static final String ORDER_BY_COLUMN = "orderByColumn";
+
+    /**
+     * 排序的方向 "desc" 或者 "asc".
+     */
+    public static final String IS_ASC = "isAsc";
+
+    /**
+     * 验证码有效期(分钟)
+     */
+    public static final long CAPTCHA_EXPIRATION = 2;
+
+    /**
+     * 资源映射路径 前缀
+     */
+    public static final String RESOURCE_PREFIX = "/profile";
+
+    /**
+     * 自动识别json对象白名单配置(仅允许解析的包名,范围越小越安全)
+     */
+    public static final List<String> JSON_WHITELIST_STR = Arrays.asList("org.springframework", "com.ruoyi");
+
+    /**
+     * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加)
+     */
+    public static final List<String> JOB_WHITELIST_STR = Arrays.asList("com.hdkj.job.task");
+
+    /**
+     * 定时任务违规的字符
+     */
+    public static final List<String> JOB_ERROR_STR = Arrays.asList("java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
+            "org.springframework", "org.apache", "com.hdkj.common.core.utils.file");
+
+    public static final String PROJECT_FILE_PATH_TEMPLATE = "template/";
+
+}

+ 22 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/ExcelImportError.java

@@ -0,0 +1,22 @@
+package com.hdkj.common.core.constant;
+
+/**
+ * @author : luotingyu
+ * @version : 1.0
+ * @description : excel导入异常信息显示
+ * @createTime : 2025/8/23
+ */
+public class ExcelImportError {
+
+    public static final String SCHEDULE_TEMPLATE_VALID_ERROR = "开标一览表模板校验失败";
+
+    public static final String SCHEMA_TEMPLATE_VALID_ERROR = "抽取方案模板校验失败";
+
+    public static final String BATCH_INFO_ANALYSIS_FAILURE = "批次信息解析失败";
+
+    public static final String BATCH_INFO_NOT_SAME = "请上传正确批次的抽取方案信息";
+
+    public static final String SCHEDULE_NOT_EXIST_ERROR = "批次暂无开标一览表信息,请先导入开标一览表!";
+
+
+}

+ 120 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/GenConstants.java

@@ -0,0 +1,120 @@
+package com.hdkj.common.core.constant;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 代码生成通用常量
+ * 
+ * @author ruoyi
+ */
+public class GenConstants
+{
+    /** 单表(增删改查) */
+    public static final String TPL_CRUD = "crud";
+
+    /** 树表(增删改查) */
+    public static final String TPL_TREE = "tree";
+
+    /** 主子表(增删改查) */
+    public static final String TPL_SUB = "sub";
+
+    /** 树编码字段 */
+    public static final String TREE_CODE = "treeCode";
+
+    /** 树父编码字段 */
+    public static final String TREE_PARENT_CODE = "treeParentCode";
+
+    /** 树名称字段 */
+    public static final String TREE_NAME = "treeName";
+
+    /** 上级菜单ID字段 */
+    public static final String PARENT_MENU_ID = "parentMenuId";
+
+    /** 上级菜单名称字段 */
+    public static final String PARENT_MENU_NAME = "parentMenuName";
+
+    /** 文本框 */
+    public static final String HTML_INPUT = "input";
+
+    /** 文本域 */
+    public static final String HTML_TEXTAREA = "textarea";
+
+    /** 下拉框 */
+    public static final String HTML_SELECT = "select";
+
+    /** 单选框 */
+    public static final String HTML_RADIO = "radio";
+
+    /** 复选框 */
+    public static final String HTML_CHECKBOX = "checkbox";
+
+    /** 日期控件 */
+    public static final String HTML_DATETIME = "datetime";
+
+    /** 图片上传控件 */
+    public static final String HTML_IMAGE_UPLOAD = "imageUpload";
+
+    /** 文件上传控件 */
+    public static final String HTML_FILE_UPLOAD = "fileUpload";
+
+    /** 富文本控件 */
+    public static final String HTML_EDITOR = "editor";
+
+    /** 字符串类型 */
+    public static final String TYPE_STRING = "String";
+
+    /** 整型 */
+    public static final String TYPE_INTEGER = "Integer";
+
+    /** 长整型 */
+    public static final String TYPE_LONG = "Long";
+
+    /** 浮点型 */
+    public static final String TYPE_DOUBLE = "Double";
+
+    /** 高精度计算类型 */
+    public static final String TYPE_BIGDECIMAL = "BigDecimal";
+
+    /** 时间类型 */
+    public static final String TYPE_DATE = "Date";
+
+    /** 模糊查询 */
+    public static final String QUERY_LIKE = "LIKE";
+
+    /** 相等查询 */
+    public static final String QUERY_EQ = "EQ";
+
+    /** 需要 */
+    public static final String REQUIRE = "1";
+
+    /** 数据库字符串类型 */
+    public static final List<String> COLUMNTYPE_STR = Arrays.asList("char", "varchar", "nvarchar", "varchar2");
+
+    /** 数据库文本类型 */
+    public static final List<String> COLUMNTYPE_TEXT = Arrays.asList("tinytext", "text", "mediumtext", "longtext");
+
+    /** 数据库时间类型 */
+    public static final List<String> COLUMNTYPE_TIME = Arrays.asList(HTML_DATETIME, "time", "date", "timestamp");
+
+    /** 数据库数字类型 */
+    public static final List<String> COLUMNTYPE_NUMBER = Arrays.asList("tinyint", "smallint", "mediumint", "int", "number", "integer",
+            "bit", "bigint", "float", "double", "decimal");
+
+    /** 页面不需要编辑字段 */
+    public static final List<String> COLUMNNAME_NOT_EDIT = Arrays.asList("id", "create_by", "create_time", "del_flag");
+
+    /** 页面不需要显示的列表字段 */
+    public static final List<String> COLUMNNAME_NOT_LIST = Arrays.asList("id", "create_by", "create_time", "del_flag", "update_by",
+            "update_time");
+
+    /** 页面不需要查询字段 */
+    public static final List<String> COLUMNNAME_NOT_QUERY = Arrays.asList("id", "create_by", "create_time", "del_flag", "update_by",
+            "update_time", "remark");
+
+    /** Entity基类字段 */
+    public static final List<String> BASE_ENTITY = Arrays.asList("createBy", "createTime", "updateBy", "updateTime", "remark");
+
+    /** Tree基类字段 */
+    public static final List<String> TREE_ENTITY = Arrays.asList("parentName", "parentId", "orderNum", "ancestors");
+}

+ 94 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/HttpStatus.java

@@ -0,0 +1,94 @@
+package com.hdkj.common.core.constant;
+
+/**
+ * 返回状态码
+ * 
+ * @author ruoyi
+ */
+public class HttpStatus
+{
+    /**
+     * 操作成功
+     */
+    public static final int SUCCESS = 200;
+
+    /**
+     * 对象创建成功
+     */
+    public static final int CREATED = 201;
+
+    /**
+     * 请求已经被接受
+     */
+    public static final int ACCEPTED = 202;
+
+    /**
+     * 操作已经执行成功,但是没有返回数据
+     */
+    public static final int NO_CONTENT = 204;
+
+    /**
+     * 资源已被移除
+     */
+    public static final int MOVED_PERM = 301;
+
+    /**
+     * 重定向
+     */
+    public static final int SEE_OTHER = 303;
+
+    /**
+     * 资源没有被修改
+     */
+    public static final int NOT_MODIFIED = 304;
+
+    /**
+     * 参数列表错误(缺少,格式不匹配)
+     */
+    public static final int BAD_REQUEST = 400;
+
+    /**
+     * 未授权
+     */
+    public static final int UNAUTHORIZED = 401;
+
+    /**
+     * 访问受限,授权过期
+     */
+    public static final int FORBIDDEN = 403;
+
+    /**
+     * 资源,服务未找到
+     */
+    public static final int NOT_FOUND = 404;
+
+    /**
+     * 不允许的http方法
+     */
+    public static final int BAD_METHOD = 405;
+
+    /**
+     * 资源冲突,或者资源被锁
+     */
+    public static final int CONFLICT = 409;
+
+    /**
+     * 不支持的数据,媒体类型
+     */
+    public static final int UNSUPPORTED_TYPE = 415;
+
+    /**
+     * 系统内部错误
+     */
+    public static final int ERROR = 500;
+
+    /**
+     * 接口未实现
+     */
+    public static final int NOT_IMPLEMENTED = 501;
+
+    /**
+     * 系统警告消息
+     */
+    public static final int WARN = 601;
+}

+ 24 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/MessageErrorConstant.java

@@ -0,0 +1,24 @@
+package com.hdkj.common.core.constant;
+
+/**
+ * @Author: hyh
+ * @Date: 2025/9/10
+ * @Description:
+ */
+public class MessageErrorConstant {
+
+    public static final String GET_USER_ERROR = "获取用户信息失败!";
+    public static final String TEMPLATE_ELEMENT_RULE_NO_EXISTS = "评标模板要素规则不存在!";
+    public static final String TEMPLATE_ELEMENT_NO_EXISTS = "评标模板要素数据不能为空!";
+    public static final String TEMPLATE_NO_EXISTS = "评标模板数据不能为空!";
+    public static final String BID_BATCH_NO_EXISTS = "标段批次数据不能为空!";
+    public static final String ALL_TEMPLATE_NO_EXISTS = "暂无评标模板数据!";
+
+    public static final String FIRST_TEMPLATE_ELEMENT_NO_EXISTS = "初评-暂无评标模板要素数据!";
+    public static final String DETAIL_TEMPLATE_ELEMENT_NO_EXISTS = "详评-暂无评标模板要素数据!";
+    public static final String BATCH_ID_NO_EXISTS = "批次不能为空!";
+    public static final String EVALUATION_RESULT_NO_NULL = "暂无评标结果数据!";
+
+    public static final String BID_FB_BATCH_NO_EXISTS = "该批次分包批次信息不能为空!";
+
+}

+ 88 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/RegexPatternConstant.java

@@ -0,0 +1,88 @@
+package com.hdkj.common.core.constant;
+
+import java.util.regex.Pattern;
+
+/**
+ * @Description: 正则表达式常量类
+ * @Author: wenhao
+ * @Create: 2022/10/18 11:04
+ * @Version: 1.0
+ */
+public final class RegexPatternConstant {
+
+    public final static String BASIC_REGEX = "^[\\u4E00-\\u9FA5A-Za-z0-9_]+$"; //只允许中文、英文、数字包括下划线
+
+    public final static String EMAIL_REGEX = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"; //Email地址
+
+    public final static String URL_REGEX = "[a-zA-z]+://[^\\s]*"; //URL格式
+
+    public final static String MOBILE_PHONE_REGEX = "^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$"; //移动电话
+
+    public final static String FIX_PHONE_REGEX = "\\d{3}-\\d{8}|\\d{4}-\\d{7}"; //固定电话
+
+    public final static String IDENTITY_REGEX = "(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}[0-9Xx]$)|(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)"; //身份证格式
+
+    public final static String NORM_DATE_REGEX = "^\\d{4}-\\d{1,2}-\\d{1,2}"; //日期(年月日)格式
+
+    public final static String NORM_TIME_REGEX = "^\\d{1,2}:\\d{1,2}:\\d{1,2}"; //时间(时分秒)格式
+
+    public final static String NORM_DATETIME_REGEX = "^\\d{4}-\\d{1,2}-\\d{1,2}\\s\\d{1,2}:\\d{1,2}:\\d{1,2}"; //日期(年月日时分秒)格式
+
+    public final static String ACCOUNT_REGEX = "^[a-zA-Z][a-zA-Z0-9_]{4,15}$"; //账号必须以字母开头,允许5-16字节,允许字母数字下划线
+
+    public final static String CIPHER_REGEX = "^(?=.*\\d)(?=.*[a-zA-Z])(?=.*[^a-zA-Z0-9]).{8,16}$"; //密码必须包含字母、数字和特殊字符的组合,长度在8-16之间
+
+    public final static String CHINESE_REGEX = "[\\u4e00-\\u9fa5]+"; //中文内容格式
+
+    public final static String DOUBLE_BYTE_REGEX = "[^\\x00-\\xff]{0,}$"; //双字节内容格式
+
+    public final static String ZIP_CODE_REGEX = "[1-9]\\d{5}(?!\\d)"; //邮政编码格式
+
+    public final static String IP_ADDRESS_REGEX = "\\d+\\.\\d+\\.\\d+\\.\\d+"; //IP地址格式
+
+    public final static String NONZERO_NUMBER_REGEX = "^[1-9]\\d{0,}$"; //非零数字格式
+
+    public final static String NORM_YEAR_REGEX = "^\\d{4}"; //日期(年)格式
+
+    public final static String NUM_FLOAT_REGEX = "^(100|[1-9]?\\d(\\.\\d\\d?\\d?)?)$"; //纯数字且包含小数点
+
+    public final static String MONEY_ALL_REGEX = "^([0-9]|([1-9][0-9]{0,9}))(\\.[0-9]{1,6})?$"; //金额,整数不超过10位,小数不超过6位,包含0
+
+    public final static String MONEY_REGEX = "^(([1-9][0-9]{0,9}(\\.[0-9]{1,6})?)|(0\\.[0-9]{1,6}))$"; //金额,整数不超过10位,小数不超过6位,大于0
+
+    public final static String KH_REGEX = "\\((.*?)\\)|\\((.*?)\\)"; //括号(中英文)
+
+    public final static String BIRTHDAY_REGEX = "^((?:19[2-9]\\d{1})|(?:20(?:(?:0[0-9])|(?:1[0-8]))))((?:0?[1-9])|(?:1[0-2]))((?:0?[1-9])|(?:[1-2][0-9])|30|31)$"; //出生日期
+
+    public final static String BATCH_NO_REGEX = "(?:\\(|()?([A-Z0-9]{2}\\d{2}[A-Z0-9]{2})(?:\\)|))?";//校验批次号,第3、4位可获取到年份
+
+    public final static String SCHEMA_GROUP_NAME_REGEX = "[((].*?[))]";
+
+    public final static String BIDNUM_WITH_PACK_REGEX = "分标编号[::]?\\s*(\\d+[-\\d]*)\\s*";
+
+    public final static String GROUP_NAME_INFO_REGEX = "^[^,,]+";
+
+    public static final Pattern CONTAINS_NUMBER = Pattern.compile(".*\\d+.*"); //字符串是否包含数字
+
+    public static final Pattern CONTAINS_NUMBER_SIGNED = Pattern.compile("[+-]?\\d+(?:\\.\\d+)?"); //字符串是否包含正负号的数字
+
+    public static final Pattern INTEGER_RANGE = Pattern.compile("^\\[\\d+,\\d+\\]$"); //整数范围
+
+    public static final Pattern DECIMAL_RANGE = Pattern.compile("^\\[\\d+,\\d+\\]\\.\\d+$"); //小数范围
+
+    // 1.检测首尾的长数字串(长度>=4),截取保留中文部分重新再查一次
+    public static final Pattern BOUNDARY_DIGITS = Pattern.compile("^\\d{4,}.*|.*\\d{4,}$");
+
+    public static final Pattern AHEAD_NUMBER = Pattern.compile("\\d+(?:\\.\\d+)?(?=\\[|\\()");
+
+    public static final Pattern CONTAINS_BATCH_NO = Pattern.compile("\\d+");
+
+    public static final Pattern TECHNICAL_GROUP_NAME_PATTERN = Pattern.compile(".*技术(一|二|三|四|五|六|七|八|九|十)组.*");
+
+    public static final Pattern BUSINESS_GROUP_NAME_PATTERN = Pattern.compile(".*商务(一|二|三|四|五|六|七|八|九|十)组.*");
+
+    public final static String BATCH_WITH_BID_NUMBER_REGEX = "^([A-Z0-9]+)-";
+
+    public final static String EXPERT_GROUP_NAME_REGEX = "^(技术|商务)([一二三四五六七八九十百千万零]{1,})组";
+
+}

+ 50 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/ScheduleConstants.java

@@ -0,0 +1,50 @@
+package com.hdkj.common.core.constant;
+
+/**
+ * 任务调度通用常量
+ * 
+ * @author ruoyi
+ */
+public class ScheduleConstants
+{
+    public static final String TASK_CLASS_NAME = "TASK_CLASS_NAME";
+
+    /** 执行目标key */
+    public static final String TASK_PROPERTIES = "TASK_PROPERTIES";
+
+    /** 默认 */
+    public static final String MISFIRE_DEFAULT = "0";
+
+    /** 立即触发执行 */
+    public static final String MISFIRE_IGNORE_MISFIRES = "1";
+
+    /** 触发一次执行 */
+    public static final String MISFIRE_FIRE_AND_PROCEED = "2";
+
+    /** 不触发立即执行 */
+    public static final String MISFIRE_DO_NOTHING = "3";
+
+    public enum Status
+    {
+        /**
+         * 正常
+         */
+        NORMAL("0"),
+        /**
+         * 暂停
+         */
+        PAUSE("1");
+
+        private String value;
+
+        private Status(String value)
+        {
+            this.value = value;
+        }
+
+        public String getValue()
+        {
+            return value;
+        }
+    }
+}

+ 54 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/SecurityConstants.java

@@ -0,0 +1,54 @@
+package com.hdkj.common.core.constant;
+
+/**
+ * 权限相关通用常量
+ * 
+ * @author ruoyi
+ */
+public class SecurityConstants
+{
+    /**
+     * 用户ID字段
+     */
+    public static final String DETAILS_USER_ID = "user_id";
+
+    /**
+     * 用户名字段
+     */
+    public static final String DETAILS_USERNAME = "username";
+
+    /**
+     * 授权信息字段
+     */
+    public static final String AUTHORIZATION_HEADER = "Authorization";
+
+    /**
+     * 请求来源
+     */
+    public static final String FROM_SOURCE = "from-source";
+
+    /**
+     * 内部请求
+     */
+    public static final String INNER = "inner";
+
+    /**
+     * 用户标识
+     */
+    public static final String USER_KEY = "user_key";
+
+    /**
+     * 登录用户
+     */
+    public static final String LOGIN_USER = "login_user";
+
+    /**
+     * 角色权限
+     */
+    public static final String ROLE_PERMISSION = "role_permission";
+
+    /**
+     * 主账号
+     */
+    public static final String MAIN_USER = "0";
+}

+ 24 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/ServiceNameConstants.java

@@ -0,0 +1,24 @@
+package com.hdkj.common.core.constant;
+
+/**
+ * 服务名称
+ * 
+ * @author ruoyi
+ */
+public class ServiceNameConstants
+{
+    /**
+     * 认证服务的serviceid
+     */
+    public static final String AUTH_SERVICE = "ruoyi-auth";
+
+    /**
+     * 系统模块的serviceid
+     */
+    public static final String SYSTEM_SERVICE = "ruoyi-system";
+
+    /**
+     * 文件服务的serviceid
+     */
+    public static final String FILE_SERVICE = "ruoyi-file";
+}

+ 20 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/TokenConstants.java

@@ -0,0 +1,20 @@
+package com.hdkj.common.core.constant;
+
+/**
+ * Token的Key常量
+ * 
+ * @author ruoyi
+ */
+public class TokenConstants
+{
+    /**
+     * 令牌前缀
+     */
+    public static final String PREFIX = "Bearer ";
+
+    /**
+     * 令牌秘钥
+     */
+    public final static String SECRET = "abcdefghijklmnopqrstuvwxyz";
+
+}

+ 83 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constant/UserConstants.java

@@ -0,0 +1,83 @@
+package com.hdkj.common.core.constant;
+
+/**
+ * 用户常量信息
+ * 
+ * @author ruoyi
+ */
+public class UserConstants
+{
+    /**
+     * 平台内系统用户的唯一标志
+     */
+    public static final String SYS_USER = "SYS_USER";
+
+    /** 正常状态 */
+    public static final String NORMAL = "0";
+
+    /** 异常状态 */
+    public static final String EXCEPTION = "1";
+
+    /** 用户封禁状态 */
+    public static final String USER_DISABLE = "1";
+
+    /** 角色正常状态 */
+    public static final String ROLE_NORMAL = "0";
+
+    /** 角色封禁状态 */
+    public static final String ROLE_DISABLE = "1";
+
+    /** 部门正常状态 */
+    public static final String DEPT_NORMAL = "0";
+
+    /** 部门停用状态 */
+    public static final String DEPT_DISABLE = "1";
+
+    /** 字典正常状态 */
+    public static final String DICT_NORMAL = "0";
+
+    /** 是否为系统默认(是) */
+    public static final String YES = "Y";
+
+    /** 是否菜单外链(是) */
+    public static final String YES_FRAME = "0";
+
+    /** 是否菜单外链(否) */
+    public static final String NO_FRAME = "1";
+
+    /** 菜单类型(目录) */
+    public static final String TYPE_DIR = "M";
+
+    /** 菜单类型(菜单) */
+    public static final String TYPE_MENU = "C";
+
+    /** 菜单类型(按钮) */
+    public static final String TYPE_BUTTON = "F";
+
+    /** Layout组件标识 */
+    public final static String LAYOUT = "Layout";
+
+    /** ParentView组件标识 */
+    public final static String PARENT_VIEW = "ParentView";
+
+    /** InnerLink组件标识 */
+    public final static String INNER_LINK = "InnerLink";
+
+    /** 校验是否唯一的返回标识 */
+    public final static boolean UNIQUE = true;
+    public final static boolean NOT_UNIQUE = false;
+
+    /**
+     * 用户名长度限制
+     */
+    public static final int USERNAME_MIN_LENGTH = 2;
+
+    public static final int USERNAME_MAX_LENGTH = 20;
+
+    /**
+     * 密码长度限制
+     */
+    public static final int PASSWORD_MIN_LENGTH = 5;
+
+    public static final int PASSWORD_MAX_LENGTH = 20;
+}

+ 88 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constraints/EnumValidator.java

@@ -0,0 +1,88 @@
+package com.hdkj.common.core.constraints;
+
+import com.hdkj.common.core.annotation.EnumValid;
+import com.hdkj.common.core.enums.BaseValidEnum;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: 枚举校验器
+ * @Author: wenhao
+ * @Create: 2022/08/15 11:16
+ * @Version: 1.0
+ */
+public class EnumValidator implements ConstraintValidator<EnumValid, Object> {
+
+    private Class<?> enumClass;
+
+    @Override
+    public void initialize(EnumValid enumValid) {
+        this.enumClass = enumValid.enumClass();
+    }
+
+    @Override
+    public boolean isValid(Object value, ConstraintValidatorContext context) {
+        Class<?>[] interfaces = enumClass.getInterfaces();
+        if (!needValidate(interfaces)) {
+            return true;
+        }
+        try {
+            return validate(value);
+        } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+
+    /**
+     * 是否需要校验,只有实现了BaseValidEnum接口,才需要校验
+     *
+     * @param interfaces
+     * @return
+     */
+    private boolean needValidate(Class<?>[] interfaces) {
+        for (Class<?> inter : interfaces) {
+            if (inter.getName().equals(BaseValidEnum.class.getName())) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean validate(Object value) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
+        Method valuesMethod = enumClass.getMethod(BaseValidEnum.VALUES_METHOD);
+        if (Objects.isNull(valuesMethod)) {
+            return true;
+        }
+        // 如果是空时 交给NotEmpty等注解判断
+        if (Objects.isNull(value) || Objects.equals(StringUtils.EMPTY, value)) {
+            return true;
+        }
+        BaseValidEnum<?>[] validEnums = (BaseValidEnum<?>[]) valuesMethod.invoke(null);
+        List<Object> validValues = Arrays.stream(Optional.of(value).map(e -> e.toString().split(",")).orElse(null))
+                .collect(Collectors.toList());
+        for (Object validValue : validValues) {
+            boolean validRes = false; //枚举值比对,默认比对值错误
+            for (BaseValidEnum<?> validEnum : validEnums) {
+                if (Objects.equals(validEnum.getCode(), validValue)) {
+                    validRes = true; //相同比对成功
+                    break;
+                }
+            }
+            if (!validRes) { //只要是有一次比对错误就给 校验结果赋值,多次赋值也没关系
+                return false;
+            }
+        }
+        return true;
+    }
+
+}

+ 57 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/constraints/StringContentValidator.java

@@ -0,0 +1,57 @@
+package com.hdkj.common.core.constraints;
+
+import com.hdkj.common.core.annotation.RegexValid;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.Optional;
+import java.util.regex.Pattern;
+
+/**
+ * @Description:
+ * @Author: wenhao
+ * @Create: 2022/10/17 14:26
+ * @Version: 1.0
+ */
+public class StringContentValidator implements ConstraintValidator<RegexValid, String> {
+
+    private RegexValid regexValid;
+
+    @Override
+    public void initialize(RegexValid regexValid) {
+        this.regexValid = regexValid;
+    }
+
+    @Override
+    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
+        // 如果value为空则不进行格式验证,为空验证可以使用 @NotBlank @NotNull @NotEmpty 等注解来进行控制,职责分离
+        if (StringUtils.isBlank(value)) {
+            return true;
+        }
+        // 校验指定值是否正确
+        String validValueStr = Optional.of(regexValid.value()).orElse(StringUtils.EMPTY);
+        if (StringUtils.isNotBlank(validValueStr)) {
+            for (String inputValue : value.split(",")) {
+                boolean validRes = false; //默认校验不通过
+                for (String validValue : validValueStr.split(",")) {
+                    if (StringUtils.equals(inputValue, validValue)) {
+                        validRes = true;
+                        break;
+                    }
+                }
+                if (!validRes) { //只要是有一次比对错误就给 校验结果赋值,多次赋值也没关系
+                    return false;
+                }
+            }
+            return true;
+        }
+        // 校验正则是否匹配
+        String validRegex = Optional.of(regexValid.regex()).orElse(StringUtils.EMPTY);
+        if (StringUtils.isNotBlank(validRegex)) {
+            return Pattern.matches(validRegex, value);
+        }
+        return true;
+    }
+
+}

+ 99 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/context/SecurityContextHolder.java

@@ -0,0 +1,99 @@
+package com.hdkj.common.core.context;
+
+import com.alibaba.ttl.TransmittableThreadLocal;
+import com.hdkj.common.core.constant.SecurityConstants;
+import com.hdkj.common.core.text.Convert;
+import com.hdkj.common.core.utils.StringUtils;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 获取当前线程变量中的 用户id、用户名称、Token等信息 
+ * 注意: 必须在网关通过请求头的方法传入,同时在HeaderInterceptor拦截器设置值。 否则这里无法获取
+ *
+ * @author ruoyi
+ */
+public class SecurityContextHolder
+{
+    private static final TransmittableThreadLocal<Map<String, Object>> THREAD_LOCAL = new TransmittableThreadLocal<>();
+
+    public static void set(String key, Object value)
+    {
+        Map<String, Object> map = getLocalMap();
+        map.put(key, value == null ? StringUtils.EMPTY : value);
+    }
+
+    public static String get(String key)
+    {
+        Map<String, Object> map = getLocalMap();
+        return Convert.toStr(map.getOrDefault(key, StringUtils.EMPTY));
+    }
+
+    public static <T> T get(String key, Class<T> clazz)
+    {
+        Map<String, Object> map = getLocalMap();
+        return StringUtils.cast(map.getOrDefault(key, null));
+    }
+
+    public static Map<String, Object> getLocalMap()
+    {
+        Map<String, Object> map = THREAD_LOCAL.get();
+        if (map == null)
+        {
+            map = new ConcurrentHashMap<String, Object>();
+            THREAD_LOCAL.set(map);
+        }
+        return map;
+    }
+
+    public static void setLocalMap(Map<String, Object> threadLocalMap)
+    {
+        THREAD_LOCAL.set(threadLocalMap);
+    }
+
+    public static Long getUserId()
+    {
+        return Convert.toLong(get(SecurityConstants.DETAILS_USER_ID), 0L);
+    }
+
+    public static void setUserId(String account)
+    {
+        set(SecurityConstants.DETAILS_USER_ID, account);
+    }
+
+    public static String getUserName()
+    {
+        return get(SecurityConstants.DETAILS_USERNAME);
+    }
+
+    public static void setUserName(String username)
+    {
+        set(SecurityConstants.DETAILS_USERNAME, username);
+    }
+
+    public static String getUserKey()
+    {
+        return get(SecurityConstants.USER_KEY);
+    }
+
+    public static void setUserKey(String userKey)
+    {
+        set(SecurityConstants.USER_KEY, userKey);
+    }
+
+    public static String getPermission()
+    {
+        return get(SecurityConstants.ROLE_PERMISSION);
+    }
+
+    public static void setPermission(String permissions)
+    {
+        set(SecurityConstants.ROLE_PERMISSION, permissions);
+    }
+
+    public static void remove()
+    {
+        THREAD_LOCAL.remove();
+    }
+}

+ 54 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/domain/PaginationParam.java

@@ -0,0 +1,54 @@
+package com.hdkj.common.core.domain;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description: 在前后端交互时,如果使用mybatis plus的分页对象Page作为控制层请求参数时,未对分页参数进行合法校验,此处是为了重写分页属性,对属性进行合法校验
+ * @Author: wenhao
+ * @Create: 2022/10/22 12:51
+ * @Version: 1.0
+ */
+@ApiModel(value = "分页查询公共类")
+public class PaginationParam<T> extends Page<T> {
+
+    @ApiModelProperty(value = "当前页码", required = true)
+    @NotNull(message = "当前页码不能为空")
+    @Min(value = 1L, message = "当前页面参数必须大于等于1")
+    @Max(value = Long.MAX_VALUE, message = "当前页面参数输入过大")
+    private Long current;
+
+    @ApiModelProperty(value = "每页显示记录数", required = true)
+    @NotNull(message = "每页显示记录数不能为空")
+    @Min(value = 1L, message = "每页显示记录数参数必须大于等于1")
+    @Max(value = Long.MAX_VALUE, message = "每页显示记录数参数输入过大")
+    private Long size;
+
+    @Override
+    public long getCurrent() {
+        return this.current;
+    }
+
+    @Override
+    public Page<T> setCurrent(long current) {
+        this.current = current;
+        return super.setCurrent(current);
+    }
+
+    @Override
+    public long getSize() {
+        return this.size;
+    }
+
+    @Override
+    public Page<T> setSize(long size) {
+        this.size = size;
+        return super.setSize(size);
+    }
+
+}

+ 102 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/domain/R.java

@@ -0,0 +1,102 @@
+package com.hdkj.common.core.domain;
+
+import com.hdkj.common.core.constant.Constants;
+
+import java.io.Serializable;
+
+/**
+ * 响应信息主体
+ *
+ * @author ruoyi
+ */
+public class R<T> implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 成功
+     */
+    public static final int SUCCESS = Constants.SUCCESS;
+
+    /**
+     * 失败
+     */
+    public static final int FAILURE = Constants.FAIL;
+
+    private int code;
+
+    private String msg;
+
+    private T data;
+
+    public static <T> R<T> ok() {
+        return restResult(null, SUCCESS, null);
+    }
+
+    public static <T> R<T> ok(T data) {
+        return restResult(data, SUCCESS, null);
+    }
+
+    public static <T> R<T> ok(T data, String msg) {
+        return restResult(data, SUCCESS, msg);
+    }
+
+    public static <T> R<T> fail() {
+        return restResult(null, FAILURE, null);
+    }
+
+    public static <T> R<T> fail(String msg) {
+        return restResult(null, FAILURE, msg);
+    }
+
+    public static <T> R<T> fail(T data) {
+        return restResult(data, FAILURE, null);
+    }
+
+    public static <T> R<T> fail(T data, String msg) {
+        return restResult(data, FAILURE, msg);
+    }
+
+    public static <T> R<T> fail(int code, String msg) {
+        return restResult(null, code, msg);
+    }
+
+    private static <T> R<T> restResult(T data, int code, String msg) {
+        R<T> apiResult = new R<>();
+        apiResult.setCode(code);
+        apiResult.setData(data);
+        apiResult.setMsg(msg);
+        return apiResult;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+
+    public static <T> Boolean isError(R<T> ret) {
+        return !isSuccess(ret);
+    }
+
+    public static <T> Boolean isSuccess(R<T> ret) {
+        return R.SUCCESS == ret.getCode();
+    }
+}

+ 32 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/enums/AutoScoreStatusEnum.java

@@ -0,0 +1,32 @@
+package com.hdkj.common.core.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @Description:
+ * @Author: wenhao
+ * @Create: 2025/10/05 10:02
+ * @Version: 1.0
+ */
+@Getter
+@AllArgsConstructor
+public enum AutoScoreStatusEnum implements BaseValidEnum<String> {
+    /**
+     * 未开启
+     */
+    NOT_STARTED("0", "未评审"),
+    /**
+     * 评审中
+     */
+    UNDER_REVIEW("1", "评审中"),
+    /**
+     * 评审完成
+     */
+    REVIEW_COMPLETED("2", "评审完成");
+
+    private final String code;
+
+    private final String desc;
+
+}

+ 50 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/enums/BaseValidEnum.java

@@ -0,0 +1,50 @@
+package com.hdkj.common.core.enums;
+
+import lombok.SneakyThrows;
+import org.apache.commons.lang3.StringUtils;
+
+import java.lang.reflect.Method;
+
+/**
+ * @Description: 枚举数据校验接口
+ * @Author: wenhao
+ * @Create: 2022/08/14 11:04
+ * @Version: 1.0
+ */
+public interface BaseValidEnum<T> {
+
+    String VALUES_METHOD = "values";
+
+    T getCode();
+
+    String getDesc();
+
+    // 根据code获取枚举类实例
+    @SneakyThrows(ReflectiveOperationException.class)
+    static <T> BaseValidEnum<T> getByCode(T code, Class<?> clazz) {
+        Method valuesMethod = clazz.getMethod(VALUES_METHOD);
+        BaseValidEnum<T>[] validEnums = (BaseValidEnum<T>[]) valuesMethod.invoke(null);
+        for (BaseValidEnum<T> value : validEnums) {
+            if (StringUtils.equals(String.valueOf(value.getCode()), String.valueOf(code))) {
+                return value;
+            }
+        }
+//        ExceptionCast.cast(String.format("请检查code:%s对应明细值是否配置", code));
+        return null;
+    }
+
+    // 根据desc获取枚举类实例
+    @SneakyThrows(ReflectiveOperationException.class)
+    static <T> BaseValidEnum<T> getByDesc(String desc, Class<?> clazz) {
+        Method valuesMethod = clazz.getMethod(VALUES_METHOD);
+        BaseValidEnum<T>[] validEnums = (BaseValidEnum<T>[]) valuesMethod.invoke(null);
+        for (BaseValidEnum<T> value : validEnums) {
+            if (StringUtils.equals(value.getDesc(), desc)) {
+                return value;
+            }
+        }
+//        ExceptionCast.cast(String.format("请检查desc:%s对应明细值是否配置", code));
+        return null;
+    }
+
+}

+ 36 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/enums/ElementTypeEnum.java

@@ -0,0 +1,36 @@
+package com.hdkj.common.core.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @Description:
+ * @Author: wenhao
+ * @Create: 2025/03/31 21:02
+ * @Version: 1.0
+ */
+@Getter
+@AllArgsConstructor
+public enum ElementTypeEnum implements BaseValidEnum<String> {
+    /**
+     * 商务初评
+     */
+    BUSINESS_INITIAL_EVALUATION("1", "商务初评"),
+    /**
+     * 商务详评
+     */
+    BUSINESS_DETAIL_EVALUATION("2", "商务详评"),
+    /**
+     * 技术初评
+     */
+    TECHNICAL_INITIAL_EVALUATION("3", "技术初评"),
+    /**
+     * 技术详评
+     */
+    TECHNICAL_DETAIL_EVALUATION("4", "技术详评");
+
+    private final String code;
+
+    private final String desc;
+
+}

+ 44 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/enums/GradeTypeEnum.java

@@ -0,0 +1,44 @@
+package com.hdkj.common.core.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @Description:
+ * @Author: wenhao
+ * @Create: 2025/03/31 21:02
+ * @Version: 1.0
+ */
+@Getter
+@AllArgsConstructor
+public enum GradeTypeEnum implements BaseValidEnum<String> {
+    /**
+     * 输入(无限制的)
+     */
+    INPUT_ARBITRARY("1", "输入(无限制的)"),
+    /**
+     * 下拉
+     */
+    PULL_DOWN("2", "下拉(包括:分值、是/否、有/无、合格/不合格)"),
+    /**
+     * 限制输入分值(整数)
+     */
+    INPUT_SCORE_INTEGER("3", "限制输入分值(整数)"),
+    /**
+     * 限制输入分值(小数)
+     */
+    INPUT_SCORE_DECIMAL("4", "限制输入分值(小数)"),
+    /**
+     * 联动数据-关联数据
+     */
+    LINKED_DATA("5", "联动数据-关联数据(场景:详评直接关联初评某一列的数据)"),
+    /**
+     * 联动数据-原始数据
+     */
+    ORIGINAL_DATA("6", "联动数据-原始数据(场景:输入的初评数据直接赋值给详评)");
+
+    private final String code;
+
+    private final String desc;
+
+}

+ 28 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/enums/GroupTypeEnum.java

@@ -0,0 +1,28 @@
+package com.hdkj.common.core.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @Description: 专家组类型
+ * @Author: wenhao
+ * @Create: 2025/03/01 14:16
+ * @Version: 1.0
+ */
+@Getter
+@AllArgsConstructor
+public enum GroupTypeEnum implements BaseValidEnum<String> {
+    /**
+     * 技术
+     */
+    TECHNICAL("1", "技术"),
+    /**
+     * 商务
+     */
+    BUSINESS("2", "商务");
+
+    private final String code;
+
+    private final String desc;
+
+}

+ 28 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/enums/ImportErrorTypeEnum.java

@@ -0,0 +1,28 @@
+package com.hdkj.common.core.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @Description:
+ * @Author: wenhao
+ * @Create: 2025/09/04 14:30
+ * @Version: 1.0
+ */
+@Getter
+@AllArgsConstructor
+public enum ImportErrorTypeEnum {
+    /**
+     * 模板错误
+     */
+    TEMPLATE_ERROR("1", "模板错误"),
+    /**
+     * 数据错误
+     */
+    DATA_ERROR("2", "数据错误");
+
+    private final String code;
+
+    private final String desc;
+
+}

+ 32 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/enums/InitialEvaluationResultEnum.java

@@ -0,0 +1,32 @@
+package com.hdkj.common.core.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @Description:
+ * @Author: wenhao
+ * @Create: 2025/03/28 15:31
+ * @Version: 1.0
+ */
+@Getter
+@AllArgsConstructor
+public enum InitialEvaluationResultEnum implements BaseValidEnum<String> {
+    /**
+     * 合格
+     */
+    QUALIFIED("1", "合格"),
+    /**
+     * 不合格
+     */
+    DISQUALIFIED("0", "不合格"),
+    /**
+     * 部分合格
+     */
+    PART_QUALIFIED("2", "部分合格");
+
+    private final String code;
+
+    private final String desc;
+
+}

+ 70 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/enums/ProjectFileEnum.java

@@ -0,0 +1,70 @@
+package com.hdkj.common.core.enums;
+
+import com.hdkj.common.core.constant.Constants;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @Description: 项目文件枚举类,指定文件所在路径和文件名称
+ * @Author: wenhao
+ * @Create: 2025/03/01 8:25
+ * @Version: 1.0
+ */
+@Getter
+@AllArgsConstructor
+public enum ProjectFileEnum {
+
+    /**
+     * 文件下载客户端
+     */
+    DOWNLOAD_CLIENT_EXE("sys/", "文件下载客户端.exe"),
+    /**
+     * 评标专家信息
+     */
+    EXPERT_INFO_TEMPLATE(Constants.PROJECT_FILE_PATH_TEMPLATE, "评标专家信息.xlsx"),
+    /**
+     * 评标专家信息导出模板
+     */
+    EXPERT_INFO_EXPORT_TEMPLATE(Constants.PROJECT_FILE_PATH_TEMPLATE, "评标专家信息导出模板.xlsx"),
+    /**
+     * 专家抽取方案
+     */
+    EXTRACT_SCHEMA_TEMPLATE(Constants.PROJECT_FILE_PATH_TEMPLATE, "专家抽取方案.xlsx"),
+    /**
+     * 阅标记录-商务组
+     */
+    BUSINESS_BID_READING_TEMPLATE(Constants.PROJECT_FILE_PATH_TEMPLATE, "阅标记录-商务组.xlsx"),
+    /**
+     * 阅标记录-技术组
+     */
+    TECH_BID_READING_TEMPLATE(Constants.PROJECT_FILE_PATH_TEMPLATE, "阅标记录-技术组.xlsx"),
+    /**
+     * 专家分组信息
+     */
+    EXPERT_GROUP_TEMPLATE(Constants.PROJECT_FILE_PATH_TEMPLATE, "专家分组信息.xls"),
+    /**
+     * 评标委员会导入
+     */
+    COMMITTEE_TEMPLATE(Constants.PROJECT_FILE_PATH_TEMPLATE, "评标委员会导入.xlsx"),
+    /**
+     * 法律监察人员导入
+     */
+    LEGAL_SUPERVISE_TEMPLATE(Constants.PROJECT_FILE_PATH_TEMPLATE, "法律监察人员导入.xlsx"),
+    /**
+     * 阅标记录导入模板
+     */
+    BID_READ_RECORD_TEMPLATE(Constants.PROJECT_FILE_PATH_TEMPLATE, "阅标记录导入模板.zip"),
+    /**
+     * 不良行为导入模板
+     */
+    BAD_BEHAVIOR_TEMPLATE(Constants.PROJECT_FILE_PATH_TEMPLATE, "不良行为导入模板.xls"),
+    /**
+     * 供应商绩效评价导入模版
+     */
+    SUPPLIER_PERFORMANCE_TEMPLATE("download/", "供应商绩效评价导入模版.xlsx");
+
+    private final String path; //文件位于classpath下的路径
+
+    private final String fileName; //文件名称
+
+}

+ 34 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/enums/ScheduleType.java

@@ -0,0 +1,34 @@
+package com.hdkj.common.core.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author : luotingyu
+ * @version : 1.0
+ * @description : 开标一览表目录类型枚举类
+ * @createTime : 2025/8/21
+ */
+@Getter
+@AllArgsConstructor
+public enum ScheduleType {
+
+    //根目录
+    ROOT(1, "ROOT_DIRECTORY_ID", "根目录"),
+    //标段
+    BIDNUM(2, "BIDNUM_DIRECTORY_ID", "标段"),
+    //包
+    PACK(3, "PACK_DIRECTORY_ID", "包"),
+    //厂商
+    UNIT(4, "UNIT_DIRECTORY_ID", "厂商");
+
+    //编码
+    private final Integer code;
+
+    //层级名称
+    private final String name;
+
+    //层级英文名称
+    private final String msg;
+
+}

+ 41 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/enums/UserStatus.java

@@ -0,0 +1,41 @@
+package com.hdkj.common.core.enums;
+
+/**
+ * 用户状态
+ * 
+ * @author ruoyi
+ */
+public enum UserStatus
+{
+    /**
+     * 正常
+     */
+    OK("0", "正常"),
+    /**
+     * 停用
+     */
+    DISABLE("1", "停用"),
+    /**
+     * 删除
+     */
+    DELETED("2", "删除");
+
+    private final String code;
+    private final String info;
+
+    UserStatus(String code, String info)
+    {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
+    public String getInfo()
+    {
+        return info;
+    }
+}

+ 28 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/enums/YesOrNoEnum.java

@@ -0,0 +1,28 @@
+package com.hdkj.common.core.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @Description: 是和否枚举
+ * @Author: wenhao
+ * @Create: 2025/03/01 14:16
+ * @Version: 1.0
+ */
+@Getter
+@AllArgsConstructor
+public enum YesOrNoEnum implements BaseValidEnum<String> {
+    /**
+     * 是
+     */
+    YES("1", "是"),
+    /**
+     * 否
+     */
+    NO("0", "否");
+
+    private final String code;
+
+    private final String desc;
+
+}

+ 16 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/exception/CaptchaException.java

@@ -0,0 +1,16 @@
+package com.hdkj.common.core.exception;
+
+/**
+ * 验证码错误异常类
+ * 
+ * @author ruoyi
+ */
+public class CaptchaException extends RuntimeException
+{
+    private static final long serialVersionUID = 1L;
+
+    public CaptchaException(String msg)
+    {
+        super(msg);
+    }
+}

+ 31 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/exception/CheckedException.java

@@ -0,0 +1,31 @@
+package com.hdkj.common.core.exception;
+
+/**
+ * 检查异常
+ * 
+ * @author ruoyi
+ */
+public class CheckedException extends RuntimeException
+{
+    private static final long serialVersionUID = 1L;
+
+    public CheckedException(String message)
+    {
+        super(message);
+    }
+
+    public CheckedException(Throwable cause)
+    {
+        super(cause);
+    }
+
+    public CheckedException(String message, Throwable cause)
+    {
+        super(message, cause);
+    }
+
+    public CheckedException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace)
+    {
+        super(message, cause, enableSuppression, writableStackTrace);
+    }
+}

+ 16 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/exception/DemoModeException.java

@@ -0,0 +1,16 @@
+package com.hdkj.common.core.exception;
+
+/**
+ * 演示模式异常
+ *
+ * @author ruoyi
+ */
+public class DemoModeException extends RuntimeException {
+
+    private static final long serialVersionUID = 1L;
+
+    public DemoModeException() {
+        // do something
+    }
+
+}

+ 58 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/exception/GlobalException.java

@@ -0,0 +1,58 @@
+package com.hdkj.common.core.exception;
+
+/**
+ * 全局异常
+ * 
+ * @author ruoyi
+ */
+public class GlobalException extends RuntimeException
+{
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 错误提示
+     */
+    private String message;
+
+    /**
+     * 错误明细,内部调试错误
+     *
+     * 和 {@link CommonResult#getDetailMessage()} 一致的设计
+     */
+    private String detailMessage;
+
+    /**
+     * 空构造方法,避免反序列化问题
+     */
+    public GlobalException()
+    {
+    }
+
+    public GlobalException(String message)
+    {
+        this.message = message;
+    }
+
+    public String getDetailMessage()
+    {
+        return detailMessage;
+    }
+
+    public GlobalException setDetailMessage(String detailMessage)
+    {
+        this.detailMessage = detailMessage;
+        return this;
+    }
+
+    @Override
+    public String getMessage()
+    {
+        return message;
+    }
+
+    public GlobalException setMessage(String message)
+    {
+        this.message = message;
+        return this;
+    }
+}

+ 16 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/exception/InnerAuthException.java

@@ -0,0 +1,16 @@
+package com.hdkj.common.core.exception;
+
+/**
+ * 内部认证异常
+ * 
+ * @author ruoyi
+ */
+public class InnerAuthException extends RuntimeException
+{
+    private static final long serialVersionUID = 1L;
+
+    public InnerAuthException(String message)
+    {
+        super(message);
+    }
+}

+ 16 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/exception/PreAuthorizeException.java

@@ -0,0 +1,16 @@
+package com.hdkj.common.core.exception;
+
+/**
+ * 权限异常
+ *
+ * @author ruoyi
+ */
+public class PreAuthorizeException extends RuntimeException {
+
+    private static final long serialVersionUID = 1L;
+
+    public PreAuthorizeException() {
+        // do something
+    }
+
+}

+ 74 - 0
common/ruoyi-common-core/src/main/java/com/hdkj/common/core/exception/ServiceException.java

@@ -0,0 +1,74 @@
+package com.hdkj.common.core.exception;
+
+/**
+ * 业务异常
+ * 
+ * @author ruoyi
+ */
+public final class ServiceException extends RuntimeException
+{
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 错误码
+     */
+    private Integer code;
+
+    /**
+     * 错误提示
+     */
+    private String message;
+
+    /**
+     * 错误明细,内部调试错误
+     *
+     * 和 {@link CommonResult#getDetailMessage()} 一致的设计
+     */
+    private String detailMessage;
+
+    /**
+     * 空构造方法,避免反序列化问题
+     */
+    public ServiceException()
+    {
+    }
+
+    public ServiceException(String message)
+    {
+        this.message = message;
+    }
+
+    public ServiceException(String message, Integer code)
+    {
+        this.message = message;
+        this.code = code;
+    }
+
+    public String getDetailMessage()
+    {
+        return detailMessage;
+    }
+
+    @Override
+    public String getMessage()
+    {
+        return message;
+    }
+
+    public Integer getCode()
+    {
+        return code;
+    }
+
+    public ServiceException setMessage(String message)
+    {
+        this.message = message;
+        return this;
+    }
+
+    public ServiceException setDetailMessage(String detailMessage)
+    {
+        this.detailMessage = detailMessage;
+        return this;
+    }
+}

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini