已修改6个文件
已添加2个文件
566 ■■■■■ 文件已修改
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSubtaskCategoryCount.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSubtaskCountReq.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSubtaskScriptCount.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/ServiceSubtaskMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IServiceSubtaskService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml 182 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java
@@ -16,9 +16,11 @@
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.DtoConversionUtils;
import com.ruoyi.common.utils.PageUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.utils.reflect.ReflectUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.system.service.ISysConfigService;
import com.smartor.domain.*;
import com.smartor.mapper.PatMedInhospMapper;
import com.smartor.mapper.PatMedOuthospMapper;
@@ -66,6 +68,9 @@
    @Autowired
    private IServiceSubtaskRecordService serviceSubtaskRecordService;
    @Autowired
    private ISysConfigService configService;
    @Value("${spring.profiles.active}")
    private String active;
@@ -533,6 +538,62 @@
        return success(serviceSubtaskService.getSfStatisticsJoydetails(serviceSubtaskCountReq));
    }
    /**
     * èŽ·å–éšè®¿åˆ†ç±»ç»Ÿè®¡æ˜Žç»†
     */
    @ApiOperation("获取随访分类统计明细")
    @PostMapping("/getSfStatisticsCount")
    public Map<String, Object> getSfStatisticsCount(@RequestBody ServiceSubtaskCountReq serviceSubtaskCountReq) {
        if (CollectionUtils.isEmpty(serviceSubtaskCountReq.getServiceType())) {
            return error("服务类型不能为空");
        }
        PageUtils.startPageByPost(serviceSubtaskCountReq.getPageNum(), serviceSubtaskCountReq.getPageSize());
        String configKey = serviceSubtaskCountReq.getConfigKey();
        if(StringUtils.isNotEmpty(configKey)){
            String configValue = configService.selectConfigByKey(configKey);
            serviceSubtaskCountReq.setConfigValue(configValue);
            if(StringUtils.isEmpty(configValue)){
                String logInfo =  "getSfStatisticsCount-参数 " + configKey + " æœªé…ç½®, è¯·é…ç½®å¥½åŽé‡è¯•";
                log.error(logInfo);
                return error(logInfo);
            }
        }else {
            String logInfo =  "getSfStatisticsCount-参数configKey未传入, è¯·é…ç½®å¥½åŽé‡è¯•";
            log.error(logInfo);
            return error(logInfo);
        }
        return success(serviceSubtaskService.getSfStatisticsScript(serviceSubtaskCountReq));
    }
    @ApiOperation("获取随访分类统计明细详情")
    @PostMapping("/getSfStatisticsCountDetails")
    public AjaxResult getSfStatisticsCountDetails(@RequestBody ServiceSubtaskCountReq serviceSubtaskCountReq) {
        if (serviceSubtaskCountReq.getLeavehospitaldistrictcodes().size() == 0 && serviceSubtaskCountReq.getDeptcodes().size() == 0) {
            return error("科室或病区不能为空");
        }
        PageUtils.startPageByPost(serviceSubtaskCountReq.getPageNum(), serviceSubtaskCountReq.getPageSize());
        //复诊统计
        String configKey = serviceSubtaskCountReq.getConfigKey();
        if(StringUtils.isNotEmpty(configKey)){
            String configValue = configService.selectConfigByKey(configKey);
            if(StringUtils.isEmpty(configValue)){
                String logInfo =  "getSfStatisticsCountDetails-参数 " + configKey + " æœªé…ç½®, è¯·é…ç½®å¥½åŽé‡è¯•";
                log.error(logInfo);
                return error(logInfo);
            }
            serviceSubtaskCountReq.setConfigValue(configValue);
        }else {
            String logInfo =  "getSfStatisticsCountDetails-参数configKey未传入, è¯·é…ç½®å¥½åŽé‡è¯•";
            log.error(logInfo);
            return error(logInfo);
        }
        LoginUser loginUser = getLoginUser();
        String orgid = loginUser.getUser().getOrgid();
        serviceSubtaskCountReq.setOrgid(orgid);
        return success(serviceSubtaskService.getSfStatisticsScriptDetails(serviceSubtaskCountReq));
    }
    /**
     * å‘送短信模板
smartor/src/main/java/com/smartor/domain/ServiceSubtaskCategoryCount.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
package com.smartor.domain;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * å„科室完成量统计结果
 *
 * @author ruoyi
 * @date 2024-02-02
 */
