Parcourir la source

Merge remote-tracking branch 'origin/master'

lenovodn il y a 2 ans
Parent
commit
dc916bf870

+ 30 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/common/bo/DeptAuditRequestBO.java

@@ -0,0 +1,30 @@
+package org.jeecg.modules.medical.common.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @author soft01
+ * @time 2023/5/27
+ * @description '科室审核请求'
+ * @parentProject medical-java
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel("科室/医生端审核请求入参")
+public class DeptAuditRequestBO extends AuditRequestBO{
+
+    @Length(min= 1, max=200 , message = "申诉理由不可小于1,不可大于200")
+    @NotBlank(message = "审核理由不可为空")
+    @ApiModelProperty(value = "审核理由")
+    private String description;
+
+    @NotBlank(message = "必须上传图片")
+    @ApiModelProperty(value = "审核照片组,中间用逗号分割")
+    private String imgPaths;
+}

+ 50 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/common/enums/AfterwardsAuditStatusEnum.java

@@ -0,0 +1,50 @@
+package org.jeecg.modules.medical.common.enums;
+
+import lombok.Getter;
+import org.springframework.util.ObjectUtils;
+
+/**
+ * @author soft01
+ * @time 2023/5/27 15:06
+ * @description '这里描写类的用途'
+ * @parentProject medical-java
+ */
+@Getter
+public enum AfterwardsAuditStatusEnum {
+
+    // 审核流转状态
+    wait("wait", "待分配"),
+    process("proces", "处理中"),
+    finish("finish", "已完成"),
+
+    // 审核结果
+    pass("pass", "系统问题,不违规"),
+    violation("violation", "直接违规"),
+    issue_review("issue_review", "下发复核"),
+    agree_audit("agree_audit", "医生同意审核结果")
+    ,
+
+
+    // 下发复核状态
+    dept_audit_wait("dept_audit_wait", "等待科室处理"),
+    doctor_appeal("doctor_appeal", "医生申诉")
+
+    ;
+
+    private String status;
+    private String statusText;
+
+    AfterwardsAuditStatusEnum(String status, String statusText) {
+        this.status = status;
+        this.statusText = statusText;
+    }
+
+    public static AfterwardsAuditStatusEnum findEnums(String checkState) {
+        for (AfterwardsAuditStatusEnum value : AfterwardsAuditStatusEnum.values()) {
+            if (ObjectUtils.nullSafeEquals(value.getStatus(), checkState)) {
+                return value;
+            }
+        }
+        return null;
+    }
+}

+ 4 - 5
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/controller/AfterwardsAuditController.java

@@ -7,16 +7,15 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.aspect.annotation.AutoLog;
 import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.common.system.base.controller.JeecgController;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.common.system.util.JwtUtil;
-import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.medical.common.bo.AuditRequestBO;
+import org.jeecg.modules.medical.common.bo.DeptAuditRequestBO;
 import org.jeecg.modules.medical.common.bo.DeptAuditResponse;
 import org.jeecg.modules.medical.common.bo.ReportAfterQueryResponseBO;
 import org.jeecg.modules.medical.entity.AfterwardsAudit;
@@ -37,7 +36,7 @@ import java.util.Arrays;
  * @Date:   2023-05-09 14:37:31
  * @Version: V1.0
  */
-@Api(value = "统计报表:事后数据报表统计", tags="medical_ins_knowledge")
+@Api(value = "统计报表:事后数据报表统计", tags="事后工单审核相关")
 @RestController
 @RequestMapping("/medical/afterwardsAudit")
 @Slf4j
@@ -45,7 +44,7 @@ public class AfterwardsAuditController extends JeecgController<AfterwardsAudit,
 	@Autowired
 	private IAfterwardsAuditService afterwardsAuditService;
 
