Просмотр исходного кода

益寿缘总后台-开方时长-增加开方数量(同一处方编号算一张)、拒方率、组别筛选与展示

cgp 6 дней назад
Родитель
Сommit
b32546d956

+ 18 - 3
fs-service/src/main/java/com/fs/his/param/PrescribeStatParam.java

@@ -16,6 +16,24 @@ public class PrescribeStatParam {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date endOperateTime;
 
+    //医生组别
+    private String groupCode;
+
+    //拒方率筛选范围
+    // 最小拒方率 (0.0 - 1.0)
+    private Double minRejectRate;
+
+    // 最大拒方率 (0.0 - 1.0)
+    private Double maxRejectRate;
+
+    // --- 新增的月度查询字段 ---
+    private Integer queryYear;
+
+    private Integer queryMonth;
+
+    // 新增:指定排序字段 (例如: avgOperateSecond, prescribeNum, operation, rejectRate)
+    private String orderByColumn = "avgOperateSecond"; // 默认按平均操作时长排序
+
     // 科室id
     private Long deptId;
 
@@ -28,7 +46,4 @@ public class PrescribeStatParam {
     private int pageNum=1;
 
     private int pageSize=10;
-
-    //医生组别
-    private String groupCode;;
 }

+ 24 - 0
fs-service/src/main/java/com/fs/his/vo/DoctorOperateStatVO.java

@@ -5,22 +5,46 @@ import lombok.Data;
 import java.math.BigDecimal;
 @Data
 public class DoctorOperateStatVO {
+
+    //处方ID
+    private Long prescribeId;
+
+    //开方数量(同一处方编号算一张)
+    private Long prescribeNum;
+
     //医生id
     private Long doctorId;
+
     //医生名称
     private String doctorName;
+
     //操作次数
     private Long operation;
+
     //部门id
     private Long deptId;
+
     //医院id
     private Long hospitalId;
+
     //平均操作时长
     private BigDecimal avgOperateSecond;
+
     //科室名称
     private String deptName;
+
+    //开方开始时间
+    private String startOperateTime;
+
+    //开方结束时间
+    private String endOperateTime;
+
     //医院名称
     private String hospitalName;
+
     //医生组别
     private String groupCode;
+
+    //拒方率 (被拒绝的处方占总处方的比例)
+    private BigDecimal rejectRate;
 }

+ 33 - 6
fs-service/src/main/resources/mapper/his/FsPrescribeMapper.xml

@@ -339,8 +339,14 @@
         fd.dept_id,
         fd.hospital_id,
         fd.group_code,
+        -- 平均操作时长
         AVG(fp.operate_second) AS avgOperateSecond,
+        -- 操作次数 (等于总处方数)
         COUNT(*) as operation,
+        -- 开方数量
+        COUNT(DISTINCT fp.prescribe_code) as prescribeNum,
+        -- 拒方率计算
+        ROUND(COUNT(CASE WHEN fp.status = 2 THEN 1 END) * 1.0 / COUNT(*), 4) AS rejectRate,
         de.dept_name,
         ho.hospital_name
         FROM fs_prescribe fp
@@ -363,11 +369,19 @@
         <if test="hospitalId != null and hospitalId != ''">
             AND ho.hospital_id = #{hospitalId}
         </if>
-        <if test="startOperateTime != null">
-             AND fp.start_operate_time &gt;= #{startOperateTime}
+        <!-- 日期范围筛选  -->
+        <if test="!(queryYear != null and queryMonth != null) and startOperateTime != null">
+            AND fp.start_operate_time &gt;= #{startOperateTime}
         </if>
-        <if test="endOperateTime != null">
-             AND fp.end_operate_time &lt;= #{endOperateTime}
+        <if test="!(queryYear != null and queryMonth != null) and endOperateTime != null">
+            AND fp.end_operate_time &lt;= #{endOperateTime}
+        </if>
+        <!-- 新增:月度筛选条件 -->
+        <if test="queryYear != null">
+            AND YEAR(fp.start_operate_time) = #{queryYear}
+        </if>
+        <if test="queryMonth != null">
+            AND MONTH(fp.start_operate_time) = #{queryMonth}
         </if>
 
         GROUP BY
@@ -375,9 +389,22 @@
         fd.doctor_name,
         fd.dept_id,
         fd.hospital_id
-
+        <if test="minRejectRate != null or maxRejectRate != null">
+            HAVING 1=1
+        </if>
+        <if test="minRejectRate != null">
+            AND ROUND(COUNT(CASE WHEN fp.status = 2 THEN 1 END) * 1.0 / COUNT(*), 4) &gt;= #{minRejectRate}
+        </if>
+        <if test="maxRejectRate != null">
+            AND ROUND(COUNT(CASE WHEN fp.status = 2 THEN 1 END) * 1.0 / COUNT(*), 4) &lt;= #{maxRejectRate}
+        </if>
         ORDER BY
-        avgOperateSecond
+        <choose>
+            <when test="orderByColumn == 'prescribeNum' or orderByColumn == 'operation'">prescribeNum</when>
+            <when test="orderByColumn == 'rejectRate'">rejectRate</when>
+            <!-- 默认排序字段 -->
+            <otherwise>avgOperateSecond</otherwise>
+        </choose>
         <choose>
             <when test="sort != null and sort == 'desc'">DESC</when>
             <otherwise>ASC</otherwise>