@ApiModel(value = "ServiceSubtaskCount", description = "各科室完成量统计结果")
@Data
public class ServiceSubtaskCategoryCount {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "子任务ID")
    private Long subTaskId;
    @ApiModelProperty(value = "服务类型")
    private Long serviceType;
    @ApiModelProperty(value = "年月")
    private String month;
    @ApiModelProperty(value = "数量")
    private Long count;
    @ApiModelProperty(value = "填写数量")
    private Integer completedCount;
    @ApiModelProperty(value = "所有数量")
    private Integer allCount;
    @ApiModelProperty(value = "填写比例")
    private String completedPercent;
    @ApiModelProperty(value = "名称")
    private String name;
    public ServiceSubtaskCategoryCount(String month, Long serviceType, Long count) {
        this.serviceType = serviceType;
        this.month = month;
        this.count = count;
    }
}
smartor/src/main/java/com/smartor/domain/ServiceSubtaskCountReq.java
@@ -1,6 +1,7 @@
package com.smartor.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -61,5 +62,30 @@
    @ApiModelProperty(value = "问卷分类编码")
    private Long svyCategoryid;
    @ApiModelProperty(value = "任务类型:1,机器人语音  2,问卷;3,通知;")
    private String type;
}
    @ApiModelProperty(value = "查询参数 joyCount-满意度统计; returnVisitCount-复诊统计")
    private String configKey;
    @ApiModelProperty(value = "查询参数对应值 joyCount-满意度统计; returnVisitCount-复诊统计")
    private String configValue;
    /**
     * æœºæž„编码
     */
    @ApiModelProperty("机构编码")
    private String orgid;
    /**
     * pageNum
     */
    @ApiModelProperty("pageNum")
    private Integer pageNum;
    /**
     * pageSize
     */
    @ApiModelProperty("pageSize")
    private Integer pageSize;
}
smartor/src/main/java/com/smartor/domain/ServiceSubtaskScriptCount.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
package com.smartor.domain;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
 * å­ä»»åŠ¡é—®é¢˜é€‰é¡¹ç»Ÿè®¡ç»“æžœ
 *
 * @author é™ˆæ˜¶è¿
 * &#064;date  2025-12-31
 */