-	 @ApiOperation(value="审核列表", notes="审核列表")
+	 @ApiOperation(value="获取-审核列表", notes="审核列表")
 	 @GetMapping(value = "/audit/list")
 	 public Result<IPage<AfterwardsAudit>> auditQueryListPage(AfterwardsAudit afterwardsAudit,
 															  @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@@ -80,7 +79,7 @@ public class AfterwardsAuditController extends JeecgController<AfterwardsAudit,
 
 	 @ApiModelProperty(value = "科室端,复核", notes = "科室端,复核")
 	 @PostMapping(value = "/dept/audit")
-	 public Result<?> deptAudit(HttpServletRequest request, @RequestBody @Valid AuditRequestBO param) {
+	 public Result<?> deptAudit(HttpServletRequest request, @RequestBody @Valid DeptAuditRequestBO param) {
 		 // 获取当前登录的人,并获取到他的科室
 		 String loginUserName = JwtUtil.getUserNameByToken(request);
 		 boolean result = afterwardsAuditService.deptAudit(loginUserName, param);

+ 12 - 4
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/AfterwardsAudit.java

@@ -102,10 +102,7 @@ public class AfterwardsAudit implements Serializable {
 	@Excel(name = "审核人", width = 15)
     @ApiModelProperty(value = "审核人")
     private java.lang.String checkBy;
-	/**审核状态*/
-	@Excel(name = "审核状态", width = 15)
-    @ApiModelProperty(value = "审核状态")
-    private java.lang.String checkState;
+
 
     @ApiModelProperty(value = "审核时间")
     private Date auditTime;
@@ -129,6 +126,17 @@ public class AfterwardsAudit implements Serializable {
     @ApiModelProperty(value = "资料来源")
     private String auditSource;
 
+    /**审核状态*/
+    @Excel(name = "审核状态", width = 15)
+    @ApiModelProperty(value = "审核状态: wait=待分配; proces=处理中; finish=已完成")
+    private java.lang.String checkState;
+
+    @ApiModelProperty(value = "审核状态;dept_audit_wait=等待科室处理;doctor_appeal=医生申诉")
+    private String status;
+
+    @ApiModelProperty(value = "审查结果:pass=系统问题不违规;issue_review=疑似违规_下发复核;violation=直接违规")
+    private String reviewResults;
+
 
 
     @TableField(exist = false)

+ 4 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/MedicalDoctorAppealRecord.java

@@ -71,7 +71,7 @@ public class MedicalDoctorAppealRecord implements Serializable {
 	/**事后工单id*/
 	@Excel(name = "事后工单id", width = 15)
     @ApiModelProperty(value = "事后工单id")
-    private String afterwardsAuditId;
+    private Integer afterwardsAuditId;
 	/**申诉次数*/
 	@Excel(name = "申诉次数", width = 15)
     @ApiModelProperty(value = "申诉次数")
@@ -84,4 +84,7 @@ public class MedicalDoctorAppealRecord implements Serializable {
 	@Excel(name = "申诉照片组", width = 15)
     @ApiModelProperty(value = "申诉照片组")
     private String imgPath;
+
+    @ApiModelProperty(value = "复核申诉状态;复核申诉状态;appeal=申诉;agree_audit=同意")
+    private String appealStatus;
 }

+ 4 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/mapper/MedicalDoctorAppealRecordMapper.java

@@ -3,6 +3,7 @@ package org.jeecg.modules.medical.mapper;
 import java.util.List;
 
 import org.apache.ibatis.annotations.Param;
+import org.checkerframework.checker.optional.qual.Present;
 import org.jeecg.modules.medical.entity.MedicalDoctorAppealRecord;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
@@ -14,4 +15,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface MedicalDoctorAppealRecordMapper extends BaseMapper<MedicalDoctorAppealRecord> {
 
+    MedicalDoctorAppealRecord loadMaxAppealNumber(@Param("afterwardsAuditId") Integer afterwardsAuditId,
+                             @Param("medicalDeptCode") String medicalDeptCode,
+                             @Param("doctorId") String doctorId);
 }

+ 12 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/mapper/xml/MedicalDoctorAppealRecordMapper.xml

@@ -2,4 +2,15 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.jeecg.modules.medical.mapper.MedicalDoctorAppealRecordMapper">
 
-</mapper>
+
+    <select id="loadMaxAppealNumber" resultType="org.jeecg.modules.medical.entity.MedicalDoctorAppealRecord">
+        SELECT
+            MAX( appeal_number ) as appealNumber
+        FROM
+            medical_doctor_appeal_record
+        WHERE
+            afterwards_audit_id = #{afterwardsAuditId,jdbcType=INTEGER}
+          AND medical_dept_code = #{medicalDeptCode,jdbcType=VARCHAR}
+          AND doctor_id = #{doctorId,jdbcType=VARCHAR}
+    </select>
+</mapper>

+ 5 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/service/IAfterwardsAuditService.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.modules.medical.common.bo.AuditRequestBO;
+import org.jeecg.modules.medical.common.bo.DeptAuditRequestBO;
 import org.jeecg.modules.medical.common.bo.DeptAuditResponse;
 import org.jeecg.modules.medical.common.bo.ReportAfterQueryResponseBO;
 import org.jeecg.modules.medical.entity.AfterwardsAudit;
@@ -47,5 +48,8 @@ public interface IAfterwardsAuditService extends IService<AfterwardsAudit> {
      * @param param
      * @return
      */
-    boolean deptAudit(String loginUserName, AuditRequestBO param);
+    boolean deptAudit(String loginUserName, DeptAuditRequestBO param);
+
+
+    AfterwardsAudit loadAfterwardsAuditById(String id);
 }

+ 9 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/service/IMedicalDoctorAppealRecordService.java

@@ -11,4 +11,13 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IMedicalDoctorAppealRecordService extends IService<MedicalDoctorAppealRecord> {
 
+
+    /**
+     * 根据条件,获取最大的审核次数
+     * @param id
+     * @param medicalDeptCode
+     * @param doctorId
+     * @return
+     */
+    MedicalDoctorAppealRecord loadMaxAppealNumber(Integer id, String medicalDeptCode, String doctorId);
 }

+ 130 - 21
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/service/impl/AfterwardsAuditServiceImpl.java

@@ -11,10 +11,13 @@ import org.checkerframework.checker.units.qual.A;
 import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.modules.medical.common.bo.*;
+import org.jeecg.modules.medical.common.enums.AfterwardsAuditStatusEnum;
 import org.jeecg.modules.medical.entity.AfterwardsAudit;
 import org.jeecg.modules.medical.entity.AfterwardsAuditDetail;
+import org.jeecg.modules.medical.entity.MedicalDoctorAppealRecord;
 import org.jeecg.modules.medical.mapper.AfterwardsAuditMapper;
 import org.jeecg.modules.medical.service.IAfterwardsAuditService;
+import org.jeecg.modules.medical.service.IMedicalDoctorAppealRecordService;
 import org.jeecg.modules.system.entity.SysDepart;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -42,6 +45,8 @@ import java.util.stream.Collectors;
 @RequiredArgsConstructor(onConstructor = @__(@Autowired))
 public class AfterwardsAuditServiceImpl extends ServiceImpl<AfterwardsAuditMapper, AfterwardsAudit> implements IAfterwardsAuditService {
 
+    /** 科室/医生复核服务 */
+    private final IMedicalDoctorAppealRecordService appealRecordService;
 
     @Override
     public IPage<ReportAfterQueryResponseBO> departmentStatistics(Page<AfterwardsAudit> page, AfterwardsAudit afterwardsAudit) {
@@ -98,17 +103,7 @@ public class AfterwardsAuditServiceImpl extends ServiceImpl<AfterwardsAuditMappe
     public boolean audit(String loginUserName, AuditRequestBO param) {
         AfterwardsAudit a = new AfterwardsAudit();
 
-        LambdaQueryWrapper<AfterwardsAudit> queryWrapper = Wrappers.<AfterwardsAudit>lambdaQuery()
-                .eq(AfterwardsAudit::getId, param.getId());
-        List<AfterwardsAudit> list = this.list(queryWrapper);
-        if (CollectionUtils.isEmpty(list)) {
-            log.error("根据参数={},获取审核表时,取不到数据", param.getId());
-            throw new JeecgBootException("参数异常,找不到要审核的数据");
-        }
-        a = list.get(0);
-        if (list.size() > 1) {
-            log.error("审核中心审核表根据id={}获取记录时,获取到多条", param.getId());
-        }
+        a = loadAfterwardsAuditById(param.getId());
 
         // 检查当前状态
         if (!ObjectUtils.nullSafeEquals("wait", a.getCheckState()) && !ObjectUtils.nullSafeEquals("reAudit", a.getCheckState())) {
@@ -118,22 +113,32 @@ public class AfterwardsAuditServiceImpl extends ServiceImpl<AfterwardsAuditMappe
 
         Date nowTime = new Date();
 
-        switch (param.getCheckState()) {
-            case "pass": //系统问题,过了
-            case "violation":
-                a.setCheckState(param.getCheckState());
+        AfterwardsAuditStatusEnum checkStatus = AfterwardsAuditStatusEnum.findEnums(param.getCheckState());
+        if (checkStatus == null) {
+            log.error("不支持的审核状态={}", param.getCheckState());
+            throw new JeecgBootException("不支持的审核状态,请检查");
+        }
+
+        switch (checkStatus) {
+            case pass: //系统问题,过了
+            case violation:
+
+                a.setCheckState(AfterwardsAuditStatusEnum.finish.getStatus());
+                a.setStatus("");// 直接违规或者结果通过,这个给空
+                a.setReviewResults(checkStatus.getStatus());
                 a.setCheckBy(loginUserName);// 审核人
 
                 a.setAuditTime(nowTime);
                 a.setUpdateTime(nowTime);
                 a.setUpdateBy(loginUserName);
                 break;
-            case "issue_review": //下发审核
-                a.setCheckState(param.getCheckState()); // 下发审核
+            case issue_review: //下发审核
+                a.setCheckState(AfterwardsAuditStatusEnum.process.getStatus()); // 审核流转为处理中
+                a.setStatus(AfterwardsAuditStatusEnum.dept_audit_wait.getStatus());//  状态为等待科室处理
+                a.setReviewResults(AfterwardsAuditStatusEnum.issue_review.getStatus());
                 a.setPreCheckBy(loginUserName);
                 a.setPreAuditTime(nowTime); //审核人员
 
-                a.setStartTime("科室处理");// TODO 定一下这个枚举
                 a.setCheckBy(a.getDoctorId());// 分配给符合人
 //                a.setAuditTime(nowTime);
                 a.setUpdateTime(nowTime);
@@ -141,12 +146,14 @@ public class AfterwardsAuditServiceImpl extends ServiceImpl<AfterwardsAuditMappe
                 break;
             default:
                 log.error("不支持的审核状态={}", param.getCheckState());
-                break;
+                throw new JeecgBootException("不支持的审核状态,请检查");
         }
         this.saveOrUpdate(a);
         return true;
     }
 
+
+
     @Override
     public DeptAuditResponse deptAuditPanel(String loginUserName) {
         // 根据当前登录,先获取到医生面板
@@ -172,8 +179,110 @@ public class AfterwardsAuditServiceImpl extends ServiceImpl<AfterwardsAuditMappe
         return result;
     }
 
+    @Transactional(readOnly = false)
     @Override
-    public boolean deptAudit(String loginUserName, AuditRequestBO param) {
-        return false;
+    public boolean deptAudit(String loginUserName, DeptAuditRequestBO param) {
+        // 根据当前登录,先获取到医生面板
+        SysDepart sysDepart = baseMapper.loadUserDept(loginUserName);
+        if (null == sysDepart) {
+            log.error("找不到当前医生的科室,请检查");
+            throw new JeecgBootException("找不到当前医生的科室,请检查!");
+        }
+        // 当前登录科室/医生端的科室code
+        String medicalDeptCode = sysDepart.getMedicalDeptCode();
+        // 1.获取当前需要复核的id,是否为当前科室。
+        AfterwardsAudit audit = this.loadAfterwardsAuditById(param.getId());
+        if (null == audit) {
+            log.error("根据参数={},获取审核表时,取不到数据", param.getId());
+            throw new JeecgBootException("参数异常,找不到要审核的数据");
+        }
+        if (!ObjectUtils.nullSafeEquals(medicalDeptCode, audit.getMedicalDeptCode())) {
+            log.error("当前登录用户科室为={}, 需要处理数据的科室为={},不匹配,无法继续操作", medicalDeptCode, audit.getMedicalDeptCode());
+            throw new JeecgBootException("请求数据与您非同一科室,请检查!");
+        }
+        // 如果审核流转状态不为待处理,则不允许继续
+        if (!ObjectUtils.nullSafeEquals(AfterwardsAuditStatusEnum.process.getStatus(), audit.getCheckState())) {
+            log.error("当前申诉工单id={}, 审核流转状态为={},非处理中,请检查!", param.getId(), audit.getCheckState());
+            throw new JeecgBootException("审核流转状态不是处理中,请检查!");
+        }
+        // 审核状态为处理中 && 处理中的状态为 待科室审核时,才继续
+        if (!ObjectUtils.nullSafeEquals(AfterwardsAuditStatusEnum.issue_review.getStatus() ,audit.getReviewResults())) {
+            log.error("当前申诉工单id={}, 审查结果={},非下发复核状态,请检查!", param.getId(), audit.getStatus());
+            throw new JeecgBootException("审查结果非下发复核状态,请检查!");
+        }
+
+        Integer appealNumber = 1;
+        // 获取过往的申诉记录,取出最大次数
+        MedicalDoctorAppealRecord historyAppealRecord = appealRecordService.loadMaxAppealNumber(audit.getId(), audit.getMedicalDeptCode(), audit.getDoctorId());
+        if (historyAppealRecord != null && historyAppealRecord.getAppealNumber() != null && historyAppealRecord.getAppealNumber() > 0) {
+            appealNumber = historyAppealRecord.getAppealNumber();
+        }
+
+
+        MedicalDoctorAppealRecord appealRecord = new MedicalDoctorAppealRecord();
+
+        appealRecord.setAppealNumber(appealNumber);// TODO
+        appealRecord.setCreateTime(new Date()); // 处理时间
+        appealRecord.setCreateBy(loginUserName);// 处理人
+        appealRecord.setAppealStatus(param.getCheckState());
+        appealRecord.setMedicalDeptCode(medicalDeptCode);
+        appealRecord.setMedicalDeptName(audit.getMedicalDeptName());
+        appealRecord.setDoctorId(audit.getDoctorId());
+        appealRecord.setDoctorName(audit.getDoctorName());
+        appealRecord.setAfterwardsAuditId(audit.getId());
+        // 2.开始校验处理状态
+        switch (param.getCheckState()) {
+            case "appeal": //申诉
+                appealRecord.setDescription(param.getDescription());
+                appealRecord.setImgPath(param.getImgPaths());
+
+                audit.setCheckBy(audit.getPreCheckBy()); //下一个审核人员为 下发给科室的人员继续审核
+                audit.setPreCheckBy(loginUserName); // 上一个审核人员为当前审核人员
+                audit.setPreAuditTime(new Date()); // 上一个审查时间,是当前时间
+                audit.setStatus(AfterwardsAuditStatusEnum.dept_audit_wait.getStatus()); //审核状态为等待科室处理
+                audit.setReviewResults(AfterwardsAuditStatusEnum.doctor_appeal.getStatus());// 申诉时,审核结果为医生申诉
+                audit.setUpdateTime(new Date());
+                audit.setUpdateBy(loginUserName);
+                break;
+            case "agree_audit": // 同意审核结果
+                audit.setCheckBy(audit.getPreCheckBy()); //下一个审核人员为 下发给科室的人员继续审核
+                audit.setPreCheckBy(loginUserName); // 上一个审核人员为当前审核人员
+                audit.setPreAuditTime(new Date()); // 上一个审查时间,是当前时间
+                audit.setCheckState(AfterwardsAuditStatusEnum.finish.getStatus());
+                audit.setStatus("");// 直接完成,这个状态给空
+                audit.setReviewResults(AfterwardsAuditStatusEnum.agree_audit.getStatus());
+                audit.setUpdateTime(new Date());
+                audit.setUpdateBy(loginUserName);
+                break;
+            default:
+                log.error("不支持的审核状态={}", param.getCheckState());
+                throw new JeecgBootException("不支持的审核状态");
+
+        }
+        this.saveOrUpdate(audit);
+        appealRecordService.save(appealRecord);
+        return true;
+    }
+
+    /**
+     * 根据id获取 事后工单
+     * @param id
+     * @return
+     */
+    @Override
+    public AfterwardsAudit loadAfterwardsAuditById(String id) {
+        AfterwardsAudit a;
+        LambdaQueryWrapper<AfterwardsAudit> queryWrapper = Wrappers.<AfterwardsAudit>lambdaQuery()
+                .eq(AfterwardsAudit::getId, id);
+        List<AfterwardsAudit> list = this.list(queryWrapper);
+        if (CollectionUtils.isEmpty(list)) {
+            log.error("根据参数={},获取审核表时,取不到数据", id);
+            throw new JeecgBootException("参数异常,找不到要审核的数据");
+        }
+        a = list.get(0);
+        if (list.size() > 1) {
+            log.error("审核中心审核表根据id={}获取记录时,获取到多条", id);
+        }
+        return a;
     }
 }

+ 4 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/service/impl/MedicalDoctorAppealRecordServiceImpl.java

@@ -16,4 +16,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 @Service
 public class MedicalDoctorAppealRecordServiceImpl extends ServiceImpl<MedicalDoctorAppealRecordMapper, MedicalDoctorAppealRecord> implements IMedicalDoctorAppealRecordService {
 
+    @Override
+    public MedicalDoctorAppealRecord loadMaxAppealNumber(Integer afterwardsAuditId, String medicalDeptCode, String doctorId) {
+        return baseMapper.loadMaxAppealNumber(afterwardsAuditId, medicalDeptCode, doctorId);
+    }
 }