Pārlūkot izejas kodu

init: init project step4: biz code support

shc 1 gadu atpakaļ
vecāks
revīzija
d487cfe4a6
22 mainītis faili ar 747 papildinājumiem un 65 dzēšanām
  1. 0 0
      doc/db/14sys_plan_pkg.sql
  2. 35 0
      doc/db/15sys_check_chain.sql
  3. 29 0
      doc/db/16sys_chain_node.sql
  4. 27 0
      doc/db/17sys_chain_gateway.sql
  5. 26 0
      doc/db/18sys_chain_check_his.sql
  6. 29 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/dto/SysCheckChainNodeCheckHistoryDTO.java
  7. 94 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/SysCheckChainNode.java
  8. 74 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/SysCheckChainNodeCheckHistory.java
  9. 44 30
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmTask.java
  10. 7 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysUserController.java
  11. 26 20
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmTaskController.java
  12. 153 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/manager/SysCheckChainManager.java
  13. 21 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/SysCheckChainNodeCheckHistoryMapper.java
  14. 21 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/SysCheckChainNodeMapper.java
  15. 1 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmTaskMapper.java
  16. 21 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysCheckChainNodeCheckHistoryService.java
  17. 13 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysCheckChainNodeService.java
  18. 3 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysUserService.java
  19. 44 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysCheckChainNodeCheckHistoryServiceImpl.java
  20. 26 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysCheckChainNodeImpl.java
  21. 2 2
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmTaskContentServiceImpl.java
  22. 51 11
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmTaskServiceImpl.java

+ 0 - 0
doc/db/9sys_plan_pkg.sql → doc/db/14sys_plan_pkg.sql


+ 35 - 0
doc/db/15sys_check_chain.sql

@@ -0,0 +1,35 @@
+USE `cnbg_20240511_001`;
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for sys_check_chain
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_check_chain`;
+CREATE TABLE `sys_check_chain`
+(
+    `chain_id`    INT AUTO_INCREMENT COMMENT 'Id',
+    `chain_name`  VARCHAR(64) NOT NULL COMMENT '审批链名称',
+    `node_qty`    VARCHAR(64) NOT NULL COMMENT '节点数',
+    `del_flag`    VARCHAR(1)  NOT NULL DEFAULT '0' COMMENT '删除标记',
+    `create_by`   VARCHAR(64) NOT NULL DEFAULT 'admin' COMMENT '创建人',
+    `update_by`   VARCHAR(64) NOT NULL DEFAULT 'admin' COMMENT '修改人',
+    `create_time` DATETIME    NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_time` DATETIME    NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    PRIMARY KEY `pk_id` (`chain_id`) USING BTREE,
+    UNIQUE KEY `uk_name` (`chain_name`) USING BTREE
+) ENGINE = InnoDB
+    COMMENT ='审批链';
+
+-- ----------------------------
+-- Records of sys_check_chain
+-- ----------------------------
+BEGIN;
+INSERT INTO sys_check_chain (chain_id, chain_name, node_qty, del_flag, create_by, update_by, create_time, update_time)
+VALUES (1, '中生营销行为证据链审批流', '6', '0', 'admin', 'admin', '2024-05-22 10:26:23', '2024-05-22 10:26:23');
+
+COMMIT;
+
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 29 - 0
doc/db/16sys_chain_node.sql

@@ -0,0 +1,29 @@
+USE `cnbg_20240511_001`;
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for sys_chain_node
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_chain_node`;
+CREATE TABLE `sys_chain_node`
+(
+    `node_id`      BIGINT AUTO_INCREMENT COMMENT 'Id',
+    `node_name`    VARCHAR(255) NOT NULL COMMENT '节点名称',
+    `pre_node_id`  BIGINT       NULL COMMENT '上游节点',
+    `next_node_id` BIGINT       NULL COMMENT '下游节点',
+    `group_id`     BIGINT       NOT NULL DEFAULT 0 COMMENT '组别ID',
+    `exec_role_id` BIGINT       NOT NULL COMMENT '执行角色',
+    `dis_info`     VARCHAR(255) NOT NULL COMMENT '前端显示文案',
+    `del_flag`     VARCHAR(1)   NOT NULL DEFAULT '0' COMMENT '删除标记',
+    `create_by`    VARCHAR(64)  NOT NULL DEFAULT 'admin' COMMENT '创建人',
+    `update_by`    VARCHAR(64)  NOT NULL DEFAULT 'admin' COMMENT '修改人',
+    `create_time`  DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_time`  DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    PRIMARY KEY `pk_id` (`node_id`) USING BTREE
+) ENGINE = InnoDB
+    COMMENT ='审批链节点';
+
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 27 - 0
doc/db/17sys_chain_gateway.sql