@ApiModel(value = "ServiceSubtaskScriptCount", description = "子任务问题选项统计结果")
@Data
public class ServiceSubtaskScriptCount implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * é—®é¢˜ID
     */
    @ApiModelProperty(name = "问题ID")
    private Long scriptid;
    /**
     * é—®é¢˜å†…容
     */
    @ApiModelProperty("问题内容")
    private String scriptContent;
    /**
     * å·²å¡«å†™æ•°é‡
     */
    @ApiModelProperty(value = "已填写数量")
    private Integer completedQuantity;
    /**
     * æ‰€æœ‰æ•°é‡
     */
    @ApiModelProperty(value = "所有数量")
    private Integer allQuantity;
    /**
     * å·²å¡«å†™æ¯”例
     */
    @ApiModelProperty(value = "已填写比例")
    private String completedPercentage;
    /**
     * é—®é¢˜é€‰é¡¹
     */
    @ApiModelProperty(value = "问题选项")
    private String optionText;
    /**
     * é—®é¢˜é€‰æ‹©æ•°
     */
    @ApiModelProperty(value = "问题选择数")
    private Integer chosenQuantity;
    /**
     * é€‰æ‹©æ¯”例 = (chosenQuantity / completedQuantity)
     */
    @ApiModelProperty(value = "选择比例")
    private String chosenPercentage;
    /**
     * æ˜Žç»†
     */
    @ApiModelProperty(value = "明细")
    private List<ServiceSubtaskScriptCount> details;
}
smartor/src/main/java/com/smartor/mapper/ServiceSubtaskMapper.java
@@ -105,6 +105,28 @@
    public List<ServiceSubtaskCount> getSfStatisticsJoydetails(ServiceSubtaskCountReq serviceSubtaskCountReq);
    /**
     * èŽ·å–é—®é¢˜ç»Ÿè®¡ç»“æžœï¼ˆéšè®¿ï¼‰
     *
     * @return ç»“æžœ
     */
    public List<ServiceSubtaskCount> getSfStatisticsCategory(ServiceSubtaskCountReq serviceSubtaskCountReq);
    /**
     * èŽ·å–é—®é¢˜ç»Ÿè®¡ç»“æžœï¼ˆéšè®¿ï¼‰
     *
     * @return ç»“æžœ
     */
    public List<ServiceSubtaskScriptCount> getSfStatisticsScriptDetails(ServiceSubtaskCountReq serviceSubtaskCountReq);
    /**
     * èŽ·å–é—®é¢˜å›žç­”ç»Ÿè®¡ç»“æžœï¼ˆéšè®¿ï¼‰
     *
     * @return ç»“æžœ
     */
    public List<ServiceSubtaskScriptCount> getSfStatisticsScriptItemDetails(ServiceSubtaskCountReq serviceSubtaskCountReq);
    public List<PatMedRes> getDeptRanking(PatMedReq patMedReq);
    public List<ServiceStatisticsResponse> getServiceStatistics(ServiceStatisticsRequest serviceStatisticsRequest);
