| | |
| | | <result property="senduuid" column="senduuid"/> |
| | | <result property="result" column="result"/> |
| | | <result property="finishtime" column="finishtime"/> |
| | | <result property="finishState" column="finish_state"/> |
| | | <result property="recordid" column="recordid"/> |
| | | <result property="exrecallcount" column="exrecallcount"/> |
| | | <result property="pulltime" column="pulltime"/> |
| | |
| | | <result property="leavehospitaldistrictname" column="leavehospitaldistrictname"/> |
| | | <result property="excep" column="excep"/> |
| | | <result property="remark" column="remark"/> |
| | | <result property="doctorOpinion" column="doctor_opinion"/> |
| | | <result property="suggest" column="suggest"/> |
| | | <result property="sendstate" column="sendstate"/> |
| | | <result property="inhospid" column="inhospid"/> |
| | |
| | | <result property="visitCount" column="visit_count"/> |
| | | <result property="isVisitAgain" column="is_visit_again"/> |
| | | <result property="upid" column="upid"/> |
| | | <result property="visitType" column="visit_type"/> |
| | | <result property="visitTime" column="visit_time"/> |
| | | <result property="visitDeptName" column="visit_dept_name"/> |
| | | <result property="visitDeptCode" column="visit_dept_code"/> |
| | |
| | | <result property="loopCount" column="loop_count"/> |
| | | <result property="isManuallyCalled" column="is_manually_called"/> |
| | | <result property="campusid" column="campusid"/> |
| | | <result property="diagType" column="diag_type"/> |
| | | </resultMap> |
| | | |
| | | <resultMap type="com.ruoyi.task.domain.ServiceSubtaskCount" id="ServiceSubtaskResult2"> |
| | |
| | | long_send_time, |
| | | openid, |
| | | remark, |
| | | doctor_opinion, |
| | | service_type, |
| | | libtemplateid, |
| | | libtemplatename, |
| | |
| | | senduuid, |
| | | result, |
| | | finishtime, |
| | | finish_state, |
| | | recordid, |
| | | exrecallcount, |
| | | pulltime, |
| | |
| | | task_situation, |
| | | is_manually_called |
| | | from service_subtask |
| | | </sql> |
| | | |
| | | <!-- 超时完成、延期完成逻辑 完成时状态(finish_state)计算:仅当本次更新把 sendstate 置为 6(随访完成)时使用。 |
| | | 基准截止时间 base: |
| | | 非任务组(appltype != 5):endtime + send_day(缺省1) + (Σ service_subtask_preachform.compensate_time + 1) 天; |
| | | 任务组(appltype = 5):按 schedule_benchmark 解析基准时间 |
| | | (1-入院 2-出院 3-就诊 4-入组 0/其它-自定义时间) |
| | | + day_offset + (Σ compensate_time + 1) 天(不叠加 send_day); |
| | | 与 RyTask/RedisMqReceiver 的 isSubtaskDeadline、selectTimelyRateBatch 口径保持一致; |
| | | delay = COALESCE(service_task.delay_finish_days, 0); |
| | | finish_time = COALESCE(入参 finishtime, 库中 finishtime, NOW()): |
| | | finish_time <= base -> 1 正常完成 |
| | | delay > 0 且 finish_time <= base + delay -> 2 延期完成 |
| | | 其余(含 delay 为 0 或 NULL、或已超出延期窗口) -> 3 超时完成 |
| | | finishtime 为空时用 NOW() 兜底,保证完成时一定写入状态; |
| | | base 为空(endtime / schedule / day_offset 缺失)时保持原值不覆盖。 --> |
| | | <sql id="finishDeadlineExpr"> |
| | | DATE_ADD( |
| | | CASE |
| | | WHEN COALESCE(st.appltype, '') = '5' THEN |
| | | DATE_ADD( |
| | | CASE sts.schedule_benchmark |
| | | WHEN 1 THEN service_subtask.starttime |
| | | WHEN 2 THEN service_subtask.endtime |
| | | WHEN 3 THEN service_subtask.admindate |
| | | WHEN 4 THEN service_subtask.create_time |
| | | ELSE sts.schedule_benchmark_custom_time |
| | | END, |
| | | INTERVAL std.day_offset DAY) |
| | | ELSE |
| | | DATE_ADD(service_subtask.endtime, INTERVAL COALESCE(st.send_day, 1) DAY) |
| | | END, |
| | | INTERVAL (COALESCE((SELECT SUM(CAST(COALESCE(NULLIF(TRIM(pf.compensate_time), ''), '0') AS SIGNED)) |
| | | FROM service_subtask_preachform pf |
| | | WHERE pf.subid = service_subtask.id AND pf.del_flag = 0), 0) + 1) DAY) |
| | | </sql> |
| | | |
| | | <sql id="finishStateExpr"> |
| | | COALESCE(( |
| | | SELECT |
| | | CASE |
| | | WHEN <include refid="finishDeadlineExpr"/> IS NULL THEN NULL |
| | | WHEN COALESCE(#{finishtime,jdbcType=TIMESTAMP}, service_subtask.finishtime, NOW()) |
| | | <= <include refid="finishDeadlineExpr"/> |
| | | THEN 1 |
| | | WHEN COALESCE(st.delay_finish_days, 0) > 0 |
| | | AND COALESCE(#{finishtime,jdbcType=TIMESTAMP}, service_subtask.finishtime, NOW()) |
| | | <= DATE_ADD(<include refid="finishDeadlineExpr"/>, |
| | | INTERVAL COALESCE(st.delay_finish_days, 0) DAY) |
| | | THEN 2 |
| | | ELSE 3 |
| | | END |
| | | FROM (SELECT 1) dummy |
| | | LEFT JOIN service_task st ON st.taskid = service_subtask.taskid |
| | | LEFT JOIN service_task_schedule sts ON sts.id = service_subtask.schedule_id |
| | | LEFT JOIN service_task_schedule_detail std ON std.id = service_subtask.schedule_detail_id |
| | | LIMIT 1 |
| | | ), finish_state) |
| | | </sql> |
| | | |
| | | <!-- 当前执行方式:首次随访 current_preachform 为空时,取 preachform 的第一个执行方式兜底 --> |
| | | <sql id="effectiveCurrentPreachformExpr"> |
| | | COALESCE(NULLIF(TRIM(current_preachform), ''), TRIM(SUBSTRING_INDEX(preachform, ',', 1))) |
| | | </sql> |
| | | |
| | | <select id="selectServiceSubtaskBySendstate" parameterType="com.ruoyi.task.domain.entity.ServiceSubtaskEntity" |
| | |
| | | <foreach collection="leaveldeptcodes" item="lvDeptCodeItem" open="(" separator="," close=")"> |
| | | #{lvDeptCodeItem} |
| | | </foreach> |
| | | </if> |
| | | </sql> |
| | | |
| | | <!-- 即将超时过滤:是否即将超时(soonTimeout=1) + 即将超时时间(soonTimeoutHours,单位小时)。 |
| | | 截止时间口径与 RyTask/RedisMqReceiver 的 isSubtaskDeadline 保持一致: |
| | | service_subtask.endtime + service_task.send_day(缺省1) + (Σ service_subtask_preachform.compensate_time + 1) 天; |
| | | 仅当存在有效补偿记录时才计算截止时间(无补偿记录不参与即将超时); |
| | | 仅统计“尚未超时、且在 N 小时内将要超时”的数据。 --> |
| | | <sql id="soonTimeoutDeadlineExpr"> |
| | | ( |
| | | SELECT DATE_ADD( |
| | | DATE_ADD(ss.endtime, INTERVAL COALESCE(st.send_day, 1) DAY), |
| | | INTERVAL (COALESCE(pf.compensate_days, 0) + 1) DAY |
| | | ) |
| | | FROM service_subtask ss |
| | | LEFT JOIN service_task st ON st.taskid = ss.taskid AND st.del_flag = '0' |
| | | INNER JOIN ( |
| | | SELECT subid, |
| | | SUM(CAST(COALESCE(NULLIF(TRIM(compensate_time), ''), '0') AS SIGNED)) AS compensate_days |
| | | FROM service_subtask_preachform |
| | | WHERE del_flag = 0 |
| | | GROUP BY subid |
| | | ) pf ON pf.subid = ss.id |
| | | WHERE ss.id = service_subtask.id |
| | | ) |
| | | </sql> |
| | | |
| | | <sql id="soonTimeoutFilter"> |
| | | <if test="soonTimeout != null and soonTimeout == 1"> |
| | | AND <include refid="soonTimeoutDeadlineExpr"/> > NOW() |
| | | AND <include refid="soonTimeoutDeadlineExpr"/> <= DATE_ADD(NOW(), INTERVAL COALESCE(#{soonTimeoutHours}, 0) HOUR) |
| | | </if> |
| | | </sql> |
| | | |
| | |
| | | <if test="campusid != null and campusid != ''">and campusid = #{campusid}</if> |
| | | <if test="pid != null ">and pid = #{pid}</if> |
| | | <if test="preachform != null ">and preachform = #{preachform}</if> |
| | | <if test="currentPreachform != null ">and current_preachform = #{currentPreachform}</if> |
| | | <if test="currentPreachform != null and currentPreachform != '' ">and current_preachform = #{currentPreachform}</if> |
| | | <if test="currentPreachforms != null and currentPreachforms != ''"> |
| | | and FIND_IN_SET(<include refid="effectiveCurrentPreachformExpr"/>, #{currentPreachforms}) |
| | | </if> |
| | | <if test="guid != null and guid != ''">and guid = #{guid}</if> |
| | | <if test="textParam != null and textParam != ''">and text_param = #{textParam}</if> |
| | | <if test="bedNo != null">and bed_no = #{bedNo}</if> |
| | |
| | | AND visit_count > 1 |
| | | </if> |
| | | <if test="remark != null">and remark = #{remark}</if> |
| | | <if test="doctorOpinion != null and doctorOpinion != ''">and doctor_opinion like concat('%', #{doctorOpinion}, '%')</if> |
| | | <if test="suggest != null">and suggest = #{suggest}</if> |
| | | <if test="createBy != null">and create_by = #{createBy}</if> |
| | | <if test="taskGuid != null">and task_guid = #{taskGuid}</if> |
| | |
| | | #{visitDeptCode} |
| | | </foreach> |
| | | </if> |
| | | <include refid="soonTimeoutFilter"/> |
| | | </sql> |
| | | |
| | | <!-- 排序片段:保持原语义,只在调用方显式传 sort 时才拼 order by |
| | |
| | | <if test="visitDeptName != null">and visit_dept_name = #{visitDeptName}</if> |
| | | <if test="managementDoctorCode != null">and management_doctor_code = #{managementDoctorCode}</if> |
| | | <if test="managementDoctor != null">and management_doctor = #{managementDoctor}</if> |
| | | <if test="currentPreachform != null">and current_preachform = #{currentPreachform}</if> |
| | | <if test="currentPreachform != null and currentPreachform != '' ">and current_preachform = #{currentPreachform}</if> |
| | | <if test="isabnormal != null">and isabnormal = #{isabnormal}</if> |
| | | <if test="continueFlag != null ">and continue_flag = #{continueFlag}</if> |
| | | <if test="continueTimeNow != null ">and continue_time_now = #{continueTimeNow,jdbcType=TIMESTAMP}</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> |
| | | <if test="currentPreachform != null">and current_preachform = #{currentPreachform}</if> |
| | | <if test="currentPreachform != null and currentPreachform != '' ">and current_preachform = #{currentPreachform}</if> |
| | | <if test="managementDoctorCode != null">and management_doctor_code = #{managementDoctorCode}</if> |
| | | <if test="isabnormal != null">and isabnormal = #{isabnormal}</if> |
| | | <if test="managementDoctor != null">and management_doctor like concat('%',#{managementDoctor}, '%')</if> |
| | |
| | | <if test="continueTimeNow != null ">and continue_time_now = #{continueTimeNow,jdbcType=TIMESTAMP}</if> |
| | | <if test="continueCount != null ">and continue_count = #{continueCount}</if> |
| | | <if test="continueTimeNext != null ">and continue_time_next = #{continueTimeNext}</if> |
| | | <include refid="soonTimeoutFilter"/> |
| | | </select> |
| | | |
| | | <select id="selectSendstateByCondition" parameterType="com.ruoyi.task.domain.ServiceSubtask" resultType="Integer"> |
| | |
| | | </if> |
| | | SUM(CASE WHEN ss.finishtime IS NOT NULL AND DATE(ss.visit_time) <= DATE(ss.finishtime) THEN 1 ELSE 0 END) / |
| | | COUNT(*) AS finishRate, |
| | | <if test="rateDay != null"> |
| | | SUM(CASE WHEN ss.finishtime IS NOT NULL |
| | | AND DATEDIFF(ss.finishtime, ss.endtime) <= #{rateDay} + COALESCE(cp.compensate_days, 0) |
| | | THEN 1 ELSE 0 END) / COUNT(*) AS rate |
| | | </if> |
| | | <if test="rateDay == null"> |
| | | NULL AS rate |
| | | </if> |
| | | <!-- 及时率基准: |
| | | 1) 非任务组(appltype != 5):endtime + send_day(缺省1) + Σ补偿天数 + 1 天; |
| | | 2) 任务组(appltype = 5):按 schedule_benchmark 解析基准时间 |
| | | (1-入院时间 2-出院时间 3-就诊时间 4-入组时间 0/其它-自定义时间) |
| | | + day_offset + Σ补偿天数 + 1 天(不再叠加 send_day); |
| | | 完成时间 finishtime <= 基准时间计为及时,分母仍为应随访数。 |
| | | 补偿天数只取 service_subtask_preachform.compensate_time 的汇总值一次, |
| | | 避免与补偿明细相加造成重复补偿或一对多放大分母。 --> |
| | | SUM(CASE |
| | | WHEN ss.finishtime IS NOT NULL |
| | | AND COALESCE(st.appltype, '') != '5' |
| | | AND ss.endtime IS NOT NULL |
| | | AND ss.finishtime <= DATE_ADD( |
| | | DATE_ADD(ss.endtime, INTERVAL COALESCE(st.send_day, 1) DAY), |
| | | INTERVAL (COALESCE(cp.compensate_days, 0) + 1) DAY) |
| | | THEN 1 |
| | | WHEN ss.finishtime IS NOT NULL |
| | | AND st.appltype = '5' |
| | | AND std.day_offset IS NOT NULL |
| | | AND ss.finishtime <= DATE_ADD( |
| | | DATE_ADD( |
| | | CASE sts.schedule_benchmark |
| | | WHEN 1 THEN ss.starttime |
| | | WHEN 2 THEN ss.endtime |
| | | WHEN 3 THEN ss.admindate |
| | | WHEN 4 THEN ss.create_time |
| | | ELSE sts.schedule_benchmark_custom_time |
| | | END, INTERVAL std.day_offset DAY), |
| | | INTERVAL (COALESCE(cp.compensate_days, 0) + 1) DAY) |
| | | THEN 1 |
| | | ELSE 0 |
| | | END) / COUNT(*) AS rate |
| | | FROM service_subtask ss |
| | | <if test="rateDay != null"> |
| | | <!-- 补偿时间:先按子任务聚合成一行再关联,避免一对多放大 COUNT(*) 分母。 |
| | | compensate_time 是 varchar 且可能存成空串,需先置空再转数字 --> |
| | | LEFT JOIN ( |
| | | SELECT subid, |
| | | SUM(CAST(COALESCE(NULLIF(TRIM(compensate_time), ''), '0') AS SIGNED)) AS compensate_days |
| | | FROM service_subtask_preachform |
| | | WHERE del_flag = 0 |
| | | GROUP BY subid |
| | | ) cp ON cp.subid = ss.id |
| | | </if> |
| | | <!-- 这里按 taskid / 历史 schedule 快照关联,不按 del_flag 过滤: |
| | | 任务或计划被编辑后旧 schedule/detail 会置为 del_flag=1, |
| | | 但历史 subtask 仍引用旧 ID,过滤会丢失历史及时率基准。 --> |
| | | LEFT JOIN service_task st |
| | | ON st.taskid = ss.taskid |
| | | LEFT JOIN service_task_schedule sts |
| | | ON sts.id = ss.schedule_id |
| | | LEFT JOIN service_task_schedule_detail std |
| | | ON std.id = ss.schedule_detail_id |
| | | <!-- 补偿时间:先按子任务聚合成一行再关联,避免一对多放大 COUNT(*) 分母。 |
| | | compensate_time 是 varchar 且可能存成空串,需先置空再转数字 --> |
| | | LEFT JOIN ( |
| | | SELECT subid, |
| | | SUM(CAST(COALESCE(NULLIF(TRIM(compensate_time), ''), '0') AS SIGNED)) AS compensate_days |
| | | FROM service_subtask_preachform |
| | | WHERE del_flag = 0 |
| | | GROUP BY subid |
| | | ) cp ON cp.subid = ss.id |
| | | WHERE ss.del_flag = 0 |
| | | AND ss.visit_time IS NOT NULL |
| | | AND ss.sendstate != 4 |
| | |
| | | </if> |
| | | <if test="managementDoctorCode != null">and management_doctor_code = #{managementDoctorCode}</if> |
| | | <if test="managementDoctor != null">and management_doctor like concat('%',#{managementDoctor}, '%')</if> |
| | | <if test="startOutHospTime != null"> |
| | | AND date_format(endtime,'%y%m%d') >= date_format(#{startOutHospTime},'%y%m%d') |
| | | </if> |
| | | <if test="endOutHospTime != null"> |
| | | AND date_format(endtime,'%y%m%d') <= date_format(#{endOutHospTime},'%y%m%d') |
| | | </if> |
| | | ) a where a.finished =1) |
| | | </select> |
| | | |
| | |
| | | <if test="senduuid != null">senduuid,</if> |
| | | <if test="result != null">result,</if> |
| | | <if test="finishtime != null">finishtime,</if> |
| | | <if test="finishState != null">finish_state,</if> |
| | | <if test="recordid != null">recordid,</if> |
| | | <if test="exrecallcount != null">exrecallcount,</if> |
| | | <if test="pulltime != null">pulltime,</if> |
| | |
| | | <if test="nurseName != null ">nurse_name,</if> |
| | | <if test="nurseId != null ">nurse_id,</if> |
| | | <if test="remark != null ">remark,</if> |
| | | <if test="doctorOpinion != null ">doctor_opinion,</if> |
| | | <if test="suggest != null ">suggest,</if> |
| | | <if test="sendstate != null ">sendstate,</if> |
| | | <if test="inhospid != null ">inhospid,</if> |
| | |
| | | <if test="visitDeptName != null">visit_dept_name,</if> |
| | | <if test="managementDoctorCode != null">management_doctor_code,</if> |
| | | <if test="managementDoctor != null">management_doctor,</if> |
| | | <if test="currentPreachform != null">current_preachform,</if> |
| | | <if test="currentPreachform != null and currentPreachform != '' ">current_preachform,</if> |
| | | <if test="taskSituation != null">task_situation,</if> |
| | | <if test="isabnormal != null">isabnormal,</if> |
| | | <if test="continueFlag != null ">continue_flag,</if> |
| | |
| | | <if test="senduuid != null">#{senduuid},</if> |
| | | <if test="result != null">#{result},</if> |
| | | <if test="finishtime != null">#{finishtime},</if> |
| | | <if test="finishState != null">#{finishState},</if> |
| | | <if test="recordid != null">#{recordid},</if> |
| | | <if test="exrecallcount != null">#{exrecallcount},</if> |
| | | <if test="pulltime != null">#{pulltime},</if> |
| | |
| | | <if test="nurseName != null ">#{nurseName},</if> |
| | | <if test="nurseId != null ">#{nurseId},</if> |
| | | <if test="remark != null ">#{remark},</if> |
| | | <if test="doctorOpinion != null ">#{doctorOpinion},</if> |
| | | <if test="suggest != null ">#{suggest},</if> |
| | | <if test="sendstate != null ">#{sendstate},</if> |
| | | <if test="inhospid != null ">#{inhospid},</if> |
| | |
| | | <if test="visitDeptName != null">#{visitDeptName},</if> |
| | | <if test="managementDoctorCode != null">#{managementDoctorCode},</if> |
| | | <if test="managementDoctor != null">#{managementDoctor},</if> |
| | | <if test="currentPreachform != null">#{currentPreachform},</if> |
| | | <if test="currentPreachform != null and currentPreachform != '' ">#{currentPreachform},</if> |
| | | <if test="taskSituation != null">#{taskSituation},</if> |
| | | <if test="isabnormal != null">#{isabnormal},</if> |
| | | <if test="continueFlag != null ">#{continueFlag},</if> |
| | |
| | | <if test="isManuallyCalled != null ">#{isManuallyCalled},</if> |
| | | </trim> |
| | | </insert> |
| | | |
| | | <!-- 二次随访幂等:仅当 is_visit_again 不是目标值时更新,返回受影响行数 --> |
| | | <update id="updateIsVisitAgainById"> |
| | | update service_subtask |
| | | set is_visit_again = #{isVisitAgain}, |
| | | update_time = now() |
| | | where id = #{id} |
| | | and (is_visit_again is null or is_visit_again <> #{isVisitAgain}) |
| | | </update> |
| | | |
| | | <update id="updateServiceSubtask" parameterType="com.ruoyi.task.domain.ServiceSubtask"> |
| | | update service_subtask |
| | |
| | | <if test="openid != null ">openid = #{openid},</if> |
| | | <if test="longSendTime != null ">long_send_time = #{longSendTime},</if> |
| | | <if test="sendstate != null ">sendstate = #{sendstate},</if> |
| | | <if test="sendstate != null and sendstate == 6">finish_state = <include refid="finishStateExpr"/>,</if> |
| | | <if test="serviceType != null ">service_type = #{serviceType},</if> |
| | | <if test="score != null ">score = #{score},</if> |
| | | <if test="submit != null ">submit = #{submit},</if> |
| | |
| | | <if test="nurseName != null ">nurse_name=#{nurseName},</if> |
| | | <if test="nurseId != null ">nurse_id=#{nurseId},</if> |
| | | <if test="remark != null ">remark=#{remark},</if> |
| | | <if test="doctorOpinion != null ">doctor_opinion=#{doctorOpinion},</if> |
| | | <if test="suggest != null ">suggest=#{suggest},</if> |
| | | <if test="inhospid != null ">inhospid=#{inhospid},</if> |
| | | <if test="patfrom != null ">patfrom=#{patfrom},</if> |
| | |
| | | <if test="visitDeptName != null">visit_dept_name = #{visitDeptName},</if> |
| | | <if test="managementDoctorCode != null">management_doctor_code = #{managementDoctorCode},</if> |
| | | <if test="managementDoctor != null">management_doctor=#{managementDoctor},</if> |
| | | <if test="currentPreachform != null">current_preachform=#{currentPreachform},</if> |
| | | <if test="currentPreachform != null and currentPreachform != '' ">current_preachform=#{currentPreachform},</if> |
| | | <if test="taskSituation != null">task_situation=#{taskSituation},</if> |
| | | <if test="isabnormal != null">isabnormal=#{isabnormal},</if> |
| | | <if test="continueFlag != null ">continue_flag = #{continueFlag},</if> |
| | |
| | | <if test="isManuallyCalled != null ">is_manually_called = #{isManuallyCalled},</if> |
| | | </trim> |
| | | where id = #{id} |
| | | </update> |
| | | |
| | | <!-- 微信公众号已领取未填写按默认选项完成:只更新当前子任务。 |
| | | 条件 sendstate=1 + 未提交,保证只处理当前被领取且未填写的子任务,不波及其他任务。 --> |
| | | <update id="updateWechatDefaultComplete" parameterType="com.ruoyi.task.domain.ServiceSubtask"> |
| | | update service_subtask |
| | | set sendstate = 6, |
| | | finishtime = #{finishtime}, |
| | | result = #{result}, |
| | | remark = case |
| | | when remark is null or remark = '' then #{remark} |
| | | else concat(remark, ',', #{remark}) |
| | | end, |
| | | update_time = now(), |
| | | finish_state = <include refid="finishStateExpr"/> |
| | | where id = #{id} |
| | | and orgid = #{orgid} |
| | | and sendstate = 1 |
| | | and (submit is null or submit != 1) |
| | | </update> |
| | | |
| | | <update id="updateServiceSubtaskByPatId" parameterType="com.ruoyi.task.domain.ServiceSubtask"> |
| | |
| | | <if test="openid != null ">openid = #{openid},</if> |
| | | <if test="longSendTime != null ">long_send_time = #{longSendTime},</if> |
| | | <if test="sendstate != null ">sendstate = #{sendstate},</if> |
| | | <if test="sendstate != null and sendstate == 6">finish_state = <include refid="finishStateExpr"/>,</if> |
| | | <if test="serviceType != null ">service_type = #{serviceType},</if> |
| | | <if test="score != null ">score = #{score},</if> |
| | | <if test="visitCount != null ">visit_count = #{visitCount},</if> |
| | |
| | | <if test="nurseName != null ">nurse_name=#{nurseName},</if> |
| | | <if test="nurseId != null ">nurse_id=#{nurseId},</if> |
| | | <if test="remark != null ">remark=#{remark},</if> |
| | | <if test="doctorOpinion != null ">doctor_opinion=#{doctorOpinion},</if> |
| | | <if test="suggest != null ">suggest=#{suggest},</if> |
| | | <if test="inhospid != null ">inhospid=#{inhospid},</if> |
| | | <if test="patfrom != null ">patfrom=#{patfrom},</if> |
| | |
| | | <if test="visitDeptName != null">visit_dept_name = #{visitDeptName},</if> |
| | | <if test="managementDoctorCode != null">management_doctor_code = #{managementDoctorCode},</if> |
| | | <if test="managementDoctor != null">management_doctor=#{managementDoctor},</if> |
| | | <if test="currentPreachform != null">current_preachform=#{currentPreachform},</if> |
| | | <if test="currentPreachform != null and currentPreachform != '' ">current_preachform=#{currentPreachform},</if> |
| | | <if test="taskSituation != null">task_situation=#{taskSituation},</if> |
| | | <if test="isabnormal != null">isabnormal=#{isabnormal},</if> |
| | | <if test="continueFlag != null ">continue_flag = #{continueFlag},</if> |
| | |
| | | <if test="sex != null">sex = #{sex},</if> |
| | | <if test="delFlag != null">del_flag = #{delFlag},</if> |
| | | <if test="sendstate != null ">sendstate = #{sendstate},</if> |
| | | <if test="sendstate != null and sendstate == 6">finish_state = <include refid="finishStateExpr"/>,</if> |
| | | <if test="age != null">age = #{age},</if> |
| | | <if test="sfzh != null">sfzh = #{sfzh},</if> |
| | | <if test="addr != null">addr = #{addr},</if> |
| | |
| | | <if test="nurseName != null ">nurse_name=#{nurseName},</if> |
| | | <if test="nurseId != null ">nurse_id=#{nurseId},</if> |
| | | <if test="remark != null ">remark=#{remark},</if> |
| | | <if test="doctorOpinion != null ">doctor_opinion=#{doctorOpinion},</if> |
| | | <if test="suggest != null ">suggest=#{suggest},</if> |
| | | <if test="inhospid != null ">inhospid=#{inhospid},</if> |
| | | <if test="patfrom != null ">patfrom=#{patfrom},</if> |
| | |
| | | <if test="visitDeptName != null">visit_dept_name = #{visitDeptName},</if> |
| | | <if test="managementDoctorCode != null">management_doctor_code = #{managementDoctorCode},</if> |
| | | <if test="managementDoctor != null">management_doctor=#{managementDoctor},</if> |
| | | <if test="currentPreachform != null">current_preachform=#{currentPreachform},</if> |
| | | <if test="currentPreachform != null and currentPreachform != '' ">current_preachform=#{currentPreachform},</if> |
| | | <if test="taskSituation != null">task_situation=#{taskSituation},</if> |
| | | <if test="isabnormal != null">isabnormal=#{isabnormal},</if> |
| | | <if test="continueFlag != null ">continue_flag = #{continueFlag},</if> |
| | |
| | | <if test="phone != null">phone = #{phone},</if> |
| | | <if test="sex != null">sex = #{sex},</if> |
| | | <if test="sendstate != null ">sendstate = #{sendstate},</if> |
| | | <if test="sendstate != null and sendstate == 6">finish_state = <include refid="finishStateExpr"/>,</if> |
| | | <if test="age != null">age = #{age},</if> |
| | | <if test="sfzh != null">sfzh = #{sfzh},</if> |
| | | <if test="addr != null">addr = #{addr},</if> |
| | |
| | | <if test="nurseName != null ">nurse_name=#{nurseName},</if> |
| | | <if test="nurseId != null ">nurse_id=#{nurseId},</if> |
| | | <if test="remark != null ">remark=#{remark},</if> |
| | | <if test="doctorOpinion != null ">doctor_opinion=#{doctorOpinion},</if> |
| | | <if test="suggest != null ">suggest=#{suggest},</if> |
| | | <if test="inhospid != null ">inhospid=#{inhospid},</if> |
| | | <if test="patfrom != null ">patfrom=#{patfrom},</if> |
| | |
| | | <if test="visitDeptName != null">visit_dept_name = #{visitDeptName},</if> |
| | | <if test="managementDoctorCode != null">management_doctor_code = #{managementDoctorCode},</if> |
| | | <if test="managementDoctor != null">management_doctor=#{managementDoctor},</if> |
| | | <if test="currentPreachform != null">current_preachform=#{currentPreachform},</if> |
| | | <if test="currentPreachform != null and currentPreachform != '' ">current_preachform=#{currentPreachform},</if> |
| | | <if test="taskSituation != null">task_situation=#{taskSituation},</if> |
| | | <if test="isabnormal != null">isabnormal=#{isabnormal},</if> |
| | | <if test="continueFlag != null ">continue_flag = #{continueFlag},</if> |
| | |
| | | where patid = #{patid} and taskid = #{taskid} |
| | | </update> |
| | | |
| | | <!-- 人工随访:软删除患者出院记录对应的未完成随访任务 --> |
| | | <update id="deleteUnfinishedServiceSubtaskByInhospids"> |
| | | update service_subtask |
| | | set del_flag = 1 |
| | | where del_flag = 0 |
| | | and patid = #{patid} |
| | | and sendstate in |
| | | <foreach collection="sendstates" item="sendstate" open="(" separator="," close=")"> |
| | | #{sendstate} |
| | | </foreach> |
| | | and inhospid in |
| | | <foreach collection="inhospids" item="inhospid" open="(" separator="," close=")"> |
| | | #{inhospid} |
| | | </foreach> |
| | | </update> |
| | | |
| | | <!-- 人工随访重复校验:同一患者同一任务下是否已有未完成随访任务 --> |
| | | <select id="countUnfinishedServiceSubtaskByPatidAndTaskid" resultType="int"> |
| | | select count(1) |
| | | from service_subtask |
| | | where del_flag = 0 |
| | | and patid = #{patid} |
| | | and taskid = #{taskid} |
| | | and sendstate in |
| | | <foreach collection="sendstates" item="sendstate" open="(" separator="," close=")"> |
| | | #{sendstate} |
| | | </foreach> |
| | | </select> |
| | | |
| | | <select id="getSfStatistics" parameterType="com.ruoyi.task.domain.ServiceSubtaskCountReq" |
| | | resultMap="ServiceSubtaskResult"> |
| | | select id, |
| | |
| | | leaveldeptname, |
| | | sendstate, |
| | | preachform, |
| | | current_preachform, |
| | | <include refid="effectiveCurrentPreachformExpr"/> AS current_preachform, |
| | | excep, |
| | | nurse_id, |
| | | nurse_name, |
| | | taskid, |
| | | task_name, |
| | | <if test="groupKey != null and groupKey == 'taskid'"> |
| | | (SELECT st.diag_type FROM service_task st WHERE st.taskid = service_subtask.taskid LIMIT 1) AS diag_type, |
| | | </if> |
| | | visit_time, |
| | | visit_dept_code, |
| | | finishtime, |
| | | endtime, |
| | | senddate, |
| | |
| | | continue_content, |
| | | continue_count, |
| | | continue_time_next, |
| | | task_situation |
| | | task_situation, |
| | | finish_state, |
| | | is_manually_called |
| | | from service_subtask |
| | | where 1=1 |
| | | and del_flag = 0 |
| | |
| | | <foreach collection="deptcodes" item="deptcode" open="(" separator="," |
| | | close=")"> |
| | | #{deptcode} |
| | | </foreach> |
| | | </if> |
| | | <if test="taskIds != null and taskIds.size() > 0"> |
| | | AND taskid IN |
| | | <foreach collection="taskIds" item="taskId" open="(" separator="," |
| | | close=")"> |
| | | #{taskId} |
| | | </foreach> |
| | | </if> |
| | | <if test="serviceType != null and serviceType.size() > 0"> |
| | |
| | | <select id="getSfStatisticsGroupKey" parameterType="com.ruoyi.task.domain.ServiceSubtaskCountReq" |
| | | resultType="String"> |
| | | select |
| | | <if test="groupKey != null and groupKey != ''"> |
| | | ${groupKey} as groupKey |
| | | </if> |
| | | <choose> |
| | | <when test="groupColumn != null and groupColumn != ''"> |
| | | ${groupColumn} as groupKey |
| | | </when> |
| | | <when test="groupKey != null and groupKey != ''"> |
| | | ${groupKey} as groupKey |
| | | </when> |
| | | <otherwise> |
| | | NULL as groupKey |
| | | </otherwise> |
| | | </choose> |
| | | from service_subtask |
| | | where 1=1 |
| | | and del_flag = 0 |
| | |
| | | 南华满意度子任务的 leavehospitaldistrictcode 有 83%(3236/3811)为 NULL, |
| | | 原来「科室 AND 病区」两个条件永远不可能同时成立 → 整张统计表空。 |
| | | 判空放行只影响病区为空的记录,有病区的数据行为不变。 --> |
| | | <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0"> |
| | | AND (leavehospitaldistrictcode IS NULL OR leavehospitaldistrictcode IN |
| | | <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator="," |
| | | close=")"> |
| | | #{leavehospitaldistrictcode} |
| | | </foreach> |
| | | ) |
| | | </if> |
| | | <choose> |
| | | <!-- 满意度统计(getSfStatisticsScript):改用“有效病区”列, |
| | | 出院病区为空则回退到在院病区。筛选因此真正生效, |
| | | 空病区的记录也会归到它真实的在院病区,而不是混进用户选中的病区。 --> |
| | | <when test="districtColumn != null and districtColumn != ''"> |
| | | <!-- 出院病区为空回退到在院病区。这里刻意写成 OR 展开而不是 IFNULL(a,b) IN (...): |
| | | 列被函数包住就用不了索引,56 万行明细表上是全表扫(实测 5.1s → 0.7s)。 |
| | | 两个分支分别命中 idx_ss_district_pair 的 (leave..., hospital...) 前缀。 --> |
| | | <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0"> |
| | | AND (leavehospitaldistrictcode IN |
| | | <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator="," |
| | | close=")"> |
| | | #{leavehospitaldistrictcode} |
| | | </foreach> |
| | | OR (leavehospitaldistrictcode IS NULL AND hospitaldistrictcode IN |
| | | <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator="," |
| | | close=")"> |
| | | #{leavehospitaldistrictcode} |
| | | </foreach> |
| | | )) |
| | | </if> |
| | | </when> |
| | | <otherwise> |
| | | <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0"> |
| | | AND (leavehospitaldistrictcode IS NULL OR leavehospitaldistrictcode IN |
| | | <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator="," |
| | | close=")"> |
| | | #{leavehospitaldistrictcode} |
| | | </foreach> |
| | | ) |
| | | </if> |
| | | </otherwise> |
| | | </choose> |
| | | <if test="leaveldeptcodes != null and leaveldeptcodes.size() > 0"> |
| | | AND leaveldeptcode IN |
| | | <foreach collection="leaveldeptcodes" item="leaveldeptcode" open="(" separator="," |
| | |
| | | <foreach collection="hospitaldeptcodes" item="hospitaldeptcode" open="(" separator="," |
| | | close=")"> |
| | | #{hospitaldeptcode} |
| | | </foreach> |
| | | </if> |
| | | <if test="taskIds != null and taskIds.size() > 0"> |
| | | AND taskid IN |
| | | <foreach collection="taskIds" item="taskId" open="(" separator="," |
| | | close=")"> |
| | | #{taskId} |
| | | </foreach> |
| | | </if> |
| | | <if test="serviceType != null and serviceType.size() > 0"> |
| | |
| | | <if test="visitCount != null and visitCount > 1"> |
| | | AND visit_count > 1 |
| | | </if> |
| | | <if test="groupKey != null and groupKey != ''"> |
| | | group by ${groupKey} |
| | | </if> |
| | | <choose> |
| | | <when test="groupColumn != null and groupColumn != ''"> |
| | | group by ${groupColumn} |
| | | order by ${groupColumn} |
| | | </when> |
| | | <when test="groupKey != null and groupKey != ''"> |
| | | group by ${groupKey} |
| | | order by ${groupKey} |
| | | </when> |
| | | </choose> |
| | | <!-- pageNum 是 1 起始的,OFFSET 必须用 (pageNum-1)*pageSize; |
| | | 以前直接写 OFFSET ${pageNum},第一页会跳掉第一条分组。 --> |
| | | <if test="pageSize != null and pageNum != null"> |
| | | limit ${pageSize} OFFSET ${pageNum} |
| | | limit ${pageSize} OFFSET ${pageOffset} |
| | | </if> |
| | | </select> |
| | | |
| | |
| | | --> |
| | | <resultMap type="com.ruoyi.task.domain.ServiceSubtaskStatistic" id="ServiceSubtaskScriptStatisticResult"> |
| | | <result property="groupCode" column="group_code"/> |
| | | <result property="groupName" column="group_name"/> |
| | | <result property="taskId" column="taskid"/> |
| | | <result property="taskName" column="task_name"/> |
| | | <result property="dischargeCount" column="discharge_count"/> |
| | | <result property="firstVisitCount" column="first_visit_count"/> |
| | | <result property="againVisitCount" column="again_visit_count"/> |
| | | <result property="drcode" column="drcode"/> |
| | |
| | | resultMap="ServiceSubtaskScriptStatisticResult"> |
| | | select |
| | | IFNULL(${groupColumn}, 'Unknown') as group_code, |
| | | <!-- 分组键对应的显示名:病区统计时就是这一组的病区名。 |
| | | 以前这一列是 MAX(hospitaldistrictname),一个组混了多个病区时会随机显示其中一个, |
| | | 于是出现“选血液内科病区却显示骨科中心三病区”。 --> |
| | | <choose> |
| | | <when test="groupKey != null and groupKey == 'taskid'"> |
| | | MAX(task_name) as group_name, |
| | | </when> |
| | | <otherwise> |
| | | MAX(IFNULL(leavehospitaldistrictname, hospitaldistrictname)) as group_name, |
| | | </otherwise> |
| | | </choose> |
| | | MAX(taskid) as taskid, |
| | | MAX(task_name) as task_name, |
| | | MAX(drcode) as drcode, |
| | | MAX(drname) as drname, |
| | | MAX(leaveldeptcode) as deptcode, |
| | |
| | | SUM(CASE WHEN visit_count > 1 and sendstate is not null and current_preachform = '3' THEN 1 ELSE 0 END) as voice_again, |
| | | SUM(CASE WHEN visit_count > 1 and sendstate is not null and current_preachform = '4' THEN 1 ELSE 0 END) as sms_again, |
| | | SUM(CASE WHEN visit_count > 1 and sendstate is not null and current_preachform = '5' THEN 1 ELSE 0 END) as we_chat_again, |
| | | SUM(CASE WHEN visit_count > 1 and sendstate is not null and excep = '1' THEN 1 ELSE 0 END) as abnormal_again |
| | | SUM(CASE WHEN visit_count > 1 and sendstate is not null and excep = '1' THEN 1 ELSE 0 END) as abnormal_again, |
| | | <!-- 出院人次:原来的内存实现是 serviceSubtaskList.size(),即分组内命中的子任务条数。 |
| | | 改成本语句后一直没有聚合这一列,页面上“出院人次”恒为 0,与应随访人次自相矛盾。 --> |
| | | COUNT(*) as discharge_count |
| | | from service_subtask |
| | | where 1=1 |
| | | and del_flag = 0 |
| | |
| | | <if test="campusid != null and campusid != ''"> |
| | | and campusid = #{campusid} |
| | | </if> |
| | | <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0"> |
| | | AND (leavehospitaldistrictcode IS NULL OR leavehospitaldistrictcode IN |
| | | <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator="," |
| | | close=")"> |
| | | #{leavehospitaldistrictcode} |
| | | </foreach> |
| | | ) |
| | | </if> |
| | | <choose> |
| | | <!-- 满意度统计:改用“有效病区”列(出院病区为空回退在院病区),筛选才真正生效 --> |
| | | <when test="districtColumn != null and districtColumn != ''"> |
| | | <!-- 出院病区为空回退到在院病区。这里刻意写成 OR 展开而不是 IFNULL(a,b) IN (...): |
| | | 列被函数包住就用不了索引,56 万行明细表上是全表扫(实测 5.1s → 0.7s)。 |
| | | 两个分支分别命中 idx_ss_district_pair 的 (leave..., hospital...) 前缀。 --> |
| | | <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0"> |
| | | AND (leavehospitaldistrictcode IN |
| | | <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator="," |
| | | close=")"> |
| | | #{leavehospitaldistrictcode} |
| | | </foreach> |
| | | OR (leavehospitaldistrictcode IS NULL AND hospitaldistrictcode IN |
| | | <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator="," |
| | | close=")"> |
| | | #{leavehospitaldistrictcode} |
| | | </foreach> |
| | | )) |
| | | </if> |
| | | </when> |
| | | <otherwise> |
| | | <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0"> |
| | | AND (leavehospitaldistrictcode IS NULL OR leavehospitaldistrictcode IN |
| | | <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator="," |
| | | close=")"> |
| | | #{leavehospitaldistrictcode} |
| | | </foreach> |
| | | ) |
| | | </if> |
| | | </otherwise> |
| | | </choose> |
| | | <if test="deptcodes != null and deptcodes.size() > 0"> |
| | | AND leaveldeptcode IN |
| | | <foreach collection="deptcodes" item="deptcode" open="(" separator="," |
| | |
| | | <if test="visitCount != null and visitCount > 1"> |
| | | AND visit_count > 1 |
| | | </if> |
| | | <if test="groupKey != null and groupKey != '' and groupKeyList != null and groupKeyList.size>0"> |
| | | AND IFNULL(${groupKey}, 'Unknown') IN |
| | | <!-- 过滤列必须与 GROUP BY 的列一致:都用 groupColumn(满意度病区统计时它是 |
| | | IFNULL(出院病区, 在院病区) 这样的表达式),否则聚合出来的分组键过滤不上,题目量会全变 0。 --> |
| | | <if test="groupColumn != null and groupColumn != '' and groupKeyList != null and groupKeyList.size>0"> |
| | | AND IFNULL(${groupColumn}, 'Unknown') IN |
| | | <foreach collection="groupKeyList" item="key" open="(" separator="," |
| | | close=")"> |
| | | #{key} |
| | |
| | | <select id="getSfStatisticsScriptJoySum" parameterType="com.ruoyi.task.domain.ServiceSubtaskCountReq" |
| | | resultType="map"> |
| | | select |
| | | IFNULL(t.${groupColumn}, 'Unknown') as groupCode, |
| | | <choose> |
| | | <when test="districtColumn != null and districtColumn != ''"> |
| | | IFNULL(${districtColumn}, 'Unknown') as groupCode, |
| | | </when> |
| | | <otherwise> |
| | | IFNULL(t.${groupColumn}, 'Unknown') as groupCode, |
| | | </otherwise> |
| | | </choose> |
| | | SUM(CASE WHEN a.categoryid IN(${configValue}) |
| | | THEN 1 ELSE 0 END) as joyAllCount, |
| | | SUM(CASE WHEN a.categoryid IN(${configValue}) |
| | |
| | | <if test="campusid != null and campusid != ''"> |
| | | and t.campusid = #{campusid} |
| | | </if> |
| | | <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0"> |
| | | AND (t.leavehospitaldistrictcode IS NULL OR t.leavehospitaldistrictcode IN |
| | | <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator="," |
| | | close=")"> |
| | | #{leavehospitaldistrictcode} |
| | | </foreach> |
| | | ) |
| | | </if> |
| | | <choose> |
| | | <!-- 满意度统计:与聚合主查询一致,用“有效病区”列过滤, |
| | | 否则题目量会和主查询的行对不上(分组键不一样,过滤不上就全变 0)。 --> |
| | | <when test="districtColumn != null and districtColumn != ''"> |
| | | <!-- 出院病区为空回退到在院病区。这里刻意写成 OR 展开而不是 IFNULL(a,b) IN (...): |
| | | 列被函数包住就用不了索引,56 万行明细表上是全表扫(实测 5.1s → 0.7s)。 |
| | | 两个分支分别命中 idx_ss_district_pair 的 (leave..., hospital...) 前缀。 --> |
| | | <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0"> |
| | | AND (leavehospitaldistrictcode IN |
| | | <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator="," |
| | | close=")"> |
| | | #{leavehospitaldistrictcode} |
| | | </foreach> |
| | | OR (leavehospitaldistrictcode IS NULL AND hospitaldistrictcode IN |
| | | <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator="," |
| | | close=")"> |
| | | #{leavehospitaldistrictcode} |
| | | </foreach> |
| | | )) |
| | | </if> |
| | | </when> |
| | | <otherwise> |
| | | <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0"> |
| | | AND (t.leavehospitaldistrictcode IS NULL OR t.leavehospitaldistrictcode IN |
| | | <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator="," |
| | | close=")"> |
| | | #{leavehospitaldistrictcode} |
| | | </foreach> |
| | | ) |
| | | </if> |
| | | </otherwise> |
| | | </choose> |
| | | <if test="deptcodes != null and deptcodes.size() > 0"> |
| | | AND t.leaveldeptcode IN |
| | | <foreach collection="deptcodes" item="deptcode" open="(" separator="," |
| | |
| | | <if test="visitCount != null and visitCount > 1"> |
| | | AND t.visit_count > 1 |
| | | </if> |
| | | <if test="groupKey != null and groupKey != '' and groupKeyList != null and groupKeyList.size>0"> |
| | | <if test="districtColumn != null and districtColumn != '' and groupKeyList != null and groupKeyList.size>0"> |
| | | AND IFNULL(${districtColumn}, 'Unknown') IN |
| | | <foreach collection="groupKeyList" item="key" open="(" separator="," |
| | | close=")"> |
| | | #{key} |
| | | </foreach> |
| | | </if> |
| | | <if test="(districtColumn == null or districtColumn == '') and groupKey != null and groupKey != '' and groupKeyList != null and groupKeyList.size>0"> |
| | | AND IFNULL(t.${groupKey}, 'Unknown') IN |
| | | <foreach collection="groupKeyList" item="key" open="(" separator="," |
| | | close=")"> |
| | | #{key} |
| | | </foreach> |
| | | </if> |
| | | group by IFNULL(t.${groupColumn}, 'Unknown') |
| | | <choose> |
| | | <when test="districtColumn != null and districtColumn != ''"> |
| | | group by IFNULL(${districtColumn}, 'Unknown') |
| | | </when> |
| | | <otherwise> |
| | | group by IFNULL(t.${groupColumn}, 'Unknown') |
| | | </otherwise> |
| | | </choose> |
| | | </select> |
| | | |
| | | <select id="getSfStatisticsHyperlink" parameterType="com.ruoyi.task.domain.ServiceSubtaskCountReq" |
| | |
| | | leaveldeptname, |
| | | sendstate, |
| | | preachform, |
| | | current_preachform, |
| | | <include refid="effectiveCurrentPreachformExpr"/> AS current_preachform, |
| | | excep, |
| | | nurse_id, |
| | | nurse_name, |
| | | taskid, |
| | | task_name, |
| | | visit_time, |
| | | visit_dept_code, |
| | | visit_dept_name, |
| | | finishtime, |
| | | endtime, |
| | | senddate, |
| | |
| | | continue_count, |
| | | continue_time_next, |
| | | task_situation, |
| | | remark |
| | | remark, |
| | | doctor_opinion, |
| | | finish_state, |
| | | is_manually_called |
| | | from service_subtask |
| | | where 1=1 |
| | | and del_flag = 0 |
| | |
| | | and campusid = #{campusid} |
| | | </if> |
| | | <!-- 2026-10-21:病区为空时视为"不限"(南华满意度 83% 子任务无病区),有病区的数据行为不变 --> |
| | | <!-- 与 getSfStatisticsScript 的汇总行保持一致:出院病区为空则回退到在院病区, |
| | | 否则点“查看详情”查出来的条数会和汇总行的数字对不上。 --> |
| | | <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0"> |
| | | AND (leavehospitaldistrictcode IS NULL OR leavehospitaldistrictcode IN |
| | | AND (leavehospitaldistrictcode IN |
| | | <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator="," |
| | | close=")"> |
| | | #{leavehospitaldistrictcode} |
| | | </foreach> |
| | | ) |
| | | OR (leavehospitaldistrictcode IS NULL AND hospitaldistrictcode IN |
| | | <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator="," |
| | | close=")"> |
| | | #{leavehospitaldistrictcode} |
| | | </foreach> |
| | | )) |
| | | </if> |
| | | <if test="deptcodes != null and deptcodes.size() > 0"> |
| | | AND leaveldeptcode IN |
| | |
| | | AND IFNULL(visit_time, IFNULL(finishtime, create_time)) >= DATE(#{startTime}) |
| | | AND IFNULL(visit_time, IFNULL(finishtime, create_time)) < DATE_ADD(DATE(#{endTime}), INTERVAL 1 DAY) |
| | | </if> |
| | | <if test="hospitalStartTime != null and hospitalEndTime!=null"> |
| | | AND endtime >= DATE(#{hospitalStartTime}) |
| | | AND endtime < DATE_ADD(DATE(#{hospitalEndTime}), 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> |
| | |
| | | <if test="type != null"> |
| | | and type = #{type} |
| | | </if> |
| | | <if test="visitCount != null and visitCount == 1"> |
| | | <!-- 首个再次随访:精确查 visit_count = 2,与统计口径一致 --> |
| | | <if test="hyperLinkInfoType == 'againFollowUpPushCountInfo'"> |
| | | AND visit_count = 2 |
| | | </if> |
| | | <!-- 其他类型保持原语义:1 首次,>1 再次 --> |
| | | <if test="hyperLinkInfoType != 'againFollowUpPushCountInfo' and visitCount != null and visitCount == 1"> |
| | | AND visit_count = 1 |
| | | </if> |
| | | <if test="visitCount != null and visitCount > 1"> |
| | | <if test="hyperLinkInfoType != 'againFollowUpPushCountInfo' and visitCount != null and visitCount > 1"> |
| | | AND visit_count > 1 |
| | | </if> |
| | | <if test="groupKey != null and groupKey != '' and groupKeyList != null and groupKeyList.size>0"> |
| | |
| | | #{state} |
| | | </foreach> |
| | | </if> |
| | | <if test="currentPreachform != null"> |
| | | AND current_preachform = #{currentPreachform} |
| | | <if test="currentPreachform != null and currentPreachform != '' "> |
| | | AND <include refid="effectiveCurrentPreachformExpr"/> = #{currentPreachform} |
| | | <if test="followUpCountStyle != null and followUpCountStyle = '1'"> |
| | | AND sendstate != 4 |
| | | </if> |
| | |
| | | <if test="taskSituation != null"> |
| | | AND task_situation = #{taskSituation} |
| | | </if> |
| | | <if test="finishState != null"> |
| | | AND finish_state = #{finishState} |
| | | </if> |
| | | <if test="drcode != null and drcode != ''"> |
| | | AND drcode = #{drcode} |
| | | </if> |
| | |
| | | </if> |
| | | <if test="deptcode != null and deptcode != ''"> |
| | | AND leaveldeptcode = #{deptcode} |
| | | </if> |
| | | <if test="isManuallyCalled != null"> |
| | | AND is_manually_called = #{isManuallyCalled} |
| | | </if> |
| | | <if test="suggest != null and suggest != ''"> |
| | | AND TRIM(suggest) = #{suggest} |
| | | </if> |
| | | order by endtime desc |
| | | <if test="pageSize != null and pageNum != null"> |
| | |
| | | <select id="getSfStatisticsScriptDetails" parameterType="com.ruoyi.task.domain.ServiceSubtaskCountReq" |
| | | resultMap="ServiceSubtaskScriptCountResult"> |
| | | SELECT |
| | | a.id as scriptid, |
| | | a.templateid as templateid, |
| | | a.script_type, |
| | | MIN(a.id) as scriptid, |
| | | MIN(a.templateid) as templateid, |
| | | MIN(a.script_type) as script_type, |
| | | a.script_content, |
| | | b.subtask_type, |
| | | b.completed_quantity, |
| | | b.all_quantity, |
| | | ROUND(b.completed_quantity/b.all_quantity,2) as completed_percentage |
| | | SUM(b.completed_quantity) as completed_quantity, |
| | | SUM(b.all_quantity) as all_quantity, |
| | | ROUND(SUM(b.completed_quantity)/SUM(b.all_quantity),2) as completed_percentage |
| | | FROM |
| | | <if test="type == 1"> |
| | | ivr_task_template_script a |
| | |
| | | AND ss.campusid = #{campusid} |
| | | </if> |
| | | <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0"> |
| | | AND ss.leavehospitaldistrictcode IN |
| | | AND (ss.leavehospitaldistrictcode IN |
| | | <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator="," |
| | | close=")"> |
| | | #{leavehospitaldistrictcode} |
| | | </foreach> |
| | | OR (ss.leavehospitaldistrictcode IS NULL AND ss.hospitaldistrictcode IN |
| | | <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator="," |
| | | close=")"> |
| | | #{leavehospitaldistrictcode} |
| | | </foreach> |
| | | )) |
| | | </if> |
| | | <if test="deptcodes != null and deptcodes.size() > 0"> |
| | | AND ss.leaveldeptcode IN |
| | |
| | | group by ssd.scriptid) b |
| | | ON a.id = b.scriptid |
| | | <!-- 适用单条查询 --> |
| | | <if test="scriptids != null"> |
| | | <if test="scriptids != null and scriptids != ''"> |
| | | AND a.scriptid in |
| | | (SELECT lib_script.scriptid FROM |
| | | svy_lib_template_script lib_script |
| | | WHERE lib_script.scriptid in (${scriptids})) |
| | | </if> |
| | | <!-- 同一道题会被复制到多个任务模板,按题目内容合并,保证一道题只返回一条 --> |
| | | GROUP BY a.script_content, b.subtask_type |
| | | ORDER BY MIN(a.id) |
| | | </select> |
| | | |
| | | <select id="getSfStatisticsScriptItemDetails" parameterType="com.ruoyi.task.domain.ServiceSubtaskCountReq" |
| | | resultMap="ServiceSubtaskScriptCountResult"> |
| | | SELECT |
| | | ssd.scriptid, |
| | | a.script_content, |
| | | ss.type as subtask_type, |
| | | 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 |
| | | INNER JOIN |
| | | <if test="type == 1"> |
| | | ivr_task_template_script a ON a.id = ssd.scriptid |
| | | </if> |
| | | <if test="type == 2"> |
| | | svy_task_template_script a ON a.id = ssd.scriptid |
| | | </if> |
| | | where 1=1 |
| | | and ss.del_flag=0 |
| | | and ssd.del_flag=0 |
| | | <if test="orgid != null and orgid != ''"> |
| | | and ss.orgid = #{orgid} |
| | | </if> |
| | |
| | | and ss.campusid = #{campusid} |
| | | </if> |
| | | <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0"> |
| | | AND ss.leavehospitaldistrictcode IN |
| | | AND (ss.leavehospitaldistrictcode IN |
| | | <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator="," |
| | | close=")"> |
| | | #{leavehospitaldistrictcode} |
| | | </foreach> |
| | | OR (ss.leavehospitaldistrictcode IS NULL AND ss.hospitaldistrictcode IN |
| | | <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator="," |
| | | close=")"> |
| | | #{leavehospitaldistrictcode} |
| | | </foreach> |
| | | )) |
| | | </if> |
| | | <if test="deptcodes != null and deptcodes.size() > 0"> |
| | | AND ss.leaveldeptcode IN |
| | |
| | | <if test="configValue != null and configValue != ''"> |
| | | AND ssd.categoryid IN (${configValue}) |
| | | </if> |
| | | group by ssd.scriptid, IFNULL(ssd.matchedtext,ssd.asrtext) |
| | | group by a.script_content, ss.type, IFNULL(ssd.matchedtext,ssd.asrtext) |
| | | </select> |
| | | |
| | | <!-- |
| | | 问题选项数字下钻:返回选择了指定选项的 service_subtask 列表。 |
| | | 过滤口径与 getSfStatisticsScriptDetails / getSfStatisticsScriptItemDetails 保持一致, |
| | | 额外支持 statisticaltype:1-病区、2-科室、3-病种。 |
| | | --> |
| | | <select id="getSfStatisticsScriptDetailsHyperlink" parameterType="com.ruoyi.task.domain.ServiceSubtaskCountReq" |
| | | resultMap="ServiceSubtaskResult"> |
| | | SELECT ss.* |
| | | FROM service_subtask ss |
| | | WHERE ss.del_flag = 0 |
| | | <if test="orgid != null and orgid != ''"> |
| | | AND ss.orgid = #{orgid} |
| | | </if> |
| | | <if test="campusid != null and campusid != ''"> |
| | | AND ss.campusid = #{campusid} |
| | | </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 ss.visit_time >= DATE(#{startTime}) |
| | | AND ss.visit_time < DATE_ADD(DATE(#{endTime}), INTERVAL 1 DAY) |
| | | </if> |
| | | <if test="type != null and type != ''"> |
| | | AND ss.type = #{type} |
| | | </if> |
| | | |
| | | <!-- 统计维度:1-按病区 2-按科室 3-按taskid --> |
| | | <if test="statisticaltype != null and statisticaltype == 1"> |
| | | <choose> |
| | | <when test="deptcode != null and deptcode != ''"> |
| | | AND ss.leavehospitaldistrictcode = #{deptcode} |
| | | </when> |
| | | <when test="leavehospitaldistrictcode != null and leavehospitaldistrictcode != ''"> |
| | | AND ss.leavehospitaldistrictcode = #{leavehospitaldistrictcode} |
| | | </when> |
| | | </choose> |
| | | </if> |
| | | <if test="statisticaltype != null and statisticaltype == 2 and deptcode != null and deptcode != ''"> |
| | | AND ss.deptcode = #{deptcode} |
| | | </if> |
| | | <if test="statisticaltype != null and statisticaltype == 3 and taskId != null"> |
| | | AND ss.taskid = #{taskId} |
| | | </if> |
| | | <!-- 兼容不传 statisticaltype 时按单值条件过滤 --> |
| | | <if test="statisticaltype == null"> |
| | | <if test="leavehospitaldistrictcode != null and leavehospitaldistrictcode != ''"> |
| | | AND ss.leavehospitaldistrictcode = #{leavehospitaldistrictcode} |
| | | </if> |
| | | <if test="deptcode != null and deptcode != ''"> |
| | | AND ss.deptcode = #{deptcode} |
| | | </if> |
| | | <if test="taskId != null"> |
| | | AND ss.taskid = #{taskId} |
| | | </if> |
| | | </if> |
| | | |
| | | <!-- 题目 + 选项匹配:只保留回答中选择了该选项的子任务 --> |
| | | AND EXISTS ( |
| | | SELECT 1 |
| | | FROM service_subtask_detail ssd |
| | | WHERE ssd.sub_id = ss.id |
| | | AND ssd.del_flag = 0 |
| | | <if test="configValue != null and configValue != ''"> |
| | | AND ssd.categoryid IN (${configValue}) |
| | | </if> |
| | | <choose> |
| | | <when test="optionText != null"> |
| | | AND IFNULL(ssd.matchedtext, ssd.asrtext) = #{optionText} |
| | | </when> |
| | | <otherwise> |
| | | AND 1 = 0 |
| | | </otherwise> |
| | | </choose> |
| | | <choose> |
| | | <!-- 优先按题目内容匹配:同一道题复制到多个任务模板时 scriptid 不同,但 script_content 相同 --> |
| | | <when test="scriptContent != null and scriptContent != ''"> |
| | | AND ssd.scriptid IN ( |
| | | <choose> |
| | | <when test="type == '1'"> |
| | | SELECT its.id FROM ivr_task_template_script its |
| | | WHERE its.script_content = #{scriptContent} |
| | | </when> |
| | | <when test="type == '2'"> |
| | | SELECT sts.id FROM svy_task_template_script sts |
| | | WHERE sts.script_content = #{scriptContent} |
| | | </when> |
| | | <otherwise> |
| | | SELECT its.id FROM ivr_task_template_script its |
| | | WHERE its.script_content = #{scriptContent} |
| | | UNION |
| | | SELECT sts.id FROM svy_task_template_script sts |
| | | WHERE sts.script_content = #{scriptContent} |
| | | </otherwise> |
| | | </choose> |
| | | ) |
| | | </when> |
| | | <when test="scriptid != null"> |
| | | AND ssd.scriptid = #{scriptid} |
| | | </when> |
| | | <otherwise> |
| | | AND 1 = 0 |
| | | </otherwise> |
| | | </choose> |
| | | ) |
| | | ORDER BY ss.endtime DESC, ss.id DESC |
| | | <if test="pageSize != null and pageSize > 0"> |
| | | LIMIT #{pageSize} |
| | | <if test="pageNum != null and pageNum >= 0"> |
| | | OFFSET #{pageNum} |
| | | </if> |
| | | </if> |
| | | </select> |
| | | |
| | | <select id="getDataByTime" resultMap="ServiceSubtaskResult"> |
| | |
| | | nurse_id, |
| | | nurse_name, |
| | | remark, |
| | | doctor_opinion, |
| | | inhospid, |
| | | patfrom, |
| | | task_guid, |
| | |
| | | SUM(CASE WHEN sendstate = 1 THEN 1 ELSE 0 END) AS blq, |
| | | SUM(CASE WHEN sendstate = 4 THEN 1 ELSE 0 END) AS wxsf, |
| | | SUM(CASE WHEN sendstate != 4 THEN 1 ELSE 0 END) AS xsf, |
| | | SUM(CASE WHEN (sendstate = 1 OR sendstate = 2 OR sendstate = 3 OR sendstate = 5 OR sendstate = 7 ) THEN 1 ELSE 0 |
| | | SUM(CASE WHEN (sendstate = 1 OR sendstate = 2 OR sendstate = 3 OR sendstate = 7 ) THEN 1 ELSE 0 |
| | | END) AS dsf, |
| | | SUM(CASE WHEN sendstate != 2 THEN 1 ELSE 0 END) AS yfs, |
| | | SUM(CASE WHEN sendstate = 2 THEN 1 ELSE 0 END) AS wfs, |
| | | SUM(CASE WHEN sendstate = 6 THEN 1 ELSE 0 END) AS ywc, |
| | | SUM(CASE WHEN sendstate = 7 THEN 1 ELSE 0 END) AS cs, |
| | | SUM(CASE WHEN excep IS NOT NULL AND excep = '1' THEN 1 ELSE 0 END) AS yc, |
| | | SUM(CASE WHEN excep IS NOT NULL AND excep = '2' THEN 1 ELSE 0 END) AS jg, |
| | | COUNT(1) as total |
| | |
| | | #{state} |
| | | </foreach> |
| | | </if> |
| | | <if test="currentPreachforms != null and currentPreachforms != ''"> |
| | | AND FIND_IN_SET(<include refid="effectiveCurrentPreachformExpr"/>, #{currentPreachforms}) |
| | | </if> |
| | | <if test="orgid != null and orgid != ''"> |
| | | AND orgid = #{orgid} |
| | | </if> |
| | |
| | | 当前登录人「待处理」随访任务,按出院年月(endtime)分组统计,出院随访 / 门诊随访分开计数。 |
| | | 口径(与随访列表「待随访」页签一致): |
| | | 1) 出院随访 service_type = '2',门诊随访 service_type = '3' |
| | | 2) 待随访(未完成)→ sendstate IN (1,2,3,5,7),排除 4 不执行 / 6 完成 |
| | | 2) 统计状态 → sendstate IN (1,2,3,7):1 被领取 / 2 待发送 / 3 已发送 / 7 超时 |
| | | (不含 4 不执行、5 发送失败、6 已完成) |
| | | 3) 出院满 7 天 → endtime < (今天 - 7 天) + 1 天, |
| | | 即「7 天前那一天」出院的也计入(用 <= DATE_SUB(...) 只会截到当天 0 点,会漏掉 9 条) |
| | | 4) 只看最近 4 个出院月份(含当月)→ endtime >= 当月往前推 3 个月的 1 号 |
| | |
| | | FROM service_subtask |
| | | WHERE del_flag = '0' |
| | | AND service_type IN ('2', '3') |
| | | AND sendstate IN (1, 2, 3, 5, 7) |
| | | <!-- 浮窗「待处理随访任务」口径:1 被领取 / 2 待发送 / 3 已发送 / 7 超时 --> |
| | | AND sendstate IN (1, 2, 3, 7) |
| | | AND endtime IS NOT NULL |
| | | AND endtime < DATE_ADD(DATE_SUB(CURDATE(), INTERVAL 7 DAY), INTERVAL 1 DAY) |
| | | AND endtime >= DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 3 MONTH), '%Y-%m-01') |
| | |
| | | COUNT(CASE WHEN sendstate = 5 THEN 1 END) AS failedVisitCount, |
| | | SUM(CASE WHEN excep IS NOT NULL AND excep = '1' THEN 1 ELSE 0 END) AS abnormalVisitCount, |
| | | SUM(CASE WHEN excep IS NOT NULL AND excep = '2' THEN 1 ELSE 0 END) AS warnningVisitCount, |
| | | COUNT(*) AS allVisitCount |
| | | FROM service_subtask |
| | | WHERE del_flag = '0' |
| | | AND service_type = '2' |
| | | AND visit_count = 1 |
| | | COUNT(*) AS allVisitCount, |
| | | <choose> |
| | | <when test="soonTimeoutHours != null and soonTimeoutHours > 0"> |
| | | COUNT(CASE WHEN t.soon_deadline > NOW() |
| | | AND t.soon_deadline <= DATE_ADD(NOW(), INTERVAL #{soonTimeoutHours} HOUR) |
| | | THEN 1 END) AS soonTimeoutCount |
| | | </when> |
| | | <otherwise> |
| | | 0 AS soonTimeoutCount |
| | | </otherwise> |
| | | </choose> |
| | | FROM ( |
| | | SELECT ss.*, |
| | | <!-- 即将超时截止时间 = 出院时间(endtime) + 发送日(send_day, 缺省1) + 补偿天数(compensate_time 求和后再 +1 天), |
| | | 与 RyTask/RedisMqReceiver 的 isSubtaskDeadline 口径保持一致; |
| | | 无有效补偿记录(cp.subid 为空)时截止时间为 NULL,不参与即将超时统计 --> |
| | | CASE |
| | | WHEN cp.subid IS NULL THEN NULL |
| | | ELSE DATE_ADD( |
| | | DATE_ADD(ss.endtime, INTERVAL COALESCE(st.send_day, 1) DAY), |
| | | INTERVAL (COALESCE(cp.compensate_days, 0) + 1) DAY |
| | | ) |
| | | END AS soon_deadline |
| | | FROM service_subtask ss |
| | | LEFT JOIN service_task st ON st.taskid = ss.taskid AND st.del_flag = '0' |
| | | <!-- 补偿时间:先按子任务聚合成一行再关联,避免一对多放大计数; |
| | | compensate_time 是 varchar 且可能存成空串,需先置空再转数字 --> |
| | | LEFT JOIN ( |
| | | SELECT subid, |
| | | SUM(CAST(COALESCE(NULLIF(TRIM(compensate_time), ''), '0') AS SIGNED)) AS compensate_days |
| | | FROM service_subtask_preachform |
| | | WHERE del_flag = 0 |
| | | GROUP BY subid |
| | | ) cp ON cp.subid = ss.id |
| | | WHERE ss.del_flag = '0' |
| | | AND ss.service_type = '2' |
| | | AND ss.visit_count = 1 |
| | | <if test="orgid != null and orgid != ''"> |
| | | AND orgid = #{orgid} |
| | | AND ss.orgid = #{orgid} |
| | | </if> |
| | | <if test="campusid != null and campusid != ''"> |
| | | and campusid = #{campusid} |
| | | and ss.campusid = #{campusid} |
| | | </if> |
| | | <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0"> |
| | | AND leavehospitaldistrictcode IN |
| | | <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" |
| | | separator="," |
| | | close=")"> |
| | | #{leavehospitaldistrictcode} |
| | | </foreach> |
| | | <!-- 离院科室/病区:有科室按科室、有病区按病区,两者都有时取 OR(原写法 1=1 会让筛选失效) --> |
| | | <if test="(leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0) |
| | | or (leaveldeptcodes != null and leaveldeptcodes.size() > 0)"> |
| | | AND ( |
| | | <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0"> |
| | | ss.leavehospitaldistrictcode IN |
| | | <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" |
| | | separator="," |
| | | close=")"> |
| | | #{leavehospitaldistrictcode} |
| | | </foreach> |
| | | </if> |
| | | <if test="(leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0) |
| | | and (leaveldeptcodes != null and leaveldeptcodes.size() > 0)"> |
| | | OR |
| | | </if> |
| | | <if test=" leaveldeptcodes != null and leaveldeptcodes.size()>0"> |
| | | ss.leaveldeptcode IN |
| | | <foreach collection="leaveldeptcodes" item="leaveldeptcode" open="(" separator="," |
| | | close=")"> |
| | | #{leaveldeptcode} |
| | | </foreach> |
| | | </if>) |
| | | </if> |
| | | <if test=" leaveldeptcodes != null and leaveldeptcodes.size()>0"> |
| | | AND leaveldeptcode IN |
| | | <foreach collection="leaveldeptcodes" item="leaveldeptcode" open="(" separator="," |
| | | close=")"> |
| | | #{leaveldeptcode} |
| | | </foreach> |
| | | </if> |
| | | ) t |
| | | </select> |
| | | |
| | | <!-- |
| | |
| | | continue_count, |
| | | continue_time_next, |
| | | task_situation, |
| | | remark |
| | | remark, |
| | | doctor_opinion |
| | | from service_subtask |
| | | where 1=1 |
| | | and del_flag = 0 |