陈昶聿
6 天以前 e36f70174333c6fd405dd3bbe0e516f8330d2cb5
smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml
@@ -100,6 +100,27 @@
    </resultMap>
    <resultMap type="com.smartor.domain.ServiceSubtaskCategoryCount" id="ServiceSubtaskCategoryCountResult">
        <result property="month" column="month"/>
        <result property="serviceType" column="service_type"/>
        <result property="subTaskId" column="subTaskId"/>
        <result property="completedCount" column="completed_count"/>
        <result property="allCount" column="all_count"/>
        <result property="completedPercent" column="completed_percent"/>
        <result property="name" column="name"/>
    </resultMap>
    <resultMap type="com.smartor.domain.ServiceSubtaskScriptCount" id="ServiceSubtaskScriptCountResult">
        <result property="scriptid" column="scriptid"/>
        <result property="scriptContent" column="script_content"/>
        <result property="completedQuantity" column="completed_quantity"/>
        <result property="allQuantity" column="all_quantity"/>
        <result property="completedPercentage" column="completed_percentage"/>
        <result property="optionText" column="option_text"/>
        <result property="chosenQuantity" column="chosen_quantity"/>
        <result property="chosenPercentage" column="chosen_percentage"/>
    </resultMap>
    <sql id="selectServiceSubtaskVo">
        select id,
               hosp_type,
@@ -369,7 +390,7 @@
            <if test="taskGuid != null">and task_guid = #{taskGuid}</if>
            <if test="isabnormal != null">and isabnormal = #{isabnormal}</if>
            <if test="isVisitAgain != null">and is_visit_again = #{isVisitAgain}</if>
            <if test="dateLimit != null and dateLimit = '1'"> and CURDATE() + 1 > long_send_time</if>
<!--            <if test="dateLimit != null and dateLimit = '1'"> and CURDATE() + 1 > long_send_time</if>-->
            <!-- <if test="visitTime != null">and visit_time = #{visitTime}</if> -->
            <!--<if test="visitDeptCode != null">and visit_dept_code = #{visitDeptCode}</if>
            <if test="visitDeptName != null">and visit_dept_name = #{visitDeptName}</if>-->
