Преглед на файлове

add: 审核中心的列表,审核中心:发起审核

Scott преди 2 години
родител
ревизия
967c2a9828
променени са 11 файла, в които са добавени 491 реда и са изтрити 56 реда
  1. 26 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/common/bo/AuditRequestBO.java
  2. 88 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/common/bo/ReportAfterQueryDetailResponseBO.java
  3. 2 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/common/bo/ReportAfterQueryResponseBO.java
  4. 57 31
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/controller/AfterwardsAuditController.java
  5. 23 3
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/AfterwardsAudit.java
  6. 4 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/entity/AfterwardsAuditDetail.java
  7. 17 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/mapper/AfterwardsAuditMapper.java
  8. 129 20
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/mapper/xml/AfterwardsAuditMapper.xml
  9. 1 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/FactorEnchangeFactory.java
  10. 22 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/service/IAfterwardsAuditService.java
  11. 122 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/service/impl/AfterwardsAuditServiceImpl.java

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

@@ -0,0 +1,26 @@
+package org.jeecg.modules.medical.common.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * @author soft01
+ * @time 2023/5/24 23:44
+ * @description '审核请求参数'
+ * @parentProject medical-java
+ */
+@Data
+@ApiModel(value = "审核请求对象")
+public class AuditRequestBO implements Serializable {
+
+    @NotBlank(message = "审核记录id不可为空")
+    @ApiModelProperty(value = "审核记录id")
+    private String id;
+    @NotBlank(message = "审核状态不可为空")
+    @ApiModelProperty(value = "审核状态;wait=待审核 pass=系统问题,直接过,violation=直接违规; issue_review=下发复核") //TODO 暂定3种,后面在枚举中,或者字典
+    private String checkState;
+}

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

@@ -0,0 +1,88 @@
+package org.jeecg.modules.medical.common.bo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+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.math.BigDecimal;
+
+/**
+ * @author soft01
+ * @time 2023/5/21 18:50
+ * @description '事后-科室违规明细'
+ * @parentProject medical-java
+ */
+@Data
+public class ReportAfterQueryDetailResponseBO implements Serializable {
+    @ApiModelProperty(value = "科室名称")
+    private String medicalDeptName;
+    @ApiModelProperty(value = "科室编码")
+    private String medicalDeptCode;
+    @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 BigDecimal price;
+
+    @ApiModelProperty(value = "数量")
+    private BigDecimal quantity;
+    @ApiModelProperty(value = "异常金额")
+    private BigDecimal errorTotalAmt;
+    @ApiModelProperty(value = "异常多收")
+    private BigDecimal errorRelativelyManyAmt;
+    @ApiModelProperty(value = "异常多收")
+    private BigDecimal errorRelativelyFewAmt;
+    @ApiModelProperty(value = "就诊类别;住院/门诊")
+    private java.lang.String treatmentType;
+
+    @Excel(name = "医保项目编码", width = 15)
+    @ApiModelProperty(value = "医保项目编码")
+    private java.lang.String medicalProjectCode;
+    /**项目名称*/
+    @Excel(name = "医保项目名称", width = 15)
+    @ApiModelProperty(value = "医保项目名称")
+    private java.lang.String medicalProjectName;
+
+    @Excel(name = "个人编号", width = 15)
+    @ApiModelProperty(value = "个人编号")
+    private java.lang.String patientId;
+    /**患者姓名*/
+    @Excel(name = "患者姓名", width = 15)
+    @ApiModelProperty(value = "患者姓名")
+    private java.lang.String patientName;
+
+    @Excel(name = "医保规则编码", width = 15)
+    @ApiModelProperty(value = "医保规则编码")
+    private java.lang.String medicalInsRuleInfoCode;
+    /**医保规则名称*/
+    @Excel(name = "医保规则名称", width = 15)
+    @ApiModelProperty(value = "医保规则名称")
+    private java.lang.String medicalInsRuleInfoName;
+    @ApiModelProperty(value = "违规等级")
+    private java.lang.Integer violationLevel;
+    @ApiModelProperty(value = "是否医保")
+    private String medicalInsurance;
+
+    @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 createTime;
+    /**反馈结果*/
+    @Excel(name = "反馈结果", width = 15)
+    @ApiModelProperty(value = "反馈结果|医生处理意见")
+    private java.lang.String feedbackResult;
+    /**反馈编码*/
+    @Excel(name = "反馈编码", width = 15)
+    @ApiModelProperty(value = "反馈编码")
+    private java.lang.String feedbackCode;
+
+
+}

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

