1.省立同德新增满意度接口(未开发完)
2.字段修改将isMust修改成ismandatory (是否必填 1必填 2不必填(默认))
已修改23个文件
已添加2个文件
740 ■■■■■ 文件已修改
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskDetailController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/DTO/QuestionCountKsOrBqDTO.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/IvrLibaTemplateScript.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/IvrLibaTemplateScriptVO.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/IvrTaskTemplateScript.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/IvrTaskTemplateScriptVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSubtaskDetailRatioExport.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/SvyLibTemplateScript.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/SvyLibTemplateScriptVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/SvyLibTemplateScriptWjx.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/SvyTaskScript.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/SvyTaskScriptoption.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/SvyTaskTemplateScript.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/SvyTaskTemplateScriptVO.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/SvyTopic.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/VO/QuestionCountKsOrBqVO.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/VO/QuestionResultVO.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/ServiceSubtaskMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IServiceSubtaskDetailService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IServiceSubtaskService.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/IvrLibaTemplateScriptMapper.xml 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/IvrTaskTemplateScriptMapper.xml 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml 347 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/SvyTaskTemplateScriptMapper.xml 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskDetailController.java
@@ -12,6 +12,7 @@
import com.smartor.domain.*;
import com.smartor.domain.DTO.QuestionResultDTO;
import com.smartor.domain.DTO.ServiceSubtaskDetailDTO;
import com.smartor.domain.VO.QuestionCountKsOrBqVO;
import com.smartor.domain.VO.QuestionResultVO;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.service.IServiceSubtaskDetailService;
@@ -221,8 +222,7 @@
        // æŒ‰ questiontext åˆ†ç»„后转换为 QuestionResultVO
        List<QuestionResultDTO> result = new ArrayList<>();
        if (!detailList.isEmpty()) {
            Map<String, List<ServiceSubtaskDetailRatioExport>> groupedMap = detailList.stream()
                    .collect(Collectors.groupingBy(ServiceSubtaskDetailRatioExport::getQuestiontext));
            Map<String, List<ServiceSubtaskDetailRatioExport>> groupedMap = detailList.stream().collect(Collectors.groupingBy(ServiceSubtaskDetailRatioExport::getQuestiontext));
            groupedMap.forEach((questionText, exportList) -> {
                QuestionResultDTO questionResultDTO = new QuestionResultDTO();
@@ -234,4 +234,10 @@
        return success(result);
    }
    @ApiOperation("省立同德满意度数据统计通过科室或病区")
    @PostMapping("/statQuestionOptionByKsOrBq")
    public Map<String, Object> statQuestionOptionByKsOrBq(@RequestBody QuestionCountKsOrBqVO questionResultVO) {
        return success(serviceSubtaskService.statQuestionOptionByKsOrBq(questionResultVO));
    }
}
smartor/src/main/java/com/smartor/domain/DTO/QuestionCountKsOrBqDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,77 @@
package com.smartor.domain.DTO;
import com.ruoyi.common.core.domain.BaseEntity;
import com.smartor.domain.ServiceSubtaskDetailRatioExport;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * é—®å·ç»“æžœ
 *
 * @author ruoyi
 * @date 2024-02-02
 */
@ApiModel(value = "QuestionResultDTO", description = "问卷结果")
@Data
public class QuestionCountKsOrBqDTO extends BaseEntity {
    private static final long serialVersionUID = 1L;
    /**
     * é—®å·é¢˜ç›®
     */
    @ApiModelProperty(value = "问卷题目")
    private String qeustionText;
    /**
     * é—®å·ç»“果集合
     */
    @ApiModelProperty(value = "任务id")
    private Long taskid;
    /**
     * é—®å·ç»“果集合
     */
    @ApiModelProperty(value = "部门名称")
    private String deptname;
    /**
     * é—®å·ç»“果集合
     */
    @ApiModelProperty(value = "病区名称")
    private String leavehospitaldistrictname;
    /**
     * é—®å·ç»“果集合
     */
    @ApiModelProperty(value = "选项")
    private String targetvalue;
    /**
     * é—®å·ç»“果集合
     */
    @ApiModelProperty(value = "选项结果")
    private String asrtext;
    /**
     * é—®å·ç»“果集合
     */
    @ApiModelProperty(value = "回答数量")
    private String answerCount;
    /**
     * é—®å·ç»“果集合
     */
    @ApiModelProperty(value = "单题得分")
    private String singleScore;
    /**
     * å¹³å‡å¾—分
     */
    @ApiModelProperty(value = "平均得分")
    private String avgScore;
}
smartor/src/main/java/com/smartor/domain/IvrLibaTemplateScript.java
@@ -329,9 +329,9 @@
    /**
     * æ˜¯å¦å¿…填(给人工用的,AI不用遵守)
     */
    @Excel(name = "是否必填(给人工用的,AI不用遵守)")
    @ApiModelProperty(value = "是否必填(给人工用的,AI不用遵守)")
    private String isMust;
    @Excel(name = "是否必填   1必填   2不必填(默认)(给人工用的,AI不用遵守)")
    @ApiModelProperty(value = "是否必填   1必填   2不必填(默认)")
    private String ismandatory;
    /**
     * ç»„别
smartor/src/main/java/com/smartor/domain/IvrLibaTemplateScriptVO.java
@@ -357,9 +357,9 @@
    /**
     * æ˜¯å¦å¿…填(给人工用的,AI不用遵守)
     */
    @Excel(name = "是否必填(给人工用的,AI不用遵守)")
    @ApiModelProperty(value = "是否必填(给人工用的,AI不用遵守)")
    private String isMust;
    @Excel(name = "是否必填   1必填   2不必填(默认)是否必填(给人工用的,AI不用遵守)")
    @ApiModelProperty(value = "是否必填   1必填   2不必填(默认)  ç»™äººå·¥ç”¨çš„,AI不用遵守)")
    private String ismandatory;
    /**
     * é—®é¢˜ç»“果(给“值类型”是文本或者数值用的)
smartor/src/main/java/com/smartor/domain/IvrTaskTemplateScript.java
@@ -276,7 +276,7 @@
     */
    @Excel(name = "是否必填,1:必填    2:可以不填    ", readConverterExp = "给=人工用的,AI不用遵守")
    @ApiModelProperty(value = "是否必填,1:必填    2:可以不填    ï¼ˆç»™äººå·¥ç”¨çš„,AI不用遵守)")
    private String isMust;
    private String ismandatory;
    /**
     * é—®é¢˜ç»“果(给“值类型”是文本或者数值用的)
smartor/src/main/java/com/smartor/domain/IvrTaskTemplateScriptVO.java
@@ -320,7 +320,7 @@
     */
    @Excel(name = "是否必填,1:必填    2:可以不填    ", readConverterExp = "给=人工用的,AI不用遵守")
    @ApiModelProperty(value = "是否必填,1:必填    2:可以不填    ï¼ˆç»™äººå·¥ç”¨çš„,AI不用遵守)")
    private String isMust;
    private String ismandatory;
    /**
     * é—®é¢˜ç»“果(给“值类型”是文本或者数值用的)
smartor/src/main/java/com/smartor/domain/ServiceSubtaskDetailRatioExport.java
@@ -50,4 +50,30 @@
    @Excel(name = "任务编号")
    private String taskid;
    /**
     * éƒ¨é—¨code
     */
    @Excel(name = "  éƒ¨é—¨code")
    @ApiModelProperty(value = "部门code")
    private String deptcode;
    /**
     * ç§‘室名称
     */
    @Excel(name = "科室名称")
    @ApiModelProperty(value = "科室名称")
    private String deptname;
    /**
     * å‡ºé™¢ç—…区编号
     */
    @ApiModelProperty(value = "出院病区编号")
    private String leavehospitaldistrictcode;
    /**
     * å‡ºé™¢ç—…区名称
     */
    @ApiModelProperty(value = "出院病区名称")
    @Excel(name = " å‡ºé™¢ç—…区名称 ")
    private String leavehospitaldistrictname;
}
smartor/src/main/java/com/smartor/domain/SvyLibTemplateScript.java
@@ -96,8 +96,8 @@
    /**
     * æ˜¯å¦å¿…å¡«   0必填   1不必填
     */
    @Excel(name = " æ˜¯å¦å¿…å¡«   0必填   1不必填")
    @ApiModelProperty("是否必填   0必填   1不必填")
    @Excel(name = " æ˜¯å¦å¿…å¡«   1必填   2不必填(默认)")
    @ApiModelProperty("是否必填   1必填   2不必填(默认)")
    private String ismandatory;
    /**
smartor/src/main/java/com/smartor/domain/SvyLibTemplateScriptVO.java
@@ -132,8 +132,8 @@
    /**
     * æ˜¯å¦å¿…å¡«   0必填   1不必填
     */
    @Excel(name = " æ˜¯å¦å¿…å¡«   0必填   1不必填")
    @ApiModelProperty("是否必填   0必填   1不必填")
    @Excel(name = " æ˜¯å¦å¿…å¡«   1必填   2不必填(默认)")
    @ApiModelProperty("是否必填   1必填   2不必填(默认)")
    private String ismandatory;
    /**
smartor/src/main/java/com/smartor/domain/SvyLibTemplateScriptWjx.java
@@ -89,7 +89,7 @@
    /**
     * æ˜¯å¦å¿…å¡«   0必填   1不必填
     */
    @ApiModelProperty(value = "是否必填   0必填   1不必填")
    @ApiModelProperty(value = "是否必填   1必填   2不必填(默认)")
    private String ismandatory;
    /**
smartor/src/main/java/com/smartor/domain/SvyTaskScript.java
@@ -64,8 +64,8 @@
    /**
     * æ˜¯å¦å¿…å¡«
     */
    @Excel(name = " æ˜¯å¦å¿…å¡« ")
    @ApiModelProperty(value = "是否必填")
    @Excel(name = " æ˜¯å¦å¿…å¡«   1必填   2不必填(默认) ")
    @ApiModelProperty(value = "是否必填   1必填   2不必填(默认)")
    private Long ismandatory;
    /**
smartor/src/main/java/com/smartor/domain/SvyTaskScriptoption.java
@@ -78,8 +78,8 @@
    /**
     * æ˜Žç»†æ˜¯å¦å¿…å¡«
     */
    @Excel(name = " æ˜Žç»†æ˜¯å¦å¿…å¡« ")
    @ApiModelProperty(value = "明细是否必填")
    @Excel(name = " æ˜¯å¦å¿…å¡«   1必填   2不必填(默认) ")
    @ApiModelProperty(value = "是否必填   1必填   2不必填(默认)")
    private Long detailismandatory;
    /**
smartor/src/main/java/com/smartor/domain/SvyTaskTemplateScript.java
@@ -104,7 +104,7 @@
     * æ˜¯å¦å¿…å¡«,1:必填    2:可以不填    ï¼ˆç»™äººå·¥ç”¨çš„,AI不用遵守)
     */
    @ApiModelProperty(value = "是否必填,1:必填    2:可以不填  ")
    private String isMust;
    private String ismandatory;
    /**
     * æ˜¯å¦å­˜åœ¨æ“ä½œï¼š1 æ–°å¢ž 2修改 3删除
smartor/src/main/java/com/smartor/domain/SvyTaskTemplateScriptVO.java
@@ -95,14 +95,6 @@
    @ApiModelProperty(value = "话术内容")
    private String scriptContent;
    /**
     * æ˜¯å¦å¿…å¡«,1:必填    2:可以不填    ï¼ˆç»™äººå·¥ç”¨çš„,AI不用遵守)
     */
    @ApiModelProperty(value = "是否必填,1:必填    2:可以不填 ")
    private String isMust;
    /**
     * åˆ é™¤æ ‡è®°
     */