@@ -0,0 +1,27 @@
+USE `cnbg_20240511_001`;
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for sys_chain_gateway
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_chain_gateway`;
+CREATE TABLE `sys_chain_gateway`
+(
+    `gateway_id`   BIGINT AUTO_INCREMENT COMMENT 'Id',
+    `gateway_type` VARCHAR(32) NOT NULL COMMENT '网关类型',
+    `rule_type`    VARCHAR(32) NOT NULL COMMENT '规则类型',
+    `pre_node_id`  BIGINT      NULL COMMENT '上游节点',
+    `next_node_id` BIGINT      NULL COMMENT '下游游节点',
+    `del_flag`     VARCHAR(1)  NOT NULL DEFAULT '0' COMMENT '删除标记',
+    `create_by`    VARCHAR(64) NOT NULL DEFAULT 'admin' COMMENT '创建人',
+    `update_by`    VARCHAR(64) NOT NULL DEFAULT 'admin' COMMENT '修改人',
+    `create_time`  DATETIME    NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_time`  DATETIME    NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    PRIMARY KEY `pk_id` (`gateway_id`) USING BTREE
+) ENGINE = InnoDB
+    COMMENT ='审批链网关';
+
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 26 - 0
doc/db/18sys_chain_check_his.sql

@@ -0,0 +1,26 @@
+USE `cnbg_20240511_001`;
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for sys_chain_node_check_his
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_chain_node_check_his`;
+CREATE TABLE `sys_chain_node_check_his`
+(
+    `his_id`       BIGINT AUTO_INCREMENT COMMENT 'Id',
+    `node_id`      BIGINT       NOT NULL COMMENT '节点ID',
+    `target_id`    BIGINT       NOT NULL COMMENT '目标ID',
+    `check_result` TINYINT(1)   NOT NULL COMMENT '审核结果',
+    `check_msg`    VARCHAR(255) NOT NULL COMMENT '结果描述',
+    `create_by`    VARCHAR(64)  NOT NULL DEFAULT 'admin' COMMENT '创建人',
+    `update_by`    VARCHAR(64)  NOT NULL DEFAULT 'admin' COMMENT '修改人',
+    `create_time`  DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_time`  DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    PRIMARY KEY `pk_id` (`his_id`) USING BTREE
+) ENGINE = InnoDB
+    COMMENT ='审批链节点审核历史';
+
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 29 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/dto/SysCheckChainNodeCheckHistoryDTO.java

@@ -0,0 +1,29 @@
+package com.qunzhixinxi.hnqz.admin.api.dto;
+
+import lombok.AccessLevel;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 节点审批dto
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2024/05/22 17:02
+ */
+@NoArgsConstructor(access = AccessLevel.NONE)
+public final class SysCheckChainNodeCheckHistoryDTO {
+
+    @Data
+    public static class OnCreate {
+
+        private Integer nodeId;
+
+        private Integer targetId;
+
+        private Boolean checkResult;
+
+        private String checkMessage;
+
+    }
+}

+ 94 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/SysCheckChainNode.java