@@ -1285,6 +1306,177 @@
        )a1
    </select>
    <select id="getSfStatisticsCategory" parameterType="com.smartor.domain.ServiceSubtaskCountReq"
            resultMap="ServiceSubtaskResult2">
        SELECT a.sub_id as subTaskId,
        <if test="configValue != null and configValue != ''">
            SUM(CASE WHEN a.categoryid IN(${configValue})
            THEN 1 ELSE 0 END) AS joyAllCount,
        </if>
        COUNT(sub_id) joyCount
        FROM service_subtask_detail a
        INNER JOIN service_subtask t ON a.sub_id = t.id
        <where>
            a.del_flag=0
            AND t.del_flag=0
            <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
                AND t.leavehospitaldistrictcode IN
                <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator=","
                         close=")">
                    #{leavehospitaldistrictcode}
                </foreach>
            </if>
            <if test="deptcodes != null and deptcodes.size() > 0">
                AND t.deptcode IN
                <foreach collection="deptcodes" item="deptcode" open="(" separator=","
                         close=")">
                    #{deptcode}
                </foreach>
            </if>
            <if test="serviceType != null and serviceType.size() > 0">
                AND t.service_type IN
                <foreach collection="serviceType" item="serviceType" open="(" separator=","
                         close=")">
                    #{serviceType}
                </foreach>
            </if>
            <if test="startTime != null and endTime!=null">
                AND date_format(t.visit_time,'%y%m%d') >= date_format(#{startTime},'%y%m%d')
                AND date_format(t.visit_time,'%y%m%d') &lt;= date_format(#{endTime},'%y%m%d')
            </if>
            <if test="visitDeptCode != null">
                and t.visit_dept_code = #{visitDeptCode}
            </if>
            <if test="visitDeptName != null">
                and t.visit_dept_name = #{visitDeptName}
            </if>
            <if test="isabnormal != null">
                and t.isabnormal = #{isabnormal}
            </if>
            <!-- 目前只统计语音和问卷 -->
            <if test="type != null">
                and t.type = #{type}
            </if>
        </where>
        GROUP BY a.sub_id
    </select>
    <select id="getSfStatisticsScriptDetails" parameterType="com.smartor.domain.ServiceSubtaskCountReq"
            resultMap="ServiceSubtaskScriptCountResult">
        SELECT
        a.id as scriptid,
        a.script_content,
        b.completed_quantity,
        b.all_quantity,
        ROUND(b.completed_quantity/b.all_quantity,2) as completed_percentage
        FROM
        <if test="type == 1">
            ivr_task_template_script a
        </if>
        <if test="type == 2">
            svy_task_template_script a
        </if>
        INNER JOIN(
        SELECT
        ssd.scriptid AS scriptid,
        SUM(CASE WHEN IFNULL(ssd.matchedtext,ssd.asrtext) IS NOT NULL
        AND IFNULL(ssd.matchedtext,ssd.asrtext) != '' THEN 1
        ELSE 0 END) AS completed_quantity,
        COUNT(*) AS all_quantity
        FROM
        service_subtask_detail ssd
        INNER JOIN service_subtask ss ON ssd.sub_id = ss.id
        WHERE
        ss.del_flag=0
        AND ssd.del_flag = 0
        <if test="orgid != null and orgid != ''">
            AND ss.orgid = #{orgid}
        </if>
        <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
            AND ss.leavehospitaldistrictcode IN
            <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator=","
                     close=")">
                #{leavehospitaldistrictcode}
            </foreach>
        </if>
        <if test="deptcodes != null and deptcodes.size() > 0">
            AND ss.deptcode IN
            <foreach collection="deptcodes" item="deptcode" open="(" separator=","
                     close=")">
                #{deptcode}
            </foreach>
        </if>
        <if test="serviceType != null and serviceType.size() > 0">
            AND ss.service_type IN
            <foreach collection="serviceType" item="serviceType" open="(" separator=","
                     close=")">
                #{serviceType}
            </foreach>
        </if>
        <if test="startTime != null and endTime!=null">
            AND date_format(ss.visit_time,'%y%m%d') >= date_format(#{startTime},'%y%m%d')
            AND date_format(ss.visit_time,'%y%m%d') &lt;= date_format(#{endTime},'%y%m%d')
        </if>
        <!-- 目前只统计语音和问卷 -->
        <if test="type != null">
            and ss.type = #{type}
        </if>
        <if test="configValue != null and configValue != ''">
            AND ssd.categoryid IN (${configValue})
        </if>
        group by ssd.scriptid) b
        ON a.id = b.scriptid
    </select>
    <select id="getSfStatisticsScriptItemDetails" parameterType="com.smartor.domain.ServiceSubtaskCountReq"
            resultMap="ServiceSubtaskScriptCountResult">
        SELECT
        ssd.scriptid,
        IFNULL(ssd.matchedtext,ssd.asrtext) AS option_text,
        COUNT(*) AS chosen_quantity
        FROM
        service_subtask_detail ssd
        INNER JOIN service_subtask ss ON ssd.sub_id = ss.id
        <where>
            ss.del_flag=0
            AND IFNULL(ssd.matchedtext,ssd.asrtext) IS NOT NULL
            AND IFNULL(ssd.matchedtext,ssd.asrtext) != ''
            <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
                AND ss.leavehospitaldistrictcode IN
                <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator=","
                         close=")">
                    #{leavehospitaldistrictcode}
                </foreach>
            </if>
            <if test="deptcodes != null and deptcodes.size() > 0">
                AND ss.deptcode IN
                <foreach collection="deptcodes" item="deptcode" open="(" separator=","
                         close=")">
                    #{deptcode}
                </foreach>
            </if>
            <if test="serviceType != null and serviceType.size() > 0">
                AND ss.service_type IN
                <foreach collection="serviceType" item="serviceType" open="(" separator=","
                         close=")">
                    #{serviceType}
                </foreach>
            </if>
            <if test="startTime != null and endTime!=null">
                AND date_format(ss.visit_time,'%y%m%d') >= date_format(#{startTime},'%y%m%d')
                AND date_format(ss.visit_time,'%y%m%d') &lt;= date_format(#{endTime},'%y%m%d')
            </if>
            <!-- 目前只统计语音和问卷 -->
            <if test="type != null">
                and ss.type = #{type}
            </if>
            <if test="configValue != null and configValue != ''">
                AND ssd.categoryid IN (${configValue})
            </if>
        </where>
        group by ssd.scriptid, IFNULL(ssd.matchedtext,ssd.asrtext)
    </select>
    <select id="getDataByTime" resultMap="ServiceSubtaskResult">
        select id,
@@ -1627,4 +1819,176 @@
        ORDER BY timePeriod DESC
    </select>
    <!-- 优化的统计查询:直接在数据库层完成聚合计算 -->
    <select id="countByCondition" parameterType="com.smartor.domain.ServiceSubtaskVO" resultType="map">
        SELECT
            SUM(CASE WHEN sendstate = 4 THEN 1 ELSE 0 END) AS wzx,
            SUM(CASE WHEN sendstate != 4 AND sendstate != 2 THEN 1 ELSE 0 END) AS ysf,
            SUM(CASE WHEN sendstate = 5 THEN 1 ELSE 0 END) AS fssb,
            SUM(CASE WHEN sendstate >= 3 OR sendstate = 1 THEN 1 ELSE 0 END) AS yfs,
            SUM(CASE WHEN sendstate = 2 THEN 1 ELSE 0 END) AS dsf,
            SUM(CASE WHEN sendstate = 1 THEN 1 ELSE 0 END) AS blq,
            SUM(CASE WHEN excep IS NOT NULL AND excep != '0' THEN 1 ELSE 0 END) AS yc
        FROM service_subtask
        <where>
            del_flag = 0
            <if test="sendname != null and sendname != ''">
                AND sendname LIKE CONCAT('%', #{sendname}, '%')
            </if>
            <if test="phone != null and phone != ''">
                AND phone = #{phone}
            </if>
            <if test="deptOrDistrict==1">
                <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
                    AND leavehospitaldistrictcode IN
                    <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="("
                             separator=","
                             close=")">
                        #{leavehospitaldistrictcode}
                    </foreach>
                </if>
                <if test=" leaveldeptcodes != null and leaveldeptcodes.size()>0">
                    AND deptcode IN
                    <foreach collection="leaveldeptcodes" item="leaveldeptcode" open="(" separator=","
                             close=")">
                        #{leaveldeptcode}
                    </foreach>
                </if>
            </if>
            <if test="deptOrDistrict==2">
                <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
                    AND (leavehospitaldistrictcode IN
                    <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="("
                             separator=","
                             close=")">
                        #{leavehospitaldistrictcode}
                    </foreach>
                </if>
                <if test=" leaveldeptcodes != null and leaveldeptcodes.size()>0">
                    OR deptcode IN
                    <foreach collection="leaveldeptcodes" item="leaveldeptcode" open="(" separator=","
                             close="))">
                        #{leaveldeptcode}
                    </foreach>
                </if>
            </if>
            <if test="leavehospitaldistrictname != null and leavehospitaldistrictname != ''">
                AND leavehospitaldistrictname = #{leavehospitaldistrictname}
            </if>
            <if test="leavediagname != null and leavediagname != ''">
                AND leavediagname LIKE CONCAT('%', #{leavediagname}, '%')
            </if>
            <if test="managementDoctor != null and managementDoctor != ''">
                AND management_doctor LIKE CONCAT('%', #{managementDoctor}, '%')
            </if>
            <if test="sex != null and sex != ''">
                AND sex = #{sex}
            </if>
            <if test="age != null">
                AND age = #{age}
            </if>
            <if test="patguid != null">
                AND patguid = #{patguid}
            </if>
            <if test="subId != null">
                AND id = #{subId}
            </if>
            <if test="inhospid != null">
                AND inhospid = #{inhospid}
            </if>
            <if test="managementDoctorCode != null">
                AND management_doctor_code = #{managementDoctorCode}
            </if>
            <if test="submit != null">
                AND submit = #{submit}
            </if>
            <if test="upid != null">
                AND upid = #{upid}
            </if>
            <if test="patfrom != null">
                AND patfrom = #{patfrom}
            </if>
            <if test="serviceType != null">
                AND service_type = #{serviceType}
            </if>
            <if test="patid != null">
                AND patid = #{patid}
            </if>
            <if test="sfzh != null and sfzh != ''">
                AND sfzh = #{sfzh}
            </if>
            <if test="addr != null and addr != ''">
                AND addr = #{addr}
            </if>
            <if test="senderdetail != null and senderdetail != ''">
                AND senderdetail = #{senderdetail}
            </if>
            <if test="type != null and type != ''">
                AND type = #{type}
            </if>
            <if test="taskid != null">
                AND taskid = #{taskid}
            </if>
            <if test="templateid != null and templateid != ''">
                AND templateid = #{templateid}
            </if>
            <if test="templatename != null and templatename != ''">
                AND templatename LIKE CONCAT('%', #{templatename}, '%')
            </if>
            <if test="startOutHospTime != null">
                AND DATE_FORMAT(endtime,'%y%m%d') &gt;= DATE_FORMAT(#{startOutHospTime},'%y%m%d')
            </if>
            <if test="endOutHospTime != null">
                AND DATE_FORMAT(endtime,'%y%m%d') &lt;= DATE_FORMAT(#{endOutHospTime},'%y%m%d')
            </if>
            <if test="startSendDateTime != null">
                AND DATE_FORMAT(long_send_time,'%y%m%d') &gt;= DATE_FORMAT(#{startSendDateTime},'%y%m%d')
            </if>
            <if test="endSendDateTime != null">
                AND DATE_FORMAT(long_send_time,'%y%m%d') &lt;= DATE_FORMAT(#{endSendDateTime},'%y%m%d')
            </if>
            <if test="longSendTime != null">
                AND DATE_FORMAT(long_send_time,'%y%m%d') &lt;= DATE_FORMAT(#{longSendTime},'%y%m%d')
            </if>
            <if test="deptOrDistrict == 1">
                <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
                    AND leavehospitaldistrictcode IN
                    <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator="," close=")">
                        #{leavehospitaldistrictcode}
                    </foreach>
                </if>
                <if test="leaveldeptcodes != null and leaveldeptcodes.size() > 0">
                    AND deptcode IN
                    <foreach collection="leaveldeptcodes" item="leaveldeptcode" open="(" separator="," close=")">
                        #{leaveldeptcode}
                    </foreach>
                </if>
            </if>
            <if test="deptcode != null and deptcode != ''">
                AND deptcode = #{deptcode}
            </if>
            <if test="sendstate != null">
                AND sendstate = #{sendstate}
            </if>
            <if test="sendstates != null and sendstates.size() > 0">
                AND sendstate IN
                <foreach collection="sendstates" item="state" open="(" separator="," close=")">
                    #{state}
                </foreach>
            </if>
            <if test="orgid != null and orgid != ''">
                AND orgid = #{orgid}
            </if>
            <if test="guid != null and guid != ''">
                AND guid = #{guid}
            </if>
            <if test="visitCount != null and visitCount == 1">
                AND visit_count = 1
            </if>
            <if test="visitCount != null and visitCount > 1">
                AND visit_count > 1
            </if>
        </where>
    </select>
</mapper>