liusheng
2026-10-10 33e1839c6214ad72cc5a76ae254ce0bb542e9263
smartor/src/main/java/com/smartor/mapper/ServiceSubtaskDetailMapper.java
@@ -4,6 +4,7 @@
import com.smartor.domain.ServiceSubtaskDetail;
import com.smartor.domain.ServiceSubtaskDetailTarget;
import com.smartor.domain.ServiceSubtaskDetailVO;
import com.smartor.domain.entity.SatisfactionStatQuery;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -28,6 +29,51 @@
    public List<ServiceSubtaskDetailDTO> queryFillCount(@Param("subids") List<Long> subids, @Param("questiontext") String questiontext);
    /**
     * 满意度柱状图:一次性统计本次请求全部模板的填报量
     * (按 libtemplateid + questiontext + score 分组,只回传分值与条数,不回传明细行)
     * <p>
     * 替代 queryFillCount 的 N+1 写法,见 PatSatisfactionServiceImpl#satisfactionGraph
     *
     * @param query 聚合查询条件
     * @return 每行含 libtemplateid、questiontext、score、cnt
     */
    public List<Map<String, Object>> selectSatisfactionFillStat(SatisfactionStatQuery query);
    /**
     * 满意度统计:一次性统计本次请求全部问题的填报量(按 模板+问题+matchedtext+score 分组)
     * <p>
     * 用于 statistics / statisticsByDimension 的「各选项数量及占比」,替代逐个问题执行的
     * queryFillCount(那一步会先查出几万个 sub_id 再拼进 IN(...),并把约十万行明细传回 Java)。
     *
     * @param query 聚合查询条件
     * @return 每行含 libtemplateid、questiontext、matchedtext、score、cnt、targetvalue
     */
    public List<Map<String, Object>> selectSatisfactionFillStatByMatchedtext(SatisfactionStatQuery query);
    /**
     * 满意度柱状图:一次性统计本次请求全部模板的「回收人数」
     * (按 libtemplateid 分组,count(distinct sub_id):同一个人答了多道题只算一人)
     * <p>
     * satisfactionGraph / satisfactionGraphDimension 的回收人数必须是人数口径,
     * 不能像 selectSatisfactionFillStat 那样按题目汇总答案行数(那是题量口径)
     *
     * @param query 聚合查询条件
     * @return 每行含 libtemplateid、cnt(该模板已回收的份数/人数)
     */
    public List<Map<String, Object>> selectSatisfactionFillPersonCount(SatisfactionStatQuery query);
    /**
     * 按 scriptid 批量统计填写记录数(一次 SQL 替代逐个 scriptid 查明细)
     * <p>
     * 口径与原来「query.setScriptid(scriptId) 后 selectServiceSubtaskDetailList(...).size()」一致:
     * 只按 scriptid 过滤,不带 del_flag(原 SQL 里并没有 del_flag 条件)。
     *
     * @param scriptIds 问题ID集合
     * @return 每行含 scriptid、cnt
     */
    public List<Map<String, Object>> countDetailByScriptIds(@Param("scriptIds") List<Long> scriptIds);
    public ServiceSubtaskDetailDTO isExistServiceSubtaskDetail(@Param("subid") Long subid, @Param("scriptid") Long scriptid);
    /**
@@ -42,6 +88,7 @@
     * 查询随访详情-指标记录
     */
    public List<Map<String, Object>> getServiceSubtaskDetails(ServiceSubtaskDetailVO serviceSubtaskDetailVo);
    /**
     * 新增语音任务呼叫明细
     *
@@ -84,4 +131,19 @@
     * @return 指标统计
     */
    public List<ServiceSubtaskDetailTarget> countPatByTarget(Long targetid);
    /**
     * 查询同个subid重复的detail数据ID列表
     *
     * @return 重复记录ID列表
     */
    public List<Long> selectRepeatDetailIds();
    /**
     * 根据ID列表批量标记重复detail数据为删除
     *
     * @param ids 重复记录ID列表
     * @return 更新行数
     */
    public Integer deleteRepeatDetailByIds(@Param("ids") List<Long> ids);
}