@@ -19,6 +19,8 @@ public class ReportAfterQueryResponseBO implements Serializable {
     private Integer orderNum;
     @ApiModelProperty(value = "科室名称")
     private String medicalDeptName;
+    @ApiModelProperty(value = "科室编码")
+    private String medicalDeptCode;
     @ApiModelProperty(value = "科室医生总数")
     private Integer medicalDeptDoctorTotal;
     @ApiModelProperty(value = "违规医生总数")

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

@@ -1,42 +1,33 @@
 package org.jeecg.modules.medical.controller;
 
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+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.ReportAfterQueryResponseBO;
 import org.jeecg.modules.medical.entity.AfterwardsAudit;
+import org.jeecg.modules.medical.entity.AfterwardsAuditDetail;
 import org.jeecg.modules.medical.service.IAfterwardsAuditService;
-
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import lombok.extern.slf4j.Slf4j;
-
-import org.jeecgframework.poi.excel.ExcelImportUtil;
-import org.jeecgframework.poi.excel.def.NormalExcelConstants;
-import org.jeecgframework.poi.excel.entity.ExportParams;
-import org.jeecgframework.poi.excel.entity.ImportParams;
-import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
-import org.jeecg.common.system.base.controller.JeecgController;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-import org.springframework.web.multipart.MultipartHttpServletRequest;
 import org.springframework.web.servlet.ModelAndView;
-import com.alibaba.fastjson.JSON;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.jeecg.common.aspect.annotation.AutoLog;
-import org.apache.shiro.authz.annotation.RequiresPermissions;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.util.Arrays;
 
  /**
  * @Description: afterwards_audit
@@ -44,7 +35,7 @@ import org.apache.shiro.authz.annotation.RequiresPermissions;
  * @Date:   2023-05-09 14:37:31
  * @Version: V1.0
  */
- @Api(value = "统计报表:事后数据报表统计", tags="medical_ins_knowledge")
+@Api(value = "统计报表:事后数据报表统计", tags="medical_ins_knowledge")
 @RestController
 @RequestMapping("/medical/afterwardsAudit")
 @Slf4j
@@ -52,6 +43,30 @@ public class AfterwardsAuditController extends JeecgController<AfterwardsAudit,
 	@Autowired
 	private IAfterwardsAuditService afterwardsAuditService;
 
+	 @ApiOperation(value="审核列表", notes="审核列表")
+	 @GetMapping(value = "/audit/list")
+	 public Result<IPage<AfterwardsAudit>> auditQueryListPage(AfterwardsAudit afterwardsAudit,
+															  @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+															  @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+															  HttpServletRequest req) {
+		 QueryWrapper<AfterwardsAudit> queryWrapper = QueryGenerator.initQueryWrapper(afterwardsAudit, req.getParameterMap());
+		 Page<AfterwardsAudit> page = new Page<>(pageNo, pageSize);
+		 IPage<AfterwardsAudit> pageList = afterwardsAuditService.auditQueryListPage(page, queryWrapper);
+		 return Result.OK(pageList);
+	 }
+
+	 @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)) {
+			 log.error("当前用户未登录");
+			 throw new JeecgBootException("用户未登录"); // "登录已过期,请重新登录"
+		 }
+		 boolean result  = afterwardsAuditService.audit(loginUserName, param);
+		 return Result.ok("提交成功");
+	 }
+
 	/**
 	 * 分页列表查询
 	 *
@@ -74,18 +89,29 @@ public class AfterwardsAuditController extends JeecgController<AfterwardsAudit,
 		return Result.OK(pageList);
 	}
 
-	 @ApiOperation(value="事后-科室统计", notes="事后-科室统计")
+	 @ApiOperation(value="事后-科室统计", notes="事后-科室统计,事后-科室稽核统计")
 	 @GetMapping(value = "/group/department")
 	 public Result<IPage<ReportAfterQueryResponseBO>> department(AfterwardsAudit afterwardsAudit,
 														 @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
 														 @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
 														 HttpServletRequest req) {
 //		 QueryWrapper<AfterwardsAudit> queryWrapper = QueryGenerator.initQueryWrapper(afterwardsAudit, req.getParameterMap());
-		 Page<AfterwardsAudit> page = new Page<AfterwardsAudit>(pageNo, pageSize);
+		 Page<AfterwardsAudit> page = new Page<>(pageNo, pageSize);
 		 IPage<ReportAfterQueryResponseBO> pageList = afterwardsAuditService.departmentStatistics(page, afterwardsAudit);
 		 return Result.OK(pageList);
 	 }
 
+	 @ApiOperation(value = "事后-科室统计-详情",notes = "事后-科室统计-详情,事后-科室稽核统计")
+	 @GetMapping(value = "/group/department/detail")
+	 public Result<IPage<?>> departmentDetail(AfterwardsAuditDetail afterwardsAuditDetail,
+											  @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+											  @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+											  HttpServletRequest req) {
+		 Page<AfterwardsAuditDetail> page = new Page<>(pageNo, pageSize);
+		 IPage<?> pageList = afterwardsAuditService.departmentDetailStatistics(page, afterwardsAuditDetail);
+		 return Result.OK(pageList);
+	 }
+
 	/**
 	 *   添加
 	 *

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

@@ -90,6 +90,9 @@ public class AfterwardsAudit implements Serializable {
 	@Excel(name = "上个审核人员", width = 15)
     @ApiModelProperty(value = "上个审核人员")
     private java.lang.String preCheckBy;
+
+    @ApiModelProperty(value = "上个审核时间")
+    private Date preAuditTime;
 	/**审核人*/
 	@Excel(name = "审核人", width = 15)
     @ApiModelProperty(value = "审核人")
