陈昶聿
2 天以前 7303db54c1a2b672e4623cd022939b56882685ca
smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml
@@ -490,7 +490,8 @@
        </where>
    </select>
    <select id="selectTimelyRate" parameterType="com.smartor.domain.ServiceSubtask" resultType="double">
    <!-- 原有查询,性能差 -->
    <select id="selectTimelyRateOld" parameterType="com.smartor.domain.ServiceSubtask" resultType="double">
        SELECT sum( a.finished )/ sum( 1 ) FROM
        (SELECT id, visit_time, finishtime,
        (CASE WHEN ( DATE_FORMAT( visit_time, '%y%m%d' )&lt; DATE_FORMAT( IF ( ISNULL( finishtime ), NOW(), finishtime
@@ -517,6 +518,35 @@
        <if test="managementDoctorCode != null">and management_doctor_code = #{managementDoctorCode}</if>
        <if test="managementDoctor != null">and management_doctor like concat('%',#{managementDoctor}, '%')</if>
        ) a
    </select>
    <!-- 优化后的及时率查询:直接在 WHERE 中计算,避免子查询 -->
    <select id="selectTimelyRate" parameterType="com.smartor.domain.ServiceSubtask" resultType="double">
        SELECT
            SUM(CASE WHEN DATE(visit_time) &lt; DATE(COALESCE(finishtime, NOW())) THEN 1 ELSE 0 END) / COUNT(*)
        FROM service_subtask
        WHERE del_flag=0
        <if test="starttime == null and endtime==null">
            AND visit_time &lt; NOW()
        </if>
        <if test="starttime != null and endtime!=null">
            <!-- 优化:使用日期范围查询替代 date_format -->
            AND visit_time >= #{starttime}
            AND visit_time &lt; DATE_ADD(#{endtime}, INTERVAL 1 DAY)
        </if>
        <if test="orgid != null  and orgid != ''">AND orgid = #{orgid}</if>
        <if test="deptcode != null  and deptcode != ''">AND deptcode = #{deptcode}</if>
        <if test="drcode != null  and drcode != ''">AND drcode = #{drcode}</if>
        <if test="deptname != null  and deptname != ''">AND deptname = #{deptname}</if>
        <if test="isabnormal != null">AND isabnormal = #{isabnormal}</if>
        <if test="leavehospitaldistrictcode != null  and leavehospitaldistrictcode != ''">
            AND leavehospitaldistrictcode = #{leavehospitaldistrictcode}
        </if>
        <if test="leavehospitaldistrictname != null  and leavehospitaldistrictname != ''">
            AND leavehospitaldistrictname = #{leavehospitaldistrictname}
        </if>
        <if test="managementDoctorCode != null">AND management_doctor_code = #{managementDoctorCode}</if>
        <if test="managementDoctor != null">AND management_doctor LIKE CONCAT('%',#{managementDoctor}, '%')</if>
    </select>
    <select id="selectTimelyRateDetail" parameterType="com.smartor.domain.ServiceSubtask"
@@ -1134,7 +1164,8 @@
        where patid = #{patid} and taskid = #{taskid}
    </update>
    <select id="getSfStatistics" parameterType="com.smartor.domain.ServiceSubtaskCountReq"
    <select id="getSfStatisticsOld" parameterType="com.smartor.domain.ServiceSubtaskCountReq"
            resultMap="ServiceSubtaskResult">
        <include refid="selectServiceSubtaskVo"/>
        <where>
@@ -1165,8 +1196,69 @@
                AND date_format(visit_time,'%y%m%d') &lt;= date_format(#{endTime},'%y%m%d')
            </if>
            <if test="visitDeptCode != null">and visit_dept_code = #{visitDeptCode}</if>
            <if test="visitDeptName != null">abd visit_dept_name = #{visitDeptName}</if>
            <if test="isabnormal != null">abd isabnormal = #{isabnormal}</if>
            <if test="visitDeptName != null">and visit_dept_name = #{visitDeptName}</if>
            <if test="isabnormal != null">and isabnormal = #{isabnormal}</if>
        </where>
    </select>
    <!-- 优化后的查询:减少返回字段,优化日期查询,避免 date_format -->
    <select id="getSfStatistics" parameterType="com.smartor.domain.ServiceSubtaskCountReq"
            resultMap="ServiceSubtaskResult">
        SELECT
            id,
            sendname,
            phone,
            age,
            sendstate,
            deptcode,
            deptname,
            drcode,
            drname,
            leavehospitaldistrictcode,
            leavehospitaldistrictname,
            leavediagname,
            visit_count,
            preachform,
            excep,
            finishtime,
            visit_time,
            orgid,
            patid,
            taskid,
            task_situation,
            current_preachform
        FROM service_subtask
        <where>
            del_flag=0
            <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
                AND leavehospitaldistrictcode IN
                <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator=","
                         close=")">
                    #{leavehospitaldistrictcode}
                </foreach>
            </if>
            <if test="deptcodes != null and deptcodes.size() > 0">
                AND deptcode IN
                <foreach collection="deptcodes" item="deptcode" open="(" separator=","
                         close=")">
                    #{deptcode}
                </foreach>
            </if>
            <if test="serviceType != null and serviceType.size() > 0">
                AND service_type IN
                <foreach collection="serviceType" item="serviceType" open="(" separator=","
                         close=")">
                    #{serviceType}
                </foreach>
            </if>
            <!-- 优化:使用日期范围查询替代 date_format,可以使用索引 -->
            <if test="startTime != null and endTime!=null">
                AND visit_time >= #{startTime}
                AND visit_time &lt; DATE_ADD(#{endTime}, INTERVAL 1 DAY)
            </if>
            <if test="visitDeptCode != null">and visit_dept_code = #{visitDeptCode}</if>
            <if test="visitDeptName != null">and visit_dept_name = #{visitDeptName}</if>
            <if test="isabnormal != null">and isabnormal = #{isabnormal}</if>
        </where>
    </select>