shc 5 місяців тому
батько
коміт
cd65149e6a

+ 237 - 237
hnqz-common/hnqz-common-bom/pom.xml

@@ -1,245 +1,245 @@
 <?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>
-        <artifactId>cloud-dependencies-parent</artifactId>
-        <groupId>com.qunzhixinxi</groupId>
-        <version>1.0.0</version>
-        <relativePath/>
-    </parent>
+  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>
+    <artifactId>cloud-dependencies-parent</artifactId>
+    <groupId>com.qunzhixinxi</groupId>
+    <version>1.0.0</version>
+    <relativePath/>
+  </parent>
 
-    <artifactId>hnqz-common-bom</artifactId>
-    <packaging>pom</packaging>
-    <version>3.9.0</version>
-    <description>hnqz 公共版本控制</description>
+  <artifactId>hnqz-common-bom</artifactId>
+  <packaging>pom</packaging>
+  <version>3.9.0</version>
+  <description>hnqz 公共版本控制</description>
 
-    <properties>
-        <hnqz.version>3.9.0</hnqz.version>
-        <mybatis-plus.version>3.4.2</mybatis-plus.version>
-        <dynamic-ds.version>3.0.0</dynamic-ds.version>
-        <druid.version>1.2.20</druid.version>
-        <mysql.connector.version>8.0.20</mysql.connector.version>
-        <mp.weixin.version>4.6.0</mp.weixin.version>
-        <groovy.version>3.0.3</groovy.version>
-        <security.oauth.version>2.3.6.RELEASE</security.oauth.version>
-        <fastjson.version>1.2.69</fastjson.version>
-        <commons-io.version>2.8.0</commons-io.version>
-        <dm.version>8.1.3.140</dm.version>
-        <highgo.version>6.2.0</highgo.version>
-        <mysql.connector.version>8.0.33</mysql.connector.version>
-    </properties>
+  <properties>
+    <hnqz.version>3.9.0</hnqz.version>
+    <mybatis-plus.version>3.4.2</mybatis-plus.version>
+    <dynamic-ds.version>3.0.0</dynamic-ds.version>
+    <druid.version>1.2.20</druid.version>
+    <mysql.connector.version>8.0.20</mysql.connector.version>
+    <mp.weixin.version>4.6.0</mp.weixin.version>
+    <groovy.version>3.0.3</groovy.version>
+    <security.oauth.version>2.3.6.RELEASE</security.oauth.version>
+    <fastjson.version>1.2.69</fastjson.version>
+    <commons-io.version>2.8.0</commons-io.version>
+    <dm.version>8.1.3.140</dm.version>
+    <highgo.version>6.2.0</highgo.version>
+    <mysql.connector.version>8.0.33</mysql.connector.version>
+  </properties>
 
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>com.alibaba</groupId>
-                <artifactId>druid</artifactId>
-                <version>${druid.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.qunzhixinxi</groupId>
-                <artifactId>hnqz-common-core</artifactId>
-                <version>${hnqz.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.qunzhixinxi</groupId>
-                <artifactId>hnqz-common-data</artifactId>
-                <version>${hnqz.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.qunzhixinxi</groupId>
-                <artifactId>hnqz-common-gateway</artifactId>
-                <version>${hnqz.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.qunzhixinxi</groupId>
-                <artifactId>hnqz-common-gray</artifactId>
-                <version>${hnqz.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.qunzhixinxi</groupId>
-                <artifactId>hnqz-common-datasource</artifactId>
-                <version>${hnqz.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.qunzhixinxi</groupId>
-                <artifactId>hnqz-common-job</artifactId>
-                <version>${hnqz.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.qunzhixinxi</groupId>
-                <artifactId>hnqz-common-log</artifactId>
-                <version>${hnqz.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.qunzhixinxi</groupId>
-                <artifactId>hnqz-common-oss</artifactId>
-                <version>${hnqz.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.qunzhixinxi</groupId>
-                <artifactId>hnqz-common-security</artifactId>
-                <version>${hnqz.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.qunzhixinxi</groupId>
-                <artifactId>hnqz-common-sentinel</artifactId>
-                <version>${hnqz.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.qunzhixinxi</groupId>
-                <artifactId>hnqz-common-feign</artifactId>
-                <version>${hnqz.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.qunzhixinxi</groupId>
-                <artifactId>hnqz-common-sequence</artifactId>
-                <version>${hnqz.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.qunzhixinxi</groupId>
-                <artifactId>hnqz-common-mq</artifactId>
-                <version>${hnqz.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.qunzhixinxi</groupId>
-                <artifactId>hnqz-upms-api</artifactId>
-                <version>${hnqz.version}</version>
-            </dependency>
-            <!--mybatis plus extension,包含了mybatis plus core-->
-            <dependency>
-                <groupId>com.baomidou</groupId>
-                <artifactId>mybatis-plus-extension</artifactId>
-                <version>${mybatis-plus.version}</version>
-            </dependency>
-            <!--mybatis-->
-            <dependency>
-                <groupId>com.baomidou</groupId>
-                <artifactId>mybatis-plus-boot-starter</artifactId>
-                <version>${mybatis-plus.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.baomidou</groupId>
-                <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
-                <version>${dynamic-ds.version}</version>
-            </dependency>
-            <!-- druid 连接池 -->
-            <dependency>
-                <groupId>com.alibaba</groupId>
-                <artifactId>druid-spring-boot-starter</artifactId>
-                <version>${druid.version}</version>
-            </dependency>
-            <!--mysql 驱动-->
-            <dependency>
-                <groupId>com.mysql</groupId>
-                <artifactId>mysql-connector-j</artifactId>
-                <version>${mysql.connector.version}</version>
-            </dependency>
-            <!--DM8-->
-            <dependency>
-                <groupId>com.dameng</groupId>
-                <artifactId>DmJdbcDriver18</artifactId>
-                <version>${dm.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.dameng</groupId>
-                <artifactId>DmDialect-for-hibernate5.3</artifactId>
-                <version>${dm.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.highgo</groupId>
-                <artifactId>HgdbJdbc</artifactId>
-                <version>${highgo.version}</version>
-            </dependency>
-            <!--fastjson-->
-            <dependency>
-                <groupId>com.alibaba</groupId>
-                <artifactId>fastjson</artifactId>
-                <version>${fastjson.version}</version>
-            </dependency>
-            <!-- io -->
-            <dependency>
-                <groupId>commons-io</groupId>
-                <artifactId>commons-io</artifactId>
-                <version>${commons-io.version}</version>
-            </dependency>
-            <!--微信依赖-->
-            <dependency>
-                <groupId>com.github.binarywang</groupId>
-                <artifactId>weixin-java-mp</artifactId>
-                <version>${mp.weixin.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.github.binarywang</groupId>
-                <artifactId>weixin-java-common</artifactId>
-                <version>${mp.weixin.version}</version>
-            </dependency>
-            <!--定义groovy 版本-->
-            <dependency>
-                <groupId>org.codehaus.groovy</groupId>
-                <artifactId>groovy</artifactId>
-                <version>${groovy.version}</version>
-            </dependency>
-            <!--稳定版本,替代spring security bom内置-->
-            <dependency>
-                <groupId>org.springframework.security.oauth</groupId>
-                <artifactId>spring-security-oauth2</artifactId>
-                <version>${security.oauth.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.commons</groupId>
-                <artifactId>commons-compress</artifactId>
-                <version>1.26.0</version>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>com.alibaba</groupId>
+        <artifactId>druid</artifactId>
+        <version>${druid.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.qunzhixinxi</groupId>
+        <artifactId>hnqz-common-core</artifactId>
+        <version>${hnqz.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.qunzhixinxi</groupId>
+        <artifactId>hnqz-common-data</artifactId>
+        <version>${hnqz.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.qunzhixinxi</groupId>
+        <artifactId>hnqz-common-gateway</artifactId>
+        <version>${hnqz.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.qunzhixinxi</groupId>
+        <artifactId>hnqz-common-gray</artifactId>
+        <version>${hnqz.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.qunzhixinxi</groupId>
+        <artifactId>hnqz-common-datasource</artifactId>
+        <version>${hnqz.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.qunzhixinxi</groupId>
+        <artifactId>hnqz-common-job</artifactId>
+        <version>${hnqz.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.qunzhixinxi</groupId>
+        <artifactId>hnqz-common-log</artifactId>
+        <version>${hnqz.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.qunzhixinxi</groupId>
+        <artifactId>hnqz-common-oss</artifactId>
+        <version>${hnqz.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.qunzhixinxi</groupId>
+        <artifactId>hnqz-common-security</artifactId>
+        <version>${hnqz.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.qunzhixinxi</groupId>
+        <artifactId>hnqz-common-sentinel</artifactId>
+        <version>${hnqz.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.qunzhixinxi</groupId>
+        <artifactId>hnqz-common-feign</artifactId>
+        <version>${hnqz.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.qunzhixinxi</groupId>
+        <artifactId>hnqz-common-sequence</artifactId>
+        <version>${hnqz.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.qunzhixinxi</groupId>
+        <artifactId>hnqz-common-mq</artifactId>
+        <version>${hnqz.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.qunzhixinxi</groupId>
+        <artifactId>hnqz-upms-api</artifactId>
+        <version>${hnqz.version}</version>
+      </dependency>
+      <!--mybatis plus extension,包含了mybatis plus core-->
+      <dependency>
+        <groupId>com.baomidou</groupId>
+        <artifactId>mybatis-plus-extension</artifactId>
+        <version>${mybatis-plus.version}</version>
+      </dependency>
+      <!--mybatis-->
+      <dependency>
+        <groupId>com.baomidou</groupId>
+        <artifactId>mybatis-plus-boot-starter</artifactId>
+        <version>${mybatis-plus.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.baomidou</groupId>
+        <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
+        <version>${dynamic-ds.version}</version>
+      </dependency>
+      <!-- druid 连接池 -->
+      <dependency>
+        <groupId>com.alibaba</groupId>
+        <artifactId>druid-spring-boot-starter</artifactId>
+        <version>${druid.version}</version>
+      </dependency>
+      <!--mysql 驱动-->
+      <dependency>
+        <groupId>com.mysql</groupId>
+        <artifactId>mysql-connector-j</artifactId>
+        <version>${mysql.connector.version}</version>
+      </dependency>
+      <!--DM8-->
+      <dependency>
+        <groupId>com.dameng</groupId>
+        <artifactId>DmJdbcDriver18</artifactId>
+        <version>${dm.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.dameng</groupId>
+        <artifactId>DmDialect-for-hibernate5.3</artifactId>
+        <version>${dm.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.highgo</groupId>
+        <artifactId>HgdbJdbc</artifactId>
+        <version>${highgo.version}</version>
+      </dependency>
+      <!--fastjson-->
+      <dependency>
+        <groupId>com.alibaba</groupId>
+        <artifactId>fastjson</artifactId>
+        <version>${fastjson.version}</version>
+      </dependency>
+      <!-- io -->
+      <dependency>
+        <groupId>commons-io</groupId>
+        <artifactId>commons-io</artifactId>
+        <version>${commons-io.version}</version>
+      </dependency>
+      <!--微信依赖-->
+      <dependency>
+        <groupId>com.github.binarywang</groupId>
+        <artifactId>weixin-java-mp</artifactId>
+        <version>${mp.weixin.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.github.binarywang</groupId>
+        <artifactId>weixin-java-common</artifactId>
+        <version>${mp.weixin.version}</version>
+      </dependency>
+      <!--定义groovy 版本-->
+      <dependency>
+        <groupId>org.codehaus.groovy</groupId>
+        <artifactId>groovy</artifactId>
+        <version>${groovy.version}</version>
+      </dependency>
+      <!--稳定版本,替代spring security bom内置-->
+      <dependency>
+        <groupId>org.springframework.security.oauth</groupId>
+        <artifactId>spring-security-oauth2</artifactId>
+        <version>${security.oauth.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.commons</groupId>
+        <artifactId>commons-compress</artifactId>
+        <version>1.26.0</version>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
 
-    <build>
-        <plugins>
-            <!--避免和parent bom坐标不一致 -->
-            <plugin>
-                <groupId>com.pig4cloud.plugin</groupId>
-                <artifactId>spring-cloud-maven-plugin</artifactId>
-                <version>1.1.1</version>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>info</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <!-- nothing to do, but we need this to run docker:build form project root -->
-            <plugin>
-                <groupId>io.fabric8</groupId>
-                <artifactId>docker-maven-plugin</artifactId>
-                <version>0.32.0</version>
-                <configuration>
-                    <skip>true</skip>
-                </configuration>
-            </plugin>
-            <!--代码格式插件,默认使用spring 规则-->
-            <plugin>
-                <groupId>io.spring.javaformat</groupId>
-                <artifactId>spring-javaformat-maven-plugin</artifactId>
-                <version>0.0.22</version>
-            </plugin>
-        </plugins>
-    </build>
+  <build>
+    <plugins>
+      <!--避免和parent bom坐标不一致 -->
+      <plugin>
+        <groupId>com.pig4cloud.plugin</groupId>
+        <artifactId>spring-cloud-maven-plugin</artifactId>
+        <version>1.1.1</version>
+        <executions>
+          <execution>
+            <phase>package</phase>
+            <goals>
+              <goal>info</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <!-- nothing to do, but we need this to run docker:build form project root -->
+      <plugin>
+        <groupId>io.fabric8</groupId>
+        <artifactId>docker-maven-plugin</artifactId>
+        <version>0.32.0</version>
+        <configuration>
+          <skip>true</skip>
+        </configuration>
+      </plugin>
+      <!--代码格式插件,默认使用spring 规则-->
+      <plugin>
+        <groupId>io.spring.javaformat</groupId>
+        <artifactId>spring-javaformat-maven-plugin</artifactId>
+        <version>0.0.22</version>
+      </plugin>
+    </plugins>
+  </build>
 
-    <pluginRepositories>
-        <pluginRepository>
-            <id>aliyun-plugin</id>
-            <url>https://maven.aliyun.com/repository/public</url>
-            <releases>
-                <enabled>true</enabled>
-            </releases>
-            <snapshots>
-                <enabled>false</enabled>
-            </snapshots>
-        </pluginRepository>
-    </pluginRepositories>
+  <pluginRepositories>
+    <pluginRepository>
+      <id>aliyun-plugin</id>
+      <url>https://maven.aliyun.com/repository/public</url>
+      <releases>
+        <enabled>true</enabled>
+      </releases>
+      <snapshots>
+        <enabled>false</enabled>
+      </snapshots>
+    </pluginRepository>
+  </pluginRepositories>
 </project>

+ 184 - 195
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/constant/UpmsState.java

@@ -13,199 +13,188 @@ import lombok.Getter;
  */
 public class UpmsState {
 
-    /**
-     * 业务提醒已读状态
-     *
-     * @author lixuesong
-     * @date 2023/10/25
-     */
-    @Getter
-    @AllArgsConstructor
-    public enum BizReminderReadStatus {
-
-        READ("READ", "已读"),
-        UNREAD("UNREAD", "未读");
-
-        @EnumValue
-        private final String status;
-        private final String description;
-    }
-
-    /**
-     * 积分包结算财务复核状态
-     *
-     * @author lixuesong
-     * @date 2024/01/05
-     */
-    @Getter
-    @AllArgsConstructor
-    public enum SettleFinancialReviewStatus {
-        AUTO("AUTO", "自动"),
-        TO_BE_REVIEWED("TO_BE_REVIEWED", "待复核"),
-        PASSED("PASSED", "通过"),
-        REJECTED("REJECTED", "拒绝");
-
-        @EnumValue
-        private final String status;
-        private final String description;
-    }
-
-    /**
-     * 执行计划类型(可见实际类型)
-     *
-     * @author ImplementPlanType
-     * @version 1.0.0
-     * @date 2024/05/19 11:22
-     */
-    @Getter
-    @AllArgsConstructor
-    public enum ImplementPlanActionState {
-
-        IN_PROGRESS("IN_PROGRESS", "执行中"),
-        REJECTED("REJECTED", "拒绝"),
-
-        AWAIT_2_LEADER("AWAIT_2_LEADER", "待营销中心分管领导审批"),
-        AWAIT_2_OM("AWAIT_2_OM", "待运营管理员审批"),
-
-        PASSED_AND_GO("PASSED_AND_GO", "审核通过已下发"),
-        PASSED_TO_GO("PASSED_TO_GO", "审核通过待下发"),
-        ;
-
-        @EnumValue
-        private final String state;
-        private final String desc;
-    }
-
-    /**
-     * 执行计划类型(可见实际类型)
-     *
-     * @author ImplementPlanType
-     * @version 1.0.0
-     * @date 2024/05/19 11:22
-     */
-    @Getter
-    @AllArgsConstructor
-    public enum ImplementPlanDetailsActionState {
-
-        PASSED("PASSED", "审核通过"),
-        REJECTED("REJECTED", "审核拒绝"),
-        INIT("INIT", "待区域管理员审核"),
-        CKT1("CKT1", "待商务组审核"),
-        CKT2("CKT2", "待分管领导审核"),
-        PENDING("PENDING", "待拆解"),
-        ;
-
-        @EnumValue
-        private final String state;
-        private final String desc;
-    }
-
-
-    /**
-     * 执行计划类型
-     *
-     * @author ImplementPlanType
-     * @version 1.0.0
-     * @date 2024/05/19 11:22
-     */
-    @Getter
-    @AllArgsConstructor
-    public enum ImplementPlanState {
-
-        INIT("INIT", "新建"),
-        IN_PROGRESS("IN_PROGRESS", "执行中"),
-        REJECTED("REJECTED", "拒绝"),
-        PASSED("PASSED", "通过"),
-        ;
-
-        @EnumValue
-        private final String state;
-        private final String desc;
-    }
-
-    /**
-     * 执行计划类型
-     *
-     * @author ImplementPlanType
-     * @version 1.0.0
-     * @date 2024/05/19 11:22
-     */
-    @Getter
-    @AllArgsConstructor
-    public enum ImplPlanDetailsState {
-
-        INIT("INIT", "新建"),
-        CKT1("CKT1", "待审核1"),
-        CKT2("CKT2", "待审核2"),
-        REJECTED("REJECTED", "拒绝"),
-        PASSED("PASSED", "通过"),
-        ;
-
-        @EnumValue
-        private final String state;
-        private final String desc;
-    }
-
-
-    @Getter
-    @AllArgsConstructor
-    public enum PackageSupervisionState {
-
-        INIT("INIT", "待部门负责人审核"),
-        CKT1("CKT1", "待分管领导审核"),
-        CKT2("CKT2", "待人用疫苗事业部总经理审核"),
-        REJECTED("REJECTED", "拒绝"),
-        PASSED("PASSED", "通过"),
-        ;
-
-        @EnumValue
-        private final String state;
-        private final String desc;
-    }
-
-    @Getter
-    @AllArgsConstructor
-    public enum TaskSupervisionState {
-
-        INIT("INIT", "待部门负责人审核"),
-        CKT1("CKT1", "待分管领导审核"),
-        CKT2("CKT2", "待人用疫苗事业部总经理审核"),
-        // REJECTED("REJECTED", "拒绝"),
-        PASSED("PASSED", "通过"),
-        ;
-
-        @EnumValue
-        private final String state;
-        private final String desc;
-    }
-
-    @Getter
-    @AllArgsConstructor
-    public enum ScorePackageState {
-
-        TO_PICKUP("1", "已下发待申领"),
-        TO_CHECK("2", "已申领待审批"),
-        DOING("3", "进行中"),
-        TO_SETTLE("4", "已完成待结算"),
-        STOP("6", "已终止"),
-        TO_APPROVAL("7", "已完成待上级审批");
-
-        @EnumValue
-        private final String state;
-        private final String desc;
-    }
-
-    @Getter
-    @AllArgsConstructor
-    public enum TaskState {
-
-        UNCHECKED("1", "未审核"),
-        CHECKING("2", "审核中"),
-        PASSED("3", "审核通过"),
-        REJECTED("4", "不通过");
-
-        @EnumValue
-        private final String state;
-        private final String desc;
-    }
+  /**
+   * 业务提醒已读状态
+   *
+   * @author lixuesong
+   * @date 2023/10/25
+   */
+  @Getter
+  @AllArgsConstructor
+  public enum BizReminderReadStatus {
+    READ("READ", "已读"),
+    UNREAD("UNREAD", "未读");
+
+    @EnumValue private final String status;
+    private final String description;
+  }
+
+  /**
+   * 积分包结算财务复核状态
+   *
+   * @author lixuesong
+   * @date 2024/01/05
+   */
+  @Getter
+  @AllArgsConstructor
+  public enum SettleFinancialReviewStatus {
+    AUTO("AUTO", "自动"),
+    TO_BE_REVIEWED("TO_BE_REVIEWED", "待复核"),
+    PASSED("PASSED", "通过"),
+    REJECTED("REJECTED", "拒绝");
+
+    @EnumValue private final String status;
+    private final String description;
+  }
+
+  /**
+   * 执行计划类型(可见实际类型)
+   *
+   * @author ImplementPlanType
+   * @version 1.0.0
+   * @date 2024/05/19 11:22
+   */
+  @Getter
+  @AllArgsConstructor
+  public enum ImplementPlanActionState {
+    IN_PROGRESS("IN_PROGRESS", "执行中"),
+    REJECTED("REJECTED", "拒绝"),
+
+    AWAIT_2_LEADER("AWAIT_2_LEADER", "待营销中心分管领导审批"),
+    AWAIT_2_OM("AWAIT_2_OM", "待运营管理员审批"),
+
+    PASSED_AND_GO("PASSED_AND_GO", "审核通过已下发"),
+    PASSED_TO_GO("PASSED_TO_GO", "审核通过待下发"),
+    ;
+
+    @EnumValue private final String state;
+    private final String desc;
+  }
+
+  /**
+   * 执行计划类型(可见实际类型)
+   *
+   * @author ImplementPlanType
+   * @version 1.0.0
+   * @date 2024/05/19 11:22
+   */
+  @Getter
+  @AllArgsConstructor
+  public enum ImplementPlanDetailsActionState {
+    PASSED("PASSED", "审核通过"),
+    REJECTED("REJECTED", "审核拒绝"),
+    INIT("INIT", "待区域管理员审核"),
+    CKT1("CKT1", "待商务组审核"),
+    CKT2("CKT2", "待分管领导审核"),
+    PENDING("PENDING", "待拆解"),
+    ;
+
+    @EnumValue private final String state;
+    private final String desc;
+  }
+
+  /**
+   * 执行计划类型
+   *
+   * @author ImplementPlanType
+   * @version 1.0.0
+   * @date 2024/05/19 11:22
+   */
+  @Getter
+  @AllArgsConstructor
+  public enum ImplementPlanState {
+    INIT("INIT", "新建"),
+    IN_PROGRESS("IN_PROGRESS", "执行中"),
+    REJECTED("REJECTED", "拒绝"),
+    PASSED("PASSED", "通过"),
+    ;
+
+    @EnumValue private final String state;
+    private final String desc;
+  }
+
+  /**
+   * 执行计划类型
+   *
+   * @author ImplementPlanType
+   * @version 1.0.0
+   * @date 2024/05/19 11:22
+   */
+  @Getter
+  @AllArgsConstructor
+  public enum ImplPlanDetailsState {
+    INIT("INIT", "新建"),
+    CKT1("CKT1", "待审核1"),
+    CKT2("CKT2", "待审核2"),
+    REJECTED("REJECTED", "拒绝"),
+    PASSED("PASSED", "通过"),
+    ;
+
+    @EnumValue private final String state;
+    private final String desc;
+  }
+
+  @Getter
+  @AllArgsConstructor
+  public enum PackageSupervisionState {
+    INIT("INIT", "待部门负责人审核"),
+    CKT1("CKT1", "待分管领导审核"),
+    CKT2("CKT2", "待人用疫苗事业部总经理审核"),
+    REJECTED("REJECTED", "拒绝"),
+    PASSED("PASSED", "通过"),
+    ;
+
+    @EnumValue private final String state;
+    private final String desc;
+  }
+
+  @Getter
+  @AllArgsConstructor
+  public enum TaskSupervisionState {
+    INIT("INIT", "待部门负责人审核"),
+    CKT1("CKT1", "待分管领导审核"),
+    CKT2("CKT2", "待人用疫苗事业部总经理审核"),
+    // REJECTED("REJECTED", "拒绝"),
+    PASSED("PASSED", "通过"),
+    ;
+
+    @EnumValue private final String state;
+    private final String desc;
+  }
+
+  @Getter
+  @AllArgsConstructor
+  public enum ScorePackageState {
+    TO_PICKUP("1", "已下发待申领"),
+    TO_CHECK("2", "已申领待审批"),
+    DOING("3", "进行中"),
+    TO_SETTLE("4", "已完成待结算"),
+    STOP("6", "已终止"),
+    TO_APPROVAL("7", "已完成待上级审批");
+
+    @EnumValue private final String state;
+    private final String desc;
+  }
+
+  @Getter
+  @AllArgsConstructor
+  public enum TaskState {
+    UNCHECKED("1", "未审核"),
+    CHECKING("2", "审核中"),
+    PASSED("3", "审核通过"),
+    REJECTED("4", "不通过");
+
+    @EnumValue private final String state;
+    private final String desc;
+  }
+
+  @Getter
+  @AllArgsConstructor
+  public enum AddTaskState {
+    ENABLE("1", "可添加"),
+    DISABLE("0", "不可添加");
+
+    @EnumValue private final String state;
+    private final String desc;
+  }
 }

+ 81 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/task/WmTaskControllerV2.java

@@ -2,16 +2,26 @@ package com.qunzhixinxi.hnqz.admin.controller.task;
 
 import static com.qunzhixinxi.hnqz.common.core.util.R.ok;
 
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qunzhixinxi.hnqz.admin.controller.task.vo.TaskReqVO;
 import com.qunzhixinxi.hnqz.admin.controller.task.vo.TaskRespVO;
 import com.qunzhixinxi.hnqz.admin.manager.TaskManager;
+import com.qunzhixinxi.hnqz.admin.util.RedisUtils;
+import com.qunzhixinxi.hnqz.admin.util.RedisUtils.Token;
+import com.qunzhixinxi.hnqz.common.core.exception.BizException;
 import com.qunzhixinxi.hnqz.common.core.util.R;
+import com.qunzhixinxi.hnqz.common.log.annotation.SysLog;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
 import com.qunzhixinxi.hnqz.common.security.util.SecurityUtils;
+import java.util.concurrent.TimeUnit;
 import javax.annotation.Resource;
 import javax.validation.Valid;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -26,12 +36,83 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping(value = "/task/v2")
 public class WmTaskControllerV2 {
 
+  @Resource private RedisTemplate<String, Object> redisTemplate;
+  @Resource private RedisUtils redisUtils;
   @Resource private TaskManager taskManager;
 
+  /**
+   * 获取待审核的页面
+   *
+   * @param query 筛选条件
+   * @return 分页结果
+   */
   @GetMapping(value = "/page")
   public R<Page<TaskRespVO.ToDirectCheck>> pageTaskToCheck(@Valid TaskReqVO.OnPage query) {
     Page<TaskRespVO.ToDirectCheck> page =
         taskManager.pageTaskToCheck(query, SecurityUtils.getUser());
     return ok(page);
   }
+
+  //  @Inner(value = false)
+  @PostMapping("/token")
+  public R<Token> getToken(@Valid @RequestBody TaskReqVO.OnToken query) {
+
+    String valueStr = String.join(StrUtil.COMMA, query.getTaskIds());
+
+    Token token = redisUtils.generateToken(valueStr);
+
+    return ok(token);
+  }
+
+  /**
+   * 单一任务审核
+   *
+   * @param checkReq 审核信息
+   * @return 审核结果
+   */
+  //  @Inner(value = false)
+//  @SysLog(value = "单一任务审核")
+  @PostMapping(value = "/check/single")
+  public R<Boolean> doSingleCheck(@Valid @RequestBody TaskReqVO.OnSingleCheck checkReq) {
+
+    // 删除幂等token
+    boolean valid = redisUtils.validToken(checkReq.getToken(), checkReq.getTaskId());
+    if (!valid) {
+      throw new BizException("令牌无效,请刷新数据后重试");
+    }
+
+    // 校验参数
+    if (!checkReq.getCheckResult() && StrUtil.isBlank(checkReq.getCheckMessage())) {
+      throw new BizException("拒绝时,【审核意见】必填");
+    }
+
+    // 添加执行锁
+    HnqzUser user = SecurityUtils.getUser();
+
+    String lockInfo =
+        String.format(
+            "【%s】正在进行任务【%s】", user.getRealName(), checkReq.getCheckResult() ? "通过" : "拒绝");
+
+    String lockKey = "task_opt:check:" + checkReq.getTaskId();
+    Boolean locked =
+        redisTemplate.opsForValue().setIfAbsent(lockKey, lockInfo, 10, TimeUnit.MINUTES);
+
+    if (Boolean.FALSE.equals(locked)) {
+      throw new BizException(
+          "当前任务(ID:"
+              + checkReq.getTaskId()
+              + "),存在在途操作,"
+              + redisTemplate.opsForValue().get(lockKey)
+              + ",请稍后重试");
+    }
+
+    // 发起审核
+    try {
+      taskManager.doSingleCheck(checkReq, user);
+    } finally {
+      redisTemplate.delete(lockKey);
+    }
+
+    return ok(Boolean.TRUE);
+  }
 }

+ 29 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/task/vo/TaskReqVO.java

@@ -2,6 +2,10 @@ package com.qunzhixinxi.hnqz.admin.controller.task.vo;
 
 import com.qunzhixinxi.hnqz.common.core.entity.PageParam;
 import java.time.LocalDate;
+import java.util.List;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
 import lombok.AccessLevel;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -53,4 +57,29 @@ public final class TaskReqVO {
     // 任务状态
     private String taskStatus;
   }
+
+  @Data
+  public static class OnSingleCheck {
+
+    @NotBlank(message = "请求令牌不能为空")
+    private String token;
+
+    @NotBlank(message = "任务ID必填")
+    private String taskId;
+
+    @NotNull(message = "审核节点必填")
+    private Integer nodeId;
+
+    @NotNull(message = "审核结果必填")
+    private Boolean checkResult;
+
+    private String checkMessage;
+  }
+
+  @Data
+  public static class OnToken {
+
+    @NotEmpty(message = "任务ID不能为空")
+    private List<String> taskIds;
+  }
 }

+ 178 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/manager/TaskManager.java

@@ -4,19 +4,29 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qunzhixinxi.hnqz.admin.api.constant.UpmsState.AddTaskState;
 import com.qunzhixinxi.hnqz.admin.api.constant.UpmsState.TaskState;
 import com.qunzhixinxi.hnqz.admin.api.constant.UpmsType.AreaType;
+import com.qunzhixinxi.hnqz.admin.api.constant.enums.PackageStatusEnum;
+import com.qunzhixinxi.hnqz.admin.api.dto.SysCheckChainNodeCheckHistoryDTO;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysCheckChainNodeCheckHistory;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysDept;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysUser;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmDaDrugEntDrugtable;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmScorePackage;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmScorePackageStatus;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmTask;
 import com.qunzhixinxi.hnqz.admin.controller.task.vo.TaskReqVO;
 import com.qunzhixinxi.hnqz.admin.controller.task.vo.TaskRespVO;
 import com.qunzhixinxi.hnqz.admin.controller.task.vo.TaskRespVO.ToDirectCheck;
 import com.qunzhixinxi.hnqz.admin.mapper.SysCheckChainNodeCheckHistoryMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.WmTaskV2Mapper;
 import com.qunzhixinxi.hnqz.admin.service.SysUserAreaService;
+import com.qunzhixinxi.hnqz.admin.service.WmScorePackageService;
+import com.qunzhixinxi.hnqz.admin.service.WmScorePackageStatusService;
 import com.qunzhixinxi.hnqz.common.core.constant.CacheConstants;
+import com.qunzhixinxi.hnqz.common.core.constant.CommonConstants;
+import com.qunzhixinxi.hnqz.common.core.exception.BizException;
 import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -32,6 +42,7 @@ import javax.validation.Valid;
 import org.springframework.data.redis.core.ListOperations;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * 任务管理器
@@ -40,11 +51,14 @@ import org.springframework.stereotype.Service;
  * @date 2025-01-10 16:14
  */
 @Service
-public final class TaskManager {
+public class TaskManager {
 
   @Resource private RedisTemplate redisTemplate;
   @Resource private WmTaskV2Mapper taskMapper;
   @Resource private SysUserAreaService userAreaService;
+  @Resource private WmScorePackageService scorePackageService;
+  @Resource private SysCheckChainManager checkChainManager;
+  @Resource private WmScorePackageStatusService scorePackageStatusService;
   @Resource private SysCheckChainNodeCheckHistoryMapper checkChainNodeCheckHistoryMapper;
 
   /**
@@ -249,4 +263,167 @@ public final class TaskManager {
   private int getMonthValue(String quarterStr) {
     return Integer.parseInt(quarterStr) * 3 - 2;
   }
+
+  // 任务单一审核
+  @Transactional(rollbackFor = Exception.class)
+  public void doSingleCheck(@Valid TaskReqVO.OnSingleCheck checkReq, HnqzUser user) {
+
+    Boolean checkResult = checkReq.getCheckResult();
+    String checkMessage = checkReq.getCheckMessage();
+    String tid = checkReq.getTaskId();
+    LocalDateTime now = LocalDateTime.now();
+
+    // 获取任务
+    WmTask task = taskMapper.selectById(tid);
+
+    // 校验任务
+    validateTaskDetails(task);
+
+    // 校验任务审核记录
+    validateTaskCheckHis(task.getId(), checkReq.getNodeId());
+
+    // 获取包信息
+    WmScorePackage scorePackage = scorePackageService.getById(task.getScorePackageId());
+
+    // 校验包信息
+    validatePackage(scorePackage);
+
+    // 获取领取信息
+    WmScorePackageStatus picked =
+        scorePackageStatusService.getOne(
+            Wrappers.<WmScorePackageStatus>lambdaQuery()
+                .eq(WmScorePackageStatus::getStatus, PackageStatusEnum.APPROVED.val())
+                .eq(WmScorePackageStatus::getPackageId, task.getScorePackageId()));
+
+    // 校验领取信息
+    validatePicked(picked);
+
+    // 更新任务审核信息
+    WmTask updateTask = new WmTask();
+    updateTask.setId(task.getId());
+
+    if (!checkResult) {
+      updateTask.setTaskStatus(TaskState.REJECTED.getState());
+    }
+
+    updateTask.setUpdateUser(user.getId().toString());
+    updateTask.setUpdateTime(now);
+    taskMapper.updateById(updateTask);
+
+    // 创建审批节点
+    SysCheckChainNodeCheckHistoryDTO.OnCreate res = new SysCheckChainNodeCheckHistoryDTO.OnCreate();
+    res.setNodeId(checkReq.getNodeId());
+    res.setTargetId(Integer.parseInt(tid));
+    res.setCheckResult(checkResult);
+    res.setCheckMessage(checkMessage);
+    checkChainManager.doCheck(Collections.singletonList(res), user);
+
+    // 最后一层审核通过
+    if (checkResult && checkReq.getNodeId() == 6) {
+      // 查询已提交的任务(除去审核不通过的任务)& 统计判断任务累计积分是否达到积分包的预设值
+      Map<String, Integer> stat = calcTotalScoreAndCount(task.getScorePackageId());
+      //      int tot = stat.get("tot");
+      int passed = stat.get("passed");
+
+      boolean finished = (passed + task.getScore()) >= scorePackage.getScore();
+
+      // 更新包信息
+      scorePackageService.update(
+          Wrappers.<WmScorePackage>lambdaUpdate()
+              .set(finished, WmScorePackage::getTaskAddFlag, AddTaskState.DISABLE.getState())
+              .set(finished, WmScorePackage::getPackageFinishTime, now)
+              .set(WmScorePackage::getUpdateTime, now)
+              .set(WmScorePackage::getUpdateUser, user.getUsername())
+              .eq(WmScorePackage::getId, task.getScorePackageId()));
+
+      // 更新领取信息
+      scorePackageStatusService.update(
+          Wrappers.<WmScorePackageStatus>lambdaUpdate()
+              .set(finished, WmScorePackageStatus::getTaskAddFlag, AddTaskState.DISABLE.getState())
+              .set(WmScorePackageStatus::getUpdateTime, now)
+              .set(WmScorePackageStatus::getUpdateUser, user.getUsername())
+              .eq(WmScorePackageStatus::getPackageId, task.getScorePackageId()));
+    }
+  }
+
+  private Map<String, Integer> calcTotalScoreAndCount(String scorePackageId) {
+
+    List<WmTask> submitedTaskList =
+        taskMapper.selectList(
+            Wrappers.<WmTask>lambdaQuery()
+                .eq(WmTask::getScorePackageId, scorePackageId)
+                .ne(WmTask::getTaskStatus, TaskState.REJECTED.getState())
+                .eq(WmTask::getRealFlag, CommonConstants.STATUS_NORMAL));
+
+    int totalTaskScore = submitedTaskList.stream().mapToInt(WmTask::getScore).sum();
+    int approvedCount =
+        submitedTaskList.stream()
+            .filter(task -> TaskState.PASSED.getState().equals(task.getTaskStatus()))
+            .map(WmTask::getScore)
+            .reduce(0, Integer::sum);
+
+    Map<String, Integer> totalScoreAndCount = new HashMap<>(2);
+    totalScoreAndCount.put("tot", totalTaskScore);
+    totalScoreAndCount.put("passed", approvedCount);
+    return totalScoreAndCount;
+  }
+
+  private void validatePackage(WmScorePackage scorePackage) {
+    if (scorePackage == null) {
+      throw new BizException("执行包不存在");
+    }
+
+    if (AddTaskState.DISABLE.getState().equals(scorePackage.getTaskAddFlag())) {
+      throw new BizException("当前包已经关闭,不能追加新服务记录");
+    }
+  }
+
+  private void validatePicked(WmScorePackageStatus picked) {
+
+    if (picked == null) {
+      throw new BizException("执行包领取记录不存在");
+    }
+
+    if (AddTaskState.DISABLE.getState().equals(picked.getTaskAddFlag())) {
+      throw new BizException("当前包已经关闭,不能追加新服务记录");
+    }
+  }
+
+  private void validateTaskCheckHis(String id, Integer nodeId) {
+    List<SysCheckChainNodeCheckHistory> histories =
+        checkChainNodeCheckHistoryMapper.selectList(
+            Wrappers.<SysCheckChainNodeCheckHistory>lambdaQuery()
+                .eq(SysCheckChainNodeCheckHistory::getTargetId, Integer.parseInt(id)));
+
+    if (CollUtil.isEmpty(histories)) {
+      return;
+    }
+
+    histories.stream()
+        .filter(h -> h.getNodeId().equals(nodeId))
+        .findAny()
+        .ifPresent(
+            h -> {
+              throw new BizException("当前任务已被同节点审核完毕, 请刷新数据,查看最新信息");
+            });
+
+    histories.stream()
+        .filter(h -> !h.getCheckResult())
+        .findAny()
+        .ifPresent(
+            h -> {
+              throw new BizException("当前任务已被其他节点【拒绝】, 请刷新数据,查看最新信息");
+            });
+  }
+
+  private void validateTaskDetails(WmTask task) {
+
+    if (task == null) {
+      throw new BizException("为查询到该ID的任务");
+    }
+
+    if (!TaskState.PASSED.getState().equals(task.getTaskStatus())) {
+      throw new BizException("当前任务状态不支持,审核操作,请刷新数据");
+    }
+  }
 }

+ 71 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/util/RedisUtils.java

@@ -0,0 +1,71 @@
+package com.qunzhixinxi.hnqz.admin.util;
+
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.util.IdUtil;
+import com.qunzhixinxi.hnqz.common.core.exception.BizException;
+import java.time.LocalDateTime;
+import java.util.Collections;
+import java.util.concurrent.TimeUnit;
+import javax.annotation.Resource;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.script.DefaultRedisScript;
+import org.springframework.data.redis.core.script.RedisScript;
+import org.springframework.stereotype.Component;
+
+/**
+ * redis lua 工具类
+ *
+ * @author jimmy
+ * @date 2025-01-16 10:39
+ */
+@Slf4j
+@Component
+public final class RedisUtils {
+
+  private static final String IDEM_SCRIPT =
+      "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
+
+  private static final TimeUnit TIME_UNIT = TimeUnit.SECONDS;
+  private static final int DEF_DURATION = 60 * 3;
+  private static final String IDEM_TOKEN_PREFIX = "idem_token:";
+
+  @Resource private RedisTemplate<String, Object> redisTemplate;
+
+  public boolean validToken(String token, String value) {
+    RedisScript<Long> redisScript = new DefaultRedisScript<>(IDEM_SCRIPT, Long.class);
+    String key = IDEM_TOKEN_PREFIX + token;
+    Long result = redisTemplate.execute(redisScript, ListUtil.of(key), value);
+    if (result != 0L) {
+      log.info("验证 token={},key={},value={} 成功", token, key, value);
+      return true;
+    }
+    log.info("验证 token={},key={},value={} 失败", token, key, value);
+    return false;
+  }
+
+  public Token generateToken(String value) {
+    final String token = IdUtil.fastSimpleUUID();
+
+    String key = IDEM_TOKEN_PREFIX + token;
+
+    Boolean setIfAbsent =
+        redisTemplate.opsForValue().setIfAbsent(key, value, DEF_DURATION, TIME_UNIT);
+
+    if (Boolean.FALSE.equals(setIfAbsent)) {
+      return null;
+    }
+
+    return new Token(token, value, LocalDateTime.now().plusSeconds(DEF_DURATION));
+  }
+
+  @Data
+  @AllArgsConstructor
+  public static class Token{
+    private String token;
+    private String value;
+    private LocalDateTime expireTime;
+  }
+}

+ 1 - 1
hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/WmTaskV2Mapper.xml

@@ -40,7 +40,7 @@
     pkg.drugtable
     FROM wm_task AS t
     LEFT JOIN wm_score_package AS pkg ON pkg.id = t.score_package_id
-    LEFT JOIN (SELECT DISTINCT tmp.target_id AS task_id
+    RIGHT JOIN (SELECT DISTINCT tmp.target_id AS task_id
     FROM (SELECT h.target_id, MAX(h.node_id) AS node_id
     FROM sys_chain_node_check_his AS h
     GROUP BY h.target_id) tmp