@@ -311,10 +303,10 @@
    private Long categoryid;
    /**
     * æ˜¯å¦å¿…å¡«   0必填   1不必填
     * æ˜¯å¦å¿…å¡«  1必填   2不必填
     */
    @Excel(name = " æ˜¯å¦å¿…å¡«   0必填   1不必填")
    @ApiModelProperty("是否必填   0必填   1不必填")
    @Excel(name = " æ˜¯å¦å¿…å¡«  1必填   2不必填")
    @ApiModelProperty("是否必填  1必填   2不必填")
    private String ismandatory;
smartor/src/main/java/com/smartor/domain/SvyTopic.java
@@ -55,9 +55,9 @@
    private Long sort;
    /**
     * æ˜¯å¦å¿…å¡«
     * æ˜¯å¦å¿…å¡«   1必填   2不必填(默认)
     */
    @Excel(name = " æ˜¯å¦å¿…å¡« ")
    @Excel(name = " æ˜¯å¦å¿…å¡«   1必填   2不必填(默认) ")
    private Long ismandatory;
    /**
smartor/src/main/java/com/smartor/domain/VO/QuestionCountKsOrBqVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
package com.smartor.domain.VO;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import com.smartor.domain.ServiceSubtaskDetailRatioExport;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.ibatis.annotations.Param;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import java.util.List;
/**
 * é—®é¢˜ç»Ÿè®¡æ ¹æ®ç§‘室或病区查询
 *
 * @author ls
 * @date 2026-09-11
 */