@@ -0,0 +1,94 @@
+package com.qunzhixinxi.hnqz.admin.api.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.qunzhixinxi.hnqz.admin.api.constant.enums.DelEnum;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 审批链节点
+ *
+ * @TableName sys_chain_node
+ */
+@Data
+@TableName(value = "sys_chain_node")
+public class SysCheckChainNode implements Serializable {
+    /**
+     * Id
+     */
+    @TableId(type = IdType.AUTO)
+    private Integer nodeId;
+
+    /**
+     * 节点名称
+     */
+    private String nodeName;
+
+    /**
+     * 上游节点
+     */
+    private Integer preNodeId;
+
+    /**
+     * 下游游节点
+     */
+    private Integer nextNodeId;
+
+    /**
+     * 组别ID
+     */
+    private Integer groupId;
+
+    /**
+     * 执行角色
+     */
+    private Integer execRoleId;
+
+    /**
+     * 前端显示文案
+     */
+    @TableField("dis_info")
+    private String displayInfo;
+
+    /**
+     * 删除标记
+     */
+    @TableLogic
+    private DelEnum delFlag;
+
+    /**
+     * 创建人
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private String createBy;
+
+    /**
+     * 修改人
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private String updateBy;
+
+    /**
+     * 创建时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+
+
+}

+ 74 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/SysCheckChainNodeCheckHistory.java

@@ -0,0 +1,74 @@
+package com.qunzhixinxi.hnqz.admin.api.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 审批链节点审核历史
+ *
+ * @TableName sys_chain_node_check_his
+ */
+@Data
+@TableName(value = "sys_chain_node_check_his")
+public class SysCheckChainNodeCheckHistory implements Serializable {
+    /**
+     * Id
+     */
+    @TableId(value = "his_id", type = IdType.AUTO)
+    private Integer historyId;
+
+    /**
+     * Id
+     */
+    private Integer nodeId;
+
+    /**
+     * 目标对象ID
+     */
+    private Integer targetId;
+
+    /**
+     * 审核结果
+     */
+    private Boolean checkResult;
+
+    /**
+     * 结果描述
+     */
+    private String checkMsg;
+
+    /**
+     * 创建人
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private String createBy;
+
+    /**
+     * 修改人
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private String updateBy;
+
+    /**
+     * 创建时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+
+}

+ 44 - 30
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmTask.java

@@ -12,6 +12,7 @@ import lombok.Getter;
 
 import java.time.LocalDateTime;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 任务表
@@ -216,37 +217,37 @@ public class WmTask extends Model<WmTask> {
      */
     private Integer deptReviewTaskCount;
 
-	/**
-	 * 审核人userId
-	 */
-	private Integer approvalUserId;
+    /**
+     * 审核人userId
+     */
+    private Integer approvalUserId;
 
-	/**
-	 * 审核人姓名
-	 */
-	@TableField(exist = false)
-	private String approvalUserName;
+    /**
+     * 审核人姓名
+     */
+    @TableField(exist = false)
+    private String approvalUserName;
 
-	/**
-	 * 审核时间
-	 */
-	private LocalDateTime approvalTime;
+    /**
+     * 审核时间
+     */
+    private LocalDateTime approvalTime;
 
-	/**
-	 * 企业审核人userId
-	 */
-	private Integer deptApprovalUserId;
+    /**
+     * 企业审核人userId
+     */
+    private Integer deptApprovalUserId;
 
-	/**
-	 * 企业审核人姓名
-	 */
-	@TableField(exist = false)
-	private String deptApprovalUserName;
+    /**
+     * 企业审核人姓名
+     */
+    @TableField(exist = false)
+    private String deptApprovalUserName;
 
-	/**
-	 * 企业审核时间
-	 */
-	private LocalDateTime deptApprovalTime;
+    /**
+     * 企业审核时间
+     */
+    private LocalDateTime deptApprovalTime;
 
     /**
      * 任务用户用户名
@@ -294,10 +295,10 @@ public class WmTask extends Model<WmTask> {
      */
     private String ip2region;
 
-	/**
-	 * 乐观锁
-	 */
-	private Integer version;
+    /**
+     * 乐观锁
+     */
+    private Integer version;
 
     /**
      * 任务提交审核信息
@@ -316,6 +317,19 @@ public class WmTask extends Model<WmTask> {
     @TableField(exist = false)
     private Integer tmpId;
 
+    /**
+     * 审核信息
+     */
+    @TableField(exist = false)
+    private Map<String, Object> checkState;
+
+    /**
+     * 审核节点ID
+     */
+    @TableField(exist = false)
+    private Integer nodeId;
+
+
 
     @Getter
     @AllArgsConstructor

+ 7 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysUserController.java

@@ -117,7 +117,13 @@ public class SysUserController {
                 || Arrays.asList(roles).contains(33)
                 || Arrays.asList(roles).contains(34)
                 || Arrays.asList(roles).contains(35)
-                || Arrays.asList(roles).contains(37);
+                || Arrays.asList(roles).contains(37)
+                || Arrays.asList(roles).contains(38)
+                || Arrays.asList(roles).contains(39)
+                || Arrays.asList(roles).contains(41)
+                || Arrays.asList(roles).contains(42)
+                || Arrays.asList(roles).contains(43)
+                ;
     }
 
     /**

+ 26 - 20
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmTaskController.java

@@ -18,6 +18,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.pig4cloud.plugin.excel.annotation.RequestExcel;
 import com.qunzhixinxi.hnqz.admin.api.constant.CacheConstants;
 import com.qunzhixinxi.hnqz.admin.api.constant.MqConstants;
+import com.qunzhixinxi.hnqz.admin.api.dto.SysCheckChainNodeCheckHistoryDTO;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysDept;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysDictItem;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysFile;
@@ -52,6 +53,7 @@ import com.qunzhixinxi.hnqz.admin.api.constant.enums.SettleStatusEnum;
 import com.qunzhixinxi.hnqz.admin.api.constant.enums.TaskStatusEnum;
 import com.qunzhixinxi.hnqz.admin.api.constant.enums.UserSignPurposeEnum;
 import com.qunzhixinxi.hnqz.admin.api.constant.enums.UserSignResultEnum;
+import com.qunzhixinxi.hnqz.admin.manager.SysCheckChainManager;
 import com.qunzhixinxi.hnqz.admin.mapper.WmTaskMapper;
 import com.qunzhixinxi.hnqz.admin.service.SysDeptService;
 import com.qunzhixinxi.hnqz.admin.service.SysDictItemService;
@@ -148,48 +150,29 @@ import java.util.stream.Stream;
 public class WmTaskController {
 
     private final WmTaskService wmTaskService;
-
     private final WmTaskMapper wmTaskMapper;
-
     private final WmScorePackageService wmScorePackageService;
-
     private final SysDeptService sysDeptService;
-
     private final SysUserService sysUserService;
-
     private final WmDaDrugEntService wmDaDrugEntService;
-
     private final WmTaskTypeService wmTaskTypeService;
-
     private final WmTaskRuleService wmTaskRuleService;
-
     private final WmDaAgentService wmDaAgentService;
-
     private final WmDaHospitalService wmDaHospitalService;
-
     private final WmDaDistributionService wmDaDistributionService;
-
     private final WmTaskContentService wmTaskContentService;
-
     private final WmWkArticleService wmWkArticleService;
-
     private final WmWkArticleShareService wmWkArticleShareService;
-
     private final WmWkAlbumService wmWkAlbumService;
-
     private final WmUserSignService wmUserSignService;
-
     private final WmUserSignDetailService wmUserSignDetailService;
-
     private final WmTaskContentConfigService wmTaskContentConfigService;
-
     private final SysDictItemService sysDictItemService;
-
     private final SysFileService sysFileService;
-
     private final RabbitMqClient rabbitMqClient;
     private final RedisTemplate<String, String> redisTemplate;
     private final UpmsConfig upmsConfig;
+    private final SysCheckChainManager checkChainManager;
 
     /**
      * 分页查询
@@ -1647,6 +1630,29 @@ public class WmTaskController {
 
     }
 
+    @PostMapping(value = "/task/check/node/history/create")
+    public R<Boolean> doCheck(@RequestBody WmTask wmTask) {
+
+        //要循环判断,每一个接单用户,所有用户完成,审核通过,才算是积分包完成
+        //有没有什么问题,例如,个人包收回,影响积分包的积分值
+        String[] ids = wmTask.getId().split(",");
+        if (ids.length <= 0) {
+            return R.failed("缺少参数!");
+        }
+
+        List<SysCheckChainNodeCheckHistoryDTO.OnCreate> collect = Arrays.stream(ids).map(id -> {
+            SysCheckChainNodeCheckHistoryDTO.OnCreate res = new SysCheckChainNodeCheckHistoryDTO.OnCreate();
+            res.setNodeId(wmTask.getNodeId());
+            res.setTargetId(Integer.valueOf(id));
+            res.setCheckResult(Boolean.TRUE);
+            res.setCheckMessage(wmTask.getTaskStatusInfo());
+            return res;
+        }).collect(Collectors.toList());
+        return R.ok(checkChainManager.doCheck(collect, SecurityUtils.getUser()));
+
+    }
+
+
     /**
      * 新增举证--结算包举证
      *

+ 153 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/manager/SysCheckChainManager.java

@@ -0,0 +1,153 @@
+package com.qunzhixinxi.hnqz.admin.manager;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.qunzhixinxi.hnqz.admin.api.dto.SysCheckChainNodeCheckHistoryDTO;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysCheckChainNode;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysCheckChainNodeCheckHistory;
+import com.qunzhixinxi.hnqz.admin.service.SysCheckChainNodeCheckHistoryService;
+import com.qunzhixinxi.hnqz.admin.service.SysCheckChainNodeService;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 服务管理器
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2024/05/22 11:22
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class SysCheckChainManager {
+
+    private final SysCheckChainNodeService checkChainNodeService;
+    private final SysCheckChainNodeCheckHistoryService checkChainNodeCheckHistoryService;
+
+
+    public Boolean doCheck(Collection<SysCheckChainNodeCheckHistoryDTO.OnCreate> resources, HnqzUser operator){
+
+
+        List<SysCheckChainNodeCheckHistory> collect = resources.stream().map(resource -> {
+            SysCheckChainNodeCheckHistory history = new SysCheckChainNodeCheckHistory();
+            history.setNodeId(resource.getNodeId());
+            history.setTargetId(resource.getTargetId());
+            history.setCheckResult(resource.getCheckResult());
+            history.setCheckMsg(resource.getCheckMessage());
+            history.setCreateBy(operator.getUsername());
+            history.setUpdateBy(operator.getUsername());
+            history.setCreateTime(LocalDateTime.now());
+            history.setUpdateTime(LocalDateTime.now());
+            return history;
+        }).collect(Collectors.toList());
+
+
+        return checkChainNodeCheckHistoryService.createHistory(collect);
+    }
+
+
+
+    /**
+     * 获取目标的最新的审核状态
+     */
+    public Map<Integer, Map<String, Object>> getTargetLatestCheckState(Collection<Integer> targetIds) {
+
+        // 获取目标的所有审核
+        List<SysCheckChainNodeCheckHistory> histories = checkChainNodeCheckHistoryService.getTargetLatestCheckState(targetIds);
+
+        if (CollUtil.isEmpty(histories)) {
+            return initTargetCheckMap(targetIds, Collections.emptyMap());
+        } else {
+            Map<Integer, List<SysCheckChainNodeCheckHistory>> hisMap = histories.stream().collect(Collectors.groupingBy(SysCheckChainNodeCheckHistory::getTargetId));
+            return initTargetCheckMap(targetIds, hisMap);
+        }
+
+    }
+
+
+    private Map<Integer, Map<String, Object>> initTargetCheckMap(Collection<Integer> targetIds, Map<Integer, List<SysCheckChainNodeCheckHistory>> hisMap) {
+
+        // 获取所有的审核节点
+        List<SysCheckChainNode> allCheckNodes = checkChainNodeService.list();
+        Map<Integer, SysCheckChainNode> nodeMap = allCheckNodes.stream().collect(Collectors.toMap(SysCheckChainNode::getNodeId, Function.identity()));
+
+        // 封装初始化结果
+        Map<Integer, Map<String, Object>> res = new HashMap<>(targetIds.size());
+        for (Integer tid : targetIds) {
+
+            Boolean checkResult;
+            String checkMsg;
+            String displayInfo = null;
+            String nextNodeId = null;
+
+            // 任务的审核记录
+            List<SysCheckChainNodeCheckHistory> histories = hisMap.get(tid);
+
+            Integer nodeId;
+            if (CollUtil.isNotEmpty(histories)) {
+                SysCheckChainNodeCheckHistory history = histories.get(0);
+
+                nodeId = history.getNodeId();
+
+                // 如果是服务组别
+                if (nodeId == 4) {
+                    nextNodeId = "8,9";
+                }
+                // 如果最新提交的是市场组
+                else if (nodeId == 8) {
+                    history = histories.get(1);
+                    // 证明服务组已经审核完毕了
+                    if (history.getNodeId() == 9) {
+                        nextNodeId = "5";
+                        displayInfo = nodeMap.get(4).getDisplayInfo();
+                    }
+                }
+                // 如果最信提交的是服务组
+                else if (nodeId == 9) {
+                    history = histories.get(1);
+                    // 证明服务组已经审核完毕了
+                    if (history.getNodeId() == 8) {
+                        nextNodeId = "5";
+                        displayInfo = nodeMap.get(4).getDisplayInfo();
+                    }
+                }
+                checkMsg = history.getCheckMsg();
+                checkResult = history.getCheckResult();
+
+
+            } else {
+                nodeId = 1;
+                checkMsg = "";
+                checkResult = null;
+            }
+
+            SysCheckChainNode chainNode = nodeMap.get(nodeId);
+            Map<String, Object> temp = new HashMap<>(5);
+            temp.put("checkResult", checkResult);
+            temp.put("checkMsg", checkMsg);
+            temp.put("roleId", chainNode.getExecRoleId());
+            temp.put("displayInfo", StrUtil.isBlank(displayInfo) ? chainNode.getDisplayInfo() : displayInfo);
+            temp.put("nextNodeId", StrUtil.isBlank(nextNodeId) ? nodeMap.get(nodeId).getNextNodeId().toString() : nextNodeId);
+            res.put(tid, temp);
+        }
+
+
+        return res;
+
+
+    }
+
+
+}

+ 21 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/SysCheckChainNodeCheckHistoryMapper.java

@@ -0,0 +1,21 @@
+package com.qunzhixinxi.hnqz.admin.mapper;
+
+import com.qunzhixinxi.hnqz.admin.api.entity.SysCheckChainNodeCheckHistory;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 审批链节点审核历史
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2024/05/22 11:14
+ */
+@Mapper
+public interface SysCheckChainNodeCheckHistoryMapper extends BaseMapper<SysCheckChainNodeCheckHistory> {
+
+}
+
+
+
+

+ 21 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/SysCheckChainNodeMapper.java

@@ -0,0 +1,21 @@
+package com.qunzhixinxi.hnqz.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysCheckChainNode;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 审批链节点
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2024/05/22 11:14
+ */
+@Mapper
+public interface SysCheckChainNodeMapper extends BaseMapper<SysCheckChainNode> {
+
+}
+
+
+
+

+ 1 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmTaskMapper.java

@@ -100,7 +100,7 @@ public interface WmTaskMapper extends DataScopeMapper<WmTask> {
 
     List<Map<String, Object>> getTaskListByIdsZdJs(@Param("query") WmTask wmTask);
 
-    IPage<WmTask> getWmTaskList(Page page, @Param("query") WmTask wmTask);
+    Page<WmTask> getWmTaskList(Page page, @Param("query") WmTask wmTask);
 
     /**
      * 根据配置查询任务

+ 21 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysCheckChainNodeCheckHistoryService.java

@@ -0,0 +1,21 @@
+package com.qunzhixinxi.hnqz.admin.service;
+
+import com.qunzhixinxi.hnqz.admin.api.entity.SysCheckChainNodeCheckHistory;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 审批链节点审核历史服务
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2024/05/22 12:10
+ */
+public interface SysCheckChainNodeCheckHistoryService extends IService<SysCheckChainNodeCheckHistory> {
+
+    List<SysCheckChainNodeCheckHistory> getTargetLatestCheckState(Collection<Integer> targetIds);
+
+    Boolean createHistory(Collection<SysCheckChainNodeCheckHistory> history);
+}

+ 13 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysCheckChainNodeService.java

@@ -0,0 +1,13 @@
+package com.qunzhixinxi.hnqz.admin.service;
+
+import com.qunzhixinxi.hnqz.admin.api.entity.SysCheckChainNode;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author jimmy
+* @description 针对表【sys_chain_node(审批链节点)】的数据库操作Service
+* @createDate 2024-05-22 11:08:25
+*/
+public interface SysCheckChainNodeService extends IService<SysCheckChainNode> {
+
+}

+ 3 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysUserService.java

@@ -137,4 +137,7 @@ public interface SysUserService extends IService<SysUser> {
      * @return 区域树
      */
     List<Tree<Long>> getUserAreaTree(Long id);
+
+
+
 }

+ 44 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysCheckChainNodeCheckHistoryServiceImpl.java

@@ -0,0 +1,44 @@
+package com.qunzhixinxi.hnqz.admin.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysCheckChainNodeCheckHistory;
+import com.qunzhixinxi.hnqz.admin.mapper.SysCheckChainNodeCheckHistoryMapper;
+import com.qunzhixinxi.hnqz.admin.service.SysCheckChainNodeCheckHistoryService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 审批链节点审核历史服务实现
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2024/05/22 12:10
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class SysCheckChainNodeCheckHistoryServiceImpl extends ServiceImpl<SysCheckChainNodeCheckHistoryMapper, SysCheckChainNodeCheckHistory>
+        implements SysCheckChainNodeCheckHistoryService {
+
+    @Override
+    public List<SysCheckChainNodeCheckHistory> getTargetLatestCheckState(Collection<Integer> targetIds) {
+        return this.list(Wrappers.<SysCheckChainNodeCheckHistory>lambdaQuery().in(SysCheckChainNodeCheckHistory::getTargetId, targetIds).orderByDesc(SysCheckChainNodeCheckHistory::getCreateTime));
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean createHistory(Collection<SysCheckChainNodeCheckHistory> history) {
+
+        return this.saveBatch(history);
+    }
+}
+
+
+
+

+ 26 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysCheckChainNodeImpl.java

@@ -0,0 +1,26 @@
+package com.qunzhixinxi.hnqz.admin.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysCheckChainNode;
+import com.qunzhixinxi.hnqz.admin.mapper.SysCheckChainNodeMapper;
+import com.qunzhixinxi.hnqz.admin.service.SysCheckChainNodeService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author jimmy
+ * @description 针对表【sys_chain_node(审批链节点)】的数据库操作Service实现
+ * @createDate 2024-05-22 11:08:25
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class SysCheckChainNodeImpl extends ServiceImpl<SysCheckChainNodeMapper, SysCheckChainNode>
+        implements SysCheckChainNodeService {
+
+}
+
+
+
+

+ 2 - 2
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmTaskContentServiceImpl.java

@@ -569,11 +569,11 @@ public class WmTaskContentServiceImpl extends ServiceImpl<WmTaskContentMapper, W
 		this.limitScore(sysU.getUserId(), sysU.getDeptId(), tWmScorePackage.getPackageType1());
 
 		// 获取校验规则
-		List<WmTaskSubmissionRule.SubmissionRule> taskSubmissionRule = this.getTaskSubmissionRule(wmTaskContent.getTemp30(), tWmScorePackage.getRelatedService());
+		//List<WmTaskSubmissionRule.SubmissionRule> taskSubmissionRule = this.getTaskSubmissionRule(wmTaskContent.getTemp30(), tWmScorePackage.getRelatedService());
 
 
 		// 校验提交数据
-		this.checkTaskContent(tWmScorePackage, wmTaskContent, sysU.getUserId(), taskSubmissionRule);
+		//this.checkTaskContent(tWmScorePackage, wmTaskContent, sysU.getUserId(), taskSubmissionRule);
 
 		Map<String, String> resultMap = new HashMap<>();
 		WmScorePackageStatus scorePackageStatus = statusList.get(0);

+ 51 - 11
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmTaskServiceImpl.java

@@ -19,6 +19,8 @@ import com.baomidou.mybatisplus.core.metadata.OrderItem;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.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.config.UpmsConfig;
@@ -41,6 +43,7 @@ import com.qunzhixinxi.hnqz.admin.api.constant.enums.PackageStatusEnum;
 import com.qunzhixinxi.hnqz.admin.api.constant.enums.PackageTypeEnum;
 import com.qunzhixinxi.hnqz.admin.api.constant.enums.ScorePackageStatusEnum;
 import com.qunzhixinxi.hnqz.admin.api.constant.enums.TaskStatusEnum;
+import com.qunzhixinxi.hnqz.admin.manager.SysCheckChainManager;
 import com.qunzhixinxi.hnqz.admin.mapper.WmReportMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.WmScorePackageMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.WmTaskContentMapper;
@@ -127,6 +130,7 @@ public class WmTaskServiceImpl extends ServiceImpl<WmTaskMapper, WmTask> impleme
     private WmDaDistributionService wmDaDistributionService;
     private final RedisTemplate<String, Object> redisTemplate;
     private final UpmsConfig upmsConfig;
+    private final SysCheckChainManager checkChainManager;
 
     @Autowired
     public void setWmDaHospitalService(WmDaHospitalService wmDaHospitalService) {
@@ -293,7 +297,7 @@ public class WmTaskServiceImpl extends ServiceImpl<WmTaskMapper, WmTask> impleme
     public R<?> selectByWmTask(WmTask wmTask) {
         String packageId = wmTask.getScorePackageId();  // 获取积分包ID
         List<WmScorePackage> wmScorePackageList = wmScorePackageMapper.selectByRelationScoreIdList(packageId);
-        List<String> idList = wmScorePackageList.stream().map(p -> p.getId()).collect(Collectors.toList());
+        List<String> idList = wmScorePackageList.stream().map(WmScorePackage::getId).collect(Collectors.toList());
         idList.add(packageId);
         List<String> strs1 = new ArrayList<>();
         WmScorePackage wmScorePackage = wmScorePackageService.getById(packageId);
@@ -369,13 +373,16 @@ public class WmTaskServiceImpl extends ServiceImpl<WmTaskMapper, WmTask> impleme
                     }
                 }
             }
-        } else if (sysDept.getLevel() == 4) {
+        }
+
+
+        else if (sysDept.getLevel() == 4) {
             // 二级CSO
-            if (Objects.nonNull(wmScorePackage.getDrugEntId())) {
-                // 通过drugEntId为空,判断是否为药企发来的包,即药企->一级CSO->二级CSO的包
-                // 药企->一级CSO->二级CSO的大包,只能由一级CSO提交报告审批,二级CSO在任务中心中,点击生成报告按钮应提示没有权限
-                return R.ok(0);
-            }
+            //if (Objects.nonNull(wmScorePackage.getDrugEntId())) {
+            //    // 通过drugEntId为空,判断是否为药企发来的包,即药企->一级CSO->二级CSO的包
+            //    // 药企->一级CSO->二级CSO的大包,只能由一级CSO提交报告审批,二级CSO在任务中心中,点击生成报告按钮应提示没有权限
+            //    return R.ok(0);
+            //}
             wmTask.setExtIds(strs1);
             wmTask.setTaskStatus(String.valueOf(3));
             List<WmTask> taskList = new ArrayList<>();
@@ -1440,16 +1447,33 @@ public class WmTaskServiceImpl extends ServiceImpl<WmTaskMapper, WmTask> impleme
 
         IPage<WmTask> taskPage = wmTaskMapper.getWmTaskList(page, wmTask);
         if (CollUtil.isNotEmpty(taskPage.getRecords())) {
+
+            Set<Integer> taskIds = taskPage.getRecords().stream().mapToInt(task -> Integer.parseInt(task.getId())).boxed().collect(Collectors.toSet());
+
+            Map<Integer, Map<String, Object>> targetLatestCheckState = checkChainManager.getTargetLatestCheckState(taskIds);
+
             Set<Integer> approvalUserIds = taskPage.getRecords().stream()
                     .map(WmTask::getApprovalUserId)
                     .filter(Objects::nonNull).collect(Collectors.toSet());
+            Map<Integer, String> userMap = null;
             if (CollUtil.isNotEmpty(approvalUserIds)) {
                 List<SysUser> users = userService.listByIds(approvalUserIds);
-                Map<Integer, String> userMap = users.stream().collect(Collectors.toMap(SysUser::getUserId, SysUser::getRealname));
-                taskPage.getRecords().stream()
-                        .filter(r -> r.getApprovalUserId() != null)
-                        .forEach(r -> r.setApprovalUserName(userMap.get(r.getApprovalUserId())));
+                userMap = users.stream().collect(Collectors.toMap(SysUser::getUserId, SysUser::getRealname));
+
+                //taskPage.getRecords().stream()
+                //        .filter(r -> r.getApprovalUserId() != null)
+                //        .forEach(r -> r.setApprovalUserName(userMap.get(r.getApprovalUserId())));
+
             }
+
+            for (WmTask task : taskPage.getRecords()){
+                if (task.getApprovalUserId() != null && CollUtil.isNotEmpty(userMap)){
+                    task.setApprovalUserName(userMap.get(task.getApprovalUserId()));
+                }
+
+                task.setCheckState(targetLatestCheckState.get(Integer.parseInt(task.getId())));
+            }
+
         }
 
         return R.ok(taskPage);
@@ -1659,6 +1683,8 @@ public class WmTaskServiceImpl extends ServiceImpl<WmTaskMapper, WmTask> impleme
             });
         }
 
