浏览代码

基因定制流程提交、审核、执行,审批流程记录

陈长荣 3 月之前
父节点
当前提交
b07c611e4c
共有 17 个文件被更改,包括 448 次插入15 次删除
  1. 4 0
      jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/cache/UserIdNameCache.java
  2. 17 8
      jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/constants/GeneStatusEnum.java
  3. 26 3
      jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/flow/controller/FlowController.java
  4. 2 0
      jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/flow/entity/FlowAudit.java
  5. 15 0
      jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/flow/entity/FlowInfo.java
  6. 23 0
      jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/flow/service/FlowInfoService.java
  7. 9 0
      jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/flow/service/NotifyService.java
  8. 97 2
      jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/flow/service/impl/FlowInfoServiceImpl.java
  9. 120 0
      jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/flow/service/impl/NotifyServiceImpl.java
  10. 33 0
      jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/flow/vo/FlowAuditVo.java
  11. 6 0
      jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/flow/vo/FlowDetailVo.java
  12. 5 2
      jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/flow/vo/FlowPageVo.java
  13. 33 0
      jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/sys/entity/DBSystemProperties.java
  14. 7 0
      jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/sys/mapper/DBSystemPropertiesMapper.java
  15. 11 0
      jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/sys/service/DBSystemPropertiesService.java
  16. 32 0
      jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/sys/service/impl/DBSystemPropertiesServiceImpl.java
  17. 8 0
      jfcloud-gene-common/src/main/java/com/github/jfcloud/gene/common/constant/StrConstant.java

+ 4 - 0
jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/cache/UserIdNameCache.java