@ApiModel(value = "QuestionCountKsOrBqVO", description = "问题统计根据科室或病区查询")
@Data
public class QuestionCountKsOrBqVO extends BaseEntity {
    private static final long serialVersionUID = 1L;
    /**
     * ç§‘室与病区的查询是or还是and:   1:and(默认)(离院病区与离院科室组合)     2:or(离院病区与离院科室组合)    3:and(离院病区与随访科室组合)   4:or(离院病区与随访科室组合)
     */
    @ApiModelProperty(value = "科室与病区的查询是or还是and:   1:and(默认)(离院病区与离院科室组合)     2:or(离院病区与离院科室组合)    3:and(离院病区与随访科室组合)   4:or(离院病区与随访科室组合)")
    private String deptOrDistrict = "1";
    /**
     *
     */
    @ApiModelProperty(value = "主键id")
    private Long subId;
    /**
     * å‡ºé™¢ç—…区编号
     */
    @ApiModelProperty(value = "出院病区集合(必填)")
    private List<String> leavehospitaldistrictcodes;
    /**
     * éƒ¨é—¨code
     */
    @Excel(name = "  éƒ¨é—¨code")
    @ApiModelProperty(value = "部门code集合")
    private List<String> leaveldeptcodes;
    /**
     * å¼€å§‹å‡ºé™¢æ—¥æœŸ
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "开始完成日期")
    private Date startFinisTime;
    /**
     * ç»“束出院日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "结束完成日期")
    private Date endFinishTime;
    @ApiModelProperty(value = "问题类型(1.单选 2多选 3问答 4填空  5其它)")
    private String valueType;
}
smartor/src/main/java/com/smartor/domain/VO/QuestionResultVO.java
@@ -41,6 +41,13 @@
    @ApiModelProperty(value = "出院病区集合(必填)")
    private List<String> leavehospitaldistrictcodes;
    /**
     * éƒ¨é—¨code
     */
    @Excel(name = "  éƒ¨é—¨code")
    @ApiModelProperty(value = "部门code集合")
    private List<String> leaveldeptcodes;
    /**
     * ä¸»é”®id集合
@@ -64,7 +71,6 @@
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "结束出院日期")
    private Date endOutHospTime;
    /**
     * é—®é¢˜å†…容
smartor/src/main/java/com/smartor/mapper/ServiceSubtaskMapper.java
@@ -1,8 +1,10 @@
package com.smartor.mapper;
import com.smartor.domain.*;
import com.smartor.domain.DTO.QuestionCountKsOrBqDTO;
import com.smartor.domain.VO.PatSatisfactionReqVO;
import com.smartor.domain.VO.HeLibraryCountVO;
import com.smartor.domain.VO.QuestionCountKsOrBqVO;
import com.smartor.domain.VO.ServiceSubtaskCotinueCountVO;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.domain.entity.ServiceSubtaskSatisfactionEntity;
@@ -274,4 +276,11 @@
     */
    List<ServiceSubtaskDetailRatioExport> statQuestionOptionBySubtaskIds(@Param("subtaskIds") List<Long> subtaskIds, @Param("startOutHospTime") Date startOutHospTime, @Param("endOutHospTime") Date endOutHospTime, @Param("scoreStart") Double scoreStart, @Param("scoreEnd") Double scoreEnd, @Param("questiontext") String questiontext, @Param("valueType") String valueType);
    /**
     * æ ¹æ®ç§‘室、病区、题目类型统计的科室、病区评分
     * @param questionCountKsOrBqVO
     * @return
     */
    List<QuestionCountKsOrBqDTO> statQuestionOptionByKsOrBq(QuestionCountKsOrBqVO questionCountKsOrBqVO);
}
smartor/src/main/java/com/smartor/service/IServiceSubtaskDetailService.java
@@ -31,6 +31,7 @@
    public Map<String, Object> selectServiceSubtaskDetailList(ServiceSubtaskDetail serviceSubtaskDetail);
    public List<Map<String, Object>> getServiceSubtaskDetails(ServiceSubtaskDetailVO serviceSubtaskDetailVo);
    /**
     * æ–°å¢žè¯­éŸ³ä»»åŠ¡å‘¼å«æ˜Žç»†
     *
smartor/src/main/java/com/smartor/service/IServiceSubtaskService.java
@@ -2,12 +2,10 @@
import com.ruoyi.common.core.domain.AjaxResult;
import com.smartor.domain.*;
import com.smartor.domain.DTO.QuestionCountKsOrBqDTO;
import com.smartor.domain.DTO.QuestionResultDTO;
import com.smartor.domain.ServiceSubtask;
import com.smartor.domain.VO.HeLibraryCountVO;
import com.smartor.domain.VO.QuestionResultVO;
import com.smartor.domain.VO.ServiceSubtaskCotinueCountVO;
import com.smartor.domain.VO.TransferDeptVO;
import com.smartor.domain.VO.*;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import org.springframework.web.bind.annotation.RequestBody;
@@ -236,6 +234,8 @@
     */
    public List<ServiceSubtaskDetailRatioExport> statQuestionOptionBySubtaskIds(List<Long> subtaskIds, Date startOutHospTime, Date endOutHospTime, String scriptContent, Double scoreStart, Double scoreEnd, String valueType);
    public List<QuestionCountKsOrBqDTO> statQuestionOptionByKsOrBq(QuestionCountKsOrBqVO questionCountKsOrBqVO);
    public String scanGenerateSubtask(ServiceTask serviceTaskVo);
    public Integer matchOptionIndex(String url, String questionText, String voiceText, List<IvrTaskTemplateTargetoption> options, String uuid);
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
@@ -22,13 +22,11 @@
import com.smartor.common.MtSubmitSmUtil;
import com.smartor.common.ScheduleSubtaskBuilder;
import com.smartor.config.PhoneUtils;
import com.smartor.domain.DTO.QuestionCountKsOrBqDTO;
import com.smartor.domain.DTO.QuestionResultDTO;
import com.smartor.domain.DTO.ServiceSubtaskDetailDTO;
import com.smartor.domain.*;
import com.smartor.domain.VO.HeLibraryCountVO;
import com.smartor.domain.VO.QuestionResultVO;
import com.smartor.domain.VO.ServiceSubtaskCotinueCountVO;
import com.smartor.domain.VO.TransferDeptVO;
import com.smartor.domain.VO.*;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.mapper.*;
import com.smartor.service.*;
@@ -672,10 +670,8 @@
            //如果不存在,则新增
            ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
            if (ObjectUtils.isNotEmpty(serviceTask)) {
                serviceSubtask.setDeptcode(serviceTask.getDeptcode());
                serviceSubtask.setTaskDesc(serviceTask.getTaskDesc());
                serviceSubtask.setTaskName(serviceTask.getTaskName());
                serviceSubtask.setDeptname(serviceTask.getDeptname());
                serviceSubtask.setTemplatename(serviceTask.getTemplatename());
            }
@@ -2923,12 +2919,10 @@
                collect = rawData.stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDrcode()).orElse("Unknown")));
                break;
            case "management_doctor_code":
                rawData = rawData.stream()
                        .peek(item -> {
                            item.setDrname(item.getManagementDoctor());
                            item.setDrcode(item.getManagementDoctorCode());
                        })
                        .collect(Collectors.toList());
                rawData = rawData.stream().peek(item -> {
                    item.setDrname(item.getManagementDoctor());
                    item.setDrcode(item.getManagementDoctorCode());
                }).collect(Collectors.toList());
                collect = rawData.stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getManagementDoctorCode()).orElse("Unknown")));
                break;
            case "deptcode":