+
+        Boolean checkResult = null;
         switch (wmTask.getTaskStatus()) {
             case "3": // 审核通过
 
@@ -1703,14 +1729,28 @@ public class WmTaskServiceImpl extends ServiceImpl<WmTaskMapper, WmTask> impleme
                 updateWrapper.set(WmTask::getRealFlag, "0");
                 updateWrapper.set(WmTask::getUpdateTime, now);
                 this.update(updateWrapper);
+                checkResult = true;
                 break;
             case "4": // 审核不通过
                 updateWrapper.set(WmTask::getTaskStatus, wmTask.getTaskStatus());
                 updateWrapper.set(WmTask::getRealFlag, "0");
                 this.update(updateWrapper);
+                checkResult = false;
                 break;
         }
 
+        // 创建审批流审核记录
+        Boolean finalCheckResult = checkResult;
+        List<SysCheckChainNodeCheckHistoryDTO.OnCreate> collect = Arrays.stream(ids).map(id -> {
+            SysCheckChainNodeCheckHistoryDTO.OnCreate res = new SysCheckChainNodeCheckHistoryDTO.OnCreate();
+            res.setNodeId(wmTask.getNodeId());
+            res.setTargetId(Integer.valueOf(id));
+            res.setCheckResult(finalCheckResult);
+            res.setCheckMessage(wmTask.getTaskStatusInfo());
+            return res;
+        }).collect(Collectors.toList());
+        checkChainManager.doCheck(collect, SecurityUtils.getUser());
+
         wmTaskList.forEach(task -> {
             WmScorePackageStatus scorePackageStatus = new WmScorePackageStatus();
             scorePackageStatus.setPackageId(wmScorePackage.getId());