smartor/src/main/java/com/smartor/service/IServiceSubtaskService.java
@@ -139,6 +139,10 @@
    public List<ServiceStatisticsResponse> getServiceStatistics(ServiceStatisticsRequest request);
    public List<ServiceSubtaskStatistic> getSfStatisticsScript(ServiceSubtaskCountReq serviceSubtaskCountReq);
    public Map<String, ServiceSubtaskScriptCount> getSfStatisticsScriptDetails(ServiceSubtaskCountReq serviceSubtaskCountReq);
    public List<PatArchiveSrmVO> sendMsgTemplate(List<PatArchiveSrmVO> patArchiveSrmVOS);
    public List<ServiceSubtaskDiagname> convertToDiagnameList(List<ServiceSubtask> subtaskList) ;
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
@@ -2368,6 +2368,8 @@
        return serviceSubtaskStatistics;
    }
    /**
     * èŽ·å–æ»¡æ„åº¦é¢˜ç›®æ€»é‡
     * type : 1-科室   2病区
@@ -2928,6 +2930,150 @@
        return serviceSubtaskMapper.getSfStatisticsJoydetails(serviceSubtaskCountReq);
    }
    /**
     * èŽ·å–éšè®¿ç»Ÿè®¡æ¯”ä¾‹
     *
     * @param serviceSubtaskCountReq
     * @return
     */
    @Override
    @Cacheable(value = "sfStatisticsJoy", key = "T(org.springframework.util.DigestUtils).md5DigestAsHex(#serviceSubtaskCountReq.toString().getBytes())", unless = "#result == null or #result.isEmpty()")
    public List<ServiceSubtaskStatistic> getSfStatisticsScript(ServiceSubtaskCountReq serviceSubtaskCountReq) {
        log.error("getSfStatisticsScript的入参为:{}", serviceSubtaskCountReq);
        List<ServiceSubtaskStatistic> serviceSubtaskStatistics = new ArrayList<>();
        // æ ¹æ®æ¡ä»¶è¿›è¡Œåˆ†ç»„
        Map<String, List<ServiceSubtask>> collect = new HashMap<>();
        String orgid = null;
        if (serviceSubtaskCountReq.getLeavehospitaldistrictcodes() != null && serviceSubtaskCountReq.getLeavehospitaldistrictcodes().size() > 0) {
            if (serviceSubtaskCountReq.getDrcode() != null && !serviceSubtaskCountReq.getDrcode().isEmpty()) {
                collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDrname()).orElse("Unknown")));
            } else {
                collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getLeavehospitaldistrictname()).orElse("Unknown")));
            }
        } else if (serviceSubtaskCountReq.getDeptcodes() != null && serviceSubtaskCountReq.getDeptcodes().size() > 0) {
            if (serviceSubtaskCountReq.getDrcode() != null && !serviceSubtaskCountReq.getDrcode().isEmpty()) {
                collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDrname()).orElse("Unknown")));
            } else {
                collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDeptname()).orElse("Unknown")));
            }
        }
        //获取随访统计
        List<ServiceSubtaskCount> subCount = new ArrayList<>();
        subCount = serviceSubtaskMapper.getSfStatisticsCategory(serviceSubtaskCountReq);
        for (List<ServiceSubtask> serviceSubtaskList : collect.values()) {
            if (CollectionUtils.isEmpty(serviceSubtaskList)) {
                continue;
            }
            ServiceSubtaskStatistic statistic = getStatisticJoy(serviceSubtaskList, subCount);
            //及时率
            ServiceSubtask ss = new ServiceSubtask();
            orgid = serviceSubtaskList.get(0).getOrgid();
            ss.setOrgid(orgid);
            // å¦‚果有医生编码,设置医生编码用于及时率查询
            if (serviceSubtaskCountReq.getDrcode() != null && !serviceSubtaskCountReq.getDrcode().isEmpty()) {
                ss.setDrcode(serviceSubtaskList.get(0).getDrcode());
            } else {
                if (CollectionUtils.isNotEmpty(serviceSubtaskCountReq.getLeavehospitaldistrictcodes())) {
                    ss.setLeavehospitaldistrictcode(serviceSubtaskList.get(0).getLeavehospitaldistrictcode());
                } else if (CollectionUtils.isNotEmpty(serviceSubtaskCountReq.getDeptcodes())) {
                    ss.setDeptcode(serviceSubtaskList.get(0).getDeptcode());
                }
            }
            ss.setStarttime(serviceSubtaskCountReq.getStartTime());
            ss.setEndtime(serviceSubtaskCountReq.getEndTime());
            if (serviceSubtaskCountReq.getEndTime() != null && new Date().before(serviceSubtaskCountReq.getEndTime())) {
                ss.setEndtime(new Date());
            }
            Double jsRate = serviceSubtaskMapper.selectTimelyRate(ss);
            statistic.setRate(jsRate);
            if (ObjectUtils.isNotEmpty(statistic)) {
                serviceSubtaskStatistics.add(statistic);
            }
        }
        if (CollectionUtils.isNotEmpty(serviceSubtaskStatistics)) {
            for (ServiceSubtaskStatistic serviceSubtaskStatistic : serviceSubtaskStatistics) {
                //获取满意度题目总量
                BigDecimal mydtmzlsum = new BigDecimal(0);
                //获取满意度题目填报量
                BigDecimal mydtblsum = new BigDecimal(0);
                //完成比例
                Double wcbl = null;
                if(ObjectUtils.isNotEmpty(serviceSubtaskStatistic.getJoyAllCount())){
                    mydtblsum = new BigDecimal(serviceSubtaskStatistic.getJoyAllCount());
                }
                if(ObjectUtils.isNotEmpty(serviceSubtaskStatistic.getJoyCount())){
                    mydtmzlsum = new BigDecimal(serviceSubtaskStatistic.getJoyCount());
                }
                if(mydtmzlsum.intValue() != 0){
                    wcbl = mydtblsum.divide(mydtmzlsum, 2, RoundingMode.HALF_UP).doubleValue();
                }
                serviceSubtaskStatistic.setJoyAllCount(mydtmzlsum.intValue());
                serviceSubtaskStatistic.setJoyCount(mydtblsum.intValue());
                serviceSubtaskStatistic.setJoyTotal(wcbl);
            }
        }
        return serviceSubtaskStatistics;
    }
    @Override
    public Map<String, ServiceSubtaskScriptCount> getSfStatisticsScriptDetails(ServiceSubtaskCountReq serviceSubtaskCountReq) {
        Map<String, ServiceSubtaskScriptCount> result = new HashMap<>();
        List<ServiceSubtaskScriptCount> allCounts = new ArrayList<>();
        List<ServiceSubtaskScriptCount> allItemCounts = new ArrayList<>();
        if(ObjectUtils.isEmpty(serviceSubtaskCountReq.getType())){
            //查询语音统计明细
            serviceSubtaskCountReq.setType("1");
            List<ServiceSubtaskScriptCount> ivyCounts = serviceSubtaskMapper.getSfStatisticsScriptDetails(serviceSubtaskCountReq);
            List<ServiceSubtaskScriptCount> ivyItemCounts = serviceSubtaskMapper.getSfStatisticsScriptItemDetails(serviceSubtaskCountReq);
            //查询短信统计明细
            serviceSubtaskCountReq.setType("2");
            List<ServiceSubtaskScriptCount> svyCounts = serviceSubtaskMapper.getSfStatisticsScriptDetails(serviceSubtaskCountReq);
            List<ServiceSubtaskScriptCount> svyItemCounts = serviceSubtaskMapper.getSfStatisticsScriptItemDetails(serviceSubtaskCountReq);
            allCounts.addAll(ivyCounts);
            allCounts.addAll(svyCounts);
            allItemCounts.addAll(ivyItemCounts);
            allItemCounts.addAll(svyItemCounts);
        }else {
            allCounts = serviceSubtaskMapper.getSfStatisticsScriptDetails(serviceSubtaskCountReq);
            allItemCounts = serviceSubtaskMapper.getSfStatisticsScriptItemDetails(serviceSubtaskCountReq);
        }
        for(ServiceSubtaskScriptCount count : allCounts){
            List<ServiceSubtaskScriptCount> itemCounts = new ArrayList<>();
            allItemCounts.forEach(itemCount ->{
                if(ObjectUtils.isNotEmpty(count.getScriptid()) && ObjectUtils.isNotEmpty(itemCount.getScriptid())){
                    if(count.getScriptid().equals(itemCount.getScriptid())){
                        //放入统计信息
                        itemCount.setScriptContent(count.getScriptContent());
                        itemCount.setCompletedQuantity(count.getCompletedQuantity());
                        itemCount.setAllQuantity(count.getAllQuantity());
                        //计算选择比例
                        int chosenQuantity = ObjectUtils.isNotEmpty(itemCount.getChosenQuantity())?itemCount.getChosenQuantity():0;
                        int completedQuantity = itemCount.getCompletedQuantity();
                        if(ObjectUtils.isNotEmpty(completedQuantity) && completedQuantity != 0){
                            BigDecimal chosenPercentage = (new BigDecimal(chosenQuantity)).divide(new BigDecimal(completedQuantity), 2, RoundingMode.HALF_UP);
                            itemCount.setChosenPercentage(chosenPercentage.toString());
                        }
                        itemCounts.add(itemCount);
                    }
                }
            });
            count.setDetails(itemCounts);
            result.put(count.getScriptid().toString(),count);
        }
        return result;
    }
    /**
     * @param serviceSubtask
smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml
@@ -100,6 +100,17 @@
    </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,
@@ -1285,6 +1296,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,