@@ -5012,7 +5006,7 @@
    }
    @Override
    public List<ServiceSubtaskDetailRatioExport> statQuestionOption(List<Long> taskIds, Date startOutHospTime, Date endOutHospTime, String scriptContent, Double scoreStart, Double scoreEnd,String valueType) {
    public List<ServiceSubtaskDetailRatioExport> statQuestionOption(List<Long> taskIds, Date startOutHospTime, Date endOutHospTime, String scriptContent, Double scoreStart, Double scoreEnd, String valueType) {
        //先清理一下重复数据
        List<Long> repeatIds = serviceSubtaskDetailMapper.selectRepeatDetailIds();
        if (!CollectionUtils.isEmpty(repeatIds)) {
@@ -5028,14 +5022,10 @@
                // å¦‚果有多条目标值,拆分成多行
                for (String value : values) {
                    //先去 result ä¸­æŸ¥ä¸€ä¸‹ï¼Œæœ‰æ²¡æœ‰è¿™ä¸ª questiontext å’Œå¯¹åº”çš„ targetvalue
                    ServiceSubtaskDetailRatioExport existingExport = result.stream()
                            .filter(e -> e.getQuestiontext().equals(export.getQuestiontext())
                                    && value.trim().equals(e.getTargetvalue()))
                            .findFirst()
                            .orElse(null);
                    ServiceSubtaskDetailRatioExport existingExport = result.stream().filter(e -> e.getQuestiontext().equals(export.getQuestiontext()) && value.trim().equals(e.getTargetvalue())).findFirst().orElse(null);
                    if (existingExport != null && existingExport.getRatio().equals("0") && existingExport.getCount().equals("0")) {
                        //如果存在,则将 result é‡Œçš„这个问题所对应的 Targetvalue=value è¿™æ¡æ•°æ®æ›´æ–°æˆå½“前这条数据
                        if(value.equals(export.getOptionresult())) {
                        if (value.equals(export.getOptionresult())) {
                            existingExport.setRatio(export.getRatio());
                            existingExport.setScore(export.getScore());
                            existingExport.setCount(export.getCount());
@@ -5063,15 +5053,62 @@
        return result;
    }
    /*
     * æ ¹æ®ç§‘室或病区统计问卷选项(科室、题目查询的科室评分表)
     */
    @Override
    public List<ServiceSubtaskDetailRatioExport> statQuestionOptionBySubtaskIds(List<Long> subtaskIds, Date startOutHospTime, Date endOutHospTime, String scriptContent, Double scoreStart, Double scoreEnd,String valueType) {
    public List<QuestionCountKsOrBqDTO> statQuestionOptionByKsOrBq(QuestionCountKsOrBqVO questionCountKsOrBqVO) {
        List<QuestionCountKsOrBqDTO> questionCountKsOrBqDTOS = serviceSubtaskMapper.statQuestionOptionByKsOrBq(questionCountKsOrBqVO);
        // å¤„理 targetvalue:按 & åˆ†å‰²æˆå¤šæ¡è®°å½•
        List<QuestionCountKsOrBqDTO> result = new ArrayList<>();
        for (QuestionCountKsOrBqDTO questionCountKsOrBqDTO : questionCountKsOrBqDTOS) {
            if (StringUtils.isNotEmpty(questionCountKsOrBqDTO.getTargetvalue()) && questionCountKsOrBqDTO.getTargetvalue().contains("&")) {
                String[] values = questionCountKsOrBqDTO.getTargetvalue().split("&");
                // å¦‚果有多条目标值,拆分成多行
                for (String value : values) {
                    //先去 result ä¸­æŸ¥ä¸€ä¸‹ï¼Œæœ‰æ²¡æœ‰è¿™ä¸ª questiontext å’Œå¯¹åº”çš„ targetvalue
                    QuestionCountKsOrBqDTO existingExport = result.stream().filter(e -> e.getQeustionText().equals(questionCountKsOrBqDTO.getQeustionText()) && value.trim().equals(e.getTargetvalue())).findFirst().orElse(null);
                    if (existingExport != null && existingExport.getAnswerCount().equals("0") && existingExport.getSingleScore().equals("0")) {
                        //如果存在,则将 result é‡Œçš„这个问题所对应的 Targetvalue=value è¿™æ¡æ•°æ®æ›´æ–°æˆå½“前这条数据
                        if (value.equals(questionCountKsOrBqDTO.getAsrtext())) {
                            existingExport.setAsrtext(questionCountKsOrBqDTO.getAsrtext());
                            existingExport.setAnswerCount(questionCountKsOrBqDTO.getAnswerCount());
                            existingExport.setSingleScore(questionCountKsOrBqDTO.getSingleScore());
                            existingExport.setAvgScore(questionCountKsOrBqDTO.getAvgScore());
                        }
                    } else if (existingExport != null && !existingExport.getAnswerCount().equals("0")) {
                        continue;
                    } else {
                        QuestionCountKsOrBqDTO qcDto = DtoConversionUtils.sourceToTarget(questionCountKsOrBqDTO, QuestionCountKsOrBqDTO.class);
                        qcDto.setTargetvalue(value.trim()); // targetvalue æ˜¾ç¤ºå•个选项
                        if (!value.equals(qcDto.getAsrtext())) {
                            existingExport.setAsrtext(null);
                            existingExport.setAnswerCount("0");
                            existingExport.setSingleScore("0");
                            existingExport.setAvgScore("0");
                        }
                        result.add(qcDto);
                    }
                }
            } else {
                // targetvalue ä¸åŒ…含 &,直接添加到结果
                result.add(questionCountKsOrBqDTO);
            }
        }
        return result;
    }
    @Override
    public List<ServiceSubtaskDetailRatioExport> statQuestionOptionBySubtaskIds(List<Long> subtaskIds, Date startOutHospTime, Date endOutHospTime, String scriptContent, Double scoreStart, Double scoreEnd, String valueType) {
        //先清理一下重复数据
        List<Long> repeatIds = serviceSubtaskDetailMapper.selectRepeatDetailIds();
        if (!CollectionUtils.isEmpty(repeatIds)) {
            serviceSubtaskDetailMapper.deleteRepeatDetailByIds(repeatIds);
        }
        List<ServiceSubtaskDetailRatioExport> serviceSubtaskDetailRatioExports = serviceSubtaskMapper.statQuestionOptionBySubtaskIds(subtaskIds, startOutHospTime, endOutHospTime, scoreStart, scoreEnd, scriptContent,valueType);
        List<ServiceSubtaskDetailRatioExport> serviceSubtaskDetailRatioExports = serviceSubtaskMapper.statQuestionOptionBySubtaskIds(subtaskIds, startOutHospTime, endOutHospTime, scoreStart, scoreEnd, scriptContent, valueType);
        // å¤„理 targetvalue:按 & åˆ†å‰²æˆå¤šæ¡è®°å½•
        List<ServiceSubtaskDetailRatioExport> result = new ArrayList<>();
        for (ServiceSubtaskDetailRatioExport export : serviceSubtaskDetailRatioExports) {
@@ -5080,14 +5117,10 @@
                // å¦‚果有多条目标值,拆分成多行
                for (String value : values) {
                    //先去 result ä¸­æŸ¥ä¸€ä¸‹ï¼Œæœ‰æ²¡æœ‰è¿™ä¸ª questiontext å’Œå¯¹åº”çš„ targetvalue
                    ServiceSubtaskDetailRatioExport existingExport = result.stream()
                            .filter(e -> e.getQuestiontext().equals(export.getQuestiontext())
                                    && value.trim().equals(e.getTargetvalue()))
                            .findFirst()
                            .orElse(null);
                    ServiceSubtaskDetailRatioExport existingExport = result.stream().filter(e -> e.getQuestiontext().equals(export.getQuestiontext()) && value.trim().equals(e.getTargetvalue())).findFirst().orElse(null);
                    if (existingExport != null && existingExport.getRatio().equals("0") && existingExport.getCount().equals("0")) {
                        //如果存在,则将 result é‡Œçš„这个问题所对应的 Targetvalue=value è¿™æ¡æ•°æ®æ›´æ–°æˆå½“前这条数据
                        if(value.equals(export.getOptionresult())) {
                        if (value.equals(export.getOptionresult())) {
                            existingExport.setRatio(export.getRatio());
                            existingExport.setScore(export.getScore());
                            existingExport.setCount(export.getCount());
@@ -5813,11 +5846,11 @@
        if (StringUtils.isNotEmpty(questionResultVO.getServiceType()) && questionResultVO.getServiceType().equals("2")) {
            //获取serviceSubtaskList中的所有taskid
            List<Long> taskIds = serviceSubtaskRes.stream().map(ServiceSubtaskRes::getTaskid).filter(ObjectUtils::isNotEmpty).distinct().collect(Collectors.toList());
            serviceSubtaskDetailRatioExports = statQuestionOption(taskIds, questionResultVO.getStartOutHospTime(), questionResultVO.getEndOutHospTime(), questionResultVO.getQuestionContent(), questionResultVO.getStartScore(), questionResultVO.getEndScore(),questionResultVO.getValueType());
            serviceSubtaskDetailRatioExports = statQuestionOption(taskIds, questionResultVO.getStartOutHospTime(), questionResultVO.getEndOutHospTime(), questionResultVO.getQuestionContent(), questionResultVO.getStartScore(), questionResultVO.getEndScore(), questionResultVO.getValueType());
        } else if (StringUtils.isNotEmpty(questionResultVO.getServiceType()) && questionResultVO.getServiceType().equals("6")) {
            //满意度统计 ï¼ˆé€šè¿‡ subtask çš„ id åŽ»ç»Ÿè®¡ï¼‰
            List<Long> subtaskIds = serviceSubtaskRes.stream().map(ServiceSubtaskRes::getId).collect(Collectors.toList());
            serviceSubtaskDetailRatioExports = statQuestionOptionBySubtaskIds(subtaskIds, questionResultVO.getStartOutHospTime(), questionResultVO.getEndOutHospTime(), questionResultVO.getQuestionContent(), questionResultVO.getStartScore(), questionResultVO.getEndScore(),questionResultVO.getValueType());
            serviceSubtaskDetailRatioExports = statQuestionOptionBySubtaskIds(subtaskIds, questionResultVO.getStartOutHospTime(), questionResultVO.getEndOutHospTime(), questionResultVO.getQuestionContent(), questionResultVO.getStartScore(), questionResultVO.getEndScore(), questionResultVO.getValueType());
        }
        return serviceSubtaskDetailRatioExports;
    }
smartor/src/main/resources/mapper/smartor/IvrLibaTemplateScriptMapper.xml
@@ -40,7 +40,7 @@
        <result property="scriptTopic" column="script_topic"/>
        <result property="nextScriptno" column="next_scriptno"/>
        <result property="otherdata" column="otherdata"/>
        <result property="isMust" column="is_must"/>
        <result property="ismandatory" column="ismandatory"/>
        <result property="scriptDesc" column="script_desc"/>
        <result property="scriptType" column="script_type"/>
        <result property="branchFlag" column="branch_flag"/>
@@ -107,7 +107,7 @@
               next_scriptno,
               otherdata,
               score,
               is_must,
               ismandatory,
               playWavOnly,
               del_flag,
               update_by,
@@ -181,7 +181,7 @@
        <if test="guid != null  and guid != ''">and guid = #{guid}</if>
        <if test="targetid != null ">and targetid = #{targetid}</if>
        <if test="targetvalue != null  and targetvalue != ''">and targetvalue = #{targetvalue}</if>
        <if test="isMust != null  and isMust != ''">and is_must = #{isMust}</if>
        <if test="ismandatory != null  and ismandatory != ''">and ismandatory = #{ismandatory}</if>
        <if test="scriptType != null">and script_type = #{scriptType}</if>
        <if test="sort != null">and sort = #{sort}</if>
        <if test="score != null">and score = #{score}</if>
@@ -273,7 +273,7 @@
            <if test="scriptTopic != null">script_topic,</if>
            <if test="nextScriptno != null">next_scriptno,</if>
            <if test="otherdata != null">otherdata,</if>
            <if test="isMust != null  and isMust != ''">is_must,</if>
            <if test="ismandatory != null  and ismandatory != ''">ismandatory,</if>
            <if test="scriptDesc != null ">script_desc,</if>
            <if test="scriptType != null ">script_type,</if>
            <if test="branchFlag != null  and branchFlag != ''">branch_flag,</if>
@@ -329,7 +329,7 @@
            <if test="scriptTopic != null">#{scriptTopic},</if>
            <if test="nextScriptno != null">#{nextScriptno},</if>
            <if test="otherdata != null">#{otherdata},</if>
            <if test="isMust != null  and isMust != ''">#{isMust},</if>
            <if test="ismandatory != null  and ismandatory != ''">#{ismandatory},</if>
            <if test="scriptDesc != null ">#{scriptDesc},</if>
            <if test="scriptType != null ">#{scriptType},</if>
            <if test="branchFlag != null  and branchFlag != ''">#{branchFlag},</if>
@@ -394,7 +394,7 @@
            <if test="scriptTopic != null">script_topic = #{scriptTopic},</if>
            <if test="nextScriptno != null">next_scriptno = #{nextScriptno},</if>
            <if test="otherdata != null">otherdata = #{otherdata},</if>
            <if test="isMust != null  and isMust != ''">is_must = #{isMust},</if>
            <if test="ismandatory != null  and ismandatory != ''">ismandatory = #{ismandatory},</if>
            <if test="scriptDesc != null ">script_desc = #{scriptDesc},</if>
            <if test="scriptType != null ">script_type = #{scriptType},</if>
            <if test="isMydException != null  and isMydException != ''">is_myd_exception = #{isMydException},</if>
smartor/src/main/resources/mapper/smartor/IvrTaskTemplateScriptMapper.xml
@@ -36,7 +36,7 @@
        <result property="targetid" column="targetid"/>
        <result property="targetvalue" column="targetvalue"/>
        <result property="otherdata" column="otherdata"/>
        <result property="isMust" column="is_must"/>
        <result property="ismandatory" column="ismandatory"/>
        <result property="questionResult" column="question_result"/>
        <result property="branchFlag" column="branch_flag"/>
        <result property="branchNextscriptno" column="branch_nextscriptno"/>
@@ -99,7 +99,7 @@
               noClearlyText,
               noClearlyVoice,
               script_assortname,
               targetOptions, language, playWavOnly, value_type, del_flag, update_by, update_time, create_by, create_time, isupload, upload_time, orgid, pid, guid, targettype, targetid, targetvalue, otherdata, is_must, question_result
               targetOptions, language, playWavOnly, value_type, del_flag, update_by, update_time, create_by, create_time, isupload, upload_time, orgid, pid, guid, targettype, targetid, targetvalue, otherdata, ismandatory, question_result
        from ivr_task_template_script
    </sql>
@@ -157,7 +157,7 @@
        <if test="targetid != null ">and targetid = #{targetid}</if>
        <if test="targetvalue != null  and targetvalue != ''">and targetvalue = #{targetvalue}</if>
        <if test="otherdata != null  and otherdata != ''">and otherdata = #{otherdata}</if>
        <if test="isMust != null  and isMust != ''">and is_must = #{isMust}</if>
        <if test="ismandatory != null  and ismandatory != ''">and ismandatory = #{ismandatory}</if>
        <if test="questionResult != null  and questionResult != ''">and question_result = #{questionResult}</if>
        <if test="branchFlag != null  and branchFlag != ''">and branch_flag = #{branchFlag}</if>
        <if test="scriptType != null  and scriptType != ''">and script_type = #{scriptType}</if>
@@ -231,7 +231,7 @@
            <if test="targetid != null">targetid,</if>
            <if test="targetvalue != null">targetvalue,</if>
            <if test="otherdata != null">otherdata,</if>
            <if test="isMust != null">is_must,</if>
            <if test="ismandatory != null">ismandatory,</if>
            <if test="questionResult != null">question_result,</if>
            <if test="branchFlag != null  and branchFlag != ''">branch_flag,</if>
            <if test="branchNextscriptno != null  and branchNextscriptno != ''">branch_nextscriptno,</if>
@@ -287,7 +287,7 @@
            <if test="targetid != null">#{targetid},</if>
            <if test="targetvalue != null">#{targetvalue},</if>
            <if test="otherdata != null">#{otherdata},</if>
            <if test="isMust != null">#{isMust},</if>
            <if test="ismandatory != null">#{ismandatory},</if>
            <if test="questionResult != null">#{questionResult},</if>
            <if test="branchFlag != null  and branchFlag != ''">#{branchFlag},</if>
            <if test="branchNextscriptno != null  and branchNextscriptno != ''">#{branchNextscriptno},</if>
@@ -347,7 +347,7 @@
            <if test="targetid != null">targetid = #{targetid},</if>
            <if test="targetvalue != null">targetvalue = #{targetvalue},</if>
            <if test="otherdata != null">otherdata = #{otherdata},</if>
            <if test="isMust != null">is_must = #{isMust},</if>
            <if test="ismandatory != null">ismandatory = #{ismandatory},</if>
            <if test="questionResult != null">question_result = #{questionResult},</if>
            <if test="branchFlag != null  and branchFlag != ''">branch_flag = #{branchFlag},</if>
            <if test="branchNextscriptno != null  and branchNextscriptno != ''">branch_nextscriptno =
smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml
@@ -752,7 +752,8 @@
        <if test="groupKey != null and groupKey != ''">
            ss.${groupKey} as groupKey,
        </if>
        SUM(CASE WHEN ss.finishtime IS NOT NULL AND DATE(ss.visit_time) &lt;= DATE(ss.finishtime) THEN 1 ELSE 0 END) / COUNT(*) AS finishRate,
        SUM(CASE WHEN ss.finishtime IS NOT NULL AND DATE(ss.visit_time) &lt;= 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) &lt;= #{rateDay} + COALESCE(cp.compensate_days, 0)
@@ -1793,132 +1794,132 @@
    <select id="getSfStatisticsHyperlink" parameterType="com.smartor.domain.ServiceSubtaskCountReq"
            resultMap="ServiceSubtaskResult">
            select id,
            visit_count,
            is_visit_again,
            type,
            orgid,
            drcode,
            drname,
            leavehospitaldistrictcode,
            leavehospitaldistrictname,
            deptcode,
            deptname,
            sendstate,
            preachform,
            current_preachform,
            excep,
            nurse_id,
            nurse_name,
            taskid,
            task_name,
            visit_time,
            finishtime,
            endtime,
            senddate,
            suggest,
            result,
            templateid,
            templatename,
            patid,
            sendname,
            send_type,
            recordid,
            exrecallcount,
            continue_flag,
            continue_time_now,
            continue_content,
            continue_count,
            continue_time_next,
            task_situation,
            remark
            from service_subtask
            where 1=1
            and del_flag = 0
            <if test="orgid != null and orgid != ''">
                and orgid = #{orgid}
        select id,
        visit_count,
        is_visit_again,
        type,
        orgid,
        drcode,
        drname,
        leavehospitaldistrictcode,
        leavehospitaldistrictname,
        deptcode,
        deptname,
        sendstate,
        preachform,
        current_preachform,
        excep,
        nurse_id,
        nurse_name,
        taskid,
        task_name,
        visit_time,
        finishtime,
        endtime,
        senddate,
        suggest,
        result,
        templateid,
        templatename,
        patid,
        sendname,
        send_type,
        recordid,
        exrecallcount,
        continue_flag,
        continue_time_now,
        continue_content,
        continue_count,
        continue_time_next,
        task_situation,
        remark
        from service_subtask
        where 1=1
        and del_flag = 0
        <if test="orgid != null and orgid != ''">
            and orgid = #{orgid}
        </if>
        <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
            AND leavehospitaldistrictcode IN
            <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator=","
                     close=")">
                #{leavehospitaldistrictcode}
            </foreach>
        </if>
        <if test="deptcodes != null and deptcodes.size() > 0">
            AND deptcode IN
            <foreach collection="deptcodes" item="deptcode" open="(" separator=","
                     close=")">
                #{deptcode}
            </foreach>
        </if>
        <if test="serviceType != null and serviceType.size() > 0">
            AND service_type IN
            <foreach collection="serviceType" item="serviceType" open="(" separator=","
                     close=")">
                #{serviceType}
            </foreach>
        </if>
        <if test="startTime != null and endTime!=null">
            AND visit_time >= DATE(#{startTime})
            AND visit_time &lt; DATE_ADD(DATE(#{endTime}), INTERVAL 1 DAY)
        </if>
        <if test="visitDeptCode != null">and visit_dept_code = #{visitDeptCode}</if>
        <if test="visitDeptName != null">and visit_dept_name = #{visitDeptName}</if>
        <if test="isabnormal != null">and isabnormal = #{isabnormal}</if>
        <if test="continueFlag != null ">and continue_flag = #{continueFlag}</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,jdbcType=TIMESTAMP}</if>
        <!-- ç›®å‰åªç»Ÿè®¡è¯­éŸ³å’Œé—®å· -->
        <if test="type != null">
            and type = #{type}
        </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>
        <if test="groupKey != null and groupKey != '' and groupKeyList != null and groupKeyList.size>0">
            AND ${groupKey} IN
            <foreach collection="groupKeyList" item="key" open="(" separator=","
                     close=")">
                #{key}
            </foreach>
        </if>
        AND sendstate IS NOT NULL
        <if test="sendstates != null and sendstates.size() > 0">
            AND sendstate IN
            <foreach collection="sendstates" item="state" open="(" separator="," close=")">
                #{state}
            </foreach>
        </if>
        <if test="currentPreachform != null">
            AND current_preachform = #{currentPreachform}
            <if test="followUpCountStyle != null and followUpCountStyle = '1'">
                AND sendstate != 4
            </if>
            <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
                AND leavehospitaldistrictcode IN
                <foreach collection="leavehospitaldistrictcodes" item="leavehospitaldistrictcode" open="(" separator=","
                         close=")">
                    #{leavehospitaldistrictcode}
                </foreach>
            </if>
            <if test="deptcodes != null and deptcodes.size() > 0">
                AND deptcode IN
                <foreach collection="deptcodes" item="deptcode" open="(" separator=","
                         close=")">
                    #{deptcode}
                </foreach>
            </if>
            <if test="serviceType != null and serviceType.size() > 0">
                AND service_type IN
                <foreach collection="serviceType" item="serviceType" open="(" separator=","
                         close=")">
                    #{serviceType}
                </foreach>
            </if>
            <if test="startTime != null and endTime!=null">
                AND visit_time >= DATE(#{startTime})
                AND visit_time &lt; DATE_ADD(DATE(#{endTime}), INTERVAL 1 DAY)
            </if>
            <if test="visitDeptCode != null">and visit_dept_code = #{visitDeptCode}</if>
            <if test="visitDeptName != null">and visit_dept_name = #{visitDeptName}</if>
            <if test="isabnormal != null">and isabnormal = #{isabnormal}</if>
            <if test="continueFlag != null ">and continue_flag = #{continueFlag}</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,jdbcType=TIMESTAMP}</if>
            <!-- ç›®å‰åªç»Ÿè®¡è¯­éŸ³å’Œé—®å· -->
            <if test="type != null">
                and type = #{type}
            </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>
            <if test="groupKey != null and groupKey != '' and groupKeyList != null and groupKeyList.size>0">
                AND ${groupKey} IN
                <foreach collection="groupKeyList" item="key" open="(" separator=","
                         close=")">
                    #{key}
                </foreach>
            </if>
            AND sendstate IS NOT NULL
            <if test="sendstates != null and sendstates.size() > 0">
                AND sendstate IN
                <foreach collection="sendstates" item="state" open="(" separator="," close=")">
                    #{state}
                </foreach>
            </if>
            <if test="currentPreachform != null">
                AND current_preachform = #{currentPreachform}
                <if test="followUpCountStyle != null and followUpCountStyle = '1'">
                    AND sendstate != 4
                </if>
            </if>
            <if test="excep != null and excep != ''">
                AND excep = #{excep}
            </if>
            <if test="taskSituation != null">
                AND task_situation = #{taskSituation}
            </if>
            <if test="drcode != null and drcode != ''">
                AND drcode = #{drcode}
            </if>
            <if test="leavehospitaldistrictcode != null and leavehospitaldistrictcode != ''">
                AND leavehospitaldistrictcode = #{leavehospitaldistrictcode}
            </if>
            <if test="deptcode != null and deptcode != ''">
                AND deptcode = #{deptcode}
            </if>
            order by endtime desc
            <if test="pageSize != null  and pageNum != null">
                limit ${pageSize} OFFSET ${pageNum}
            </if>
        </if>
        <if test="excep != null and excep != ''">
            AND excep = #{excep}
        </if>
        <if test="taskSituation != null">
            AND task_situation = #{taskSituation}
        </if>
        <if test="drcode != null and drcode != ''">
            AND drcode = #{drcode}
        </if>
        <if test="leavehospitaldistrictcode != null and leavehospitaldistrictcode != ''">
            AND leavehospitaldistrictcode = #{leavehospitaldistrictcode}
        </if>
        <if test="deptcode != null and deptcode != ''">
            AND deptcode = #{deptcode}
        </if>
        order by endtime desc
        <if test="pageSize != null  and pageNum != null">
            limit ${pageSize} OFFSET ${pageNum}
        </if>
    </select>
    <select id="getSfStatisticsJoy" parameterType="com.smartor.domain.ServiceSubtaskCountReq"
@@ -2966,8 +2967,8 @@
    <select id="selectByScheduleIdAndLoop" resultMap="ServiceSubtaskResult">
        <include refid="selectServiceSubtaskVo"/>
        where schedule_id = #{scheduleId}
          and loop_count = #{loopCount}
          and (del_flag is null or del_flag = '0')
        and loop_count = #{loopCount}
        and (del_flag is null or del_flag = '0')
        order by schedule_seq asc, id asc
    </select>
@@ -3134,6 +3135,10 @@
        t.task_name AS taskName,
        d.asrtext AS optionresult,
        d.score AS score,
        s.deptcode AS deptcode,
        s.deptname AS deptname,
        s.leavehospitaldistrictcode AS leavehospitaldistrictcode,
        s.leavehospitaldistrictname AS leavehospitaldistrictname,
        d.targetvalue AS targetvalue,
        d.value_type AS valueType,
        COUNT(*) AS count,
@@ -3144,43 +3149,47 @@
        INNER JOIN service_subtask_detail d ON d.sub_id = s.id
        INNER JOIN (
        SELECT
            d.questiontext,
            COUNT(*) AS total_count
        d.questiontext,
        COUNT(*) AS total_count
        FROM
            service_task t
            INNER JOIN service_subtask s ON s.taskid = t.taskid
            INNER JOIN service_subtask_detail d ON d.sub_id = s.id
            WHERE 1=1
            <if test="subtaskIds != null and subtaskIds.size() > 0">
        service_task t
        INNER JOIN service_subtask s ON s.taskid = t.taskid
        INNER JOIN service_subtask_detail d ON d.sub_id = s.id
        WHERE 1=1
        <if test="subtaskIds != null and subtaskIds.size() > 0">
            AND s.id IN
            <foreach collection="subtaskIds" item="subtaskId" open="(" separator="," close=")">
                #{subtaskId}
            </foreach>
            </if>
        </if>
        <if test="valueType != null">AND d.value_type &gt;= #{valueType}</if>
        <if test="scoreStart != null">AND d.score = #{scoreStart}</if>
        <if test="scoreEnd != null">AND d.score &lt;= #{scoreEnd}</if>
        <if test="questiontext != null  and questiontext != ''">and d.questiontext like concat('%', #{questiontext}, '%')</if>
            AND s.sendstate = 6
            AND d.del_flag=0
            GROUP BY d.questiontext
        <if test="questiontext != null  and questiontext != ''">and d.questiontext like concat('%', #{questiontext},
            '%')
        </if>
        AND s.sendstate = 6
        AND d.del_flag=0
        GROUP BY d.questiontext
        ) t2 ON t2.questiontext = d.questiontext
        WHERE 1=1
        <if test="subtaskIds != null and subtaskIds.size() > 0">
        AND s.id IN
        <foreach collection="subtaskIds" item="subtaskId" open="(" separator="," close=")">
            #{subtaskId}
        </foreach>
            AND s.id IN
            <foreach collection="subtaskIds" item="subtaskId" open="(" separator="," close=")">
                #{subtaskId}
            </foreach>
        </if>
        AND s.sendstate = 6
        AND d.del_flag=0
        <if test="valueType != null">AND d.value_type &gt;= #{valueType}</if>
        <if test="scoreStart != null">AND d.score &gt;= #{scoreStart}</if>
        <if test="scoreEnd != null">AND d.score &lt;= #{scoreEnd}</if>
        <if test="questiontext != null  and questiontext != ''">and d.questiontext like concat('%', #{questiontext}, '%')</if>
      <if test="startOutHospTime != null">
        AND date_format(s.endtime,'%y%m%d') &gt;= date_format(#{startOutHospTime},'%y%m%d')
    </if>
        <if test="questiontext != null  and questiontext != ''">and d.questiontext like concat('%', #{questiontext},
            '%')
        </if>
        <if test="startOutHospTime != null">
            AND date_format(s.endtime,'%y%m%d') &gt;= date_format(#{startOutHospTime},'%y%m%d')
        </if>
        <if test="endOutHospTime != null">
            AND date_format(s.endtime,'%y%m%d') &lt;= date_format(#{endOutHospTime},'%y%m%d')
        </if>
@@ -3195,6 +3204,48 @@
        t.taskid
    </select>
    <select id="statQuestionOptionByKsOrBq" resultType="com.smartor.domain.DTO.QuestionCountKsOrBqDTO"
            parameterType="com.smartor.domain.VO.QuestionCountKsOrBqVO">
        SELECT questiontext,
        d.taskid,
        s.deptname,
        s.leavehospitaldistrictname,
        d.targetvalue,
        d.asrtext,
        COUNT(d.asrtext) AS answercount,
        SUM(d.score) AS singleScore
        FROM service_subtask_detail d,
        service_task s
        WHERE d.taskid = s.taskid
        AND deptname IS NOT NULL
        AND leavehospitaldistrictname IS NOT NULL
        <if test="endFinishTime != null">
            AND create_time &lt; #{endFinishTime}
        </if>
        <if test="startFinishTime != null">
            AND create_time &gt;= #{startFinishTime}
        </if>
        <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>
        GROUP BY d.questiontext,
        d.taskid,
        d.asrtext
        ORDER BY d.taskid
    </select>
    <select id="selectServiceSubtaskListDeadLine" parameterType="com.smartor.domain.entity.ServiceSubtaskEntity"
            resultMap="ServiceSubtaskResult">
        <include refid="selectServiceSubtaskVo"/>
smartor/src/main/resources/mapper/smartor/SvyTaskTemplateScriptMapper.xml
@@ -15,7 +15,7 @@
        <result property="language" column="language"/>
        <result property="categoryName" column="categoryName"/>
        <result property="scriptContent" column="script_content"/>
        <result property="isMust" column="is_must"/>
        <result property="ismandatory" column="ismandatory"/>
        <result property="delFlag" column="del_flag"/>
        <result property="updateBy" column="update_by"/>
        <result property="updateTime" column="update_time"/>
@@ -82,7 +82,7 @@
               scriptno,
               templateID,
               scriptid,
               script_topic, language, categoryName, script_content, is_must, del_flag, update_by, update_time, create_by, create_time, isupload, upload_time, orgid, pid, guid, value_type, targetoptions, script_type, targetid, targetvalue, next_scriptno, script_result, otherdata, picture_path
               script_topic, language, categoryName, script_content, ismandatory, del_flag, update_by, update_time, create_by, create_time, isupload, upload_time, orgid, pid, guid, value_type, targetoptions, script_type, targetid, targetvalue, next_scriptno, script_result, otherdata, picture_path
                , duty_dept_person_name, duty_dept_person_code, report_dept_person_name, report_dept_person_code
                 , circulation_dept_person_code, circulation_dept_person_name
        from svy_task_template_script
@@ -118,7 +118,7 @@
                '%')
            </if>
            <if test="scriptContent != null  and scriptContent != ''">and script_content = #{scriptContent}</if>
            <if test="isMust != null  and isMust != ''">and is_must = #{isMust}</if>
            <if test="ismandatory != null  and ismandatory != ''">and ismandatory = #{ismandatory}</if>
            <if test="isupload != null ">and isupload = #{isupload}</if>
            <if test="uploadTime != null ">and upload_time = #{uploadTime}</if>
            <if test="orgid != null  and orgid != ''">and orgid = #{orgid}</if>
@@ -180,7 +180,7 @@
            <if test="language != null">language,</if>
            <if test="categoryName != null">categoryName,</if>
            <if test="scriptContent != null">script_content,</if>
            <if test="isMust != null">is_must,</if>
            <if test="ismandatory != null">ismandatory,</if>
            <if test="delFlag != null">del_flag,</if>
            <if test="updateBy != null">update_by,</if>
            <if test="updateTime != null">update_time,</if>
@@ -233,7 +233,7 @@
            <if test="language != null">#{language},</if>
            <if test="categoryName != null">#{categoryName},</if>
            <if test="scriptContent != null">#{scriptContent},</if>
            <if test="isMust != null">#{isMust},</if>
            <if test="ismandatory != null">#{ismandatory},</if>
            <if test="delFlag != null">#{delFlag},</if>
            <if test="updateBy != null">#{updateBy},</if>
            <if test="updateTime != null">#{updateTime},</if>
@@ -290,7 +290,7 @@
            <if test="language != null">language = #{language},</if>
            <if test="categoryName != null">categoryName = #{categoryName},</if>
            <if test="scriptContent != null">script_content = #{scriptContent},</if>
            <if test="isMust != null">is_must = #{isMust},</if>
            <if test="ismandatory != null">ismandatory = #{ismandatory},</if>
            <if test="delFlag != null">del_flag = #{delFlag},</if>
            <if test="updateBy != null">update_by = #{updateBy},</if>
            <if test="updateTime != null">update_time = #{updateTime},</if>