@@ -98,6 +101,9 @@ public class AfterwardsAudit implements Serializable {
 	@Excel(name = "审核状态", width = 15)
     @ApiModelProperty(value = "审核状态")
     private java.lang.String checkState;
+
+    @ApiModelProperty(value = "审核时间")
+    private Date auditTime;
 	/**创建人*/
     @ApiModelProperty(value = "创建人")
     private java.lang.String createBy;
@@ -115,11 +121,25 @@ public class AfterwardsAudit implements Serializable {
     @ApiModelProperty(value = "更新时间")
     private java.util.Date updateTime;
 
+    @ApiModelProperty(value = "资料来源")
+    private String auditSource;
+
+
+
+    @TableField(exist = false)
+    private java.lang.String interfName;
+
     @TableField(exist = false)
-    private Date startTime;
+    @ApiModelProperty(value = "异常多收")
+    private BigDecimal errorRelativelyManyAmt;
+
+    @ApiModelProperty(value = "异常少收")
     @TableField(exist = false)
-    private Date endTime;
+    private BigDecimal errorRelativelyFewAmt;
 
     @TableField(exist = false)
-    private java.lang.String interfName;
+    private String startTime;
+    @TableField(exist = false)
+    private String endTime;
+
 }

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

@@ -114,6 +114,10 @@ public class AfterwardsAuditDetail implements Serializable {
 	@Excel(name = "项目名称", width = 15)
     @ApiModelProperty(value = "项目名称")
     private java.lang.String proejctName;
+
+    @Excel(name = "数量", width = 13)
+    @ApiModelProperty(value = "数量")
+    private BigDecimal quantity;
     /**项目编码*/
     @Excel(name = "医保项目编码", width = 15)
     @ApiModelProperty(value = "医保项目编码")

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

@@ -1,13 +1,16 @@
 package org.jeecg.modules.medical.mapper;
 
+import java.math.BigDecimal;
 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.ReportAfterQueryDetailResponseBO;
 import org.jeecg.modules.medical.common.bo.ReportAfterQueryResponseBO;
 import org.jeecg.modules.medical.entity.AfterwardsAudit;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.medical.entity.AfterwardsAuditDetail;
 
 /**
  * @Description: afterwards_audit
@@ -23,5 +26,18 @@ public interface AfterwardsAuditMapper extends BaseMapper<AfterwardsAudit> {
      * @param afterwardsAudit
      * @return
      */
-    IPage<ReportAfterQueryResponseBO> departmentStatistics(Page<AfterwardsAudit> page, AfterwardsAudit afterwardsAudit);
+    IPage<ReportAfterQueryResponseBO> departmentStatistics(Page<AfterwardsAudit> page, @Param("ew") AfterwardsAudit afterwardsAudit);
+
+    /**
+     * 科室: 事后统计,详情列表
+     */
+    IPage<ReportAfterQueryDetailResponseBO> departmentDetailStatistics(Page<AfterwardsAuditDetail> page,
+                                                                       @Param("ew") AfterwardsAuditDetail afterwardsAuditDetail);
+
+    /**
+     * 统计时候主表对应一条记录的违规金额
+     * @param id
+     * @return
+     */
+    BigDecimal statisticsErrAmtByAfterwareRecordId(Integer id);
 }

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

@@ -5,26 +5,135 @@
     <select id="departmentStatistics"
             resultType="org.jeecg.modules.medical.common.bo.ReportAfterQueryResponseBO">
         SELECT
-            any_value ( m.medical_dept_code ),
-            any_value ( m.medical_dept_name ) ,
-            (
+            (SELECT @rowNum := @rowNum + 1 AS rowNum ) as orderNum,
+            t.*
+        From
+            ( SELECT @rowNum := 0 ) r,
+            (SELECT
+                any_value ( m.medical_dept_code ) as medical_dept_code,
+                any_value ( m.medical_dept_name ) as medical_dept_name,
+                (
+                    SELECT count(*) FROM sys_user_depart WHERE dep_id = (
+                    SELECT id FROM sys_depart WHERE medical_dept_code = m.medical_dept_code)
+                ) as medical_dept_doctor_total,
+                (
+                    SELECT count(*) FROM afterwards_audit_detail WHERE medical_dept_code = m.medical_dept_code GROUP BY doctor_id
+                ) as violation_doctor_total,
+                (
                 SELECT count(*) FROM afterwards_audit_detail WHERE medical_dept_code = m.medical_dept_code GROUP BY doctor_id
-            ) as 违规医生总数,
-            (
-                SELECT count(*) FROM afterwards_audit_detail WHERE medical_dept_code = m.medical_dept_code GROUP BY doctor_id
-            ) as 违规总数,
-            (
-                SELECT sum(amount) FROM afterwards_audit_detail WHERE 	medical_dept_code = m.medical_dept_code AND treatment_type = 'outpatient'
-            ) as 门诊异常金额,
-            (
-                SELECT sum(amount) FROM afterwards_audit_detail WHERE 	medical_dept_code = m.medical_dept_code AND treatment_type = 'hosp'
-            ) as 住院异常金额,
-            (
-                SELECT sum(amount) FROM afterwards_audit_detail WHERE 	medical_dept_code = m.medical_dept_code
-            ) as 异常金额合计
-        FROM
-            afterwards_audit as m
-        GROUP BY
-            medical_dept_code
+                ) as violation_total,
+                ifnull((
+                    SELECT sum(amount) FROM afterwards_audit_detail WHERE 	medical_dept_code = m.medical_dept_code AND treatment_type = '2'
+                ), 0) as outpatient_error_amt,
+                ifnull((
+                    SELECT sum(amount) FROM afterwards_audit_detail WHERE 	medical_dept_code = m.medical_dept_code AND treatment_type = '1'
+                ), 0) as hosp_error_amt,
+                ifnull((
+                    SELECT sum(amount) FROM afterwards_audit_detail WHERE 	medical_dept_code = m.medical_dept_code
+                ), 0) as error_amt_total
+            FROM
+                afterwards_audit as m
+                <if test="ew.medicalDeptName != null and ew.medicalDeptName != ''">
+                    WHERE medical_dept_name like concat(concat('%',#{ew.medicalDeptName}),'%')
+                </if>
+                <if test="ew.startTime != null and ew.startTime != ''">
+                    <![CDATA[ create_time >= #{ew.startTime,jdbcType=VARCHAR} ]]>
+                </if>
+                <if test="ew.endTime != null and ew.endTime != ''">
+                    <![CDATA[ create_time <= #{ew.endTime,jdbcType=VARCHAR} ]]>
+                </if>
+                GROUP BY medical_dept_code
+            ) as t
+        ORDER BY t.error_amt_total DESC
+    </select>
+
+    <select id="departmentDetailStatistics"
+            resultType="org.jeecg.modules.medical.common.bo.ReportAfterQueryDetailResponseBO">
+        SELECT
+            (tdetail.amount - (tdetail.quantity * tdetail.price)) as errorTotalAmt,
+            tdetail.*
+        from (
+             SELECT
+                 t.medical_dept_name,
+                 t.doctor_id,
+                 t.doctor_name,
+                 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, -- 数量
+                 t.amount,
+                 t.treatment_type, -- "就诊类型"
+                 t.medical_project_code, -- "项目编码"
+                 t.medical_project_name, -- "项目名称"
+                 t.patient_id, -- "参保人员编码"
+                 t.medical_ins_rule_info_code, -- as "违反规则编码"
+                 t.medical_ins_rule_info_name, -- as "违反规则名称"
+                 t.violation_level, --  as "违规等级"
+                 t.patient_name, -- as "患者姓名|参保人姓名"
+                 "is_medical_insurance" medicalInsurance, -- "是否医保"
+                 t.create_time, -- "创建时间|提醒时间"
+                 "主表带出" as "医生处理意见"
+             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>
+                AND t.medical_dept_code = #{ew.medicalDeptCode,jdbcType=VARCHAR}
+                AND t.afterwards_audit_id = #{ew.afterwardsAuditId,jdbcType=VARCHAR}
+                <!-- UI字段筛选 Start -->
+                <if test="ew.medicalProjectCode != null and ew.medicalProjectCode != ''">
+                    AND (
+                    t.medical_project_code like concat(concat('%',#{ew.medicalProjectCode}),'%')
+                        or
+                    t.medical_project_name like concat(concat('%',#{ew.medicalProjectCode}),'%')
+                    )
+                </if>
+                <if test="ew.treatmentType != null and ew.treatmentType != ''">
+                    AND t.treatment_type = #{ew.treatmentType,jdbcType=VARCHAR}
+                </if>
+                <if test="ew.medicalInsRuleInfoCode != null and ew.medicalInsRuleInfoCode != ''">
+                    AND t.medical_ins_rule_info_code = #{ew.medicalInsRuleInfoCode,jdbcType=VARCHAR}
+                </if>
+                <if test="ew.medicalInsRuleInfoName != null and ew.medicalInsRuleInfoName != ''">
+                    AND t.medical_ins_rule_info_name = #{ew.medicalInsRuleInfoName,jdbcType=VARCHAR}
+                </if>
+                <if test="ew.violationLevel != null and violationLevel != ''">
+                    AND t.violation_level = #{ew.violationLevel,jdbcType=INTEGER}
+                </if>
+             </where>
+        ) as tdetail
+    </select>
+    <select id="statisticsErrAmtByAfterwareRecordId" resultType="java.math.BigDecimal">
+        SELECT
+            sum( (tdetail.amount - (tdetail.quantity * tdetail.price))) as "异常金额"
+        from (
+             SELECT
+                 t.medical_dept_name,
+                 t.doctor_id,
+                 t.doctor_name,
+                 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, -- 数量
+                 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'
+             WHERE t.afterwards_audit_id = #{id,jdbcType=INTEGER}) as tdetail
     </select>
 </mapper>

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

@@ -79,7 +79,7 @@ public class FactorEnchangeFactory {
 
     public static Map<Integer, List<FactorCondRela>> factorCondRelaMap = new HashMap<>();
 
-    @PostConstruct
+//    @PostConstruct
     public void init() {
         List<EventAttr> eventAttrList = eventAttrService.lambdaQuery().eq(EventAttr::getDelFlag, CommonConstant.DEL_FLAG_0).list();
         enchanceAttrMap = eventAttrList.stream().collect(Collectors.toMap(EventAttr::getId, v -> v, (v1, v2) -> v1));

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

@@ -1,10 +1,14 @@
 package org.jeecg.modules.medical.service;
 
+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.ReportAfterQueryResponseBO;
 import org.jeecg.modules.medical.entity.AfterwardsAudit;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.medical.entity.AfterwardsAuditDetail;
 
 /**
  * @Description: afterwards_audit
@@ -15,4 +19,22 @@ import com.baomidou.mybatisplus.extension.service.IService;
 public interface IAfterwardsAuditService extends IService<AfterwardsAudit> {
 
     IPage<ReportAfterQueryResponseBO> departmentStatistics(Page<AfterwardsAudit> page, AfterwardsAudit afterwardsAudit);
+
+    /**
+     * 查看科室对应违规记录的列表信息
+     * @param page
+     * @param afterwardsAuditDetail
+     * @return
+     */
+    IPage<?> departmentDetailStatistics(Page<AfterwardsAuditDetail> page, AfterwardsAuditDetail afterwardsAuditDetail);
+
+    /**
+     * 获取审核列表
+     * @param page
+     * @param queryWrapper
+     * @return
+     */
+    IPage<AfterwardsAudit> auditQueryListPage(Page<AfterwardsAudit> page, QueryWrapper<AfterwardsAudit> queryWrapper);
+
+    boolean audit(String loginUserName, AuditRequestBO param);
 }

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

@@ -1,14 +1,34 @@
 package org.jeecg.modules.medical.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+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.AuditRequestBO;
+import org.jeecg.modules.medical.common.bo.ReportAfterQueryDetailResponseBO;
 import org.jeecg.modules.medical.common.bo.ReportAfterQueryResponseBO;
 import org.jeecg.modules.medical.entity.AfterwardsAudit;
+import org.jeecg.modules.medical.entity.AfterwardsAuditDetail;
 import org.jeecg.modules.medical.mapper.AfterwardsAuditMapper;
 import org.jeecg.modules.medical.service.IAfterwardsAuditService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 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 java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @Description: afterwards_audit
@@ -16,11 +36,113 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  * @Date:   2023-05-09 14:37:31
  * @Version: V1.0
  */
+@Slf4j
 @Service
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
 public class AfterwardsAuditServiceImpl extends ServiceImpl<AfterwardsAuditMapper, AfterwardsAudit> implements IAfterwardsAuditService {
 
+
     @Override
     public IPage<ReportAfterQueryResponseBO> departmentStatistics(Page<AfterwardsAudit> page, AfterwardsAudit afterwardsAudit) {
         return baseMapper.departmentStatistics(page, afterwardsAudit);
     }
+
+    @Override
+    public IPage<?> departmentDetailStatistics(Page<AfterwardsAuditDetail> page, AfterwardsAuditDetail afterwardsAuditDetail) {
+        // 1.根据 主表id 和科室编码,获取到科室违规明细的主要信息
+        AfterwardsAudit main = this.getById(afterwardsAuditDetail.getId());
+        if (null == main) {
+            log .error("根据事后统计主表id={},查询不到数据", afterwardsAuditDetail.getId());
+            throw new JeecgBootException("找不到事后数据统计报表数据");
+        }
+        String feedbackResult = main.getFeedbackResult();
+        String feedbackCode = main.getFeedbackCode();
+        IPage<ReportAfterQueryDetailResponseBO> result = baseMapper.departmentDetailStatistics(page, afterwardsAuditDetail);
+        List<ReportAfterQueryDetailResponseBO> records = result.getRecords();
+        if (!CollectionUtils.isEmpty(records)) {
+            records = records.stream().map(item -> {
+                item.setFeedbackCode(feedbackCode);
+                item.setFeedbackResult(feedbackResult);
+                return item;
+            }).collect(Collectors.toList());
+        }
+        result.setRecords(records);
+        return result;
+    }
+
+    @Override
+    public IPage<AfterwardsAudit> auditQueryListPage(Page<AfterwardsAudit> page, QueryWrapper<AfterwardsAudit> queryWrapper) {
+        Page<AfterwardsAudit> auditQueryPageList = this.page(page, queryWrapper);
+        if (!CollectionUtils.isEmpty(auditQueryPageList.getRecords())) {
+            List<AfterwardsAudit> records = auditQueryPageList.getRecords();
+            records = records.stream().map(item -> {
+                // 计算异常多收-少收
+                BigDecimal detailTotalAmt = baseMapper.statisticsErrAmtByAfterwareRecordId(item.getId());
+                if (null != detailTotalAmt) {
+                    if (detailTotalAmt.compareTo(BigDecimal.ZERO) > 0) { // 异常金额大于0,就是多收
+                        item.setErrorRelativelyManyAmt(detailTotalAmt);
+                    } else if (detailTotalAmt.compareTo(BigDecimal.ZERO) < 0) {
+                        item.setErrorRelativelyFewAmt(detailTotalAmt);
+                    }
+                }
+                return item;
+            }).collect(Collectors.toList());
+            auditQueryPageList.setRecords(records);
+        }
+        return auditQueryPageList;
+    }
+
+    @Transactional(readOnly = false)
+    @Override
+    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());
+        }
+
+        // 检查当前状态
+        if (!ObjectUtils.nullSafeEquals("wait", a.getCheckState()) && !ObjectUtils.nullSafeEquals("reAudit", a.getCheckState())) {
+            log.error("必须为待审核或医生符合后的重新审核状态才可以发起审核,当前数据状态为{}", a.getCheckState());
+            throw new JeecgBootException("当前状态不可发起审核,请检查");
+        }
+
+        Date nowTime = new Date();
+
+        switch (param.getCheckState()) {
+            case "pass": //系统问题,过了
+            case "violation":
+                a.setCheckState(param.getCheckState());
+                a.setCheckBy(loginUserName);// 审核人
+
+                a.setAuditTime(nowTime);
+                a.setUpdateTime(nowTime);
+                a.setUpdateBy(loginUserName);
+                break;
+            case "issue_review": //下发审核
+                a.setCheckState(param.getCheckState()); // 下发审核
+                a.setPreCheckBy(loginUserName);
+                a.setPreAuditTime(nowTime); //审核人员
+
+                a.setStartTime("科室处理");// TODO 定一下这个枚举
+                a.setCheckBy(a.getDoctorId());// 分配给符合人
+//                a.setAuditTime(nowTime);
+                a.setUpdateTime(nowTime);
+                a.setUpdateBy(loginUserName);
+                break;
+            default:
+                log.error("不支持的审核状态={}", param.getCheckState());
+                break;
+        }
+        this.saveOrUpdate(a);
+        return true;
+    }
 }