@@ -159,6 +159,10 @@ public class UserIdNameCache {
      * @param userId 用户id
      * @return 昵称,如果不存在,返回空字符串
      */
+    public String getNicknameByUserId(String userId) {
+        return getNicknameByUserId(Long.parseLong(userId), "");
+    }
+
     public String getNicknameByUserId(Long userId) {
         return getNicknameByUserId(userId, "");
     }

+ 17 - 8
jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/constants/GeneStatusEnum.java

@@ -1,10 +1,14 @@
 package com.github.jfcloud.gene.constants;
 
+import java.util.Arrays;
+import java.util.List;
+
 /**
  * 基因定制流程状态
  */
 public enum GeneStatusEnum {
     DRAFT("0", "待提交"),
+    REJECTED("-1", "驳回"),
     GENE_EDITING("20", "基因编辑部门负责人审核"),
     PROJECT_LEADER("40", "项目负责人审核"),
     PROJECT_MANAGEMENT("60", "项目管理部审核"),
@@ -18,14 +22,10 @@ public enum GeneStatusEnum {
         this.description = description;
     }
 
-    public static String getLabelByStatus(String status) {
-        for (GeneStatusEnum e : values()) {
-            if (e.getStatus().equals(status)) {
-                return e.getDescription();
-            }
-        }
-        return "";
-    }
+    /**
+     * 提交状态
+     */
+    public static final List<String> SUBMIT_STATUS = Arrays.asList(DRAFT.getStatus(), REJECTED.getStatus());
 
     public String getStatus() {
         return status;
@@ -34,4 +34,13 @@ public enum GeneStatusEnum {
     public String getDescription() {
         return description;
     }
+
+    public static GeneStatusEnum getByStatus(String status) {
+        for (GeneStatusEnum e : values()) {
+            if (e.getStatus().equals(status)) {
+                return e;
+            }
+        }
+        return null;
+    }
 }

+ 26 - 3
jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/flow/controller/FlowController.java

@@ -6,7 +6,8 @@ import com.github.jfcloud.common.core.util.R;
 import com.github.jfcloud.gene.constants.GeneStatusEnum;
 import com.github.jfcloud.gene.flow.dto.FlowDetailDto;
 import com.github.jfcloud.gene.flow.dto.FlowPageDto;
-import com.github.jfcloud.gene.flow.service.impl.FlowInfoServiceImpl;
+import com.github.jfcloud.gene.flow.service.FlowInfoService;
+import com.github.jfcloud.gene.flow.vo.FlowAuditVo;
 import com.github.jfcloud.gene.flow.vo.FlowDetailVo;
 import com.github.jfcloud.gene.flow.vo.FlowPageVo;
 import io.swagger.v3.oas.annotations.Operation;
@@ -26,7 +27,7 @@ import java.util.stream.Stream;
 @RequiredArgsConstructor
 public class FlowController {
 
-    private final FlowInfoServiceImpl flowInfoService;
+    private final FlowInfoService flowInfoService;
 
     @Operation(summary = "列表查询")
     @GetMapping("/page")
@@ -44,6 +45,7 @@ public class FlowController {
     @GetMapping("/statusList")
     public R<List<Pair<String, String>>> statusList() {
         List<Pair<String, String>> pairs = Stream.of(GeneStatusEnum.values())
+                .filter(e -> GeneStatusEnum.REJECTED != e)
                 .map(x -> new Pair<>(x.getStatus(), x.getDescription()))
                 .collect(Collectors.toList());
         return R.ok(pairs);
@@ -65,11 +67,32 @@ public class FlowController {
         return R.ok();
     }
 
-    @WebApiLog
     @Operation(summary = "删除")
     @DeleteMapping("/{id}")
     public R delete(@PathVariable Long id) {
         flowInfoService.removeById(id);
         return R.ok();
     }
+
+    @Operation(summary = "提交")
+    @PostMapping("/submit/{id}")
+    public R submit(@PathVariable Long id) {
+        flowInfoService.submitFlow(id);
+        return R.ok();
+    }
+
+    @WebApiLog
+    @Operation(summary = "审核")
+    @PostMapping("/audit/{id}")
+    public R audit(@PathVariable Long id, @Valid @RequestBody FlowAuditVo vo) {
+        flowInfoService.audit(id, vo);
+        return R.ok();
+    }
+
+    @Operation(summary = "执行")
+    @PostMapping("/execute/{id}")
+    public R execute(@PathVariable Long id) {
+        flowInfoService.execute(id);
+        return R.ok();
+    }
 }

+ 2 - 0
jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/flow/entity/FlowAudit.java

@@ -3,6 +3,7 @@ package com.github.jfcloud.gene.flow.entity;
 import com.github.jfcloud.gene.common.entity.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
 
 import java.io.Serializable;
 
@@ -11,6 +12,7 @@ import java.io.Serializable;
  * flow_audit
  */
 @EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
 @Data
 public class FlowAudit extends BaseEntity implements Serializable {
     private static final long serialVersionUID = 1L;

+ 15 - 0
jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/flow/entity/FlowInfo.java

@@ -3,6 +3,7 @@ package com.github.jfcloud.gene.flow.entity;
 import com.github.jfcloud.gene.common.entity.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
 
 import java.io.Serializable;
 
@@ -11,6 +12,7 @@ import java.io.Serializable;
  * flow_info
  */
 @EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
 @Data
 public class FlowInfo extends BaseEntity implements Serializable {
     private static final long serialVersionUID = 1L;
@@ -50,6 +52,15 @@ public class FlowInfo extends BaseEntity implements Serializable {
      * 项目负责人邮箱
      */
     private String projectLeaderEmail;
+    /**
+     * 基因编辑部门负责人
+     */
+    private Long geneEditPlId;
+
+    /**
+     * 项目管理部审核人
+     */
+    private Long projectManageId;
     /**
      * 机构名称
      */
@@ -78,4 +89,8 @@ public class FlowInfo extends BaseEntity implements Serializable {
      * 终末取材
      */
     private String finalSampling;
+    /**
+     * 科研id
+     */
+    private Long kyId;
 }

+ 23 - 0
jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/flow/service/FlowInfoService.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.github.jfcloud.gene.flow.dto.FlowDetailDto;
 import com.github.jfcloud.gene.flow.dto.FlowPageDto;
 import com.github.jfcloud.gene.flow.entity.FlowInfo;
+import com.github.jfcloud.gene.flow.vo.FlowAuditVo;
 import com.github.jfcloud.gene.flow.vo.FlowDetailVo;
 import com.github.jfcloud.gene.flow.vo.FlowPageVo;
 
@@ -37,4 +38,26 @@ public interface FlowInfoService extends IService<FlowInfo> {
      * @param vo
      */
     void updateFlow(Long id, FlowDetailVo vo);
+
+    /**
+     * 提交
+     *
+     * @param id
+     */
+    void submitFlow(Long id);
+
+    /**
+     * 审核
+     *
+     * @param id
+     * @param vo
+     */
+    void audit(Long id, FlowAuditVo vo);
+
+    /**
+     * 执行
+     *
+     * @param id
+     */
+    void execute(Long id);
 }

+ 9 - 0
jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/flow/service/NotifyService.java

@@ -0,0 +1,9 @@
+package com.github.jfcloud.gene.flow.service;
+
+public interface NotifyService {
+
+    /**
+     * 通知
+     */
+    void notify(Long flowId);
+}

+ 97 - 2
jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/flow/service/impl/FlowInfoServiceImpl.java

@@ -8,15 +8,19 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.jfcloud.common.data.datascope.DataScope;
 import com.github.jfcloud.gene.cache.UserIdNameCache;
+import com.github.jfcloud.gene.common.constant.StrConstant;
 import com.github.jfcloud.gene.common.constant.WhetherEnum;
 import com.github.jfcloud.gene.common.util.CustomIdGenerator;
 import com.github.jfcloud.gene.constants.GeneStatusEnum;
 import com.github.jfcloud.gene.constants.GeneTargetEnum;
 import com.github.jfcloud.gene.flow.dto.FlowDetailDto;
 import com.github.jfcloud.gene.flow.dto.FlowPageDto;
+import com.github.jfcloud.gene.flow.entity.FlowAudit;
 import com.github.jfcloud.gene.flow.entity.FlowInfo;
 import com.github.jfcloud.gene.flow.mapper.FlowInfoMapper;
 import com.github.jfcloud.gene.flow.service.FlowInfoService;
+import com.github.jfcloud.gene.flow.service.NotifyService;
+import com.github.jfcloud.gene.flow.vo.FlowAuditVo;
 import com.github.jfcloud.gene.flow.vo.FlowDetailVo;
 import com.github.jfcloud.gene.flow.vo.FlowPageVo;
 import com.github.jfcloud.gene.form.entity.StrainCustomInfo;
@@ -38,17 +42,24 @@ public class FlowInfoServiceImpl extends ServiceImpl<FlowInfoMapper, FlowInfo> i
     private final UserIdNameCache userIdNameCache;
     private final StrainCustomInfoService customInfoService;
     private final StrainPurificationInfoService purificationInfoService;
+    private final NotifyService notifyService;
 
     @Override
     public Page<FlowPageDto> getPage(FlowPageVo vo) {
         Page<FlowInfo> pageQuery = new Page<>(vo.getCurrent(), vo.getSize());
+
+        //如果查询待提交,将驳回状态的一并查出
+        if (vo.getStatusList().contains(GeneStatusEnum.DRAFT.getStatus())) {
+            vo.getStatusList().add(GeneStatusEnum.REJECTED.getStatus());
+        }
+
         LambdaQueryWrapper<FlowInfo> lqw = new LambdaQueryWrapper<>(FlowInfo.class)
                 .like(StrUtil.isNotBlank(vo.getProjectName()), FlowInfo::getProjectName, vo.getProjectName())
                 .like(StrUtil.isNotBlank(vo.getContractNo()), FlowInfo::getContractNo, vo.getContractNo())
                 .like(StrUtil.isNotBlank(vo.getApprovalNo()), FlowInfo::getApprovalNo, vo.getApprovalNo())
                 .eq(Objects.nonNull(vo.getProjectLeaderId()), FlowInfo::getProjectLeaderId, vo.getProjectLeaderId())
                 .eq(Objects.nonNull(vo.getCreateBy()), FlowInfo::getCreateBy, vo.getCreateBy())
-                .eq(StrUtil.isNotBlank(vo.getStatus()), FlowInfo::getStatus, vo.getStatus())
+                .in(!vo.getStatusList().isEmpty(), FlowInfo::getStatus, vo.getStatusList())
                 .eq(FlowInfo::getDeleted, WhetherEnum.NO.getCode())
                 .orderByDesc(FlowInfo::getCreateTime);
         Page<FlowInfo> page = baseMapper.selectPageByScope(pageQuery, lqw, DataScope.of());
@@ -70,7 +81,7 @@ public class FlowInfoServiceImpl extends ServiceImpl<FlowInfoMapper, FlowInfo> i
         Assert.notNull(flowInfo, "基因定制流程不存在");
 
         FlowDetailDto detail = BeanUtil.copyProperties(flowInfo, FlowDetailDto.class);
-        detail.setStatusLabel(GeneStatusEnum.getLabelByStatus(detail.getStatus()));
+        detail.setStatusLabel(Objects.requireNonNull(GeneStatusEnum.getByStatus(detail.getStatus())).getDescription());
         detail.setCustom(customInfoService.getByFlowId(id));
         detail.setPurification(purificationInfoService.getByFlowId(id));
         return detail;
@@ -138,4 +149,88 @@ public class FlowInfoServiceImpl extends ServiceImpl<FlowInfoMapper, FlowInfo> i
         flowInfo.setTarget(target.toString());
         flowInfo.updateById();
     }
+
+    @Override
+    public void submitFlow(Long id) {
+        FlowInfo flowInfo = getById(id);
+        Assert.notNull(flowInfo, "基因定制流程不存在");
+        Assert.isTrue(GeneStatusEnum.SUBMIT_STATUS.contains(flowInfo.getStatus()), "流程状态错误");
+
+        new FlowInfo()
+                .setId(id)
+                .setStatus(GeneStatusEnum.GENE_EDITING.getStatus())
+                .updateById();
+
+        notifyService.notify(id);
+    }
+
+    @Override
+    public void audit(Long id, FlowAuditVo vo) {
+        FlowInfo flowInfo = getById(id);
+        Assert.notNull(flowInfo, "基因定制流程不存在");
+        Assert.isFalse(GeneStatusEnum.SUBMIT_STATUS.contains(flowInfo.getStatus()), "流程状态错误");
+
+        //审核不通过
+        if (StrConstant.NO.equals(vo.getAuditResult())) {
+            log.info("流程项目 ({}) 审核不通过", flowInfo.getProjectName());
+
+            new FlowAudit()
+                    .setFlowId(id)
+                    .setFlowStatus(flowInfo.getStatus())
+                    .setAuditResult(vo.getAuditResult())
+                    .setRemarks(vo.getRemarks())
+                    .insert();
+
+            new FlowInfo()
+                    .setId(id)
+                    .setStatus(GeneStatusEnum.REJECTED.getStatus())
+                    .updateById();
+
+            notifyService.notify(id);
+            return;
+        }
+
+        Assert.isTrue(StrConstant.YES.equals(vo.getAuditResult()), "审核结果错误");
+
+        //审核通过
+        log.info("流程项目 ({}) 审核通过", flowInfo.getProjectName());
+
+        String nextStatus = "";
+        GeneStatusEnum statusEnum = Objects.requireNonNull(GeneStatusEnum.getByStatus(flowInfo.getStatus()));
+        switch (statusEnum) {
+            case GENE_EDITING:
+                nextStatus = GeneStatusEnum.PROJECT_LEADER.getStatus();
+                break;
+            case PROJECT_LEADER:
+                nextStatus = GeneStatusEnum.PROJECT_MANAGEMENT.getStatus();
+                break;
+            case PROJECT_MANAGEMENT:
+                nextStatus = GeneStatusEnum.COMPLETED.getStatus();
+                break;
+            default:
+                log.info("流程项目 ({}) 状态为{}", flowInfo.getProjectName(), statusEnum.getDescription());
+                throw new IllegalArgumentException("流程状态错误");
+        }
+
+        new FlowAudit()
+                .setFlowId(id)
+                .setFlowStatus(flowInfo.getStatus())
+                .setAuditResult(vo.getAuditResult())
+                .setRemarks(vo.getRemarks())
+                .insert();
+
+        flowInfo = new FlowInfo();
+        //更新项目批准编号、修订号等
+        BeanUtil.copyProperties(vo, flowInfo);
+        flowInfo.setId(id)
+                .setStatus(nextStatus)
+                .updateById();
+
+        notifyService.notify(id);
+    }
+
+    @Override
+    public void execute(Long id) {
+
+    }
 }

+ 120 - 0
jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/flow/service/impl/NotifyServiceImpl.java

@@ -0,0 +1,120 @@
+package com.github.jfcloud.gene.flow.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.github.jfcloud.admin.api.sys.dto.message.MessageUserDTO;
+import com.github.jfcloud.admin.api.sys.dto.message.TextMessageParam;
+import com.github.jfcloud.admin.api.sys.feign.RemoteNoticeService;
+import com.github.jfcloud.gene.cache.UserIdNameCache;
+import com.github.jfcloud.gene.common.constant.WhetherEnum;
+import com.github.jfcloud.gene.constants.GeneStatusEnum;
+import com.github.jfcloud.gene.flow.entity.FlowAudit;
+import com.github.jfcloud.gene.flow.entity.FlowInfo;
+import com.github.jfcloud.gene.flow.mapper.FlowAuditMapper;
+import com.github.jfcloud.gene.flow.mapper.FlowInfoMapper;
+import com.github.jfcloud.gene.flow.service.NotifyService;
+import com.github.jfcloud.gene.sys.service.DBSystemPropertiesService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Objects;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class NotifyServiceImpl implements NotifyService {
+
+    private final FlowInfoMapper flowInfoMapper;
+    private final FlowAuditMapper flowAuditMapper;
+    private final DBSystemPropertiesService systemPropertiesService;
+    private final RemoteNoticeService remoteNoticeService;
+    private final UserIdNameCache userIdNameCache;
+
+    @Override
+    public void notify(Long flowId) {
+        FlowInfo flowInfo = flowInfoMapper.selectById(flowId);
+        if (flowInfo == null) {
+            return;
+        }
+
+        //查询流程前一个状态
+        FlowAudit previousAudit = flowAuditMapper.selectOne(new LambdaQueryWrapper<>(FlowAudit.class)
+                .eq(FlowAudit::getFlowId, flowId)
+                .eq(FlowAudit::getDeleted, WhetherEnum.NO.getCode())
+                .orderByDesc(FlowAudit::getCreateTime)
+                .last("limit 1"));
+        String previousStatus = "";
+        String previousUser = "";
+        if (previousAudit != null) {
+            GeneStatusEnum statusEnum = GeneStatusEnum.getByStatus(previousAudit.getFlowStatus());
+            previousStatus = statusEnum != null ? statusEnum.getDescription() : "";
+            previousUser = userIdNameCache.getNicknameByUserId(previousAudit.getCreateBy());
+        }
+
+        Long userId;
+        String dingMsg;
+        GeneStatusEnum statusEnum = Objects.requireNonNull(GeneStatusEnum.getByStatus(flowInfo.getStatus()));
+        switch (statusEnum) {
+            case REJECTED:
+                //驳回通知申请人
+                userId = Long.valueOf(flowInfo.getCreateBy());
+                dingMsg = String.format("【基因定制/%s】【%s/%s】不同意,请修正后再提交", flowInfo.getProjectName(), previousStatus, previousUser);
+                break;
+            case GENE_EDITING:
+                userId = flowInfo.getGeneEditPlId();
+                dingMsg = String.format("【基因定制/%s】【%s】已提交,请进行审查", flowInfo.getProjectName(), userIdNameCache.getNicknameByUserId(flowInfo.getCreateBy()));
+                break;
+            case PROJECT_LEADER:
+                userId = flowInfo.getProjectLeaderId();
+                dingMsg = String.format("【基因定制/%s】【%s/%s】已同意,请进行审查", flowInfo.getProjectName(), previousStatus, previousUser);
+                break;
+            case PROJECT_MANAGEMENT:
+                userId = flowInfo.getProjectManageId();
+                dingMsg = String.format("【基因定制/%s】【%s/%s】已同意,请进行审查", flowInfo.getProjectName(), previousStatus, previousUser);
+                break;
+            case COMPLETED:
+                //执行
+                userId = Long.valueOf(flowInfo.getCreateBy());
+                dingMsg = String.format("【基因定制/%s】【%s/%s】已同意,请执行项目", flowInfo.getProjectName(), previousStatus, previousUser);
+                break;
+            default:
+                log.error("流程项目 ({}) 状态异常 {}", flowInfo.getProjectName(), statusEnum.getDescription());
+                return;
+        }
+
+        //查询是否需要钉钉通知
+        String key = String.format("gene.%s.dingding.enable", flowInfo.getStatus());
+        if (Boolean.parseBoolean(systemPropertiesService.getValue(key))) {
+            MessageUserDTO messageUserDTO = new MessageUserDTO();
+            messageUserDTO.setUserId(userId);
+            sendDingding(dingMsg, messageUserDTO);
+        }
+
+        //查询是否需要邮件通知
+        key = String.format("gene.%s.email.enable", flowInfo.getStatus());
+        if (Boolean.parseBoolean(systemPropertiesService.getValue(key))) {
+            //todo 邮件通知
+        }
+    }
+
+    /**
+     * 发送钉钉消息
+     *
+     * @param msg
+     * @param userList
+     */
+    private void sendDingding(String msg, MessageUserDTO... user) {
+        TextMessageParam param = new TextMessageParam(new ArrayList<>(Arrays.asList(user)), msg, "基因定制");
+        log.info("【消息通知】发送:{}", JSON.toJSONString(param));
+
+        try {
+            remoteNoticeService.sendTextMessage(param);
+        } catch (Exception e) {
+            //发送失败,异常不向上抛出,不影响业务流程
+            log.error("【消息通知】发送失败:{}", e.getMessage());
+        }
+    }
+}

+ 33 - 0
jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/flow/vo/FlowAuditVo.java

@@ -0,0 +1,33 @@
+package com.github.jfcloud.gene.flow.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class FlowAuditVo {
+
+    @Schema(description = "审核意见", example = "yes/no")
+    private String auditResult;
+
+    @Schema(description = "批准编号")
+    private String approvalNo;
+
+    @Schema(description = "修订号")
+    private String revisionNo;
+
+    @Schema(description = "收件日期")
+    private String receiptDate;
+
+    @Schema(description = "批准日期")
+    private String approvalDate;
+
+    @Schema(description = "动物入组")
+    private String animalEnrollment;
+
+    @Schema(description = "终末取材")
+    private String finalSampling;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+}

+ 6 - 0
jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/flow/vo/FlowDetailVo.java

@@ -49,6 +49,12 @@ public class FlowDetailVo {
     @Schema(description = "项目负责人邮箱")
     private String projectLeaderEmail;
 
+    @Schema(description = "基因编辑部门负责人")
+    private Long geneEditPlId;
+
+    @Schema(description = "项目管理部审核人")
+    private Long projectManageId;
+
     /**
      * 机构名称
      */

+ 5 - 2
jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/flow/vo/FlowPageVo.java

@@ -3,6 +3,9 @@ package com.github.jfcloud.gene.flow.vo;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import java.util.ArrayList;
+import java.util.List;
+
 @Data
 public class FlowPageVo {
 
@@ -36,8 +39,8 @@ public class FlowPageVo {
     /**
      * 状态
      */
-    @Schema(description = "状态")
-    private String status;
+    @Schema(description = "状态列表")
+    private List<String> statusList = new ArrayList<>();
 
     /**
      * 批准编号

+ 33 - 0
jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/sys/entity/DBSystemProperties.java

@@ -0,0 +1,33 @@
+package com.github.jfcloud.gene.sys.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+@TableName("system_properties")
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class DBSystemProperties extends Model implements Serializable {
+
+    /**
+     * 属性名
+     */
+    @TableId
+    @NotBlank(message = "属性名不能为空")
+    private String propKey;
+
+    /**
+     * 属性值
+     */
+    private String propValue;
+
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 7 - 0
jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/sys/mapper/DBSystemPropertiesMapper.java

@@ -0,0 +1,7 @@
+package com.github.jfcloud.gene.sys.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.jfcloud.gene.sys.entity.DBSystemProperties;
+
+public interface DBSystemPropertiesMapper extends BaseMapper<DBSystemProperties> {
+}

+ 11 - 0
jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/sys/service/DBSystemPropertiesService.java

@@ -0,0 +1,11 @@
+package com.github.jfcloud.gene.sys.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.github.jfcloud.gene.sys.entity.DBSystemProperties;
+
+public interface DBSystemPropertiesService extends IService<DBSystemProperties> {
+
+    String getValue(String key);
+
+    boolean equals(String key, String value);
+}

+ 32 - 0
jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/sys/service/impl/DBSystemPropertiesServiceImpl.java

@@ -0,0 +1,32 @@
+package com.github.jfcloud.gene.sys.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.jfcloud.gene.sys.entity.DBSystemProperties;
+import com.github.jfcloud.gene.sys.mapper.DBSystemPropertiesMapper;
+import com.github.jfcloud.gene.sys.service.DBSystemPropertiesService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.Objects;
+
+@Slf4j
+@Service
+public class DBSystemPropertiesServiceImpl extends ServiceImpl<DBSystemPropertiesMapper, DBSystemProperties> implements DBSystemPropertiesService {
+
+    @Override
+    public String getValue(String key) {
+        DBSystemProperties properties = getById(key);
+        if (Objects.isNull(properties)) {
+            log.info("未找到配置【{}】", key);
+            return null;
+        }
+
+        log.info("配置【{}】值,即{},为【{}】", key, properties.getRemark(), properties.getPropValue());
+        return properties.getPropValue();
+    }
+
+    @Override
+    public boolean equals(String key, String value) {
+        return Objects.equals(getValue(key), value);
+    }
+}

+ 8 - 0
jfcloud-gene-common/src/main/java/com/github/jfcloud/gene/common/constant/StrConstant.java

@@ -0,0 +1,8 @@
+package com.github.jfcloud.gene.common.constant;
+
+public class StrConstant {
+
+    public static final String YES = "yes";
+
+    public static final String NO = "no";
+}