1.处理修改service_task时,子任务删除,未将出院数据还原的问题;
2.新增省立同德满意度接口
3.处理患者基本信息并发新增的问题
已修改40个文件
已添加1个文件
1070 ■■■■ 文件已修改
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatSatisfactionController.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceTaskController.java 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceTaskdiagController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/enums/SendStateEnum.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/IvrLibaScript.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/IvrLibaScriptVO.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/IvrLibaTemplateScript.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/IvrLibaTemplateScriptVO.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/IvrTaskTemplateScript.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/IvrTaskTemplateScriptVO.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSubtaskDetail.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSubtaskDetailTrace.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSubtaskDetailVO.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSubtaskExport.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/SvyLibScript.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/SvyLibTemplateScript.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/SvyLibTemplateScriptVO.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/SvyTaskTemplateScript.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/SvyTaskTemplateScriptVO.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/VO/DetailTraceDealVO.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/VO/PatSatisfactionReqVO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/IvrLibaTemplateScriptMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/SvyLibTemplateScriptMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IPatSatisfactionService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/PatSatisfactionServiceImpl.java 309 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSLTDHealthcareRecordServiceImpl.java 84 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java 68 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/IvrLibaScriptMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/IvrLibaTemplateScriptMapper.xml 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/IvrTaskTemplateScriptMapper.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/ServiceSubtaskDetailMapper.xml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/ServiceSubtaskDetailTraceMapper.xml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/SvyLibScriptMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/SvyLibTemplateScriptMapper.xml 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/SvyTaskTemplateScriptMapper.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatSatisfactionController.java
@@ -167,15 +167,37 @@
        PatSatisfactionResVO statistics = patSatisfactionService.statistics(patSatisfactionReqVO);
        return getDataTable3(CollectionUtils.isNotEmpty(statistics.getPatSatisfactionDetailEntities()) ? statistics.getPatSatisfactionDetailEntities().size() : 0, statistics);
    }
    /**
    /**
     * æ‚£è€…满意度统计(维度)
     */
    @ApiOperation("患者满意度统计(维度)")
    @PostMapping("/statisticsByDimension")
    public Map<String, Object> statisticsByDimension(@RequestBody PatSatisfactionReqVO patSatisfactionReqVO) {
        //后端不做分页了,由前端做
        PatSatisfactionResVO statistics = patSatisfactionService.statisticsByDimension(patSatisfactionReqVO);
        return getDataTable3(CollectionUtils.isNotEmpty(statistics.getPatSatisfactionDetailEntities()) ? statistics.getPatSatisfactionDetailEntities().size() : 0, statistics);
    }
    /**
     * æ‚£è€…满意度柱状图信息
     */
    @ApiOperation("患者满意度柱状图信息")
    @ApiOperation("患者满意度柱状图信息(分类)")
    @PostMapping("/satisfactionGraph")
    public Map<String, Object> satisfactionGraph(@RequestBody PatSatisfactionReqVO patSatisfactionReqVO) {
        Map<String, Object> patSatisfactionGraphResVOS = patSatisfactionService.satisfactionGraph(patSatisfactionReqVO);
        return getDataTable3(0, patSatisfactionGraphResVOS);
    }
    /**
     * æ‚£è€…满意度柱状图信息
     */
    @ApiOperation("患者满意度柱状图信息(维度)")
    @PostMapping("/satisfactionGraphDimension")
    public Map<String, Object> satisfactionGraphDimension(@RequestBody PatSatisfactionReqVO patSatisfactionReqVO) {
        Map<String, Object> patSatisfactionGraphResVOS = patSatisfactionService.satisfactionGraphDimension(patSatisfactionReqVO);
        return getDataTable3(0, patSatisfactionGraphResVOS);
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java
@@ -13,6 +13,7 @@
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.enums.PreachFormEnum;
import com.ruoyi.common.enums.SendStateEnum;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.DtoConversionUtils;
@@ -230,6 +231,10 @@
            for (ServiceSubtaskExport serviceSubtaskExport : serviceSubtaskExports) {
                String pf = PreachFormEnum.getDescByCode(serviceSubtaskExport.getPreachform());
                serviceSubtaskExport.setPreachform(pf);
                if(serviceSubtaskExport.getSendstate() != null) {
                    String stName = SendStateEnum.getDescByCode("" + serviceSubtaskExport.getSendstate());
                    serviceSubtaskExport.setStName(stName);
                }
                //计算出院天数
                if (!Objects.isNull(serviceSubtaskExport.getEndtime())) {
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceTaskController.java
@@ -71,38 +71,38 @@
//        List<ServiceTask> list = serviceTaskService.selectServiceTaskList(serviceTask);
        List<ServiceTask> list = serviceTaskService.selectServiceTaskAndtaskDeptList(serviceTask);
        List<ServiceTaskVO> serviceTaskVOS = DtoConversionUtils.sourceToTarget(list, ServiceTaskVO.class);
        List<Long> taskIds = list.stream().map(ServiceTask::getTaskid).collect(Collectors.toList());
        ServiceSubtaskEntity serviceSubtaskEntity = new ServiceSubtaskEntity();
        serviceSubtaskEntity.setTaskIds(taskIds);
        serviceSubtaskEntity.setStartOutHospTime(serviceTask.getStartOutHospTime());
        serviceSubtaskEntity.setEndOutHospTime(serviceTask.getEndOutHospTime());
        // æ‰¹é‡æŸ¥è¯¢æ‰€æœ‰å­ä»»åŠ¡
        Map<String, List<ServiceSubtask>> subtaskMap = iServiceSubtaskService
                .selectServiceSubtaskList(serviceSubtaskEntity)
                .stream()
                .filter(subtask -> subtask.getTaskid() != null)  // æ·»åŠ è¿‡æ»¤
                .collect(Collectors.groupingBy(subtask -> Optional.of(subtask.getTaskid().toString()).orElse("Unknown")));
//
//        List<Long> taskIds = list.stream().map(ServiceTask::getTaskid).collect(Collectors.toList());
//
//        ServiceSubtaskEntity serviceSubtaskEntity = new ServiceSubtaskEntity();
//        serviceSubtaskEntity.setTaskIds(taskIds);
//        serviceSubtaskEntity.setStartOutHospTime(serviceTask.getStartOutHospTime());
//        serviceSubtaskEntity.setEndOutHospTime(serviceTask.getEndOutHospTime());
//        // æ‰¹é‡æŸ¥è¯¢æ‰€æœ‰å­ä»»åŠ¡
//        Map<String, List<ServiceSubtask>> subtaskMap = iServiceSubtaskService
//                .selectServiceSubtaskList(serviceSubtaskEntity)
//                .stream()
//                .filter(subtask -> subtask.getTaskid() != null)  // æ·»åŠ è¿‡æ»¤
//                .collect(Collectors.groupingBy(subtask -> Optional.of(subtask.getTaskid().toString()).orElse("Unknown")));
        if (CollectionUtils.isNotEmpty(serviceTaskVOS)) {
            for (ServiceTaskVO taskVO : serviceTaskVOS) {
                List<ServiceSubtask> subtasks = subtaskMap.getOrDefault(taskVO.getTaskid().toString(), Collections.emptyList());
                if (CollectionUtils.isNotEmpty(subtasks)) {
                    //已发送(子任务中的 sendstate=1为被领取)
                    long yfs = subtasks.stream().filter(s -> s.getSendstate() != null &&
                            (s.getSendstate() >= 3L || s.getSendstate() == 1L)).count();
                    //未发送
                    long wfs = subtasks.stream().filter(s -> s.getSendstate() != null &&
                            s.getSendstate() == 2L).count();
                    taskVO.setYfs(yfs);
                    taskVO.setWfs(wfs);
                }
            }
//            for (ServiceTaskVO taskVO : serviceTaskVOS) {
//                List<ServiceSubtask> subtasks = subtaskMap.getOrDefault(taskVO.getTaskid().toString(), Collections.emptyList());
//
//                if (CollectionUtils.isNotEmpty(subtasks)) {
//                    //已发送(子任务中的 sendstate=1为被领取)
//                    long yfs = subtasks.stream().filter(s -> s.getSendstate() != null &&
//                            (s.getSendstate() >= 3L || s.getSendstate() == 1L)).count();
//                    //未发送
//                    long wfs = subtasks.stream().filter(s -> s.getSendstate() != null &&
//                            s.getSendstate() == 2L).count();
//                    taskVO.setYfs(yfs);
//                    taskVO.setWfs(wfs);
//
//                }
//
//            }
            //获取total
            long total = PageUtils.count(new ISelect() {
                @Override
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceTaskdiagController.java
@@ -1,6 +1,7 @@
package com.ruoyi.web.controller.smartor;
import java.util.List;
import java.util.Map;
import com.ruoyi.common.annotation.AddOrgId;
import io.swagger.annotations.Api;
@@ -8,6 +9,7 @@
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
@@ -54,6 +56,18 @@
    }
    /**
     * æŸ¥è¯¢æ¨¡æ¿ç§‘室关联列表不分页
     */
    @ApiOperation("查询模板科室关联列表不分页")
    //@PreAuthorize("@ss.hasPermi('smartor:taskdiag:list')")
    @AddOrgId(field = "orgid", paramIndex = 0, campusField = "campusid")
    @PostMapping("listnopage")
    public Map<String, Object> listnopage(@RequestBody ServiceTaskdiag serviceTaskdiag) {
        List<ServiceTaskdiag> list = serviceTaskdiagService.selectServiceTaskdiagList(serviceTaskdiag);
        return getDataTable3(CollectionUtils.isEmpty(list) ? 0 : list.size(), list);
    }
    /**
     * å¯¼å‡ºæ¨¡æ¿ç§‘室关联列表
     */
    @ApiOperation("导出模板科室关联列表")
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java
@@ -1,7 +1,10 @@
package com.ruoyi.web.controller.system;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletResponse;
import com.ruoyi.common.annotation.AddOrgId;
@@ -34,8 +37,7 @@
 */
@RestController
@RequestMapping("/system/dict/data")
public class SysDictDataController extends BaseController
{
public class SysDictDataController extends BaseController {
    @Autowired
    private ISysDictDataService dictDataService;
@@ -44,8 +46,7 @@
    //@PreAuthorize("@ss.hasPermi('system:dict:list')")
    @GetMapping("/list")
    public TableDataInfo list(SysDictData dictData)
    {
    public TableDataInfo list(SysDictData dictData) {
        startPage();
        List<SysDictData> list = dictDataService.selectDictDataList(dictData);
        return getDataTable(list);
@@ -54,8 +55,7 @@
    @Log(title = "字典数据", businessType = BusinessType.EXPORT)
    //@PreAuthorize("@ss.hasPermi('system:dict:export')")
    @PostMapping("/export")
    public void export(HttpServletResponse response, SysDictData dictData)
    {
    public void export(HttpServletResponse response, SysDictData dictData) {
        List<SysDictData> list = dictDataService.selectDictDataList(dictData);
        ExcelUtil<SysDictData> util = new ExcelUtil<SysDictData>(SysDictData.class);
        util.exportExcel(response, list, "字典数据");
@@ -66,8 +66,7 @@
     */
    //@PreAuthorize("@ss.hasPermi('system:dict:query')")
    @GetMapping(value = "/{dictCode}")
    public AjaxResult getInfo(@PathVariable Long dictCode)
    {
    public AjaxResult getInfo(@PathVariable Long dictCode) {
        return success(dictDataService.selectDictDataById(dictCode));
    }
@@ -75,14 +74,33 @@
     * æ ¹æ®å­—典类型查询字典数据信息
     */
    @GetMapping(value = "/type/{dictType}")
    public AjaxResult dictType(@PathVariable String dictType)
    {
    public AjaxResult dictType(@PathVariable String dictType) {
        List<SysDictData> data = dictTypeService.selectDictDataByType(dictType);
        if (StringUtils.isNull(data))
        {
        if (StringUtils.isNull(data)) {
            data = new ArrayList<SysDictData>();
        }
        return success(data);
    }
    /**
     * æ ¹æ®å­—典类型查询字典数据信息(外链)
     */
    @GetMapping(value = "/typeout/{dictType}")
    public AjaxResult dictTypeOut(@PathVariable String dictType) {
        if (dictType == null) return error();
        List<SysDictData> data = dictTypeService.selectDictDataByType(dictType);
        if (StringUtils.isNull(data) || data.isEmpty()) {
            return error("字典数据不存在");
        }
        List<Map<String, Object>> list = data.stream().map(item -> {
            Map<String, Object> map = new HashMap<>();
            map.put("dictLabel", item.getDictLabel());
            map.put("dictValue", item.getDictValue());
            map.put("listClass", item.getListClass());
            return map;
        }).collect(Collectors.toList());
        return success(list);
    }
    /**
@@ -92,8 +110,7 @@
    @Log(title = "字典数据", businessType = BusinessType.INSERT)
    @AddOrgId(field = "orgid", paramIndex = 0, campusField = "campusid")
    @PostMapping("/add")
    public AjaxResult add(@Validated @RequestBody SysDictData dict)
    {
    public AjaxResult add(@Validated @RequestBody SysDictData dict) {
        dict.setCreateBy(getUsername());
        return toAjax(dictDataService.insertDictData(dict));
    }
@@ -105,8 +122,7 @@
    @Log(title = "字典数据", businessType = BusinessType.UPDATE)
    @AddOrgId(field = "orgid", paramIndex = 0, campusField = "campusid")
    @PostMapping("/edit")
    public AjaxResult edit(@Validated @RequestBody SysDictData dict)
    {
    public AjaxResult edit(@Validated @RequestBody SysDictData dict) {
        dict.setUpdateBy(getUsername());
        return toAjax(dictDataService.updateDictData(dict));
    }
@@ -117,8 +133,7 @@
    //@PreAuthorize("@ss.hasPermi('system:dict:remove')")
    @Log(title = "字典类型", businessType = BusinessType.DELETE)
    @GetMapping("/remove/{dictCodes}")
    public AjaxResult remove(@PathVariable Long[] dictCodes)
    {
    public AjaxResult remove(@PathVariable Long[] dictCodes) {
        dictDataService.deleteDictDataByIds(dictCodes);
        return success();
    }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -19,6 +19,7 @@
import com.ruoyi.system.mapper.SysUserDeptMapper;
import com.smartor.service.IServiceSLTDHealthcareRecordService;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
@@ -28,6 +29,7 @@
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -91,8 +93,18 @@
//    @PostMapping("/test")
//    public void test(@RequestBody Map<String, Object> map) {
//        WxMpUtils wxMpUtils = new WxMpUtils(wxAppid, wxAppSecret);
//        boolean b = wxMpUtils.sendTextMessage("bA_nlW7yM6CCfQMUX5HpBg", "你好");
//        System.out.println("b的值为:" + b);
//
//        Map<String, WxMpTemplateData> dataMap = new HashMap();
//
//        dataMap.put("thing2", new WxMpTemplateData("thing2", "康复报告通知", "#FFB6C1"));
//        dataMap.put("thing4", new WxMpTemplateData("thing4", "xx市xx县xxè·¯xx号", "#173177"));
//        dataMap.put("time7", new WxMpTemplateData("time7", "2023-05-15 00:00:00", "#B95EA6"));
//        dataMap.put("thing8", new WxMpTemplateData("thing8", "张三", "#87cefa"));
//
//
//        String s = wxMpUtils.sendTemplateMessage("oK3-Z59miSE_ebKdXP4IZuXilEvE", "TDF0WB3hndi1gtQybzcHCXeZWm_Q7HjtjVLNG4MOX8Q", "", dataMap);
//
//        System.out.println("s的值为:" + s);
//    }
    /**
@@ -136,7 +148,8 @@
    private RedirectView buildRedirect(String url) {
        RedirectView redirectView = new RedirectView();
        redirectView.setUrl(url);
        redirectView.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
        redirectView.setStatusCode(HttpStatus.FOUND); // 302 ä¸´æ—¶é‡å®šå‘,避免浏览器缓存
        redirectView.setExposeModelAttributes(false); // é¿å…æ¨¡åž‹å±žæ€§æš´éœ²
        return redirectView;
    }
ruoyi-common/src/main/java/com/ruoyi/common/enums/SendStateEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
package com.ruoyi.common.enums;
/**
 * å‘送类型枚举
 */
public enum SendStateEnum {
    dlq("1", "待领取"),
    dfs("2", "待发送"),
    yfs("3", "已发送"),
    bzx("4", "不执行"),
    fssb("5", "发送失败"),
    wc("6", "完成"),
    cs("7", "超时");
    private String code;
    private String desc;
    SendStateEnum(String code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    public static String getDescByCode(String code) {
        SendStateEnum[] organEnums = values();
        for (int i = 0; i < organEnums.length; i++) {
            SendStateEnum organEnum = organEnums[i];
            if (organEnum.getCode().equals(code)) {
                return organEnum.getDesc();
            }
        }
        return null;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }
}
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
@@ -111,7 +111,7 @@
                .antMatchers("/login","/test/**", "/register", "/captchaImage", "/qrcode/generateStaticHtml", "/qrcode/getQRcode", "/qrcode/getFormDate", "/chat", "/system/file/admin/uploadFile", "/smartor/dingtalk/sendNotification", "/patient/read/patientInfo", "/socket", "/API_ESB_Service", "/API_ESB_Service/Run", "/magic/web/**", "/smartor/serviceSubtask/phoneCallBack", "/smartor/serviceSubtask/taskPull", "/smartor/serviceSubtask/phoneCallBackYQ", "/smartor/robot/callstatus", "/smartor/robot/aidialog", "/smartor/robot/cdrinfo", "/getToken", "/smartor/subtaskAnswer/getQuestionCache", "/smartor/subtaskAnswer/saveQuestionCache", "/smartor/servicetask/getScriptInfoByCondition", "/smartor/subtaskAnswer/saveQuestionAnswer", "/smartor/import/download", "/smartor/serviceSubtask/recordAccept", "/smartor/outPath/getInfoByParam", "/smartor/serviceExternal/addDeptInfo", "/smartor/serviceExternal/**", "/sso/**","/smartor/sltdHealthcareRecord/**","/smartor/servicetask/getScriptByCondition","/smartor/subtaskAnswer/saveMYDQuestionAnswer").permitAll()
                // é™æ€èµ„源,可匿名访问
//                .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**","/getDept/*","/SSOLogin/**").permitAll().antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
                .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**","/getDept/*","/SSOLogin/**").permitAll().antMatchers( "/druid/**").permitAll()
                .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**","/getDept/*","/SSOLogin/**","/system/dict/data/typeout/*").permitAll().antMatchers( "/druid/**").permitAll()
                .antMatchers("/smartor/organization/list").permitAll()
                // é™¤ä¸Šé¢å¤–的所有请求全部需要鉴权认证
                .anyRequest().authenticated().and().headers().frameOptions().disable();
smartor/src/main/java/com/smartor/domain/IvrLibaScript.java
@@ -29,6 +29,12 @@
    private Long id;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("问题维度")
    private String dimension;
    /**
     * é—®é¢˜è¯æœ¯æ ‡é¢˜
     */
    @ApiModelProperty("问题话术标题")
smartor/src/main/java/com/smartor/domain/IvrLibaScriptVO.java
@@ -28,6 +28,11 @@
    @ApiModelProperty("问题话术id(主键)")
    private Long id;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("问题维度")
    private String dimension;
    /**
     * å€¼ç±»åž‹ï¼ˆ1 é€‰é¡¹  2 æ–‡æœ¬  3 æ•°å€¼ï¼‰
smartor/src/main/java/com/smartor/domain/IvrLibaTemplateScript.java
@@ -2,6 +2,7 @@
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
@@ -29,6 +30,25 @@
    @ApiModelProperty(value = "主键")
    private Long id;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("问题维度")
    private String dimension;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("问题维度集合")
    private List<String> dimensionList;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("满意度意见异常(只针对文本)")
    private String isMydException;
    /**
     * æ¨¡æ¿è¯æœ¯ç¼–号
     */
smartor/src/main/java/com/smartor/domain/IvrLibaTemplateScriptVO.java
@@ -28,6 +28,19 @@
    @ApiModelProperty(value = "主键")
    private Long id;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("问题维度")
    private String dimension;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("满意度意见异常(只针对文本)")
    private String isMydException;
    /**
     * æ¨¡æ¿è¯æœ¯ç¼–号
     */
smartor/src/main/java/com/smartor/domain/IvrTaskTemplateScript.java
@@ -30,6 +30,18 @@
    private Long id;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("问题维度")
    private String dimension;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("满意度意见异常(只针对文本)")
    private String isMydException;
    /**
     * ä»»åŠ¡id
     */
    @Excel(name = "任务id")
smartor/src/main/java/com/smartor/domain/IvrTaskTemplateScriptVO.java
@@ -31,6 +31,17 @@
    private Long id;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("问题维度")
    private String dimension;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("满意度意见异常(只针对文本)")
    private String isMydException;
    /**
     * åˆ†æ•°
     */
    @Excel(name = "分数")
smartor/src/main/java/com/smartor/domain/ServiceSubtaskDetail.java
@@ -184,5 +184,15 @@
    @ApiModelProperty(value = "患者ID")
    private Long patid;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("满意度意见异常(只针对文本)")
    private String isMydException;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("问题维度")
    private String dimension;
}
smartor/src/main/java/com/smartor/domain/ServiceSubtaskDetailTrace.java
@@ -348,5 +348,17 @@
    @Excel(name = "类别ID")
    private Long categoryid;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("满意度意见异常(只针对文本)")
    private String isMydException;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("问题维度")
    private String dimension;
}
smartor/src/main/java/com/smartor/domain/ServiceSubtaskDetailVO.java
@@ -188,6 +188,19 @@
    @ApiModelProperty("问题ID")
    @Excel(name = "问题ID集合")
    private List<Long> scriptIds;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("满意度意见异常(只针对文本)")
    private String isMydException;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("问题维度")
    private String dimension;
    /**
     * å‡ºé™¢ç—…区编号
     */
smartor/src/main/java/com/smartor/domain/ServiceSubtaskExport.java
@@ -37,11 +37,18 @@
    /**
     * å‘送状态
     */
    @Excel(name = " ä»»åŠ¡çŠ¶æ€ ")
//    @Excel(name = " ä»»åŠ¡çŠ¶æ€ ")
    @ApiModelProperty(value = "发送状态 1 è¢«é¢†å–(在任务中是新建,在服务中是被领取)  2 å¾…发送  3 å·²å‘送  4 ä¸æ‰§è¡Œ  5 å‘送失败 6 å·²å®Œæˆ 7 è¶…æ—¶(人工)")
    private Long sendstate;
    /**
     * å‘送状态
     */
    @Excel(name = " ä»»åŠ¡çŠ¶æ€ ")
    @ApiModelProperty(value = "发送状态 1 è¢«é¢†å–(在任务中是新建,在服务中是被领取)  2 å¾…发送  3 å·²å‘送  4 ä¸æ‰§è¡Œ  5 å‘送失败 6 å·²å®Œæˆ 7 è¶…æ—¶(人工)")
    private String stName;
    /**
     * å®Œæˆæ—¶é—´
     */
    @Excel(name = " å®Œæˆæ—¶é—´ ", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
smartor/src/main/java/com/smartor/domain/SvyLibScript.java
@@ -189,6 +189,11 @@
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("问题维度")
    private String dimension;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("分类ID集合")
    private String categoryids;
smartor/src/main/java/com/smartor/domain/SvyLibTemplateScript.java
@@ -298,6 +298,18 @@
    @ApiModelProperty(value = "报备科室编码(如果多个科室用逗号分割)")
    private String reportDeptCode;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("满意度意见异常(只针对文本)")
    private String isMydException;
    /**
     * é—®é¢˜ç»´åº¦
     */
    @ApiModelProperty("问题维度")
    private String dimension;
    @Excel(name = "分类ID集合")
    @ApiModelProperty(value = "分类ID集合")
    private List<Long> categoryids;
smartor/src/main/java/com/smartor/domain/SvyLibTemplateScriptVO.java
@@ -29,6 +29,24 @@
    @ApiModelProperty("自增ID")
    private Long id;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("问题维度")
    private String dimension;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("满意度意见异常(只针对文本)")
    private String isMydException;
    /**
     * é—®é¢˜ç»´åº¦é›†åˆ
     */
    @ApiModelProperty("问题维度集合")
    private List<String> dimensionList;
    @ApiModelProperty(value = "对应的ivr_liba_target的主键")
    private Long targetid;
smartor/src/main/java/com/smartor/domain/SvyTaskTemplateScript.java
@@ -262,4 +262,17 @@
    @ApiModelProperty(value = "报备科室编码(如果多个科室用逗号分割)")
    private String reportDeptCode;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("满意度意见异常(只针对文本)")
    private String isMydException;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("问题维度")
    private String dimension;
}
smartor/src/main/java/com/smartor/domain/SvyTaskTemplateScriptVO.java
@@ -352,6 +352,17 @@
    private String reportDeptCode;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("满意度意见异常(只针对文本)")
    private String isMydException;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("问题维度")
    private String dimension;
    /**
     * è¯æœ¯é€‰é¡¹
     */
    @ApiModelProperty(value = "话术选项")
smartor/src/main/java/com/smartor/domain/VO/DetailTraceDealVO.java
@@ -72,5 +72,16 @@
    @Excel(name = "问题分类:(例如,门诊满意度:mzmyd     ä½é™¢æ»¡æ„åº¦ï¼šzymyd  ...)")
    private String type;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("满意度意见异常(只针对文本)")
    private String isMydException;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("问题维度")
    private String dimension;
}
smartor/src/main/java/com/smartor/domain/VO/PatSatisfactionReqVO.java
@@ -73,6 +73,12 @@
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("问题维度集合")
    private List<String> dimensionList;
    /**
     * æ‚£è€…服务类型:6、出院满意度调查    14住院满意度   15门诊满意度  16常用满意度
     */
    @ApiModelProperty(value = "患者服务类型:6、出院满意度调查    14住院满意度   15门诊满意度  16常用满意度    (默认查全部)")
smartor/src/main/java/com/smartor/mapper/IvrLibaTemplateScriptMapper.java
@@ -33,6 +33,8 @@
     */
    public List<IvrLibaTemplateScript> selectIvrLibaTemplateScriptList(IvrLibaTemplateScript ivrLibaTemplateScript);
    public List<IvrLibaTemplateScript> selectILTSBydimension(IvrLibaTemplateScript ivrLibaTemplateScript);
    /**
     * æ–°å¢žæ¨¡ç‰ˆé—®é¢˜è¯æœ¯åº“
     *
smartor/src/main/java/com/smartor/mapper/SvyLibTemplateScriptMapper.java
@@ -2,6 +2,7 @@
import com.smartor.domain.IvrLibaTemplateScript;
import com.smartor.domain.SvyLibTemplateScript;
import com.smartor.domain.SvyLibTemplateScriptVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -31,6 +32,8 @@
     */
    public List<SvyLibTemplateScript> selectSvyLibTemplateScriptList(SvyLibTemplateScript svyLibTemplateScript);
    public List<SvyLibTemplateScript> selectSLTScriptListBydimension(SvyLibTemplateScriptVO svyLibTemplateScriptVO);
    /**
     * æ–°å¢žæ¨¡æ¿é—®å·é¢˜ç›®
     *
smartor/src/main/java/com/smartor/service/IPatSatisfactionService.java
@@ -71,6 +71,14 @@
     */
    public PatSatisfactionResVO statistics( PatSatisfactionReqVO patSatisfactionReqVO);
    /**
     * æ‚£è€…满意度统计(维度)
     *
     * @param patSatisfactionReqVO æ‚£è€…满意度统计条件
     * @return æ‚£è€…满意度统计结果
     */
    public PatSatisfactionResVO statisticsByDimension( PatSatisfactionReqVO patSatisfactionReqVO);
    /**
     * æ‚£è€…满意度柱状图信息
@@ -79,4 +87,6 @@
     * @return æ‚£è€…满意度柱状图信息
     */
    public Map<String, Object> satisfactionGraph(PatSatisfactionReqVO patSatisfactionReqVO);
    public Map<String, Object> satisfactionGraphDimension(PatSatisfactionReqVO patSatisfactionReqVO);
}
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
@@ -1542,58 +1542,59 @@
                        int primaryGeneratedCount = deptGenCount + wardGenCount + diagGenCount;
                        log.info("【基于规则】首要规则执行结果: deptGen={}, wardGen={}, diagGen={}, total={}", deptGenCount, wardGenCount, diagGenCount, primaryGeneratedCount);
                        String remark = patMedInhosp1.getRemark();
                        // ç¬¬äºŒæ­¥ï¼šåˆ¤æ–­é¦–要规则是否有任意一个生成成功
                        if (primaryGeneratedCount > 0) {
                            // è‡³å°‘有一个首要规则生成成功
                            // â€”— å°†=2的次要规则对应flag设为"2"(跳过)
                            log.info("【基于规则】首要规则有成功(count={}),将次要规则对应flag设为2", primaryGeneratedCount);
                            if (deptIsSecondary) {
                                updateCheckFlag(patMedInhosp1, 1, "2", "首要规则已生成,次要规则跳过");
                                updateCheckFlag(patMedInhosp1, 1, "2", StringUtils.isNotEmpty(remark)?remark+";首要规则已生成,次要规则跳过":"首要规则已生成,次要规则跳过");
                            }
                            if (!active.equals("xh")) {
                                if (wardIsSecondary) {
                                    updateCheckFlag(patMedInhosp1, 2, "2", "首要规则已生成,次要规则跳过");
                                    updateCheckFlag(patMedInhosp1, 2, "2", StringUtils.isNotEmpty(remark)?remark+";首要规则已生成,次要规则跳过":"首要规则已生成,次要规则跳过");
                                }
                                if (diagIsSecondary) {
                                    updateCheckFlag(patMedInhosp1, 3, "2", "首要规则已生成,次要规则跳过");
                                    updateCheckFlag(patMedInhosp1, 3, "2", StringUtils.isNotEmpty(remark)?remark+";首要规则已生成,次要规则跳过":"首要规则已生成,次要规则跳过");
                                }
                            }
                            // â€”— å¯¹äºŽ=1且生成成功的,将其对应flag设为"1"
                            if (deptIsPrimary && deptGenCount > 0) {
                                updateCheckFlag(patMedInhosp1, 1, "1", "科室首要规则生成成功");
                                updateCheckFlag(patMedInhosp1, 1, "1", StringUtils.isNotEmpty(remark)?remark+";科室首要规则生成成功":"科室首要规则生成成功");
                            }
                            if (!active.equals("xh")) {
                                if (wardIsPrimary && wardGenCount > 0) {
                                    updateCheckFlag(patMedInhosp1, 2, "1", "病区首要规则生成成功");
                                    updateCheckFlag(patMedInhosp1, 2, "1", StringUtils.isNotEmpty(remark)?remark+";病区首要规则生成成功":"病区首要规则生成成功");
                                }
                                if (diagIsPrimary && diagGenCount > 0) {
                                    updateCheckFlag(patMedInhosp1, 3, "1", "疾病首要规则生成成功");
                                    updateCheckFlag(patMedInhosp1, 3, "1", StringUtils.isNotEmpty(remark)?remark+";疾病首要规则生成成功":"疾病首要规则生成成功");
                                }
                            }
                            // â€”— å¯¹äºŽ=1但生成失败的,将其对应flag设为"2"
                            if (deptIsPrimary && deptGenCount == 0) {
                                updateCheckFlag(patMedInhosp1, 1, "2", "科室首要规则生成失败");
                                updateCheckFlag(patMedInhosp1, 1, "2", StringUtils.isNotEmpty(remark)?remark+";科室首要规则生成失败":"科室首要规则生成失败");
                            }
                            if (!active.equals("xh")) {
                                if (wardIsPrimary && wardGenCount == 0) {
                                    updateCheckFlag(patMedInhosp1, 2, "2", "病区首要规则生成失败");
                                    updateCheckFlag(patMedInhosp1, 2, "2", StringUtils.isNotEmpty(remark)?remark+";病区首要规则生成失败":"病区首要规则生成失败");
                                }
                                if (diagIsPrimary && diagGenCount == 0) {
                                    updateCheckFlag(patMedInhosp1, 3, "2", "疾病首要规则生成失败");
                                    updateCheckFlag(patMedInhosp1, 3, "2", StringUtils.isNotEmpty(remark)?remark+";疾病首要规则生成失败":"疾病首要规则生成失败");
                                }
                            }
                        } else {
                            // æ‰€æœ‰é¦–要规则全部失败,将=1的flag设为"2",然后执行=2的方法
                            log.info("【基于规则】首要规则全部失败,将=1的flag设为2,开始执行次要规则");
                            if (deptIsPrimary) {
                                updateCheckFlag(patMedInhosp1, 1, "2", "科室首要规则全部失败");
                                updateCheckFlag(patMedInhosp1, 1, "2", StringUtils.isNotEmpty(remark)?remark+";科室首要规则全部失败":"科室首要规则全部失败");
                            }
                            if (!active.equals("xh")) {
                                if (wardIsPrimary) {
                                    updateCheckFlag(patMedInhosp1, 2, "2", "病区首要规则全部失败");
                                    updateCheckFlag(patMedInhosp1, 2, "2", StringUtils.isNotEmpty(remark)?remark+";病区首要规则全部失败":"病区首要规则全部失败");
                                }
                                if (diagIsPrimary) {
                                    updateCheckFlag(patMedInhosp1, 3, "2", "疾病首要规则全部失败");
                                    updateCheckFlag(patMedInhosp1, 3, "2", StringUtils.isNotEmpty(remark)?remark+";疾病首要规则全部失败":"疾病首要规则全部失败");
                                }
                            }
                            // æ‰§è¡Œæ¬¡è¦è§„则(=2)的方法
smartor/src/main/java/com/smartor/service/impl/PatSatisfactionServiceImpl.java
@@ -315,6 +315,182 @@
        return result;
    }
    /**
     * æ‚£è€…满意度统计(维度)
     *
     * @param patSatisfactionReqVO æ‚£è€…满意度统计条件
     * @return æ‚£è€…满意度统计结果
     */
    @Override
    public PatSatisfactionResVO statisticsByDimension(PatSatisfactionReqVO patSatisfactionReqVO) {
        //定义返参
        PatSatisfactionResVO result = new PatSatisfactionResVO();
        //答题总人数(已经回答问题的)
        int totalPerson = 0;
        // æ€»äººæ•°ï¼ˆåŒ…含未回答的)
        int allPerson = 0;
        //患者满意度统详情
        List<PatSatisfactionDetailEntity> patSatisfactionDetailEntities = new ArrayList<>();
        List<ServiceSubtask> serviceSubtasks = serviceSubtaskMapper.selectSatisfactionSubtaskList(patSatisfactionReqVO);
        // æŒ‰type分组:1-语音,2-问卷
        Map<String, List<ServiceSubtask>> groupByType = serviceSubtasks.stream().filter(s -> s.getType() != null).collect(Collectors.groupingBy(ServiceSubtask::getType));
        List<ServiceSubtask> voiceList = groupByType.getOrDefault("1", Collections.emptyList());
        List<ServiceSubtask> questionnaireList = groupByType.getOrDefault("2", Collections.emptyList());
        if (CollectionUtils.isNotEmpty(voiceList)) {
            //1. å…ˆèŽ·å–å…¥å‚ä¸­çš„ç»´æŠ¤é›†åˆ
            IvrLibaTemplateScript iltscript = new IvrLibaTemplateScript();
            iltscript.setDimensionList(patSatisfactionReqVO.getDimensionList());
            //2 å†èŽ·å–è¯¥é—®é¢˜æ»¡æ„åº¦åˆ†ç±»ä¸‹çš„IvrLibaTemplateScript的集合
            List<IvrLibaTemplateScript> ivrLibaTemplateScripts = ivrLibaTemplateScriptMapper.selectILTSBydimension(iltscript);
            if (CollectionUtils.isNotEmpty(ivrLibaTemplateScripts)) {
                //3 å†é€šè¿‡å•个ivr_liba_template获取到所有的满意度问题 å’Œ ä½¿ç”¨è¯¥æ¨¡æ¿çš„subTask人数
                for (IvrLibaTemplateScript ivrLibaTemplateScript : ivrLibaTemplateScripts) {
                    //记录单个明细信息
                    PatSatisfactionDetailEntity patSatisfactionDetailEntity = new PatSatisfactionDetailEntity();
                    //通过问题ID,获取问题选项(为了获取选项上的最高分最低分)
                    IvrLibaTemplateTargetoption ivrLibaTemplateTargetoption = new IvrLibaTemplateTargetoption();
                    ivrLibaTemplateTargetoption.setScriptid(ivrLibaTemplateScript.getScriptid());
                    List<IvrLibaTemplateTargetoption> ivrLibaTemplateTargetoptions = ivrLibaTemplateTargetoptionMapper.selectIvrLibaTemplateTargetoptionList(ivrLibaTemplateTargetoption);
                    //获取libTemplateId
                    List<Long> libTemplateIds = new ArrayList<>();
                    libTemplateIds.add(ivrLibaTemplateScript.getTemplateid());
                    // å†é€šè¿‡æ¨¡æ¿id获取问题发送总量
                    ServiceSubtaskSatisfactionEntity serviceSubtaskSatisfactionEntity = DtoConversionUtils.sourceToTarget(patSatisfactionReqVO, ServiceSubtaskSatisfactionEntity.class);
                    serviceSubtaskSatisfactionEntity.setLibTemplateIds(libTemplateIds);
                    serviceSubtaskSatisfactionEntity.setType(1);
                    List<Long> subids = serviceSubtaskMapper.querySendCount(serviceSubtaskSatisfactionEntity);
                    //获取填报数量
                    List<ServiceSubtaskDetailDTO> fillCount = null;
                    if (CollectionUtils.isNotEmpty(subids))
                        fillCount = serviceSubtaskDetailMapper.queryFillCount(subids, ivrLibaTemplateScript.getScriptContent());
                    // æ ¹æ®matchedtext分组,统计各选项数量及占比
                    Map<String, Map<String, Object>> matchedtextStats = new HashMap<>();
                    if (CollectionUtils.isNotEmpty(fillCount)) {
                        int totalFill = fillCount.size();
                        fillCount.stream().filter(dto -> dto.getMatchedtext() != null).collect(Collectors.groupingBy(ServiceSubtaskDetailDTO::getMatchedtext, Collectors.counting())).forEach((matchedtext, count) -> {
                            Map<String, Object> stat = new HashMap<>();
                            stat.put("count", count);
                            stat.put("ratio", new BigDecimal((double) count / totalFill * 100).setScale(1, RoundingMode.HALF_UP).doubleValue());
                            matchedtextStats.put(matchedtext, stat);
                        });
                        // ä»ŽfillCount中取targetvalue(&分隔的当前问题的所有选项),补全未出现的选项,count和ratio均为0
                        fillCount.stream().filter(dto -> dto.getTargetvalue() != null).findFirst().ifPresent(dto -> {
                            for (String option : dto.getTargetvalue().split("&")) {
                                String optionTrim = option.trim();
                                if (!matchedtextStats.containsKey(optionTrim)) {
                                    Map<String, Object> emptyStat = new HashMap<>();
                                    emptyStat.put("count", 0L);
                                    emptyStat.put("ratio", 0.0);
                                    matchedtextStats.put(optionTrim, emptyStat);
                                }
                            }
                        });
                    }
                    patSatisfactionDetailEntity.setScriptContent(ivrLibaTemplateScript.getScriptContent());
                    patSatisfactionDetailEntity.setAnswerPerson(CollectionUtils.isEmpty(fillCount) ? 0 : fillCount.size());
                    patSatisfactionDetailEntity.setNoAnswerPerson(CollectionUtils.isNotEmpty(fillCount) && CollectionUtils.isNotEmpty(subids) ? (subids.size() - fillCount.size()) : CollectionUtils.isNotEmpty(subids) ? subids.size() : 0);
                    patSatisfactionDetailEntity.setAverageScore(averageScore(fillCount));
                    patSatisfactionDetailEntity.setMaxScore(maxScore(ivrLibaTemplateTargetoptions));
                    patSatisfactionDetailEntity.setMinScore(minScore(ivrLibaTemplateTargetoptions));
                    patSatisfactionDetailEntity.setAnswerRate(CollectionUtils.isEmpty(subids) ? 0 : CollectionUtils.isEmpty(fillCount) ? 0 : fillCount.size() * 1.0 / subids.size());
                    patSatisfactionDetailEntity.setMatchedtextStats(matchedtextStats);
                    patSatisfactionDetailEntities.add(patSatisfactionDetailEntity);
                    totalPerson += CollectionUtils.isEmpty(fillCount) ? 0 : fillCount.size();
                    allPerson += subids.size();
                }
            }
        }
        if (CollectionUtils.isNotEmpty(questionnaireList)) {
            //1. å…ˆèŽ·å–å…¥å‚ä¸­çš„æ»¡æ„åº¦ç»´åº¦
            SvyLibTemplateScriptVO svyLibTemplateScriptVO = new SvyLibTemplateScriptVO();
            svyLibTemplateScriptVO.setDimensionList(patSatisfactionReqVO.getDimensionList());
            //2 å†èŽ·å–è¯¥é—®é¢˜æ»¡æ„åº¦åˆ†ç±»ä¸‹çš„IvrLibaTemplateScript的集合
            List<SvyLibTemplateScript> svyLibTemplateScripts = svyLibTemplateScriptMapper.selectSLTScriptListBydimension(svyLibTemplateScriptVO);
            if (CollectionUtils.isNotEmpty(svyLibTemplateScripts)) {
                for (SvyLibTemplateScript svyLibTemplateScript : svyLibTemplateScripts) {
                    //记录单个明细信息
                    PatSatisfactionDetailEntity patSatisfactionDetailEntity = new PatSatisfactionDetailEntity();
                    //通过问题ID,获取问题选项(为了获取选项上的最高分最低分)
                    SvyLibTemplateTargetoption svyLibTemplateTargetoption = new SvyLibTemplateTargetoption();
                    svyLibTemplateTargetoption.setScriptid(svyLibTemplateScript.getId());
                    List<SvyLibTemplateTargetoption> svyLibTemplateTargetoptions = svyLibTemplateTargetoptionMapper.selectSvyLibTemplateTargetoptionList(svyLibTemplateTargetoption);
                    //获取libTemplateId
                    List<Long> libTemplateIds = new ArrayList<>();
                    libTemplateIds.add(svyLibTemplateScript.getSvyid());
                    // å†é€šè¿‡æ¨¡æ¿id获取问题发送总量
                    ServiceSubtaskSatisfactionEntity serviceSubtaskSatisfactionEntity = DtoConversionUtils.sourceToTarget(patSatisfactionReqVO, ServiceSubtaskSatisfactionEntity.class);
                    serviceSubtaskSatisfactionEntity.setLibTemplateIds(libTemplateIds);
                    serviceSubtaskSatisfactionEntity.setType(2);
                    List<Long> subids = serviceSubtaskMapper.querySendCount(serviceSubtaskSatisfactionEntity);
                    //获取填报数量
                    List<ServiceSubtaskDetailDTO> fillCount = null;
                    if (CollectionUtils.isNotEmpty(subids))
                        fillCount = serviceSubtaskDetailMapper.queryFillCount(subids, svyLibTemplateScript.getScriptContent());
                    // æ ¹æ®matchedtext分组,统计各选项数量及占比
                    Map<String, Map<String, Object>> matchedtextStats = new HashMap<>();
                    if (CollectionUtils.isNotEmpty(fillCount)) {
                        int totalFill = fillCount.size();
                        fillCount.stream().filter(dto -> dto.getMatchedtext() != null).collect(Collectors.groupingBy(ServiceSubtaskDetailDTO::getMatchedtext, Collectors.counting())).forEach((matchedtext, count) -> {
                            Map<String, Object> stat = new HashMap<>();
                            stat.put("count", count);
                            stat.put("ratio", new BigDecimal((double) count / totalFill * 100).setScale(1, RoundingMode.HALF_UP).doubleValue());
                            matchedtextStats.put(matchedtext, stat);
                        });
                        // ä»ŽfillCount中取targetvalue(&分隔的当前问题的所有选项),补全未出现的选项,count和ratio均为0
                        fillCount.stream().filter(dto -> dto.getTargetvalue() != null).findFirst().ifPresent(dto -> {
                            for (String option : dto.getTargetvalue().split("&")) {
                                String optionTrim = option.trim();
                                if (!matchedtextStats.containsKey(optionTrim)) {
                                    Map<String, Object> emptyStat = new HashMap<>();
                                    emptyStat.put("count", 0L);
                                    emptyStat.put("ratio", 0.0);
                                    matchedtextStats.put(optionTrim, emptyStat);
                                }
                            }
                        });
                    }
                    patSatisfactionDetailEntity.setScriptContent(svyLibTemplateScript.getScriptContent());
                    patSatisfactionDetailEntity.setAnswerPerson(CollectionUtils.isEmpty(fillCount) ? 0 : fillCount.size());
                    patSatisfactionDetailEntity.setNoAnswerPerson(CollectionUtils.isNotEmpty(fillCount) && CollectionUtils.isNotEmpty(subids) ? (subids.size() - fillCount.size()) : CollectionUtils.isNotEmpty(subids) ? subids.size() : 0);
                    patSatisfactionDetailEntity.setAverageScore(averageScore(fillCount));
                    OptionalDouble maxOpt = svyLibTemplateTargetoptions.stream().filter(dto -> dto.getScore() != null).mapToDouble(dto -> dto.getScore().doubleValue()).max();
                    patSatisfactionDetailEntity.setMaxScore(maxOpt.isPresent() ? new BigDecimal(maxOpt.getAsDouble()).setScale(1, RoundingMode.HALF_UP).doubleValue() : 0.0);
                    OptionalDouble minOpt = svyLibTemplateTargetoptions.stream().filter(dto -> dto.getScore() != null).mapToDouble(dto -> dto.getScore().doubleValue()).min();
                    patSatisfactionDetailEntity.setMinScore(minOpt.isPresent() ? new BigDecimal(minOpt.getAsDouble()).setScale(1, RoundingMode.HALF_UP).doubleValue() : 0.0);
                    patSatisfactionDetailEntity.setAnswerRate(CollectionUtils.isEmpty(subids) ? 0 : CollectionUtils.isEmpty(fillCount) ? 0 : fillCount.size() * 1.0 / subids.size());
                    patSatisfactionDetailEntity.setMatchedtextStats(matchedtextStats);
                    patSatisfactionDetailEntities.add(patSatisfactionDetailEntity);
                    totalPerson += CollectionUtils.isEmpty(fillCount) ? 0 : fillCount.size();
                    allPerson += subids.size();
                }
            }
        }
        result.setTotalAnswerRate(Arith.div(totalPerson, allPerson));
        result.setPatSatisfactionDetailEntities(patSatisfactionDetailEntities);
        result.setTotalPerson(totalPerson);
        return result;
    }
    @Override
    public Map<String, Object> satisfactionGraph(PatSatisfactionReqVO patSatisfactionReqVO) {
        //用来记录柱状图信息(key=满意度分类名称,value=满意度分类下的总人数和填报人数)
@@ -449,6 +625,139 @@
        return zzt;
    }
    @Override
    public Map<String, Object> satisfactionGraphDimension(PatSatisfactionReqVO patSatisfactionReqVO) {
        //用来记录柱状图信息(key=满意度分类名称,value=满意度分类下的总人数和填报人数)
        Map<String, Object> zzt = new HashMap<>();
        // è®°å½•一下每种分类的填报情况
        Map<String, List<ServiceSubtaskDetailDTO>> assortNameFillCountMap = new HashMap<>();
        if (patSatisfactionReqVO.getType() == null || patSatisfactionReqVO.getType() == 1) {
            //1. ä»Žå…¥å‚中获取满意度维维度
            IvrLibaTemplateScript ivrLibaTemplateScript2 = new IvrLibaTemplateScript();
            ivrLibaTemplateScript2.setDimensionList(patSatisfactionReqVO.getDimensionList());
            //2 å†èŽ·å–è¯¥é—®é¢˜æ»¡æ„åº¦åˆ†ç±»ä¸‹çš„IvrLibaTemplateScript的集合
            List<IvrLibaTemplateScript> ivrLibaTemplateScripts = ivrLibaTemplateScriptMapper.selectILTSBydimension(ivrLibaTemplateScript2);
            if (ivrLibaTemplateScripts != null && !ivrLibaTemplateScripts.isEmpty()) {
                //3 æŒ‰dimension维度分组,并获取每个集合进行遍历,计算每个分类的总人数和填报人数
                Map<String, List<IvrLibaTemplateScript>> groupByDimension = ivrLibaTemplateScripts.stream().filter(item -> item.getDimension() != null).collect(Collectors.groupingBy(IvrLibaTemplateScript::getDimension));
                if (groupByDimension != null && !groupByDimension.isEmpty()) {
                    for (String dimension : groupByDimension.keySet()) {
                        //记录总人数
                        Double subidAll = 0.0;
                        //记录总的填报人数
                        Double fillCountAll = 0.0;
                        //获取该维度的填报总数量
                        List<ServiceSubtaskDetailDTO> allFillCountList = new ArrayList<>();
                        List<IvrLibaTemplateScript> ivrLibaTemplateScriptList = groupByDimension.get(dimension);
                        for (IvrLibaTemplateScript ivrLibaTemplateScript : ivrLibaTemplateScriptList) {
                            //获取libTemplateId
                            List<Long> libTemplateIds = new ArrayList<>();
                            libTemplateIds.add(ivrLibaTemplateScript.getTemplateid());
                            // å†é€šè¿‡æ¨¡æ¿id获取问题发送总量
                            ServiceSubtaskSatisfactionEntity serviceSubtaskSatisfactionEntity = DtoConversionUtils.sourceToTarget(patSatisfactionReqVO, ServiceSubtaskSatisfactionEntity.class);
                            serviceSubtaskSatisfactionEntity.setLibTemplateIds(libTemplateIds);
                            serviceSubtaskSatisfactionEntity.setType(1);
                            List<Long> subids = serviceSubtaskMapper.querySendCount(serviceSubtaskSatisfactionEntity);
                            //获取填报数量
                            List<ServiceSubtaskDetailDTO> fillCount = null;
                            if (CollectionUtils.isNotEmpty(subids)) {
                                fillCount = serviceSubtaskDetailMapper.queryFillCount(subids, ivrLibaTemplateScript.getScriptContent());
                                if (CollectionUtils.isNotEmpty(fillCount)) allFillCountList.addAll(fillCount);
                            }
                            subidAll += subids.size();
                            fillCountAll += CollectionUtils.isEmpty(fillCount) ? 0 : fillCount.size();
                        }
                        // è¿™é‡Œå…ˆè®°å½•一下每个分类的总人数和填报人数
                        Map<String, Object> personCount = new HashMap<>();
                        personCount.put("fillCountAll", fillCountAll);
                        personCount.put("subidAll", subidAll);
                        personCount.put("receiveRate", Arith.div(fillCountAll, subidAll));
                        personCount.put("averageScore", averageScore(allFillCountList));
                        zzt.put(dimension, personCount);
                        assortNameFillCountMap.put(dimension, allFillCountList);
                    }
                }
            }
        }
        if (patSatisfactionReqVO.getType() == null || patSatisfactionReqVO.getType() == 2) {
            //1.  ä»Žå…¥å‚中获取满意度维维度
            SvyLibTemplateScriptVO svyLibTemplateScriptVO = new SvyLibTemplateScriptVO();
            svyLibTemplateScriptVO.setDimensionList(patSatisfactionReqVO.getDimensionList());
            //2 å†èŽ·å–è¯¥é—®é¢˜æ»¡æ„åº¦åˆ†ç±»ä¸‹çš„IvrLibaTemplateScript的集合
            List<SvyLibTemplateScript> svyLibTemplateScripts = svyLibTemplateScriptMapper.selectSLTScriptListBydimension(svyLibTemplateScriptVO);
            if (svyLibTemplateScripts != null && !svyLibTemplateScripts.isEmpty()) {
                //3 æŒ‰scriptAssortname分组,并获取每个集合进行遍历,计算每个分类的总人数和填报人数
                Map<String, List<SvyLibTemplateScript>> groupByDimension = svyLibTemplateScripts.stream().filter(item -> item.getDimension() != null).collect(Collectors.groupingBy(SvyLibTemplateScript::getDimension));
                if (groupByDimension != null && !groupByDimension.isEmpty()) {
                    for (String dimension : groupByDimension.keySet()) {
                        //记录总人数
                        Double subidAll = 0.0;
                        //记录总的填报人数
                        Double fillCountAll = 0.0;
                        //获取该分类的填报总数量
                        List<ServiceSubtaskDetailDTO> allFillCountList = new ArrayList<>();
                        List<SvyLibTemplateScript> svyLibTemplateScriptList = groupByDimension.get(dimension);
                        for (SvyLibTemplateScript svyLibTemplateScript : svyLibTemplateScriptList) {
                            //获取libTemplateId
                            List<Long> libTemplateIds = new ArrayList<>();
                            libTemplateIds.add(svyLibTemplateScript.getSvyid());
                            // å†é€šè¿‡æ¨¡æ¿id获取问题发送总量
                            ServiceSubtaskSatisfactionEntity serviceSubtaskSatisfactionEntity = DtoConversionUtils.sourceToTarget(patSatisfactionReqVO, ServiceSubtaskSatisfactionEntity.class);
                            serviceSubtaskSatisfactionEntity.setLibTemplateIds(libTemplateIds);
                            serviceSubtaskSatisfactionEntity.setType(2);
                            List<Long> subids = serviceSubtaskMapper.querySendCount(serviceSubtaskSatisfactionEntity);
                            //获取填报数量
                            List<ServiceSubtaskDetailDTO> fillCount = null;
                            if (CollectionUtils.isNotEmpty(subids)) {
                                fillCount = serviceSubtaskDetailMapper.queryFillCount(subids, svyLibTemplateScript.getScriptContent());
                                if (CollectionUtils.isNotEmpty(fillCount)) allFillCountList.addAll(fillCount);
                            }
                            subidAll += subids.size();
                            fillCountAll += CollectionUtils.isEmpty(fillCount) ? 0 : fillCount.size();
                        }
                        // è¿™é‡Œå…ˆè®°å½•一下每个分类的总人数和填报人数
                        Map<String, Object> personCount = (Map<String, Object>) zzt.get(dimension);
                        if (!Objects.isNull(personCount)) {
                            Double fillCountAll2 = (Double) personCount.get("fillCountAll");
                            Double subidAll2 = (Double) personCount.get("subidAll");
                            personCount.put("fillCountAll", fillCountAll2 + fillCountAll);
                            personCount.put("subidAll", subidAll2 + subidAll);
                            personCount.put("receiveRate", Arith.div((Double) personCount.get("fillCountAll"), (Double) personCount.get("subidAll")));
                            //看一下之前有没有该分类的填报量
                            List<ServiceSubtaskDetailDTO> serviceSubtaskDetailDTOS = assortNameFillCountMap.get(dimension);
                            if (CollectionUtils.isNotEmpty(serviceSubtaskDetailDTOS))
                                allFillCountList.addAll(serviceSubtaskDetailDTOS);
                            personCount.put("averageScore", averageScore(allFillCountList));
                        } else {
                            personCount = new HashMap<>();
                            personCount.put("fillCountAll", fillCountAll);
                            personCount.put("subidAll", subidAll);
                            personCount.put("receiveRate", Arith.div(fillCountAll, subidAll));
                            personCount.put("averageScore", averageScore(allFillCountList));
                            zzt.put(dimension, personCount);
                        }
                    }
                }
            }
        }
        return zzt;
    }
    /**
     * èŽ·å–æœ€é«˜åˆ†
     *
smartor/src/main/java/com/smartor/service/impl/ServiceSLTDHealthcareRecordServiceImpl.java
@@ -809,7 +809,42 @@
        patMedInhosp.setHospitaldistrictname(dto.getAreaName());
    }
    /**
     * å¤„理患者档案(新增或更新)
     * ä½¿ç”¨ Redis åˆ†å¸ƒå¼é”é˜²æ­¢å¹¶å‘重复插入
     */
    private PatArchive processPatientArchive(ServiceSLTDInhospResDTO dto) {
        // æž„建锁的 key:基于 patientno æˆ– idcardno
        String lockKey = "pat_archive_lock:" +
            (StringUtils.isNotEmpty(dto.getMedicalRecordNo()) ? dto.getMedicalRecordNo() : dto.getIdCardNo());
        // å°è¯•获取分布式锁,最多等待 3 ç§’,锁定 10 ç§’自动释放
        Boolean lockAcquired = redisTemplate.opsForValue().setIfAbsent(lockKey, "1", 10, TimeUnit.SECONDS);
        if (lockAcquired == null || !lockAcquired) {
            log.warn("【processPatientArchive】获取分布式锁失败,跳过本次处理(其他线程正在处理),patientno={}", dto.getMedicalRecordNo());
            // ç­‰å¾…一段时间后重试查询
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
        try {
            return doProcessPatientArchive(dto);
        } finally {
            // é‡Šæ”¾é”
            if (lockAcquired != null && lockAcquired) {
                redisTemplate.delete(lockKey);
            }
        }
    }
    /**
     * å®žé™…执行患者档案处理逻辑
     */
    private PatArchive doProcessPatientArchive(ServiceSLTDInhospResDTO dto) {
        List<PatArchive> existingArchives = null;
        log.info("【processPatientArchive】新增患者档案,查询入参信息patientno:{},idcardno:{}", dto.getMedicalRecordNo(), dto.getIdCardNo());
        // ç¬¬ä¸€æ­¥ï¼šæŒ‰ patientno ç²¾ç¡®æŸ¥é‡ï¼ˆä¸Žæ’入时使用的 medicalRecordNo ä¸€è‡´ï¼‰
@@ -818,6 +853,7 @@
            PatArchive queryByPatientNo = new PatArchive();
            queryByPatientNo.setPatientno(patientno);
            existingArchives = patArchiveService.selectPatArchiveList(queryByPatientNo);
            log.debug("【processPatientArchive】按patientno查询,patientno={}, ç»“果数量={}", patientno, existingArchives.size());
        }
        // ç¬¬äºŒæ­¥ï¼šæŒ‰ patientno æŸ¥ä¸åˆ°æ—¶ï¼ŒæŒ‰ idcardno æŸ¥é‡ï¼ˆåˆ†æ­¥OR,避免AND条件漏查)
@@ -825,30 +861,55 @@
            PatArchive queryByIdCard = new PatArchive();
            queryByIdCard.setIdcardno(dto.getIdCardNo().trim());
            existingArchives = patArchiveService.selectPatArchiveList(queryByIdCard);
            log.debug("【processPatientArchive】按idcardno查询,idcardno={}, ç»“果数量={}", dto.getIdCardNo(), existingArchives.size());
        }
        PatArchive patArchive = buildPatientArchive(dto);
        log.info("【processPatientArchive】患者档案查重完成,patientno={}, æ˜¯å¦å·²å­˜åœ¨={}",
            patArchive.getPatientno(), CollectionUtils.isEmpty(existingArchives) ? "否" : "是(id=" + existingArchives.get(0).getId() + ")");
        if (CollectionUtils.isEmpty(existingArchives)) {
            try {
                //再查一次,确保不会有重复的
                PatArchive queryByIdCard = new PatArchive();
                if(StringUtils.isNotEmpty(dto.getIdCardNo())) queryByIdCard.setIdcardno(dto.getIdCardNo().trim());
                if(StringUtils.isNotEmpty(dto.getMedicalRecordNo())) queryByIdCard.setPatientno(dto.getMedicalRecordNo());
                List<PatArchive> archivesByIdCard = patArchiveService.selectPatArchiveList(queryByIdCard);
                if (CollectionUtils.isEmpty(archivesByIdCard)) patArchiveService.insertPatArchive(patArchive);
                log.info("【processPatientArchive】新增患者档案,患者编号:{}", patArchive.getPatientno());
                // æœ€ç»ˆç¡®è®¤æŸ¥è¯¢ï¼ˆé˜²å¾¡æ€§ç¼–程:防止Redis锁失效等极端情况)
                PatArchive finalQuery = new PatArchive();
                if (StringUtils.isNotEmpty(dto.getIdCardNo())) {
                    finalQuery.setIdcardno(dto.getIdCardNo().trim());
                }
                if (StringUtils.isNotEmpty(dto.getMedicalRecordNo())) {
                    finalQuery.setPatientno(dto.getMedicalRecordNo());
                }
                List<PatArchive> finalCheck = patArchiveService.selectPatArchiveList(finalQuery);
                log.info("【processPatientArchive】最终确认查询,patientno={}, idcardno={}, ç»“果数量={}",
                    dto.getMedicalRecordNo(), dto.getIdCardNo(), finalCheck.size());
                if (CollectionUtils.isEmpty(finalCheck)) {
                    patArchiveService.insertPatArchive(patArchive);
                    log.info("【processPatientArchive】✓ æ–°å¢žæ‚£è€…档案成功,patientno={}, id={}",
                        patArchive.getPatientno(), patArchive.getId());
                } else {
                    // å…¶ä»–线程已经插入,直接使用已有记录
                    existingArchives = finalCheck;
                    patArchive.setId(existingArchives.get(0).getId());
                    patArchive.setNotrequiredFlag(existingArchives.get(0).getNotrequiredFlag());
                    patArchive.setNotrequiredreason(existingArchives.get(0).getNotrequiredreason());
                    log.info("【processPatientArchive】档案已被其他线程创建,使用已有记录,id={}", patArchive.getId());
                }
            } catch (org.springframework.dao.DuplicateKeyException e) {
                log.error("【processPatientArchive】患者档案已存在(并发插入),跳过:patientno={}, idcardno={}", patArchive.getPatientno(), patArchive.getIdcardno());
                log.warn("【processPatientArchive】患者档案已存在(并发插入异常),跳过:patientno={}, idcardno={}",
                    patArchive.getPatientno(), patArchive.getIdcardno());
                // å¹¶å‘插入场景,重新查询获取已存在的记录
                PatArchive queryRetry = new PatArchive();
                queryRetry.setPatientno(patArchive.getPatientno());
                if (StringUtils.isNotEmpty(patArchive.getIdcardno())) {
                    queryRetry.setIdcardno(patArchive.getIdcardno());
                }
                existingArchives = patArchiveService.selectPatArchiveList(queryRetry);
                if (CollectionUtils.isNotEmpty(existingArchives)) {
                    patArchive.setId(existingArchives.get(0).getId());
                    patArchive.setNotrequiredFlag(existingArchives.get(0).getNotrequiredFlag());
                    patArchive.setNotrequiredreason(existingArchives.get(0).getNotrequiredreason());
                    log.info("【processPatientArchive】从异常恢复,获取已有档案,id={}", patArchive.getId());
                }
            }
        } else {
@@ -856,7 +917,8 @@
            patArchive.setNotrequiredFlag(existingArchives.get(0).getNotrequiredFlag());
            patArchive.setNotrequiredreason(existingArchives.get(0).getNotrequiredreason());
            patArchiveService.updateArchive(patArchive);
            log.info("【processPatientArchive】更新患者档案,患者编号:{}", patArchive.getPatientno());
            log.info("【processPatientArchive】✓ æ›´æ–°æ‚£è€…档案,patientno={}, id={}",
                patArchive.getPatientno(), patArchive.getId());
        }
        return patArchive;
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java
@@ -862,6 +862,8 @@
        }
        ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(taskid);
        serviceSubtaskDetailVO.setQuestiontext(svyTaskTemplateScriptVO.getScriptContent());
        serviceSubtaskDetailVO.setIsMydException(svyTaskTemplateScriptVO.getIsMydException());
        serviceSubtaskDetailVO.setDimension(svyTaskTemplateScriptVO.getDimension());
        serviceSubtaskDetailVO.setCategoryid(svyTaskTemplateScriptVO.getCategoryid());
        serviceSubtaskDetailVO.setTaskid(Long.valueOf(taskid));
        serviceSubtaskDetailVO.setTargetid(svyTaskTemplateScriptVO.getTargetid() != null ? svyTaskTemplateScriptVO.getTargetid().intValue() : null);
@@ -896,7 +898,7 @@
        SvyTaskTemplateTargetoption stt = null;
        Long isabnormalFlag = 0L;
        for (SvyTaskTemplateTargetoption svyTaskTemplateTargetoption : svyTaskTemplateScriptVO.getSvyTaskTemplateTargetoptions()) {
            if (svyTaskTemplateTargetoption.getOptioncontent().trim().equals(svyTaskTemplateScriptVO.getScriptResult()))
            if (StringUtils.isNotEmpty(svyTaskTemplateTargetoption.getOptioncontent()) && svyTaskTemplateTargetoption.getOptioncontent().trim().equals(svyTaskTemplateScriptVO.getScriptResult()))
                stt = svyTaskTemplateTargetoption;
        }
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
@@ -350,11 +350,16 @@
    public List<ServiceSubtaskRes> patItem(ServiceSubtaskEntity serviceSubtaskEntity) {
        if (serviceSubtaskEntity.getSendstateView() != null) {
            //            1:待随访(2 å¾…发送);2:随访中(3 å·²å‘送、1 è¢«é¢†å–)、3:未完成(5 å‘送失败、7、超时)、4:已完成( 6 å·²å®Œæˆï¼‰ã€5:无需随访(4 ä¸æ‰§è¡Œï¼‰
            if (serviceSubtaskEntity.getSendstateView() == 1) serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(2L)));
            if (serviceSubtaskEntity.getSendstateView() == 2) serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(1L, 3L)));
            if (serviceSubtaskEntity.getSendstateView() == 3) serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(5L, 7L)));
            if (serviceSubtaskEntity.getSendstateView() == 4) serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(6L)));
            if (serviceSubtaskEntity.getSendstateView() == 5) serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(4L)));
            if (serviceSubtaskEntity.getSendstateView() == 1)
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(2L)));
            if (serviceSubtaskEntity.getSendstateView() == 2)
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(1L, 3L)));
            if (serviceSubtaskEntity.getSendstateView() == 3)
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(5L, 7L)));
            if (serviceSubtaskEntity.getSendstateView() == 4)
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(6L)));
            if (serviceSubtaskEntity.getSendstateView() == 5)
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(4L)));
        }
        List<ServiceSubtask> selectServiceSubtaskList = this.selectServiceSubtaskList(serviceSubtaskEntity);
