Ver código fonte

Merge remote-tracking branch 'origin/master'

lenovodn 2 anos atrás
pai
commit
8787fda117
17 arquivos alterados com 801 adições e 82 exclusões
  1. 3 3
      jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
  2. 47 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/common/bo/AuditInfoListResponse.java
  3. 83 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/common/bo/AuditInfoResponse.java
  4. 38 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/common/bo/DiagnosticInfoResponse.java
  5. 28 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/common/bo/DoctorViolationRequest.java
  6. 44 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/common/bo/MedicalOrderInfoResponse.java
  7. 83 12
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/controller/AfterwardsAuditController.java
  8. 60 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/MidIncidentAudit.java
  9. 31 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/MidIncidentVisitLog.java
  10. 35 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/MidIncidentWarningVO.java
  11. 20 5
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/mapper/AfterwardsAuditMapper.java
  12. 88 7
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/mapper/xml/AfterwardsAuditMapper.xml
  13. 37 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/RuleEngine.java
  14. 36 6
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/service/IAfterwardsAuditService.java
  15. 120 20
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/service/impl/AfterwardsAuditServiceImpl.java
  16. 17 10
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java
  17. 31 16
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java

+ 3 - 3
jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java

@@ -120,14 +120,14 @@ public class ShiroConfig {
         filterChainDefinitionMap.put("/swagger**/**", "anon");
         filterChainDefinitionMap.put("/webjars/**", "anon");
         filterChainDefinitionMap.put("/v2/**", "anon");
-        
+
         filterChainDefinitionMap.put("/sys/annountCement/show/**", "anon");
 
         //积木报表排除
         filterChainDefinitionMap.put("/jmreport/**", "anon");
         filterChainDefinitionMap.put("/**/*.js.map", "anon");
         filterChainDefinitionMap.put("/**/*.css.map", "anon");
-        
+
         //大屏模板例子
         filterChainDefinitionMap.put("/test/bigScreen/**", "anon");
         filterChainDefinitionMap.put("/bigscreen/template1/**", "anon");
@@ -140,7 +140,7 @@ public class ShiroConfig {
         filterChainDefinitionMap.put("/websocket/**", "anon");//系统通知和公告
         filterChainDefinitionMap.put("/newsWebsocket/**", "anon");//CMS模块
         filterChainDefinitionMap.put("/vxeSocket/**", "anon");//JVxeTable无痕刷新示例
-        filterChainDefinitionMap.put("/medical/**", "anon");//JVxeTable无痕刷新示例
+//        filterChainDefinitionMap.put("/medical/**", "anon");//JVxeTable无痕刷新示例
 
         //性能监控——安全隐患泄露TOEKN(durid连接池也有)
         //filterChainDefinitionMap.put("/actuator/**", "anon");

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

@@ -0,0 +1,47 @@
+package org.jeecg.modules.medical.common.bo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.jeecg.modules.medical.entity.AfterwardsAuditDetail;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author soft01
+ * @time 2023/5/27 19:43
+ * @description '违规项目/药品明细'
+ * @parentProject medical-java
+ */
+@Data
+@ApiModel(value = "违规项目/药品明细响应值")
+public class AuditInfoListResponse extends AfterwardsAuditDetail implements Serializable {
+    @ApiModelProperty(value = "单价")
+    private BigDecimal price;
+
+    @Excel(name = "是否医保", width = 15)
+    @ApiModelProperty(value = "是否医保,1=是,0=否")
+    private Integer medicalInsurance;
+
+    @JsonFormat(timezone = "GMT+8",pattern =  "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern= "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "就诊时间")
+    private Date visitTime;
+
+    @ApiModelProperty(value = "异常金额")
+    private BigDecimal errorDetailAmt;
+
+    @ApiModelProperty(value = "异常多收")
+    private BigDecimal errorRelativelyManyAmt;
+
+    @ApiModelProperty(value = "异常少收")
+
+    private BigDecimal errorRelativelyFewAmt;
+
+}

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

@@ -0,0 +1,83 @@
+package org.jeecg.modules.medical.common.bo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author soft01
+ * @time 2023/5/27 18:53
+ * @description '获取审核信息'
+ * @parentProject medical-java
+ */
+@Data
+@ApiModel(value = "获取审核信息")
+public class AuditInfoResponse implements Serializable {
+
+    // ========================= 患者信息 =================
+    /**个人编号*/
+    @Excel(name = "个人编号", width = 15)
+    @ApiModelProperty(value = "个人编号")
+    private java.lang.String patientId;
+    /**患者姓名*/
+    @Excel(name = "患者姓名", width = 15)
+    @ApiModelProperty(value = "患者姓名")
+    private java.lang.String patientName;
+
+    @ApiModelProperty(value = "患者生日")
+    private Date birthday;
+
+    @ApiModelProperty(value = "患者年龄")
+    private Integer age;
+
+    @ApiModelProperty(value = "性别")
+    private String gender;
+
+    @ApiModelProperty(value = "就诊类别;住院/门诊")
+    private java.lang.String treatmentType;
+
+    @ApiModelProperty(value = "住院号/门诊号/就诊流水号")
+    private java.lang.String outpatientNumber;
+
+    @Excel(name = "是否医保", width = 15)
+    @ApiModelProperty(value = "是否医保,1=是,0=否")
+    private int medicalInsurance;
+
+    @JsonFormat(timezone = "GMT+8",pattern =  "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern= "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "就诊时间")
+    private Date visitTime;
+
+    //========= 医生信息 ==========
+    /**科室编码*/
+    @Excel(name = "科室编码", width = 15)
+    @ApiModelProperty(value = "科室编码")
+    private java.lang.String medicalDeptCode;
+    /**科室名称*/
+    @Excel(name = "科室名称", width = 15)
+    @ApiModelProperty(value = "科室名称")
+    private java.lang.String medicalDeptName;
+    /**医生姓名*/
+    @Excel(name = "医生姓名", width = 15)
+    @ApiModelProperty(value = "医生姓名")
+    private java.lang.String doctorName;
+    /**主诊医师编码*/
+    @Excel(name = "主诊医师编码", width = 15)
+    @ApiModelProperty(value = "主诊医师编码")
+    private java.lang.String doctorId;
+
+    @ApiModelProperty(value = "违规药品明细")
+    private List<AuditInfoListResponse> detailList;
+
+    @ApiModelProperty(value = "审核状态: wait=待分配; process=处理中; finish=已完成")
+    private java.lang.String checkState;
+
+
+}

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

@@ -0,0 +1,38 @@
+package org.jeecg.modules.medical.common.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author soft01
+ * @time 2023/5/27 22:08
+ * @description '诊断信息'
+ * @parentProject medical-java
+ */
+@ApiModel(value = "诊断信息")
+@Data
+public class DiagnosticInfoResponse implements Serializable {
+
+
+    @ApiModelProperty(value = "住院号")
+    private String outpatientNumber;
+
+    @ApiModelProperty(value = "主要诊断编码")
+    private String mainDiagnosisCode;
+
+    @ApiModelProperty(value = "主要诊断名称")
+    private String mainDiagnosisName;
+
+    @ApiModelProperty(value = "副诊断编码")
+    private String subDiagnosisCode;
+
+    @ApiModelProperty(value = "副诊断名称")
+    private String subDiagnosisName;
+
+    @ApiModelProperty(value = "副诊断2编码")
+    private String subDiagnosis2Code;
+}

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

@@ -0,0 +1,28 @@
+package org.jeecg.modules.medical.common.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author soft01
+ * @time 2023/5/28 10:12
+ * @description '这里描写类的用途'
+ * @parentProject medical-java
+ */
+@ApiModel(value = "医生违规列表请求入参")
+@Data
+public class DoctorViolationRequest implements Serializable {
+
+    @ApiModelProperty(value = "住院号")
+    private String admissionNumber;
+
+    @ApiModelProperty(value = "患者姓名")
+    private String patientName;
+
+    @ApiModelProperty(value = "审核状态: wait=待分配; process=处理中; finish=已完成")
+    private java.lang.String checkState;
+
+}

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

@@ -0,0 +1,44 @@
+package org.jeecg.modules.medical.common.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author soft01
+ * @time 2023/5/27 23:01
+ * @description '医嘱信息'
+ * @parentProject medical-java
+ */
+@Data
+@ApiModel(value = "医嘱信息")
+public class MedicalOrderInfoResponse implements Serializable {
+
+    @ApiModelProperty(value = "关联结算主单")
+    private String associatedSettlementMaster;
+
+    @ApiModelProperty(value = "个人编码")
+    private String personalCode;
+
+    @ApiModelProperty(value = "住院号/门诊号")
+    private String admissionOutpatientNumber;
+
+    @ApiModelProperty(value = "患者姓名")
+    private String patientName;
+
+    @ApiModelProperty(value = "医嘱号")
+    private String orderNumber;
+
+    @ApiModelProperty(value = "下嘱时间")
+    private Date orderTime;
+
+    @ApiModelProperty(value = "停嘱时间")
+    private Date stopOrderTime;
+
+    @ApiModelProperty(value = "医嘱状态")
+    private String orderStatus;
+
+}

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

@@ -7,21 +7,21 @@ 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.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.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.service.IAfterwardsAuditService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.ObjectUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.servlet.ModelAndView;
 
@@ -29,8 +29,9 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.util.Arrays;
+import java.util.List;
 
- /**
+/**
  * @Description: afterwards_audit
  * @Author: jeecg-boot
  * @Date:   2023-05-09 14:37:31
@@ -50,24 +51,91 @@ public class AfterwardsAuditController extends JeecgController<AfterwardsAudit,
 															  @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
 															  @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
 															  HttpServletRequest req) {
+		 String checkState = afterwardsAudit.getCheckState();
+		 if (ObjectUtils.nullSafeEquals(AfterwardsAuditStatusEnum.wait.getStatus(),afterwardsAudit.getCheckState())) {
+			 afterwardsAudit.setCheckState(null);
+		 }
 		 QueryWrapper<AfterwardsAudit> queryWrapper = QueryGenerator.initQueryWrapper(afterwardsAudit, req.getParameterMap());
+		 if (ObjectUtils.nullSafeEquals(AfterwardsAuditStatusEnum.wait.getStatus() ,checkState)) {
+			 queryWrapper.and(q -> q.isNull( "check_state").or().eq( "check_state", "wait"));
+		 }
 		 Page<AfterwardsAudit> page = new Page<>(pageNo, pageSize);
 		 IPage<AfterwardsAudit> pageList = afterwardsAuditService.auditQueryListPage(page, queryWrapper);
 		 return Result.OK(pageList);
 	 }
 
+	 @ApiOperation(value = "审核端-获取审核详细信息")
+	 @GetMapping(value = "/audit/info")
+	 public Result<AuditInfoResponse> loadAuditInfo(HttpServletRequest request, @RequestParam("id") Integer id) {
+		 LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+//		 String loginUserName = JwtUtil.getUserNameByToken(request);
+		 if (null == loginUser) {
+			 log.error("当前用户未登录");
+			 throw new JeecgBootException("用户未登录"); // "登录已过期,请重新登录"
+		 }
+		 AuditInfoResponse result = afterwardsAuditService.loadAuditInfo(id);
+		 return Result.OK(result);
+	 }
+
+	 @ApiOperation(value = "审核端-诊断信息")
+	 @GetMapping(value = "/audit/diagnostic/info")
+	 public Result<List<DiagnosticInfoResponse>> loadDiagnosticInformation(HttpServletRequest request, @RequestParam("id") Integer id) {
+		 LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+		 if (null == loginUser) {
+			 log.error("当前用户未登录");
+			 throw new JeecgBootException("用户未登录"); // "登录已过期,请重新登录"
+		 }
+		List<DiagnosticInfoResponse> result = afterwardsAuditService.loadDiagnosticInfo(id);
+		return Result.OK(result);
+	 }
+
+	 @ApiOperation(value = "审核端-医嘱信息")
+	 @GetMapping(value = "/audit/")
+	 public Result<List<MedicalOrderInfoResponse>> loadMedicalOrderInfoResponseInfo(HttpServletRequest request, @RequestParam("id") Integer id) {
+		 LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+		 if (null == loginUser) {
+			 log.error("当前用户未登录");
+			 throw new JeecgBootException("用户未登录"); // "登录已过期,请重新登录"
+		 }
+		 List<MedicalOrderInfoResponse> result = afterwardsAuditService.loadMedicalOrderInfo(id);
+		 return Result.OK(result);
+	 }
+
 	 @ApiOperation(value = "审核端-发起审核", notes = "审核端-发起审核")
 	 @PostMapping(value = "/audit")
 	 public Result<String> audit(HttpServletRequest request, @RequestBody @Valid AuditRequestBO param) {
-		 String loginUserName = JwtUtil.getUserNameByToken(request);
-		 if (oConvertUtils.isEmpty(loginUserName)) {
+		 LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+//		 String loginUserName = JwtUtil.getUserNameByToken(request);
+		 if (null == loginUser) {
 			 log.error("当前用户未登录");
 			 throw new JeecgBootException("用户未登录"); // "登录已过期,请重新登录"
 		 }
-		 boolean result  = afterwardsAuditService.audit(loginUserName, param);
+		 boolean result  = afterwardsAuditService.audit(loginUser, param);
 		 return Result.ok("提交成功");
 	 }
 
+	@ApiOperation(value = "科室端,医生违规列表", notes = "科室端,医生违规列表")
+	@GetMapping("/dept/violations")
+	public Result<IPage<AfterwardsAudit>> getDoctorViolations(HttpServletRequest req, DoctorViolationRequest param,
+															  @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+															  @RequestParam(name="pageSize", defaultValue="10") Integer pageSize) {
+		LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+		if (null == loginUser) {
+			log.error("当前用户未登录");
+			throw new JeecgBootException("用户未登录"); // "登录已过期,请重新登录"
+		}
+		AfterwardsAudit afterwardsAudit = new AfterwardsAudit();
+		afterwardsAudit.setOutpatientNumber(param.getAdmissionNumber());
+		afterwardsAudit.setPatientId(param.getPatientName());
+		afterwardsAudit.setCheckState(param.getCheckState());
+		QueryWrapper<AfterwardsAudit> queryWrapper = QueryGenerator.initQueryWrapper(afterwardsAudit, req.getParameterMap());
+		Page<AfterwardsAudit> page = new Page<>(pageNo, pageSize);
+		IPage<AfterwardsAudit> violations = afterwardsAuditService.getDoctorViolations(page, queryWrapper, loginUser);
+		// 返回结果
+		return Result.OK("获取成功", violations);
+	}
+
+
 	 @ApiOperation(value = "科室端,医生违规面板", notes = "科室端,医生违规面板")
 	 @GetMapping(value = "/dept/panel/list")
 	 public Result<DeptAuditResponse> deptAuditPanel(HttpServletRequest request) {
@@ -80,9 +148,12 @@ public class AfterwardsAuditController extends JeecgController<AfterwardsAudit,
 	 @ApiModelProperty(value = "科室端,复核", notes = "科室端,复核")
 	 @PostMapping(value = "/dept/audit")
 	 public Result<?> deptAudit(HttpServletRequest request, @RequestBody @Valid DeptAuditRequestBO param) {
-		 // 获取当前登录的人,并获取到他的科室
-		 String loginUserName = JwtUtil.getUserNameByToken(request);
-		 boolean result = afterwardsAuditService.deptAudit(loginUserName, param);
+		 LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+		 if (null == loginUser) {
+			 log.error("当前用户未登录");
+			 throw new JeecgBootException("用户未登录"); // "登录已过期,请重新登录"
+		 }
+		 boolean result = afterwardsAuditService.deptAudit(loginUser, param);
 		 return Result.OK("请求成功");
 	 }
 

+ 60 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/MidIncidentAudit.java

@@ -19,6 +19,8 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
+import javax.validation.constraints.NotBlank;
+
 /**
  * @Description: mid_incident_audit
  * @Author: jeecg-boot
@@ -71,6 +73,51 @@ public class MidIncidentAudit implements Serializable {
 	@Excel(name = "患者姓名", width = 15)
     @ApiModelProperty(value = "患者姓名")
     private java.lang.String patientName;
+    /**医师级别;*/
+    @Excel(name = "医师级别;", width = 15)
+    @ApiModelProperty(value = "医师级别;")
+    private java.lang.String doctorLevel;
+    /**离院方式;1.医嘱离院 2.医嘱转院、转社区、转卫生机构 3.非医嘱离院 4.死亡 9.其他*/
+    @Excel(name = "离院方式;1.医嘱离院 2.医嘱转院、转社区、转卫生机构 3.非医嘱离院 4.死亡 9.其他", width = 15)
+    @ApiModelProperty(value = "离院方式;1.医嘱离院 2.医嘱转院、转社区、转卫生机构 3.非医嘱离院 4.死亡 9.其他")
+    private java.lang.String dischargeStatus;
+    /**病人年龄;*/
+    @Excel(name = "病人年龄;", width = 15)
+    @ApiModelProperty(value = "病人年龄;")
+    private java.lang.String patientAge;
+
+    /**病人性别;*/
+    @Excel(name = "病人性别;", width = 15)
+    @ApiModelProperty(value = "病人性别;")
+    private java.lang.String patientGender;
+//    inpatient_area	true	char	20	病区
+    /**
+     * 就诊类型为住院时候必填
+     */
+    /**病人性别;*/
+    @Excel(name = "病区;就诊类型为住院时候必填", width = 15)
+    @ApiModelProperty(value = "病区;就诊类型为住院时候必填")
+    private String inpatientArea;
+
+//    number_beds	true	char	10	床位号;护士办理入院时候必填
+    /**
+     * 就诊类型为住院时候必填
+     */
+    @Excel(name = "床位号;护士办理入院时候必填", width = 15)
+    @ApiModelProperty(value = "床位号;护士办理入院时候必填")
+    private String numberBeds;
+//    allergies	true	char	200	过敏史
+    /**
+     * 就诊类型为住院时候必填
+     * 过敏史
+     */
+    @Excel(name = "过敏史", width = 15)
+    @ApiModelProperty(value = "过敏史")
+    private String allergies;
+    @Excel(name = "险种类别;1.医疗、2.工伤、3.生育", width = 15)
+    @ApiModelProperty(value = "险种类别;1.医疗、2.工伤、3.生育")
+    private String insuranceType;
+
 	/**住院号/门诊号*/
 	@Excel(name = "住院号/门诊号", width = 15)
     @ApiModelProperty(value = "住院号/门诊号")
@@ -83,6 +130,19 @@ public class MidIncidentAudit implements Serializable {
     @Excel(name = "违规金额", width = 15)
     @ApiModelProperty(value = "违规金额")
     private java.lang.Double amount;
+    /**入院日期*/
+    @Excel(name = "入院日期", width = 15, format =  "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8",pattern =  "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern= "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "入院日期")
+    private java.util.Date inHospDate;
+    /**入院日期*/
+    @Excel(name = "就诊日期", width = 15, format =  "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8",pattern =  "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern= "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "就诊日期")
+    private java.util.Date visitTime;
+
 	/**反馈结果*/
 	@Excel(name = "反馈结果", width = 15)
     @ApiModelProperty(value = "反馈结果")

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

@@ -88,7 +88,31 @@ public class MidIncidentVisitLog implements Serializable {
 	@Excel(name = "病人性别;", width = 15)
     @ApiModelProperty(value = "病人性别;")
     private java.lang.String patientGender;
-	/**项目总金额;*/
+    /**病人性别;*/
+    @Excel(name = "病区;就诊类型为住院时候必填", width = 15)
+    @ApiModelProperty(value = "病区;就诊类型为住院时候必填")
+    private String inpatientArea;
+
+//    number_beds	true	char	10	床位号;护士办理入院时候必填
+    /**
+     * 就诊类型为住院时候必填
+     */
+    @Excel(name = "床位号;护士办理入院时候必填", width = 15)
+    @ApiModelProperty(value = "床位号;护士办理入院时候必填")
+    private String numberBeds;
+//    allergies	true	char	200	过敏史
+    /**
+     * 就诊类型为住院时候必填
+     * 过敏史
+     */
+    @Excel(name = "过敏史", width = 15)
+    @ApiModelProperty(value = "过敏史")
+    private String allergies;
+    @Excel(name = "险种类别;1.医疗、2.工伤、3.生育", width = 15)
+    @ApiModelProperty(value = "险种类别;1.医疗、2.工伤、3.生育")
+    private String insuranceType;
+
+    /**项目总金额;*/
 	@Excel(name = "项目总金额;", width = 15)
     @ApiModelProperty(value = "项目总金额;")
     private java.lang.Double totoalAmount;
@@ -98,6 +122,12 @@ public class MidIncidentVisitLog implements Serializable {
     @DateTimeFormat(pattern= "yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "入院日期")
     private java.util.Date inHospDate;
+    /**入院日期*/
+    @Excel(name = "就诊日期", width = 15, format =  "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8",pattern =  "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern= "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "就诊日期")
+    private java.util.Date visitTime;
 	/**诊断编码*/
 	@Excel(name = "诊断编码", width = 15)
     @ApiModelProperty(value = "诊断编码")

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

@@ -1,9 +1,13 @@
 package org.jeecg.modules.medical.entity;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import javax.validation.constraints.NotBlank;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -21,7 +25,20 @@ public class MidIncidentWarningVO {
     private String medical_dept_name;//科室名称
     @NotBlank(message = "就诊类型不能为空")
     private String visit_type;//就诊类型(1住院、2门诊)
-    private String in_hosp_date;//入院日期(就诊类型是住院的非空,格式:YYYYMMDD)
+    /**
+     * 险种类别
+     * 1.医疗、2.工伤、3.生育
+     */
+    private String insurance_type;
+    private String in_hosp_date;//入院日期(就诊类型是住院的非空,格式:yyyy-MM-dd HH:mm:ss)
+//    @JsonFormat(timezone = "GMT+8",pattern =  "yyyy-MM-dd HH:mm:ss")
+//    @DateTimeFormat(pattern= "yyyy-MM-dd HH:mm:ss")
+//    @ApiModelProperty(value = "就诊时间")
+    /**
+     * 就诊时间
+     * yyyy-MM-dd HH:mm:ss
+     */
+    private String visit_time;
     @NotBlank(message = "病人ID不能为空")
     private String patient_id;//病人ID
     @NotBlank(message = "病人姓名不能为空")
@@ -53,6 +70,23 @@ public class MidIncidentWarningVO {
      */
     @NotBlank(message = "医师级别不能为空")
     private String doctor_level;
+//    inpatient_area	true	char	20	病区
+    /**
+     * 就诊类型为住院时候必填
+     */
+    private String inpatient_area;
+
+//    number_beds	true	char	10	床位号;护士办理入院时候必填
+    /**
+     * 就诊类型为住院时候必填
+     */
+    private String number_beds;
+//    allergies	true	char	200	过敏史
+    /**
+     * 就诊类型为住院时候必填
+     * 过敏史
+     */
+    private String allergies;
     /**
      * 所有项目总金额
      */

+ 20 - 5
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/mapper/AfterwardsAuditMapper.java

@@ -6,10 +6,7 @@ import java.util.List;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Param;
-import org.jeecg.modules.medical.common.bo.DeptAuditItemResponse;
-import org.jeecg.modules.medical.common.bo.DeptAuditResponse;
-import org.jeecg.modules.medical.common.bo.ReportAfterQueryDetailResponseBO;
-import org.jeecg.modules.medical.common.bo.ReportAfterQueryResponseBO;
+import org.jeecg.modules.medical.common.bo.*;
 import org.jeecg.modules.medical.entity.AfterwardsAudit;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.jeecg.modules.medical.entity.AfterwardsAuditDetail;
@@ -53,5 +50,23 @@ public interface AfterwardsAuditMapper extends BaseMapper<AfterwardsAudit> {
      */
     List<DeptAuditItemResponse> loadDeptDoctorViolationList(@Param("medicalDeptCode") String medicalDeptCode);
 
-    List<DeptAuditItemResponse> loadDeptDoctorList(@Param("loginUserName") String loginUserName);
+    List<DeptAuditItemResponse> loadDeptDoctorList(@Param("dptId") String dptId);
+
+    /**
+     * 根据工单id,查询审核信息
+     * @param id
+     * @return
+     */
+    AuditInfoResponse loadAuditInfo(@Param("id") Integer id);
+
+    /**
+     * 根据工单,查询审核 违规项目/药品明细
+     * @param id
+     * @return
+     */
+    List<AuditInfoListResponse> loadAuditInfoList(Integer id);
+
+    List<DiagnosticInfoResponse> loadDiagnosticInfo(@Param("id") Integer id);
+
+    List<MedicalOrderInfoResponse> loadMedicalOrderInfo(@Param("id") Integer id);
 }

+ 88 - 7
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/mapper/xml/AfterwardsAuditMapper.xml

@@ -112,7 +112,7 @@
     </select>
     <select id="statisticsErrAmtByAfterwareRecordId" resultType="java.math.BigDecimal">
         SELECT
-            sum( (tdetail.amount - (tdetail.quantity * tdetail.price))) as "异常金额"
+            sum( (tdetail.amount - (tdetail.quantity * tdetail.price))) as detailTotalAmt
         from (
              SELECT
                  t.medical_dept_name,
@@ -131,9 +131,9 @@
                  t.quantity, -- 数量
                  t.amount
              FROM afterwards_audit_detail as t
-                      LEFT JOIN medicine as m on t.proejct_code = m.medicine_code AND t.project_type = 'medicine'
-                      LEFT JOIN consumable_material as c on t.proejct_code = c.consumable_code AND t.project_type = 'consumable'
-                      left JOIN diagnosis_treatment as d on t.proejct_code = d.project_code AND t.project_type = 'diagnoses'
+                      LEFT JOIN medicine as m on t.medical_project_code = m.medicine_code AND t.project_type = 'medicine'
+                      LEFT JOIN consumable_material as c on t.medical_project_code = c.consumable_code AND t.project_type = 'consumable'
+                      left JOIN diagnosis_treatment as d on t.medical_project_code = d.project_code AND t.project_type = 'diagnoses'
              WHERE t.afterwards_audit_id = #{id,jdbcType=INTEGER}) as tdetail
     </select>
 
@@ -156,7 +156,8 @@
         FROM afterwards_audit
         WHERE
             medical_dept_code = #{medicalDeptCode,jdbcType=VARCHAR}
-            AND check_state = 'issue_review'
+              AND check_state = 'process'
+              AND review_results = 'issue_review'
             GROUP BY doctor_id
     </select>
     <!-- 获取科室下的医生 -->
@@ -166,8 +167,88 @@
             u.doctor_id as doctorId,
             u.realname as doctorName
         FROM sys_user as u
-                 LEFT JOIN sys_user_depart as dm on u.id = dm.user_id
-        WHERE username = #{loginUserName,jdbcType=VARCHAR}
+            LEFT JOIN sys_user_depart as dm on u.id = dm.user_id
+        WHERE dm.dep_id = #{dptId,jdbcType=VARCHAR}
 
     </select>
+
+    <select id="loadAuditInfo" resultType="org.jeecg.modules.medical.common.bo.AuditInfoResponse">
+        SELECT
+            ad.patient_name as patientName,
+            ad.patient_id as patientId,
+            his.birthday as birthday,
+            his.gender as gender,
+            ad.treatment_type as treatmentType,
+            ad.outpatient_number as outpatientNumber,
+            ad.visit_time as visitTime,
+            ad.medical_insurance as medicalInsurance,
+            ad.doctor_name as doctorName,
+            ad.medical_dept_name as medicalDeptName
+        FROM afterwards_audit as ad
+                 LEFT JOIN his_patient as his on ad.patient_id = his.patient_no
+        WHERE ad.id = #{id,jdbcType=INTEGER};
+    </select>
+
+    <select id="loadAuditInfoList" resultType="org.jeecg.modules.medical.common.bo.AuditInfoListResponse">
+        SELECT
+            tdetail.*,
+            (tdetail.amount - (tdetail.quantity * tdetail.price)) as errorDetailAmt -- 异常金额
+        FROM (
+            SELECT
+             case t.project_type
+                 WHEN 'medicine' THEN m.id
+                 WHEN 'consumable' THEN c.id
+                 WHEN 'diagnoses' THEN d.id
+                 else 0 end as join_id,
+             case t.project_type
+                 WHEN 'medicine' THEN m.price
+                 WHEN 'consumable' THEN c.price
+                 WHEN 'diagnoses' THEN d.price
+                 else 0 end as price, -- 单价
+             t.quantity as quantity, -- 数量
+             t.amount,
+             t.patient_id as patientId, -- 患者编号
+             t.medical_project_code as medicalProjectCode, -- "医保项目编码",
+             t.medical_project_name as medicalProjectName, -- "医保项目名称",
+             t.medical_ins_rule_info_name as medicalInsRuleInfoName, -- "项目类型|违规类型"
+             t.id
+            FROM afterwards_audit_detail as t
+                  LEFT JOIN medicine as m on t.proejct_code = m.medicine_code AND t.project_type = 'medicine'
+                  LEFT JOIN consumable_material as c on t.proejct_code = c.consumable_code AND t.project_type = 'consumable'
+                  left JOIN diagnosis_treatment as d on t.proejct_code = d.project_code AND t.project_type = 'diagnoses'
+            WHERE t.afterwards_audit_id = 1)
+        as tdetail
+    </select>
+    <select id="loadDiagnosticInfo" resultType="org.jeecg.modules.medical.common.bo.DiagnosticInfoResponse">
+        SELECT
+            ad.id,
+            ad.outpatient_number as outpatientNumber, -- "住院号",
+            h.icd10_code_basy as mainDiagnosisCode, -- "主要诊断编码",
+            h.icd10_name_basy as mainDiagnosisName, -- "主要诊断名称",
+            h.disease_id1 as subDiagnosisCode, -- "副诊断编码",
+            h.disease_name1 as subDiagnosisName, -- "副诊断名称"
+            "" as subDiagnosis2Code -- 这个等后面确认
+        FROM
+            afterwards_audit as ad
+            RIGHT JOIN medical_record_homepage as h ON ad.outpatient_number = h.zyh
+        WHERE ad.id = #{id, jdbcType=INTEGER}
+    </select>
+
+    <select id="loadMedicalOrderInfo"
+            resultType="org.jeecg.modules.medical.common.bo.MedicalOrderInfoResponse">
+        SELECT
+            p.hisid as associatedSettlementMaster, -- 关联结算主单
+            p.patient_id as personalCode, -- 个人编码
+            p.inp_outpatient_number as admissionOutpatientNumber, -- 住院号/门诊号
+            ad.patient_name as patientName, -- 患者姓名
+            p.order_number as orderNumber, -- 医嘱号
+            p.order_time as orderTime, -- 下嘱时间
+            p.stop_order_time as stopOrderTime, -- 停嘱时间
+            p.order_status as orderStatus -- 医嘱状态
+        FROM
+            afterwards_audit as ad
+                RIGHT JOIN prescription_order as p ON p.inp_outpatient_number = ad.outpatient_number
+        WHERE
+            ad.id = #{id, jdbcType=INTEGER}
+    </select>
 </mapper>

+ 37 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/RuleEngine.java

@@ -344,23 +344,35 @@ public class RuleEngine {
         midIncidentVisitLog.setPatientGender(midIncidentWarningVO.getPatient_gender());
         midIncidentVisitLog.setDischargeStatus(midIncidentWarningVO.getDischarge_status());
         midIncidentVisitLog.setTotoalAmount(midIncidentWarningVO.getTotoal_amount());
+        midIncidentVisitLog.setInsuranceType(midIncidentWarningVO.getInsurance_type());
         if (CollectionUtil.isNotEmpty(midIncidentWarningVO.getDiagnoses())) {
             midIncidentVisitLog.setDiagnoses(JSON.toJSONString(midIncidentWarningVO.getDiagnoses()));
         }
         midIncidentVisitLog.setDoctorAdviceNo(midIncidentWarningVO.getDoctor_advice_no());
         try {
             if (StringUtils.isNotBlank(midIncidentWarningVO.getIn_hosp_date())) {
-                Date inHospDate = DateUtils.parseDate(midIncidentWarningVO.getIn_hosp_date(), "yyyyMMdd");
+                Date inHospDate = DateUtils.parseDate(midIncidentWarningVO.getIn_hosp_date(), "yyyy-MM-dd HH:mm:ss");
                 midIncidentVisitLog.setInHospDate(inHospDate);
             }
         } catch (ParseException e) {
             log.error(e.getMessage(), e);
         }
+        try {
+            if (StringUtils.isNotBlank(midIncidentWarningVO.getVisit_time())) {
+                Date visitTime = DateUtils.parseDate(midIncidentWarningVO.getVisit_time(), "yyyy-MM-dd HH:mm:ss");
+                midIncidentVisitLog.setVisitTime(visitTime);
+            }
+        } catch (ParseException e) {
+            log.error(e.getMessage(), e);
+        }
         Date now = new Date(System.currentTimeMillis());
         midIncidentVisitLog.setCreateTime(now);
         midIncidentVisitLog.setMedicalDeptCode(midIncidentWarningVO.getMedical_dept_code());
         midIncidentVisitLog.setMedicalDeptName(midIncidentWarningVO.getMedical_dept_name());
         midIncidentVisitLog.setVisitType(midIncidentWarningVO.getVisit_type());
+        midIncidentVisitLog.setAllergies(midIncidentWarningVO.getAllergies());
+        midIncidentVisitLog.setInpatientArea(midIncidentWarningVO.getInpatient_area());
+        midIncidentVisitLog.setNumberBeds(midIncidentWarningVO.getNumber_beds());
         midIncidentVisitLogService.save(midIncidentVisitLog);
         if (CollectionUtil.isNotEmpty(midIncidentWarningVO.getAdvice_details())) {
             List<MidIncidentVisitDetailLog> midIncidentVisitDetailLogList = new ArrayList<>();
@@ -438,6 +450,30 @@ public class RuleEngine {
         midIncidentAudit.setPrescriptionNumber(midIncidentWarningVO.getDoctor_advice_no());
         midIncidentAudit.setNoticeType("事中预警");
         midIncidentAudit.setAmount((double) 0);
+        midIncidentAudit.setDoctorLevel(midIncidentWarningVO.getDoctor_level());
+        midIncidentAudit.setPatientAge(midIncidentWarningVO.getPatient_age());
+        midIncidentAudit.setPatientGender(midIncidentWarningVO.getPatient_gender());
+        midIncidentAudit.setDischargeStatus(midIncidentWarningVO.getDischarge_status());
+        midIncidentAudit.setAllergies(midIncidentWarningVO.getAllergies());
+        midIncidentAudit.setInpatientArea(midIncidentWarningVO.getInpatient_area());
+        midIncidentAudit.setNumberBeds(midIncidentWarningVO.getNumber_beds());
+        midIncidentAudit.setInsuranceType(midIncidentWarningVO.getInsurance_type());
+        try {
+            if (StringUtils.isNotBlank(midIncidentWarningVO.getIn_hosp_date())) {
+                Date inHospDate = DateUtils.parseDate(midIncidentWarningVO.getIn_hosp_date(), "yyyy-MM-dd HH:mm:ss");
+                midIncidentAudit.setInHospDate(inHospDate);
+            }
+        } catch (ParseException e) {
+            log.error(e.getMessage(), e);
+        }
+        try {
+            if (StringUtils.isNotBlank(midIncidentWarningVO.getVisit_time())) {
+                Date visitTime = DateUtils.parseDate(midIncidentWarningVO.getVisit_time(), "yyyy-MM-dd HH:mm:ss");
+                midIncidentAudit.setVisitTime(visitTime);
+            }
+        } catch (ParseException e) {
+            log.error(e.getMessage(), e);
+        }
         midIncidentAuditService.save(midIncidentAudit);
         double allAmount = 0;
         if (null != midIncidentWarningVO.getTotoal_amount() && midIncidentWarningVO.getTotoal_amount() > 0) {

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

@@ -4,14 +4,13 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 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.common.bo.*;
 import org.jeecg.modules.medical.entity.AfterwardsAudit;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.modules.medical.entity.AfterwardsAuditDetail;
 
+import java.util.List;
+
 /**
  * @Description: afterwards_audit
  * @Author: jeecg-boot
@@ -38,7 +37,7 @@ public interface IAfterwardsAuditService extends IService<AfterwardsAudit> {
      */
     IPage<AfterwardsAudit> auditQueryListPage(Page<AfterwardsAudit> page, QueryWrapper<AfterwardsAudit> queryWrapper);
 
-    boolean audit(String loginUserName, AuditRequestBO param);
+    boolean audit(LoginUser loginUser, AuditRequestBO param);
 
     DeptAuditResponse deptAuditPanel(String loginUserName);
 
@@ -48,8 +47,39 @@ public interface IAfterwardsAuditService extends IService<AfterwardsAudit> {
      * @param param
      * @return
      */
-    boolean deptAudit(String loginUserName, DeptAuditRequestBO param);
+    boolean deptAudit(LoginUser loginUser, DeptAuditRequestBO param);
 
 
     AfterwardsAudit loadAfterwardsAuditById(String id);
+
+    /**
+     * 根据工单id查询审核系统详细信息
+     * @param id
+     * @return
+     */
+    AuditInfoResponse loadAuditInfo(Integer id);
+
+
+    /**
+     * 获取诊断信息
+     * @param id
+     * @return
+     */
+    List<DiagnosticInfoResponse> loadDiagnosticInfo(Integer id);
+
+
+    /**
+     * 获取医嘱信息
+     * @param id
+     * @return
+     */
+    List<MedicalOrderInfoResponse> loadMedicalOrderInfo(Integer id);
+
+    /**
+     * 获取医生违规列表
+     * @param pageNo
+     * @param queryWrapper
+     * @return
+     */
+    IPage<AfterwardsAudit> getDoctorViolations(Page<AfterwardsAudit> page, QueryWrapper<AfterwardsAudit> queryWrapper, LoginUser loginUser);
 }

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

@@ -1,5 +1,6 @@
 package org.jeecg.modules.medical.service.impl;
 
+import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -19,6 +20,8 @@ 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.jeecg.modules.system.entity.SysUser;
+import org.jeecg.modules.system.service.ISysUserService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -26,6 +29,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.ObjectUtils;
+import org.springframework.util.StringUtils;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
@@ -47,6 +51,8 @@ public class AfterwardsAuditServiceImpl extends ServiceImpl<AfterwardsAuditMappe
 
     /** 科室/医生复核服务 */
     private final IMedicalDoctorAppealRecordService appealRecordService;
+    private final ISysUserService sysUserService;
+
 
     @Override
     public IPage<ReportAfterQueryResponseBO> departmentStatistics(Page<AfterwardsAudit> page, AfterwardsAudit afterwardsAudit) {
@@ -78,7 +84,7 @@ public class AfterwardsAuditServiceImpl extends ServiceImpl<AfterwardsAuditMappe
 
     @Override
     public IPage<AfterwardsAudit> auditQueryListPage(Page<AfterwardsAudit> page, QueryWrapper<AfterwardsAudit> queryWrapper) {
-        Page<AfterwardsAudit> auditQueryPageList = this.page(page, queryWrapper);
+        Page<AfterwardsAudit> auditQueryPageList = this.page(page, queryWrapper); // TODO 待审核状态默认是空,需要查询为空
         if (!CollectionUtils.isEmpty(auditQueryPageList.getRecords())) {
             List<AfterwardsAudit> records = auditQueryPageList.getRecords();
             records = records.stream().map(item -> {
@@ -100,16 +106,23 @@ public class AfterwardsAuditServiceImpl extends ServiceImpl<AfterwardsAuditMappe
 
     @Transactional(readOnly = false)
     @Override
-    public boolean audit(String loginUserName, AuditRequestBO param) {
+    public boolean audit(LoginUser loginUser, AuditRequestBO param) {
         AfterwardsAudit a = new AfterwardsAudit();
 
         a = loadAfterwardsAuditById(param.getId());
-
-        // 检查当前状态
-        if (!ObjectUtils.nullSafeEquals("wait", a.getCheckState()) && !ObjectUtils.nullSafeEquals("reAudit", a.getCheckState())) {
+        // 检查当前状态 、、兼容空
+        if (!ObjectUtils.nullSafeEquals(AfterwardsAuditStatusEnum.wait.getStatus() , a.getCheckState())
+                && !ObjectUtils.nullSafeEquals(AfterwardsAuditStatusEnum.process.getStatus(), a.getCheckState())) {
             log.error("必须为待审核或医生符合后的重新审核状态才可以发起审核,当前数据状态为{}", a.getCheckState());
             throw new JeecgBootException("当前状态不可发起审核,请检查");
         }
+        // 如果当前状态为 process, 表示可能为医生申诉,或者科室处理,只有医生申诉了,才能继续
+        if (ObjectUtils.nullSafeEquals(AfterwardsAuditStatusEnum.process.getStatus(), a.getCheckState())) {
+            if (!ObjectUtils.nullSafeEquals(AfterwardsAuditStatusEnum.doctor_appeal.getStatus(), a.getReviewResults())) {
+                log.error("表记录状态为待审核={},则审查结果必须为医生申诉时,才能继续审核,当前审查结果为={}", a.getCheckState(), a.getReviewResults());
+                throw new JeecgBootException("处理中,必须为医生申诉状态才能继续,请检查!");
+            }
+        }
 
         Date nowTime = new Date();
 
@@ -119,6 +132,7 @@ public class AfterwardsAuditServiceImpl extends ServiceImpl<AfterwardsAuditMappe
             throw new JeecgBootException("不支持的审核状态,请检查");
         }
 
+        String loginUserid = loginUser.getId();
         switch (checkStatus) {
             case pass: //系统问题,过了
             case violation:
@@ -126,23 +140,29 @@ public class AfterwardsAuditServiceImpl extends ServiceImpl<AfterwardsAuditMappe
                 a.setCheckState(AfterwardsAuditStatusEnum.finish.getStatus());
                 a.setStatus("");// 直接违规或者结果通过,这个给空
                 a.setReviewResults(checkStatus.getStatus());
-                a.setCheckBy(loginUserName);// 审核人
+                a.setCheckBy(loginUserid);// 审核人
 
                 a.setAuditTime(nowTime);
                 a.setUpdateTime(nowTime);
-                a.setUpdateBy(loginUserName);
+                a.setUpdateBy(loginUserid);
                 break;
             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.setPreCheckBy(loginUserid);
                 a.setPreAuditTime(nowTime); //审核人员
-
-                a.setCheckBy(a.getDoctorId());// 分配给符合人
+                String doctorId = a.getDoctorId();
+                SysUser sysUser = sysUserService.getByDoctorId(doctorId);
+                if (null == sysUser) {
+                    log.error("下发复核时,找不到指定给医生id={}的用户信息,请先给医生id={}创建用户", doctorId, doctorId);
+                    throw new JeecgBootException("找不到复核医生的用户信息,请检查");
+                }
+                // 根据医生id,查询当前系统用户id
+                a.setCheckBy(sysUser.getId());// 分配给符合人
 //                a.setAuditTime(nowTime);
                 a.setUpdateTime(nowTime);
-                a.setUpdateBy(loginUserName);
+                a.setUpdateBy(loginUserid);
                 break;
             default:
                 log.error("不支持的审核状态={}", param.getCheckState());
@@ -165,12 +185,14 @@ public class AfterwardsAuditServiceImpl extends ServiceImpl<AfterwardsAuditMappe
         // 获取违规医生列表
         List<DeptAuditItemResponse> deptDoctorViolationList = baseMapper.loadDeptDoctorViolationList(sysDepart.getMedicalDeptCode());
         // 获取该科室的医生面板
-        List<DeptAuditItemResponse> deptDoctorList = baseMapper.loadDeptDoctorList(loginUserName);
+        List<DeptAuditItemResponse> deptDoctorList = baseMapper.loadDeptDoctorList(sysDepart.getId());
         List<DeptAuditItemResponse> allDeptDoctorList = new ArrayList<>();
         // 下半部分要扣除掉违规的医生列表
         if (!CollectionUtils.isEmpty(deptDoctorList) && !CollectionUtils.isEmpty(deptDoctorViolationList)) {
             allDeptDoctorList = deptDoctorList.stream().filter(allDoctor -> deptDoctorViolationList.stream().map(DeptAuditItemResponse::getDoctorId)
                     .noneMatch(id -> Objects.equals(allDoctor.getDoctorId(), id))).collect(Collectors.toList());
+        } else {
+            allDeptDoctorList = deptDoctorList;
         }
 
         DeptAuditResponse result = new DeptAuditResponse();
@@ -181,9 +203,9 @@ public class AfterwardsAuditServiceImpl extends ServiceImpl<AfterwardsAuditMappe
 
     @Transactional(readOnly = false)
     @Override
-    public boolean deptAudit(String loginUserName, DeptAuditRequestBO param) {
+    public boolean deptAudit(LoginUser loginUser, DeptAuditRequestBO param) {
         // 根据当前登录,先获取到医生面板
-        SysDepart sysDepart = baseMapper.loadUserDept(loginUserName);
+        SysDepart sysDepart = baseMapper.loadUserDept(loginUser.getUsername());
         if (null == sysDepart) {
             log.error("找不到当前医生的科室,请检查");
             throw new JeecgBootException("找不到当前医生的科室,请检查!");
@@ -223,7 +245,7 @@ public class AfterwardsAuditServiceImpl extends ServiceImpl<AfterwardsAuditMappe
 
         appealRecord.setAppealNumber(appealNumber);// TODO
         appealRecord.setCreateTime(new Date()); // 处理时间
-        appealRecord.setCreateBy(loginUserName);// 处理人
+        appealRecord.setCreateBy(loginUser.getId());// 处理人
         appealRecord.setAppealStatus(param.getCheckState());
         appealRecord.setMedicalDeptCode(medicalDeptCode);
         appealRecord.setMedicalDeptName(audit.getMedicalDeptName());
@@ -237,22 +259,22 @@ public class AfterwardsAuditServiceImpl extends ServiceImpl<AfterwardsAuditMappe
                 appealRecord.setImgPath(param.getImgPaths());
 
                 audit.setCheckBy(audit.getPreCheckBy()); //下一个审核人员为 下发给科室的人员继续审核
-                audit.setPreCheckBy(loginUserName); // 上一个审核人员为当前审核人员
+                audit.setPreCheckBy(loginUser.getId()); // 上一个审核人员为当前审核人员
                 audit.setPreAuditTime(new Date()); // 上一个审查时间,是当前时间
-                audit.setStatus(AfterwardsAuditStatusEnum.dept_audit_wait.getStatus()); //审核状态为等待科室处理
+                audit.setStatus(AfterwardsAuditStatusEnum.doctor_appeal.getStatus()); //审核状态为等待科室处理
                 audit.setReviewResults(AfterwardsAuditStatusEnum.doctor_appeal.getStatus());// 申诉时,审核结果为医生申诉
                 audit.setUpdateTime(new Date());
-                audit.setUpdateBy(loginUserName);
+                audit.setUpdateBy(loginUser.getId());
                 break;
             case "agree_audit": // 同意审核结果
                 audit.setCheckBy(audit.getPreCheckBy()); //下一个审核人员为 下发给科室的人员继续审核
-                audit.setPreCheckBy(loginUserName); // 上一个审核人员为当前审核人员
+                audit.setPreCheckBy(loginUser.getId()); // 上一个审核人员为当前审核人员
                 audit.setPreAuditTime(new Date()); // 上一个审查时间,是当前时间
                 audit.setCheckState(AfterwardsAuditStatusEnum.finish.getStatus());
                 audit.setStatus("");// 直接完成,这个状态给空
                 audit.setReviewResults(AfterwardsAuditStatusEnum.agree_audit.getStatus());
                 audit.setUpdateTime(new Date());
-                audit.setUpdateBy(loginUserName);
+                audit.setUpdateBy(loginUser.getId());
                 break;
             default:
                 log.error("不支持的审核状态={}", param.getCheckState());
@@ -285,4 +307,82 @@ public class AfterwardsAuditServiceImpl extends ServiceImpl<AfterwardsAuditMappe
         }
         return a;
     }
+
+    @Override
+    public AuditInfoResponse loadAuditInfo(Integer id) {
+        AuditInfoResponse result = baseMapper.loadAuditInfo(id);
+        if (null == result) {
+            log.error("根据事后审核工单id={},获取不到事后审核工单信息", id);
+            throw new JeecgBootException("找不到审核工单信息");
+        }
+        if (null != result.getBirthday()) {
+            // TODO 计算年龄
+        }
+        //获取违规的detail数据
+        List<AuditInfoListResponse> auditInfoListResponseList = baseMapper.loadAuditInfoList(id);
+        if (!CollectionUtils.isEmpty(auditInfoListResponseList)) {
+            for (AuditInfoListResponse auditInfoListResponse : auditInfoListResponseList) {
+                // 计算异常多收-少收
+                BigDecimal detailTotalAmt = auditInfoListResponse.getErrorDetailAmt();
+                if (null != detailTotalAmt) {
+                    if (detailTotalAmt.compareTo(BigDecimal.ZERO) > 0) { // 异常金额大于0,就是多收
+                        auditInfoListResponse.setErrorRelativelyManyAmt(detailTotalAmt);
+                    } else if (detailTotalAmt.compareTo(BigDecimal.ZERO) < 0) {
+                        auditInfoListResponse.setErrorRelativelyFewAmt(detailTotalAmt);
+                    }
+                }
+                auditInfoListResponse.setVisitTime(result.getVisitTime());
+                auditInfoListResponse.setMedicalInsurance(result.getMedicalInsurance());
+            }
+            result.setDetailList(auditInfoListResponseList);
+        }
+        return result;
+    }
+
+    /**
+     * 根据工单号,获取诊断信息
+     * @param id
+     * @return
+     */
+    @Override
+    public List<DiagnosticInfoResponse> loadDiagnosticInfo(Integer id) {
+        return baseMapper.loadDiagnosticInfo(id);
+    }
+
+    @Override
+    public List<MedicalOrderInfoResponse> loadMedicalOrderInfo(Integer id) {
+        return baseMapper.loadMedicalOrderInfo(id);
+    }
+
+    /**
+     * 获取医生对应的违规列表
+     * @param page
+     * @param queryWrapper
+     * @param loginUser
+     * @return
+     */
+    @Override
+    public IPage<AfterwardsAudit> getDoctorViolations(Page<AfterwardsAudit> page, QueryWrapper<AfterwardsAudit> queryWrapper, LoginUser loginUser) {
+        // 根据当前登录,先获取到医生面板
+        SysDepart sysDepart = baseMapper.loadUserDept(loginUser.getUsername());
+        if (null == sysDepart) {
+            log.error("找不到当前医生的科室,请检查");
+            throw new JeecgBootException("找不到当前医生的科室,请检查!");
+        }
+        // 当前登录科室/医生端的科室code
+        String medicalDeptCode = sysDepart.getMedicalDeptCode();
+        // 获取医生code
+        SysUser userByName = sysUserService.getUserByName(loginUser.getUsername());
+        if (null == userByName) {
+            log.error("找不到登录用户信息={}", loginUser.getUsername());
+            throw new JeecgBootException("找不到登录用户的医生用户信息,请检查!");
+        }
+        if (!StringUtils.hasText(userByName.getDoctorId())) {
+            log.error("找不到登录用户信息={},的医生编码信息,请检查", loginUser.getUsername());
+            throw new JeecgBootException("找不到登录用户的医生编码(医生id)信息,请检查!");
+        }
+        queryWrapper.eq("doctor_id", userByName.getDoctorId());
+        queryWrapper.eq("medical_dept_code", medicalDeptCode);
+        return this.page(page, queryWrapper);
+    }
 }

+ 17 - 10
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java

@@ -34,7 +34,7 @@ public interface ISysUserService extends IService<SysUser> {
 
 	/**
 	 * 查询用户数据列表
-	 * 
+	 *
 	 * @param req
 	 * @param queryWrapper
 	 * @param pageSize
@@ -42,7 +42,7 @@ public interface ISysUserService extends IService<SysUser> {
 	 * @return
 	 */
 	Result<IPage<SysUser>> queryPageList(HttpServletRequest req, QueryWrapper<SysUser> queryWrapper, Integer pageSize, Integer pageNo);
-	
+
 	/**
 	 * 重置密码
 	 *
@@ -82,15 +82,15 @@ public interface ISysUserService extends IService<SysUser> {
      * @return SysUser
      */
 	public SysUser getUserByName(String username);
-	
+
 	/**
 	 * 添加用户和用户角色关系
 	 * @param user
 	 * @param roles
 	 */
 	public void addUserWithRole(SysUser user,String roles);
-	
-	
+
+
 	/**
 	 * 修改用户和用户角色关系
 	 * @param user
@@ -113,7 +113,7 @@ public interface ISysUserService extends IService<SysUser> {
 	 * @return
 	 */
 	public SysRoleIndex getDynamicIndexByUserRole(String username,String version);
-	
+
 	/**
 	  * 查询用户信息包括 部门信息
 	 * @param username
@@ -193,14 +193,14 @@ public interface ISysUserService extends IService<SysUser> {
 	 * @return 权限集合
 	 */
 	Set<String> getUserPermissionsSet(String username);
-	
+
 	/**
 	 * 根据用户名设置部门ID
 	 * @param username
 	 * @param orgCode
 	 */
 	void updateUserDepart(String username,String orgCode,Integer loginTenantId);
-	
+
 	/**
 	 * 根据手机号获取用户名和密码
      * @param phone 手机号
@@ -230,7 +230,7 @@ public interface ISysUserService extends IService<SysUser> {
 	 * @param departs
 	 */
 	void editUserWithDepart(SysUser user, String departs);
-	
+
 	/**
 	   * 校验用户是否有效
 	 * @param sysUser
@@ -381,7 +381,7 @@ public interface ISysUserService extends IService<SysUser> {
 	 */
 	void changeDepartChargePerson(JSONObject json);
 	//--- author:taoyan date:20221231 for: QQYUN-3515【应用】应用下的组织机构管理功能,细节实现 ---
-	
+
 	/**
 	 * 编辑租户用户
 	 * @param sysUser
@@ -389,4 +389,11 @@ public interface ISysUserService extends IService<SysUser> {
 	 * @param departs
 	 */
 	void editTenantUser(SysUser sysUser, String tenantId, String departs, String roles);
+
+	/**
+	 * 根据医生id查询系统用户信息
+	 * @param doctorId
+	 * @return
+	 */
+    SysUser getByDoctorId(String doctorId);
 }

+ 31 - 16
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java

@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
@@ -63,7 +64,7 @@ import java.util.stream.Collectors;
 @Service
 @Slf4j
 public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements ISysUserService {
-	
+
 	@Autowired
 	private SysUserMapper userMapper;
 	@Autowired
@@ -96,7 +97,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     private SysUserTenantMapper relationMapper;
 	@Autowired
     private SysUserTenantMapper userTenantMapper;
-	
+
 	@Override
 	public Result<IPage<SysUser>> queryPageList(HttpServletRequest req, QueryWrapper<SysUser> queryWrapper, Integer pageSize, Integer pageNo) {
 		Result<IPage<SysUser>> result = new Result<IPage<SysUser>>();
@@ -224,8 +225,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 		}
 		return sysUser;
 	}
-	
-	
+
+
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public void addUserWithRole(SysUser user, String roles) {
@@ -286,7 +287,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 				roleIndex = list.get(0);
 			}
 		}
-		
+
 		//如果componentUrl为空,则返回空
 		if(oConvertUtils.isEmpty(roleIndex.getComponent())){
 			return null;
@@ -352,7 +353,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 			info.setSysUserName(sysUser.getRealname());
 			info.setSysOrgCode(sysUser.getOrgCode());
 		}
-		
+
 		//多部门支持in查询
 		List<SysDepart> list = sysDepartMapper.queryUserDeparts(sysUser.getId());
 		List<String> sysMultiOrgCode = new ArrayList<String>();
@@ -368,7 +369,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 			}
 		}
 		info.setSysMultiOrgCode(sysMultiOrgCode);
-		
+
 		return info;
 	}
 
@@ -586,7 +587,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 
 		//6. 删除租户用户中间表的数据
 		line += userTenantMapper.delete(new LambdaQueryWrapper<SysUserTenant>().in(SysUserTenant::getUserId,userIds));
-		
+
 		return line != 0;
 	}
 
@@ -788,7 +789,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 			queryWrapper.eq(SysTenant::getStatus, Integer.valueOf(CommonConstant.STATUS_1));
 			tenantList = sysTenantMapper.selectList(queryWrapper);
 			//-------------------------------------------------------------------------------------
-			
+
 			if (tenantList.size() == 0) {
 				return result.error500("与该用户关联的租户均已被冻结,无法登录!");
 			} else {
@@ -896,7 +897,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 				//找到新的租户id与原来的租户id不同之处,进行删除
 				String[] relTenantIdArray = relTenantIds.split(SymbolConstant.COMMA);
 				List<String> relTenantIdList = Arrays.asList(relTenantIdArray);
-				
+
 				List<Integer> deleteTenantIdList = oldTenantIds.stream().filter(item -> !relTenantIdList.contains(item.toString())).collect(Collectors.toList());
 				for (Integer tenantId : deleteTenantIdList) {
 					this.deleteTenantByUserId(userId, tenantId);
@@ -964,9 +965,9 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 					.in(SysUserDepart::getUserId, idList)
 					.in(SysUserDepart::getDepId, departIdList);
 			sysUserDepartMapper.delete(query);
-			
+
 			String[] arr = selecteddeparts.split(",");
-			
+
 			//再新增
 			for (String deaprtId : arr) {
 				for(String userId: idList){
@@ -1104,7 +1105,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 						}
 					}
 				}
-				
+
 			}
 		}
 	}
@@ -1135,7 +1136,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 		}
     	return result;
 	}
-	
+
 	/**
 	 * 变更父级部门 修改编码
 	 * @param parentId
@@ -1208,7 +1209,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 			getParentDepart(temp, orgName, orgId);
 		}
 	}
-	
+
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	@CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)
@@ -1221,7 +1222,21 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 		//修改租户用户下的部门
 		this.updateTenantDepart(user, tenantId, departs);
 	}
-	
+
+	@Override
+	public SysUser getByDoctorId(String doctorId) {
+		LambdaQueryWrapper<SysUser> queryWrapper = Wrappers.<SysUser>lambdaQuery()
+				.eq(SysUser::getDoctorId, doctorId);
+		List<SysUser> list = this.list(queryWrapper);
+		if (CollectionUtils.isEmpty(list)) {
+			return null;
+		}
+		if (list.size() > 1) {
+			log.error("根据医生编号={},查询系统用户时,获取到两条数据,请处理!", doctorId);
+		}
+		return list.get(0);
+	}
+
 	/**
 	 * 修改租户下的部门
 	 * @param departs