Przeglądaj źródła

动物样本送检审批

陈长荣 2 miesięcy temu
rodzic
commit
5a80d62962

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

@@ -27,6 +27,10 @@ public class FlowAudit extends BaseEntity implements Serializable {
      * 流程主键
      */
     private Long flowId;
+    /**
+     * 流程状态
+     */
+    private String flowType;
     /**
      * 流程状态
      */

+ 8 - 9
jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/sample/controller/SampleController.java

@@ -9,14 +9,14 @@ import com.github.jfcloud.common.core.util.R;
 import com.github.jfcloud.gene.common.constant.WhetherEnum;
 import com.github.jfcloud.gene.constants.GeneStatusEnum;
 import com.github.jfcloud.gene.file.vo.FileDetail;
-import com.github.jfcloud.gene.flow.dto.FlowAuditDto;
 import com.github.jfcloud.gene.flow.service.FlowInfoService;
-import com.github.jfcloud.gene.flow.vo.FlowAuditVo;
 import com.github.jfcloud.gene.flow.vo.SynProjectVo;
+import com.github.jfcloud.gene.sample.dto.SampleAuditDto;
 import com.github.jfcloud.gene.sample.dto.SampleDetailDto;
 import com.github.jfcloud.gene.sample.dto.SamplePageDto;
 import com.github.jfcloud.gene.sample.entity.SampleInfo;
 import com.github.jfcloud.gene.sample.service.SampleInfoService;
+import com.github.jfcloud.gene.sample.vo.SampleAuditVo;
 import com.github.jfcloud.gene.sample.vo.SamplePageVo;
 import com.github.jfcloud.gene.sample.vo.SampleSubmitVo;
 import io.swagger.v3.oas.annotations.Operation;
@@ -92,19 +92,18 @@ public class SampleController {
         return R.ok();
     }
 
-    //todo
     @WebApiLog
-    @Operation(summary = "审核", description = "待完成")
+    @Operation(summary = "审核")
     @PostMapping("/audit/{id}")
-    public R audit(@PathVariable Long id, @Valid @RequestBody FlowAuditVo vo) {
+    public R audit(@PathVariable Long id, @Valid @RequestBody SampleAuditVo vo) {
+        sampleInfoService.audit(id, vo);
         return R.ok();
     }
 
-    //todo
-    @Operation(summary = "审核记录", description = "待完成")
+    @Operation(summary = "审核记录")
     @GetMapping("/audit/{id}")
-    public R<List<FlowAuditDto>> auditRecord(@PathVariable Long id) {
-        return R.ok();
+    public R<List<SampleAuditDto>> auditRecord(@PathVariable Long id) {
+        return R.ok(sampleInfoService.getAuditRecords(id));
     }
 
     //todo

+ 37 - 0
jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/sample/dto/SampleAuditDto.java

@@ -0,0 +1,37 @@
+package com.github.jfcloud.gene.sample.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class SampleAuditDto {
+
+    @Schema(description = "流程状态")
+    private String flowStatus;
+
+    @Schema(description = "流程状态文本")
+    private String flowStatusLabel;
+
+    @Schema(description = "审核意见,是否同意", example = "yes/no")
+    private String auditResult;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "处理办法")
+    private String processMethod;
+
+    @Schema(description = "创建人签名")
+    private String createSign;
+
+    @Schema(description = "创建人姓名")
+    private String createName;
+
+    private String createBy;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+}

+ 20 - 0
jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/sample/service/SampleInfoService.java

@@ -2,12 +2,16 @@ package com.github.jfcloud.gene.sample.service;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.github.jfcloud.gene.sample.dto.SampleAuditDto;
 import com.github.jfcloud.gene.sample.dto.SampleDetailDto;
 import com.github.jfcloud.gene.sample.dto.SamplePageDto;
 import com.github.jfcloud.gene.sample.entity.SampleInfo;
+import com.github.jfcloud.gene.sample.vo.SampleAuditVo;
 import com.github.jfcloud.gene.sample.vo.SamplePageVo;
 import com.github.jfcloud.gene.sample.vo.SampleSubmitVo;
 
+import java.util.List;
+
 public interface SampleInfoService extends IService<SampleInfo> {
 
     /**
@@ -50,6 +54,22 @@ public interface SampleInfoService extends IService<SampleInfo> {
     Page<SamplePageDto> getPage(SamplePageVo vo);
 
     SampleDetailDto getDetail(Long id);
+
+    /**
+     * 审批
+     *
+     * @param id
+     * @param vo
+     */
+    void audit(Long id, SampleAuditVo vo);
+
+    /**
+     * 审批列表
+     *
+     * @param id
+     * @return
+     */
+    List<SampleAuditDto> getAuditRecords(Long id);
 }
 
 

+ 2 - 0
jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/sample/service/impl/SampleAnimalServiceImpl.java

@@ -177,6 +177,8 @@ public class SampleAnimalServiceImpl extends ServiceImpl<SampleAnimalMapper, Sam
             sampleInfoObj.put("inspectorName", inspectorName);
         }
 
+        //
+
         String modelName = "animalSampleTesting.ftl";
         if (LocalWord.exportWord(modelName, dataMap, fileName)) {
             return;

+ 115 - 4
jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/sample/service/impl/SampleInfoServiceImpl.java

@@ -4,16 +4,22 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 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.common.util.UserUtil;
 import com.github.jfcloud.gene.constants.GeneStatusEnum;
 import com.github.jfcloud.gene.file.vo.FileVo;
+import com.github.jfcloud.gene.flow.entity.FlowAudit;
+import com.github.jfcloud.gene.flow.service.FlowAuditService;
 import com.github.jfcloud.gene.flow.service.FlowFileVersionService;
+import com.github.jfcloud.gene.sample.dto.SampleAuditDto;
 import com.github.jfcloud.gene.sample.dto.SampleDetailDto;
 import com.github.jfcloud.gene.sample.dto.SamplePageDto;
 import com.github.jfcloud.gene.sample.entity.SampleInfo;
@@ -22,6 +28,7 @@ import com.github.jfcloud.gene.sample.mapper.SampleInfoMapper;
 import com.github.jfcloud.gene.sample.service.SampleEditService;
 import com.github.jfcloud.gene.sample.service.SampleInfoService;
 import com.github.jfcloud.gene.sample.vo.SampleAnimalVo;
+import com.github.jfcloud.gene.sample.vo.SampleAuditVo;
 import com.github.jfcloud.gene.sample.vo.SamplePageVo;
 import com.github.jfcloud.gene.sample.vo.SampleSubmitVo;
 import lombok.RequiredArgsConstructor;
@@ -30,9 +37,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 
 @Slf4j
 @Service
@@ -41,6 +46,8 @@ public class SampleInfoServiceImpl extends ServiceImpl<SampleInfoMapper, SampleI
 
     private final SampleAnimalServiceImpl sampleAnimalService;
     private final FlowFileVersionService fileVersionService;
+    private final UserIdNameCache userIdNameCache;
+    private final FlowAuditService flowAuditService;
 
     /**
      * 根据样本检测类型获取对应的Service
@@ -147,7 +154,8 @@ public class SampleInfoServiceImpl extends ServiceImpl<SampleInfoMapper, SampleI
                 .like(StrUtil.isNotBlank(vo.getProject()), SampleInfo::getProjectName, vo.getProject())
                 .eq(StrUtil.isNotBlank(vo.getType()), SampleInfo::getType, vo.getType())
                 .eq(StrUtil.isNotBlank(vo.getStatus()), SampleInfo::getStatus, vo.getStatus())
-                .eq(Objects.nonNull(vo.getApplicantId()), SampleInfo::getApplicantId, vo.getApplicantId());
+                .eq(Objects.nonNull(vo.getApplicantId()), SampleInfo::getApplicantId, vo.getApplicantId())
+                .orderByDesc(SampleInfo::getCreateTime);
         Page<SampleInfo> page = baseMapper.selectPageByScope(pageQuery, wrapper, DataScope.of());
 
         Page<SamplePageDto> pageResult = new Page<>(page.getCurrent(), page.getSize(), page.getTotal());
@@ -182,6 +190,109 @@ public class SampleInfoServiceImpl extends ServiceImpl<SampleInfoMapper, SampleI
         }
         return detailDto;
     }
+
+    @Override
+    public void audit(Long id, SampleAuditVo vo) {
+        SampleInfo sampleInfo = getById(id);
+        Assert.notNull(sampleInfo, "样本检测信息不存在");
+        Assert.isFalse(GeneStatusEnum.SUBMIT_STATUS.contains(sampleInfo.getStatus()), "样本检测流程状态错误");
+
+        String nextStatus = "";
+        GeneStatusEnum statusEnum = Objects.requireNonNull(GeneStatusEnum.getByStatus(sampleInfo.getStatus()));
+        switch (statusEnum) {
+            case DEPART_LEADER:
+                Assert.isTrue(UserUtil.getUserId().equals(sampleInfo.getDepartLeaderId()), "抱歉,您不能审核本条记录");
+                nextStatus = GeneStatusEnum.PROJECT_MANAGEMENT.getStatus();
+                break;
+            case PROJECT_MANAGEMENT:
+                Assert.isTrue(UserUtil.getUserId().equals(sampleInfo.getProjectManageId()), "抱歉,您不能审核本条记录");
+                nextStatus = GeneStatusEnum.COMPLETED.getStatus();
+                break;
+            default:
+                log.info("流程项目 ({}) 状态为{}", sampleInfo.getProjectName(), statusEnum.getDescription());
+                throw new IllegalArgumentException("流程状态错误");
+        }
+
+        //保存审批节点
+        FlowAudit flowAudit = new FlowAudit()
+                .setFlowId(id)
+                .setFlowType("sample." + sampleInfo.getType())
+                .setFlowStatus(sampleInfo.getStatus())
+                .setAuditResult(vo.getAuditResult())
+                .setRemarks(vo.getRemarks())
+                .setCreateSign(userIdNameCache.getSignPic(UserUtil.getUserId()));
+        if (StrUtil.isNotBlank(vo.getProcessMethod())) {
+            JSONObject dataObj = new JSONObject().fluentPut("processMethod", vo.getProcessMethod());
+            flowAudit.setAdditionalData(dataObj.toJSONString()).insert();
+        }
+        flowAudit.insert();
+
+        //审核不通过
+        if (StrConstant.NO.equals(vo.getAuditResult())) {
+            log.info("流程项目 ({}) 审核不通过", sampleInfo.getProjectName());
+
+            new SampleInfo()
+                    .setId(id)
+                    .setStatus(GeneStatusEnum.REJECTED.getStatus())
+                    .updateById();
+
+//            geneWord(id);
+//
+//            notifyService.notify(id);
+            return;
+        }
+
+        Assert.isTrue(StrConstant.YES.equals(vo.getAuditResult()), "审核结果错误");
+//        if (GeneStatusEnum.PROJECT_MANAGEMENT.getStatus().equals(sampleInfo.getStatus())) {
+//            Assert.isTrue(StrUtil.isNotBlank(vo.getApprovalNo()), "项目批准编号必填");
+//            //检查批准编号的唯一性
+//            long count = count(new LambdaQueryWrapper<>(SampleInfo.class)
+//                    .eq(SampleInfo::getApprovalNo, vo.getApprovalNo())
+//                    .eq(SampleInfo::getDeleted, WhetherEnum.NO.getCode()));
+//            Assert.isTrue(count < 1, "项目批准编号已存在");
+//        }
+
+        //审核通过
+        log.info("流程项目 ({}) 审核通过", sampleInfo.getProjectName());
+
+        sampleInfo = new SampleInfo();
+        //更新项目批准编号、修订号等
+        BeanUtil.copyProperties(vo, sampleInfo);
+        sampleInfo.setId(id)
+                .setStatus(nextStatus)
+                .updateById();
+
+//        geneWord(id);
+//        notifyService.notify(id);
+    }
+
+    @Override
+    public List<SampleAuditDto> getAuditRecords(Long id) {
+        SampleInfo sampleInfo = getById(id);
+        Assert.notNull(sampleInfo, "样本检测信息不存在");
+
+        List<FlowAudit> auditList = flowAuditService.list(new LambdaQueryWrapper<>(FlowAudit.class)
+                .eq(FlowAudit::getFlowId, id)
+                .eq(FlowAudit::getFlowType, "sample." + sampleInfo.getType())
+                .eq(FlowAudit::getDeleted, WhetherEnum.NO.getCode())
+                .orderByAsc(FlowAudit::getCreateTime));
+        if (auditList.isEmpty()) {
+            return Collections.emptyList();
+        }
+
+        List<SampleAuditDto> auditDtos = new ArrayList<>();
+        for (FlowAudit audit : auditList) {
+            SampleAuditDto auditDto = BeanUtil.copyProperties(audit, SampleAuditDto.class);
+            auditDto.setCreateName(userIdNameCache.getNicknameByUserId(audit.getCreateBy()));
+            auditDto.setFlowStatusLabel(Objects.requireNonNull(GeneStatusEnum.getByStatus(audit.getFlowStatus())).getDescription());
+            if (StrUtil.isNotBlank(audit.getAdditionalData())) {
+                JSONObject jsonObject = JSONObject.parseObject(audit.getAdditionalData());
+                auditDto.setProcessMethod(jsonObject.getString("processMethod"));
+            }
+            auditDtos.add(auditDto);
+        }
+        return auditDtos;
+    }
 }
 
 

+ 33 - 0
jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/sample/vo/SampleAuditVo.java

@@ -0,0 +1,33 @@
+package com.github.jfcloud.gene.sample.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class SampleAuditVo {
+
+    @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 expireDate;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "处理办法")
+    private String processMethod;
+
+}

+ 5 - 0
jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/sample/vo/SampleCheckOrderVo.java

@@ -1,6 +1,7 @@
 package com.github.jfcloud.gene.sample.vo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Getter;
 import lombok.Setter;
@@ -16,6 +17,10 @@ import java.util.List;
 @Getter
 public class SampleCheckOrderVo {
 
+    @JsonIgnore
+    @Schema(hidden = true)
+    private Long id;
+
     /**
      * 申请单类型:ELISA样本送检 尿常规样本送检
      */

+ 2 - 2
jfcloud-gene-biz/src/main/resources/mapper/SampleCheckOrderMapper.xml

@@ -2,8 +2,8 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.github.jfcloud.gene.sample.mapper.SampleCheckOrderMapper">
   <resultMap id="CheckOrderMap" type="com.github.jfcloud.gene.sample.vo.SampleCheckOrderVo">
-    <collection property="items" column="commissionId = id"
-                select="com.github.jfcloud.gene.sample.mapper.InspectionCommissionDetailMapper.getDetailList" />
+    <collection property="items" column="orderId = id"
+                select="com.github.jfcloud.gene.sample.mapper.SampleCheckItemMapper.getItemList" />
   </resultMap>
 
   <select id="getOrderList" resultMap="CheckOrderMap">

+ 1 - 0
jfcloud-gene-biz/src/main/resources/sql/ddl-20250317.sql

@@ -0,0 +1 @@
+ALTER TABLE jfcloud_gene.flow_audit ADD COLUMN flow_type varchar(30) NULL COMMENT '流程类型' after flow_id;