@@ -747,9 +752,8 @@
                    serviceSubtask.setPatid(patTaskRelevance.getPatid());
                    serviceSubtask.setCreateTime(DateUtils.getNowDate());
                    serviceSubtask.setInhospid(patTaskRelevance.getHospid());
                    serviceSubtask.setSendstate(1L);
                    if (serviceTaskVO.getLongTask() != null && serviceTaskVO.getLongTask() == 1)
                        serviceSubtask.setSendstate(2L);
                    //新建完成就是待发送状态
                    serviceSubtask.setSendstate(2L);
                    serviceSubtask.setDeptcode(patTaskRelevance.getDeptcode());
                    serviceSubtask.setDeptname(patTaskRelevance.getDeptName());
                    serviceSubtask.setLeavehospitaldistrictcode(patTaskRelevance.getLeavehospitaldistrictcode());
@@ -826,20 +830,23 @@
                    redisCache.removeElementFromList("cache-3", serviceSubtask.getId().toString());
                    redisCache.removeElementFromList("cache-4", serviceSubtask.getId().toString());
                    //将出入院表的数据,还原成还未处理的状态
                    if(serviceSubtask.getServiceType().equals("2")) {
                        PatMedInhosp patMedInhosp = new PatMedInhosp();
                        patMedInhosp.setDeptcheckFlag("0");
                        patMedInhosp.setWardcheckFlag("0");
                        patMedInhosp.setDiagcheckFlag("0");
                        patMedInhosp.setInhospid(serviceSubtask.getInhospid());
                        patMedInhospMapper.updatePatMedInhosp(patMedInhosp);
                    }else if(serviceSubtask.getServiceType().equals("3")) {
                        if(serviceSubtask.getInhospid()!=null) {
                            PatMedOuthospQueryReq req=new PatMedOuthospQueryReq();
                    if (serviceSubtask.getServiceType().equals("2")) {
                        ServiceTask st = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
                        //如果任务是长期任务,需要将该患者的出入院数据还原成还未处理的状态
                        if (st != null && st.getLongTask() == 1) {
                            PatMedInhosp patMedInhosp = new PatMedInhosp();
                            patMedInhosp.setDeptcheckFlag("0");
                            patMedInhosp.setWardcheckFlag("0");
                            patMedInhosp.setDiagcheckFlag("0");
                            patMedInhosp.setInhospid(serviceSubtask.getInhospid());
                            patMedInhospMapper.updatePatMedInhosp(patMedInhosp);
                        }
                    } else if (serviceSubtask.getServiceType().equals("3")) {
                        if (serviceSubtask.getInhospid() != null) {
                            PatMedOuthospQueryReq req = new PatMedOuthospQueryReq();
                            req.setOuthospno(serviceSubtask.getHospno());
                            List<PatMedOuthosp> patMedOuthosps = patMedOuthospMapper.callSpQueryOuthosp(req);
                            if(CollectionUtils.isNotEmpty(patMedOuthosps)) {
                            if (CollectionUtils.isNotEmpty(patMedOuthosps)) {
                                PatMedOuthosp patMedOuthosp = patMedOuthosps.get(0);
                                patMedOuthosp.setServerState("0");
                                patMedOuthospService.updatePatMedOuthosp(patMedOuthosp);
@@ -2214,6 +2221,8 @@
                    IvrTaskTemplateScript ivrTaskTemplateScript = iIvrTaskTemplateScriptService.selectIvrTaskTemplateScriptByID(serviceSubtaskDetail.getScriptid());
                    if (ivrTaskTemplateScript != null)
                        serviceSubtaskDetail.setCategoryid(ivrTaskTemplateScript.getScriptAssortid());
                    serviceSubtaskDetail.setIsMydException(ivrTaskTemplateScript.getIsMydException());
                    serviceSubtaskDetail.setDimension(ivrTaskTemplateScript.getDimension());
                }
                serviceSubtaskDetail.setSubId(selectServiceSubtaskList.get(0).getId());
@@ -2818,7 +2827,7 @@
                        if (serviceSubtask.getSendstate() != null && !serviceSubtask.getSendstate().equals(4L) && ObjectUtils.isNotEmpty(serviceSubtask.getCurrentPreachform()) && serviceSubtask.getCurrentPreachform().equals("5")) {
                            serviceSubtaskStatistic.setWeChat(serviceSubtaskStatistic.getWeChat() + 1L);
                        }
                    } else if(StringUtils.isNotEmpty(followUpCountStyle) && followUpCountStyle.equals("3")) {
                    } else if (StringUtils.isNotEmpty(followUpCountStyle) && followUpCountStyle.equals("3")) {
                        //首次随访成功
                        if (serviceSubtask.getSendstate() != null && (serviceSubtask.getSendstate().equals(6L))) {
                            serviceSubtaskStatistic.setFollowUpSuccess(serviceSubtaskStatistic.getFollowUpSuccess() + 1L);
@@ -2839,7 +2848,7 @@
                        if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate().equals(6L) && ObjectUtils.isNotEmpty(serviceSubtask.getCurrentPreachform()) && serviceSubtask.getCurrentPreachform().equals("5")) {
                            serviceSubtaskStatistic.setWeChat(serviceSubtaskStatistic.getWeChat() + 1L);
                        }
                    }else {
                    } else {
                        //首次随访成功 - ç»Ÿè®¡æ—¶å€™åŠ ä¸Šä¸æ‰§è¡Œçš„ï¼Œå·²å‘é€çš„
                        if (serviceSubtask.getSendstate() != null && (serviceSubtask.getSendstate().equals(6L) || serviceSubtask.getSendstate().equals(3L) || serviceSubtask.getSendstate().equals(4L))) {
                            serviceSubtaskStatistic.setFollowUpSuccess(serviceSubtaskStatistic.getFollowUpSuccess() + 1L);
@@ -2909,7 +2918,7 @@
                        if (serviceSubtask.getSendstate() != null && !serviceSubtask.getSendstate().equals(4L) && ObjectUtils.isNotEmpty(serviceSubtask.getCurrentPreachform()) && serviceSubtask.getCurrentPreachform().equals("5")) {
                            serviceSubtaskStatistic.setWeChatAgain(serviceSubtaskStatistic.getWeChatAgain() + 1L);
                        }
                    } else if(StringUtils.isNotEmpty(followUpCountStyle) && followUpCountStyle.equals("3")) {
                    } else if (StringUtils.isNotEmpty(followUpCountStyle) && followUpCountStyle.equals("3")) {
                        //再次随访成功
                        if (serviceSubtask.getSendstate() != null && (serviceSubtask.getSendstate().equals(6L))) {
                            serviceSubtaskStatistic.setFollowUpSuccessAgain(serviceSubtaskStatistic.getFollowUpSuccessAgain() + 1L);
@@ -3059,7 +3068,7 @@
                    if (serviceSubtask.getSendstate() != null && !serviceSubtask.getSendstate().equals(4L) && ObjectUtils.isNotEmpty(serviceSubtask.getCurrentPreachform()) && serviceSubtask.getCurrentPreachform().equals("5")) {
                        serviceSubtaskStatistic.setWeChat(serviceSubtaskStatistic.getWeChat() + 1L);
                    }
                }  else if(StringUtils.isNotEmpty(followUpCountStyle) && followUpCountStyle.equals("3")) {
                } else if (StringUtils.isNotEmpty(followUpCountStyle) && followUpCountStyle.equals("3")) {
                    //首次随访成功
                    if (serviceSubtask.getSendstate() != null && (serviceSubtask.getSendstate().equals(6L))) {
                        serviceSubtaskStatistic.setFollowUpSuccess(serviceSubtaskStatistic.getFollowUpSuccess() + 1L);
@@ -3206,7 +3215,7 @@
                    if (serviceSubtask.getSendstate() != null && !serviceSubtask.getSendstate().equals(4L) && ObjectUtils.isNotEmpty(serviceSubtask.getCurrentPreachform()) && serviceSubtask.getCurrentPreachform().equals("5")) {
                        serviceSubtaskStatistic.setWeChatAgain(serviceSubtaskStatistic.getWeChatAgain() + 1L);
                    }
                }  else if(StringUtils.isNotEmpty(followUpCountStyle) && followUpCountStyle.equals("3")) {
                } else if (StringUtils.isNotEmpty(followUpCountStyle) && followUpCountStyle.equals("3")) {
                    //再次随访成功
                    if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate().equals(6L)) {
                        serviceSubtaskStatistic.setFollowUpSuccessAgain(serviceSubtaskStatistic.getFollowUpSuccessAgain() + 1L);
@@ -3707,8 +3716,8 @@
         */
        if (StringUtils.isNotEmpty(followUpCountStyle) && followUpCountStyle.equals("2")) {
            List<Long> sendstates = serviceSubtaskCountReq.getSendstates();
            if(CollectionUtils.isNotEmpty(sendstates) && sendstates.get(0).equals(6L)){
                List<Long> sendstates1 =new ArrayList<>();
            if (CollectionUtils.isNotEmpty(sendstates) && sendstates.get(0).equals(6L)) {
                List<Long> sendstates1 = new ArrayList<>();
                sendstates1.add(3L);
                sendstates1.add(4L);
                sendstates1.add(6L);
@@ -3884,10 +3893,7 @@
        //获取及时率统计合集
        Map<String, Map<String, Object>> jsRates = getSsRateForSfStatistics(serviceSubtaskCountReq, collect);
        //一次性查询所有分组的题目统计,避免每个分组一次SQL(N+1)
        List<Long> allSubTaskIds = rawData.stream().map(ServiceSubtask::getId)
                .filter(Objects::nonNull)
                .distinct()
                .collect(Collectors.toList());
        List<Long> allSubTaskIds = rawData.stream().map(ServiceSubtask::getId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
        List<ServiceSubtaskCount> subCounts = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(allSubTaskIds)) {
            serviceSubtaskCountReq.setSubTaskIds(allSubTaskIds);
smartor/src/main/resources/mapper/smartor/IvrLibaScriptMapper.xml
@@ -7,6 +7,7 @@
    <resultMap type="com.smartor.domain.IvrLibaScript" id="IvrLibaScriptResult">
        <result property="id" column="id"/>
        <result property="assortid" column="assortid"/>
        <result property="dimension" column="dimension"/>
        <result property="scriptTopic" column="script_topic"/>
        <result property="scriptContent" column="script_content"/>
        <result property="ivrVoice" column="ivr_voice"/>
@@ -58,6 +59,7 @@
    <sql id="selectIvrLibaScriptVo">
        select id,
               suitway,
               dimension,
               assortid,
               targetdesc,
               campus,
@@ -94,6 +96,7 @@
            and del_flag = 0
            <if test="id != null ">and id = #{id}</if>
            <if test="deptIds != null  and deptIds != ''">and deptIds = #{deptIds}</if>
            <if test="dimension != null  and dimension != ''">and dimension = #{dimension}</if>
            <if test="deptNames != null  and deptNames != ''">and deptNames like concat('%', #{deptNames}, '%')</if>
            <if test="scriptTopic != null  and scriptTopic != ''">and script_topic like concat('%', #{scriptTopic},
                '%')
@@ -191,6 +194,7 @@
            <if test="valueType != null">value_type,</if>
            <if test="reply != null">reply,</if>
            <if test="targetdesc != null">targetdesc,</if>
            <if test="dimension != null">dimension,</if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="scriptTopic != null">#{scriptTopic},</if>
@@ -240,6 +244,7 @@
            <if test="valueType != null">#{valueType},</if>
            <if test="reply != null">#{reply},</if>
            <if test="targetdesc != null">#{targetdesc},</if>
            <if test="dimension != null">#{dimension},</if>
        </trim>
    </insert>
@@ -294,6 +299,7 @@
            <if test="valueType != null">value_type = #{valueType},</if>
            <if test="reply != null">reply = #{reply},</if>
            <if test="targetdesc != null">targetdesc = #{targetdesc},</if>
            <if test="dimension != null">dimension = #{dimension},</if>
        </trim>
        where id = #{id}
    </update>
smartor/src/main/resources/mapper/smartor/IvrLibaTemplateScriptMapper.xml
@@ -53,11 +53,16 @@
        <result property="dutyDeptCode" column="duty_dept_code"/>
        <result property="reportDeptCode" column="report_dept_name"/>
        <result property="reportDeptName" column="report_dept_code"/>
        <result property="isMydException" column="is_myd_exception"/>
        <result property="dimension" column="dimension"/>
    </resultMap>
    <sql id="selectIvrLibaTemplateScriptVo">
        select id,
               scriptno,
               is_myd_exception,
               dimension,
               sort,
               script_assortname,
               duty_dept_name,
@@ -111,6 +116,8 @@
        <include refid="selectIvrLibaTemplateScriptVo"/>
        where del_flag = 0
        <if test="scriptno != null ">and scriptno = #{scriptno}</if>
        <if test="isMydException != null ">and is_myd_exception = #{isMydException}</if>
        <if test="dimension != null ">and dimension = #{dimension}</if>
        <if test="scriptAssortid != null ">and script_assortid = #{scriptAssortid}</if>
        <if test="groupName != null ">and group_name = #{groupName}</if>
        <if test="scriptDesc != null ">and script_desc = #{scriptDesc}</if>
@@ -169,6 +176,19 @@
        <if test="score != null">and score = #{score}</if>
    </select>
    <select id="selectILTSBydimension" parameterType="com.smartor.domain.IvrLibaTemplateScript"
            resultMap="IvrLibaTemplateScriptResult">
        <include refid="selectIvrLibaTemplateScriptVo"/>
        <where>del_flag=0
            <if test="dimensionList != null ">and dimension in
                <foreach item="dimension" collection="dimensionList" open="(" separator="," close=")">
                    #{dimension}
                </foreach>
            </if>
        </where>
    </select>
    <select id="selectIvrLibaTemplateScriptByID" parameterType="Long" resultMap="IvrLibaTemplateScriptResult">
        <include refid="selectIvrLibaTemplateScriptVo"/>
        where id = #{id}
@@ -225,6 +245,8 @@
            <if test="dutyDeptCode != null  and dutyDeptCode != ''">duty_dept_code,</if>
            <if test="reportDeptName != null  and reportDeptName != ''">report_dept_name,</if>
            <if test="reportDeptCode != null  and reportDeptCode != ''">report_dept_code,</if>
            <if test="isMydException != null  and isMydException != ''">is_myd_exception,</if>
            <if test="dimension != null  and dimension != ''">dimension,</if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="scriptno != null">#{scriptno},</if>
@@ -273,6 +295,8 @@
            <if test="dutyDeptCode != null  and dutyDeptCode != ''">#{dutyDeptCode},</if>
            <if test="reportDeptName != null  and reportDeptName != ''">#{reportDeptName},</if>
            <if test="reportDeptCode != null  and reportDeptCode != ''">#{reportDeptCode},</if>
            <if test="isMydException != null  and isMydException != ''">#{isMydException},</if>
            <if test="dimension != null  and dimension != ''">#{dimension},</if>
        </trim>
    </insert>
@@ -313,6 +337,8 @@
            <if test="isMust != null  and isMust != ''">is_must = #{isMust},</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>
            <if test="dimension != null  and dimension != ''">dimension = #{dimension},</if>
            <if test="sort != null ">sort = #{sort},</if>
            <if test="ivrtext != null ">ivrtext = #{ivrtext},</if>
            <if test="branchFlag != null  and branchFlag != ''">branch_flag = #{branchFlag},</if>
@@ -350,10 +376,10 @@
        <include refid="selectIvrLibaTemplateScriptVo"/>
        where del_flag=0
        <if test="scriptAssortids != null and scriptAssortids.size > 0">
        and script_assortid in
        <foreach item="scriptAssortid" collection="scriptAssortids" open="(" separator="," close=")">
            #{scriptAssortid}
        </foreach>
            and script_assortid in
            <foreach item="scriptAssortid" collection="scriptAssortids" open="(" separator="," close=")">
                #{scriptAssortid}
            </foreach>
        </if>
    </select>
</mapper>
smartor/src/main/resources/mapper/smartor/IvrTaskTemplateScriptMapper.xml
@@ -53,11 +53,15 @@
        <result property="dutyDeptCode" column="duty_dept_code"/>
        <result property="reportDeptCode" column="report_dept_name"/>
        <result property="reportDeptName" column="report_dept_code"/>
        <result property="dimension" column="dimension"/>
        <result property="isMydException" column="is_myd_exception"/>
    </resultMap>
    <sql id="selectIvrTaskTemplateScriptVo">
        select id,
               taskid,
               dimension,
               is_myd_exception,
               duty_dept_name,
               duty_dept_code,
               report_dept_name,
@@ -93,6 +97,8 @@
        where 1=1
        and del_flag = 0
        <if test="taskid != null ">and taskid = #{taskid}</if>
        <if test="dimension != null  and dimension != ''">and dimension = #{dimension}</if>
        <if test="isMydException != null  and isMydException != ''">and is_myd_exception = #{isMydException}</if>
        <if test="scriptAssortid != null ">and script_assortid = #{scriptAssortid}</if>
        <if test="score != null ">and score = #{score}</if>
        <if test="scriptTopic != null ">and script_topic = #{scriptTopic}</if>
@@ -205,6 +211,8 @@
            <if test="dutyDeptCode != null  and dutyDeptCode != ''">duty_dept_code,</if>
            <if test="reportDeptName != null  and reportDeptName != ''">report_dept_name,</if>
            <if test="reportDeptCode != null  and reportDeptCode != ''">report_dept_code,</if>
            <if test="dimension != null  and dimension != ''">dimension,</if>
            <if test="isMydException != null  and isMydException != ''">is_myd_exception,</if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="taskid != null">#{taskid},</if>
@@ -253,6 +261,8 @@
            <if test="dutyDeptCode != null  and dutyDeptCode != ''">#{dutyDeptCode},</if>
            <if test="reportDeptName != null  and reportDeptName != ''">#{reportDeptName},</if>
            <if test="reportDeptCode != null  and reportDeptCode != ''">#{reportDeptCode},</if>
            <if test="dimension != null  and dimension != ''">#{dimension},</if>
            <if test="isMydException != null  and isMydException != ''">#{isMydException},</if>
        </trim>
    </insert>
@@ -303,6 +313,8 @@
            <if test="ivrtext != null">ivrtext = #{ivrtext},</if>
            <if test="scriptTopic != null ">script_topic = #{scriptTopic},</if>
            <if test="scriptAssortid != null ">script_assortid = #{scriptAssortid},</if>
            <if test="dimension != null  and dimension != ''">dimension = #{dimension},</if>
            <if test="isMydException != null  and isMydException != ''">is_myd_exception = #{isMydException},</if>
            <if test="dutyDeptName != null  and dutyDeptName != ''">duty_dept_name = #{dutyDeptName},</if>
            <if test="dutyDeptCode != null  and dutyDeptCode != ''">duty_dept_code = #{dutyDeptCode},</if>
            <if test="reportDeptName != null  and reportDeptName != ''">report_dept_name = #{reportDeptName},</if>
smartor/src/main/resources/mapper/smartor/ServiceSubtaskDetailMapper.xml
@@ -18,6 +18,8 @@
        <result property="assigntime" column="assigntime"/>
        <result property="starttime" column="starttime"/>
        <result property="answertime" column="answertime"/>
        <result property="dimension" column="lib_templateid"/>
        <result property="isMydException" column="is_myd_exception"/>
        <result property="silent" column="silent"/>
        <result property="dtmfKey" column="dtmf_key"/>
@@ -70,6 +72,8 @@
    <sql id="selectServiceSubtaskDetailVo">
        select id,
               sub_id,
               is_myd_exception,
               dimension,
               lib_templateid,
               targetid,
               answerps,
@@ -129,6 +133,8 @@
        <include refid="selectServiceSubtaskDetailVo"/>
        where 1=1
        <if test="subId != null">and sub_id = #{subId}</if>
        <if test="isMydException != null">and is_myd_exception = #{isMydException}</if>
        <if test="dimension != null">and dimension = #{dimension}</if>
        <if test="templateType != null">and template_type = #{templateType}</if>
        <if test="libTemplateid != null">and lib_templateid = #{libTemplateid}</if>
        <if test="targetid != null">and targetid = #{targetid}</if>
@@ -183,6 +189,8 @@
            resultType="java.util.HashMap">
        select
            ssd.sub_id,
            ssd.is_myd_exception,
            ssd.dimension,
            ssd.taskid,
            ssd.patid,
            sd.sendname,
@@ -205,6 +213,8 @@
        <if test="subId != null">and ssd.sub_id = #{subId}</if>
        <if test="taskid != null">and ssd.taskid = #{taskid}</if>
        <if test="questiontext != null and questiontext != ''">and ssd.questiontext = #{questiontext}</if>
        <if test="isMydException != null">and ssd.is_myd_exception = #{isMydException}</if>
        <if test="dimension != null">and ssd.dimension = #{dimension}</if>
        <if test="matchedtext != null and matchedtext != ''">and ssd.matchedtext = #{matchedtext}</if>
        <if test="asrtext != null and asrtext != ''">and ssd.asrtext = #{asrtext}</if>
        <if test="scriptid != null">and ssd.scriptid = #{scriptid}</if>
@@ -314,6 +324,8 @@
            <if test="templateType != null">template_type,</if>
            <if test="libTemplateid != null">lib_templateid,</if>
            <if test="score != null">score,</if>
            <if test="isMydException != null">is_myd_exception,</if>
            <if test="dimension != null">dimension,</if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="id != null">#{id},</if>
@@ -369,12 +381,16 @@
            <if test="templateType != null">#{templateType},</if>
            <if test="libTemplateid != null">#{libTemplateid},</if>
            <if test="score != null">#{score},</if>
            <if test="isMydException != null">#{isMydException},</if>
            <if test="dimension != null">#{dimension},</if>
        </trim>
    </insert>
    <update id="updateServiceSubtaskDetail" parameterType="com.smartor.domain.ServiceSubtaskDetail">
        update service_subtask_detail
        <trim prefix="SET" suffixOverrides=",">
            <if test="isMydException != null">is_myd_exception = #{isMydException},</if>
            <if test="dimension != null">dimension = #{dimension},</if>
            <if test="subId != null">sub_id = #{subId},</if>
            <if test="taskid != null">taskid = #{taskid},</if>
            <if test="targetid != null">targetid = #{targetid},</if>
@@ -487,6 +503,8 @@
            <if test="templateType != null">template_type = #{templateType},</if>
            <if test="libTemplateid != null">lib_templateid = #{libTemplateid},</if>
            <if test="score != null">score = #{score},</if>
            <if test="isMydException != null">is_myd_exception = #{isMydException},</if>
            <if test="dimension != null">dimension = #{dimension},</if>
        </trim>
        where patid = #{patid} and scriptid = #{scriptid} and sub_id = #{subId}
    </update>
smartor/src/main/resources/mapper/smartor/ServiceSubtaskDetailTraceMapper.xml
@@ -53,11 +53,15 @@
        <result property="pid" column="pid"/>
        <result property="categoryid" column="categoryid"/>
        <result property="templateType" column="template_type"/>
        <result property="isMydException" column="is_myd_exception"/>
        <result property="dimension" column="dimension"/>
    </resultMap>
    <sql id="selectServiceSubtaskDetailTtraceVo">
        select id,
               detail_id,
               is_myd_exception,
               dimension,
               template_type,
               sub_id,
               taskid,
@@ -247,6 +251,12 @@
        <if test="type != null  and type != ''">
            and type = #{type}
        </if>
        <if test="dimension != null  and dimension != ''">
            and dimension = #{dimension}
        </if>
        <if test="isMydException != null ">
            and is_myd_exception = #{isMydException}
        </if>
    </select>
    <select id="tracedeallist" parameterType="com.smartor.domain.VO.DetailTraceDealVO"
@@ -276,6 +286,12 @@
        </if>
        <if test="templateType != null">
            and template_type = #{templateType}
        </if>
        <if test="isMydException != null ">
            and is_myd_exception = #{isMydException}
        </if>
        <if test="dimension != null  and dimension != ''">
            and dimension = #{dimension}
        </if>
    </select>
@@ -386,6 +402,10 @@
            </if>
            <if test="templateType != null">template_type,
            </if>
            <if test="dimension != null">dimension,
            </if>
            <if test="isMydException != null">is_myd_exception,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="detailId != null">#{detailId},
@@ -483,6 +503,10 @@
            <if test="type != null">#{type},
            </if>
            <if test="templateType != null">#{templateType},
            </if>
            <if test="dimension != null">#{dimension},
            </if>
            <if test="isMydException != null">#{isMydException},
            </if>
        </trim>
    </insert>
@@ -634,6 +658,12 @@
            <if test="templateType != null">template_type =
                #{templateType},
            </if>
            <if test="dimension != null">dimension =
                #{dimension},
            </if>
            <if test="isMydException != null">is_myd_exception =
                #{isMydException},
            </if>
        </trim>
        where id = #{id}
    </update>
smartor/src/main/resources/mapper/smartor/SvyLibScriptMapper.xml
@@ -38,11 +38,13 @@
        <result property="targetname" column="targetname"/>
        <result property="targettype" column="targettype"/>
        <result property="targetoptions" column="targetoptions"/>
        <result property="dimension" column="dimension"/>
    </resultMap>
    <sql id="selectSvyLibScriptVo">
        select id,
               scoretype,
               dimension,
               targetid,
               targetname,
               targettype,
@@ -83,6 +85,7 @@
            and del_flag = 0
            <if test="id != null ">and id = #{id}</if>
            <if test="scriptType != null and scriptType != ''">and script_type = #{scriptType}</if>
            <if test="dimension != null and dimension != ''">and dimension = #{dimension}</if>
            <if test="categoryid != null ">and categoryid = #{categoryid}</if>
            <if test="scriptContent != null  and scriptContent != ''">and script_content like concat('%',
                #{scriptContent}, '%')
@@ -146,6 +149,7 @@
            <if test="targettype != null  and targettype != ''">targettype,</if>
            <if test="targetoptions != null  and targetoptions != ''">targetoptions,</if>
            <if test="guid != null  and guid != ''">guid,</if>
            <if test="dimension != null  and dimension != ''">dimension,</if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="scriptType != null">#{scriptType},</if>
@@ -180,6 +184,7 @@
            <if test="targettype != null  and targettype != ''">#{targettype},</if>
            <if test="targetoptions != null  and targetoptions != ''">#{targetoptions},</if>
            <if test="guid != null  and guid != ''">#{guid},</if>
            <if test="dimension != null  and dimension != ''">#{dimension},</if>
        </trim>
    </insert>
@@ -217,6 +222,7 @@
            <if test="targetname != null  and targetname != ''">targetname = #{targetname},</if>
            <if test="targettype != null  and targettype != ''">targettype = #{targettype},</if>
            <if test="targetoptions != null  and targetoptions != ''">targetoptions = #{targetoptions},</if>
            <if test="dimension != null  and dimension != ''">dimension = #{dimension},</if>
        </trim>
        where id = #{id}
    </update>
smartor/src/main/resources/mapper/smartor/SvyLibTemplateScriptMapper.xml
@@ -50,11 +50,16 @@
        <result property="dutyDeptCode" column="duty_dept_code"/>
        <result property="reportDeptCode" column="report_dept_name"/>
        <result property="reportDeptName" column="report_dept_code"/>
        <result property="isMydException" column="is_myd_exception"/>
        <result property="dimension" column="dimension"/>
    </resultMap>
    <sql id="selectSvyLibTemplateScriptVo">
        select id,
               script_type,
               is_myd_exception,
               dimension,
               duty_dept_name,
               duty_dept_code,
               report_dept_name,
@@ -105,6 +110,8 @@
        and del_flag = 0
        <if test="nextScriptno != null ">and next_scriptno = #{nextScriptno}</if>
        <if test="scriptType != null  and scriptType != ''">and script_type = #{scriptType}</if>
        <if test="isMydException != null  and isMydException != ''">and is_myd_exception = #{isMydException}</if>
        <if test="dimension != null  and dimension != ''">and dimension = #{dimension}</if>
        <if test="scriptno != null  and scriptno != ''">and scriptno = #{scriptno}</if>
        <if test="scriptid != null">and scriptid = #{scriptid}</if>
        <if test="scriptDesc != null  and scriptDesc != ''">and script_desc = #{scriptDesc}</if>
@@ -164,6 +171,18 @@
        <if test="pageSize != null  and pageNum != null">limit ${pageSize} OFFSET ${pageNum}</if>
    </select>
    <select id="selectSLTScriptListBydimension" parameterType="com.smartor.domain.SvyLibTemplateScriptVO"
            resultMap="SvyLibTemplateScriptResult">
        <include refid="selectSvyLibTemplateScriptVo"/>
        <where>del_flag=0
            <if test="dimensionList != null ">and dimension in
                <foreach item="dimension" collection="dimensionList" open="(" separator="," close=")">
                    #{dimension}
                </foreach>
            </if>
        </where>
    </select>
    <select id="selectSvyLibTemplateScriptByTopicid" parameterType="Long" resultMap="SvyLibTemplateScriptResult">
        <include refid="selectSvyLibTemplateScriptVo"/>
        where id = #{id}
@@ -218,6 +237,8 @@
            <if test="reportDeptName != null  and reportDeptName != ''">report_dept_name,</if>
            <if test="reportDeptCode != null  and reportDeptCode != ''">report_dept_code,</if>
            <if test="categoryName != null  and categoryName != ''">categoryName,</if>
            <if test="isMydException != null  and isMydException != ''">is_myd_exception,</if>
            <if test="dimension != null  and dimension != ''">dimension,</if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="nextScriptno != null">#{nextScriptno},</if>
@@ -265,6 +286,8 @@
            <if test="reportDeptName != null  and reportDeptName != ''">#{reportDeptName},</if>
            <if test="reportDeptCode != null  and reportDeptCode != ''">#{reportDeptCode},</if>
            <if test="categoryName != null  and categoryName != ''">#{categoryName},</if>
            <if test="isMydException != null  and isMydException != ''">#{isMydException},</if>
            <if test="dimension != null  and dimension != ''">#{dimension},</if>
        </trim>
    </insert>
@@ -318,6 +341,8 @@
            <if test="reportDeptName != null  and reportDeptName != ''">report_dept_name = #{reportDeptName},</if>
            <if test="reportDeptCode != null  and reportDeptCode != ''">report_dept_code = #{reportDeptCode},</if>
            <if test="categoryName != null  and categoryName != ''">categoryName = #{categoryName},</if>
            <if test="isMydException != null  and isMydException != ''">is_myd_exception = #{isMydException},</if>
            <if test="dimension != null  and dimension != ''">dimension = #{dimension},</if>
        </trim>
        where id = #{id}
    </update>
@@ -335,14 +360,14 @@
        </foreach>
    </delete>
    <select id="querySvyLibTemplateIds"  resultMap="SvyLibTemplateScriptResult">
    <select id="querySvyLibTemplateIds" resultMap="SvyLibTemplateScriptResult">
        <include refid="selectSvyLibTemplateScriptVo"/>
        where del_flag=0
        <if test="scriptCategoryids != null and scriptCategoryids.size > 0">
        and categoryid in
        <foreach item="scriptCategoryid" collection="scriptCategoryids" open="(" separator="," close=")">
            #{scriptCategoryid}
        </foreach>
            and categoryid in
            <foreach item="scriptCategoryid" collection="scriptCategoryids" open="(" separator="," close=")">
                #{scriptCategoryid}
            </foreach>
        </if>
    </select>
</mapper>
smartor/src/main/resources/mapper/smartor/SvyTaskTemplateScriptMapper.xml
@@ -49,11 +49,15 @@
        <result property="dutyDeptCode" column="duty_dept_code"/>
        <result property="reportDeptCode" column="report_dept_name"/>
        <result property="reportDeptName" column="report_dept_code"/>
        <result property="isMydException" column="is_myd_exception"/>
        <result property="dimension" column="dimension"/>
    </resultMap>
    <sql id="selectSvyTaskTemplateScriptVo">
        select id,
               sort,
               is_myd_exception,
               dimension,
               duty_dept_name,
               duty_dept_code,
               report_dept_name,
@@ -81,6 +85,8 @@
        <include refid="selectSvyTaskTemplateScriptVo"/>
        where 1=1
            <if test="taskid != null ">and taskid = #{taskid}</if>
            <if test="isMydException != null ">and is_myd_exception = #{isMydException}</if>
            <if test="dimension != null ">and dimension = #{dimension}</if>
            <if test="categoryid != null ">and categoryid = #{categoryid}</if>
            <if test="ishide != null ">and ishide = #{ishide}</if>
            <if test="scriptno != null ">and scriptno = #{scriptno}</if>
@@ -183,6 +189,8 @@
            <if test="dutyDeptCode != null  and dutyDeptCode != ''">duty_dept_code,</if>
            <if test="reportDeptName != null  and reportDeptName != ''">report_dept_name,</if>
            <if test="reportDeptCode != null  and reportDeptCode != ''"> report_dept_code,</if>
            <if test="isMydException != null ">is_myd_exception,</if>
            <if test="dimension != null ">dimension,</if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="taskid != null">#{taskid},</if>
@@ -228,6 +236,8 @@
            <if test="dutyDeptCode != null  and dutyDeptCode != ''">#{dutyDeptCode},</if>
            <if test="reportDeptName != null  and reportDeptName != ''">#{reportDeptName},</if>
            <if test="reportDeptCode != null  and reportDeptCode != ''">#{reportDeptCode},</if>
            <if test="isMydException != null ">#{isMydException},</if>
            <if test="dimension != null ">#{dimension},</if>
        </trim>
    </insert>
@@ -279,6 +289,8 @@
            <if test="dutyDeptCode != null  and dutyDeptCode != ''"> duty_dept_code = #{dutyDeptCode},</if>
            <if test="reportDeptName != null  and reportDeptName != ''">report_dept_name = #{reportDeptName},</if>
            <if test="reportDeptCode != null  and reportDeptCode != ''">report_dept_code = #{reportDeptCode},</if>
            <if test="isMydException != null ">is_myd_exception = #{isMydException},</if>
            <if test="dimension != null ">dimension = #{dimension},</if>
        </trim>
        where id = #{d}
    </update>