274d8e2950e79e73b14783e497cdaf97f7dbb8d3..b9f987ca7a4154a34f605c046eadbf455d6981e5
2026-09-11 陈昶聿
【市一】同步数据
b9f987 对比 | 目录
2026-09-11 liusheng
Merge remote-tracking branch 'origin/master'
cb5b7b 对比 | 目录
2026-09-11 liusheng
漏提交
3daeab 对比 | 目录
2026-09-11 陈昶聿
Merge remote-tracking branch 'origin/master'
0d10bc 对比 | 目录
2026-09-11 陈昶聿
【市一】同步数据
b1e21a 对比 | 目录
2026-09-11 liusheng
漏提交
8b380f 对比 | 目录
2026-09-11 liusheng
1.省立同德的满意度功能处理 2.省立同德、南华采集时间缩短 3.给保存问卷接口,加一下防止重复提前的注解@RepeatSubmit 4.省立同德新增...
2013ea 对比 | 目录
2026-09-11 liusheng
Merge branch 'master' of http://116.62.18.175:6699/r/smartor
e4872d 对比 | 目录
2026-09-10 陈昶聿
【景宁】批量新增患者满意度调整
1a3808 对比 | 目录
2026-09-09 陈昶聿
【景宁】景宁再入院逻辑调整
f58b1d 对比 | 目录
2026-09-09 陈昶聿
【市一】手术详情同步
2943d0 对比 | 目录
2026-09-07 陈昶聿
【丽水】SSO重定向跳转详情页面
16b363 对比 | 目录
2026-09-07 陈昶聿
【丽水】SSO重定向跳转详情页面
f68f81 对比 | 目录
2026-09-04 陈昶聿
【市一】处理市一同步
9db295 对比 | 目录
2026-09-03 陈昶聿
【丽水】处理超时随访任务
7a5ef4 对比 | 目录
2026-09-03 陈昶聿
【丽水】getInfo接口返回叶子节点
0c607d 对比 | 目录
2026-09-03 陈昶聿
【丽水】手术撤销
25c9ca 对比 | 目录
2026-09-03 陈昶聿
【丽水】手术撤销
e98752 对比 | 目录
2026-09-03 陈昶聿
【丽水】手术随访调整
ae3867 对比 | 目录
2026-09-03 陈昶聿
【丽水】缙云二院 住院记录不更新状态
284df1 对比 | 目录
2026-09-03 陈昶聿
【丽水】手术随访调整
c047ea 对比 | 目录
2026-09-03 陈昶聿
【丽水】手术随访调整
3a8937 对比 | 目录
2026-09-03 陈昶聿
【丽水】手术随访调整
365472 对比 | 目录
2026-09-02 陈昶聿
【丽水】缙云人民-经管医生替换医生姓名
7b1f7b 对比 | 目录
已修改53个文件
已添加6个文件
2063 ■■■■■ 文件已修改
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatSatisfactionController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskAnswerController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskDetailController.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskDetailTraceController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/sso/SSOController.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-xh.yml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application.yml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/ArrayListUtils.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/CollectHISServiceImpl.java 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/resources/mapper/quartz/CollectHISMapper.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/DTO/AiMatcherDto.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/DTO/QuestionResultDTO.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/IvrLibaTemplateScript.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/IvrTaskTemplateScript.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/IvrTaskTemplateScriptVO.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/OutboundConfigAddReqVO.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/OutboundInstanceResVO.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/PatMedInhosp.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/PatSatisfaction.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSubtask.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSubtaskDetailRatioExport.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSubtaskDetailTrace.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSubtaskExport.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/SvyLibTemplateScript.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/SvyLibTemplateScriptVO.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/SvyTaskTemplateScript.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/SvyTaskTemplateScriptVO.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/VO/DetailTraceDealVO.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/VO/QuestionResultVO.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/VO/ServiceSubtaskVO.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/entity/ServiceSubtaskEntity.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/PatMedOperationItemMapper.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/ServiceSubtaskMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/SvyLibTemplateScriptMapper.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IPatSatisfactionService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IServiceExternalService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IServiceSubtaskService.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/PatArchiveImportServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/PatSatisfactionServiceImpl.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceExternalServiceImpl.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/IvrLibaTemplateScriptMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/IvrTaskTemplateScriptMapper.xml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/PatMedInhospMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/PatMedOperationItemMapper.xml 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/PatSatisfactionMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/ServiceSubtaskDetailTraceMapper.xml 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/SvyLibTemplateScriptMapper.xml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/SvyTaskTemplateScriptMapper.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatSatisfactionController.java
@@ -121,14 +121,8 @@
    @Log(title = "患者满意度", businessType = BusinessType.INSERT)
    @PostMapping("/batchinsert")
    public AjaxResult batchinsert(@RequestBody List<PatSatisfaction> patSatisfaction) {
        LoginUser loginUser = getLoginUser();
        SysUser user = loginUser.getUser();
        for (PatSatisfaction patSatisfaction1 : patSatisfaction) {
            patSatisfaction1.setCreateBy(user.getNickName());
            patSatisfaction1.setOrgid(user.getOrgid());
            patSatisfactionService.insertPatSatisfaction(patSatisfaction1);
        }
        return toAjax(1);
        Integer row = patSatisfactionService.batchInsert(patSatisfaction);
        return toAjax(row);
    }
    /**
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskAnswerController.java
@@ -1,6 +1,7 @@
package com.ruoyi.web.controller.smartor;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.annotation.RepeatSubmit;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
@@ -120,8 +121,8 @@
    @ApiOperation("患者问题结果记录 (外链)")
    @PostMapping("/saveQuestionAnswer")
    public AjaxResult saveQuestionAnswer(@RequestBody ServiceSubTaskAnswerReq serviceSubTaskAnswerReq) {
        log.info("【saveQuestionAnswer】的入参为 param1:{},param2:{},type:{},isabnormal:{}",
                serviceSubTaskAnswerReq.getParam1(), serviceSubTaskAnswerReq.getParam2(),
        log.info("【saveQuestionAnswer】的入参为 param1:{},param2:{},type:{},isabnormal:{}",
                serviceSubTaskAnswerReq.getParam1(), serviceSubTaskAnswerReq.getParam2(),
                serviceSubTaskAnswerReq.getType(), serviceSubTaskAnswerReq.getIsabnormal());
        // å¼‚步处理保存逻辑,立即返回成功消息
        serviceSubtaskAnswerService.saveQuestionAnswer(serviceSubTaskAnswerReq, 0L);
@@ -130,6 +131,7 @@
    @ApiOperation("患者问题结果记录缓存(小程序外链)")
    @RepeatSubmit
    @PostMapping("/saveQuestionCacheXCH")
    public AjaxResult saveQuestionCacheXCH(@RequestBody ServiceSubTaskCacheReq serviceSubTaskCacheReq) {
        log.info("【saveQuestionCache-----saveQuestionCacheXCH】的入参为:{}", serviceSubTaskCacheReq);
@@ -137,6 +139,7 @@
    }
    @ApiOperation("患者问题结果保存")
    @RepeatSubmit
    @PostMapping("/savequestiondetail")
    public AjaxResult saveQuestionDetail(@RequestBody ServiceSubTaskCacheReq serviceSubTaskCacheReq) {
        log.info("【saveQuestionDetail-----saveQuestionCache】的prarm1:{},prarm2:{},type:{},prarm6:{}", serviceSubTaskCacheReq.getParam1(), serviceSubTaskCacheReq.getParam2(), serviceSubTaskCacheReq.getType(), serviceSubTaskCacheReq.getParam6());
@@ -191,6 +194,7 @@
    @ApiOperation("患者满意度结果记录(外链)")
    @RepeatSubmit
    @PostMapping("/saveMYDQuestionAnswer")
    public AjaxResult saveMYDQuestionAnswer(@RequestBody ServiceSubTaskMYDAnswerReq serviceSubTaskAnswerReq) {
        log.info("【saveQuestionCache-----saveMYDQuestionAnswer】的入参为:{}", serviceSubTaskAnswerReq);
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java
@@ -24,10 +24,8 @@
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysUserDeptService;
import com.smartor.domain.*;
import com.smartor.domain.VO.HeLibraryCountVO;
import com.smartor.domain.VO.ServiceSubtaskCotinueCountVO;
import com.smartor.domain.VO.ServiceSubtaskVO;
import com.smartor.domain.VO.TransferDeptVO;
import com.smartor.domain.DTO.QuestionResultDTO;
import com.smartor.domain.VO.*;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.service.IServiceSubtaskRecordService;
import com.smartor.service.IServiceSubtaskService;
@@ -191,59 +189,6 @@
    }
    /**
     * å¸¦Redis缓存的统计查询,供patItem和patItemCount共用,条件不变时直接命中缓存
     */
    private Map<String, Object> getPatItemCountWithCache(ServiceSubtaskEntity serviceSubtaskEntity) {
        Map<String, Object> map = new HashMap<>();
        LoginUser loginUser = getLoginUser();
        Long userId = null;
        if (ObjectUtils.isNotEmpty(loginUser) && ObjectUtils.isNotEmpty(loginUser.getUser())) {
            userId = loginUser.getUser().getUserId();
        }
        if (serviceSubtaskEntity.getSendstateView() != null) {
            //            1:待随访(1 è¢«é¢†å–、2 å¾…发送、3 å·²å‘送、5 å‘送失败、7、超时);2:已完成( 6 å·²å®Œæˆï¼‰ã€3:无需随访(4 ä¸æ‰§è¡Œï¼‰
            if (serviceSubtaskEntity.getSendstateView() == 1)
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(1L, 2L, 3L, 5L, 7L)));
            if (serviceSubtaskEntity.getSendstateView() == 2)
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(6L)));
            if (serviceSubtaskEntity.getSendstateView() == 3)
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(4L)));
        }
        if (ObjectUtils.isNotEmpty(userId)) {
            Map<String, Object> redisMap = redisCache.getCacheObject(userId + "patItemCount");
            Boolean redisFlag = false;
            if (MapUtils.isNotEmpty(redisMap)) {
                ServiceSubtaskEntity oldCondition = (ServiceSubtaskEntity) redisMap.get("searchCondition");
                if (ObjectUtils.isNotEmpty(oldCondition) && isSameCondition(oldCondition, serviceSubtaskEntity)) {
                    redisFlag = true;
                    map = redisMap;
                    redisCache.setCacheObject(userId + "patItemCount", map, 60, TimeUnit.MINUTES);
                }
            }
            if (!redisFlag) {
                map = serviceSubtaskService.patItemCount(serviceSubtaskEntity);
                map.put("searchCondition", serviceSubtaskEntity);
                redisCache.setCacheObject(userId + "patItemCount", map, 120, TimeUnit.MINUTES);
            }
        } else {
            map = serviceSubtaskService.patItemCount(serviceSubtaskEntity);
        }
        return map;
    }
    /**
     * æ¯”较两个ServiceSubtaskVO的查询条件是否一致
     * ä½¿ç”¨åå°„比较所有字段,排除分页参数和无关字段
     */
    private boolean isSameCondition(ServiceSubtaskEntity oldCondition, ServiceSubtaskEntity newCondition) {
        // ä½¿ç”¨ReflectUtils的通用方法比较,排除分页参数等无关字段
        return ReflectUtils.equalsAllFields(oldCondition, newCondition,
                // æŽ’除的字段:分页参数、序列化ID、时间戳等
                "pageNum", "pageSize", "serialVersionUID", "createBy", "createTime", "updateBy", "updateTime", "searchValue", "params");
    }
    /**
     * å¯¼å‡ºå•一任务列表
     */
    //@PreAuthorize("@ss.hasPermi('system:taskcall:export')")
@@ -275,17 +220,11 @@
                    serviceSubtaskExport.setEndDay(endDay);
                }
            }
            if (StringUtils.isNotEmpty(serviceSubtaskVO.getServiceType()) && serviceSubtaskVO.getServiceType().equals("2")) {
                //获取serviceSubtaskList中的所有taskid
                List<Long> taskIds = serviceSubtaskList.stream().map(ServiceSubtaskRes::getTaskid).filter(ObjectUtils::isNotEmpty).distinct().collect(Collectors.toList());
                serviceSubtaskDetailRatioExports = serviceSubtaskService.statQuestionOption(taskIds, serviceSubtaskVO.getStartOutHospTime(), serviceSubtaskVO.getEndOutHospTime());
            } else if (StringUtils.isNotEmpty(serviceSubtaskVO.getServiceType()) && serviceSubtaskVO.getServiceType().equals("6")) {
                //满意度统计 ï¼ˆé€šè¿‡ subtask çš„ id åŽ»ç»Ÿè®¡ï¼‰
                List<Long> subtaskIds = serviceSubtaskList.stream().map(ServiceSubtaskRes::getId).collect(Collectors.toList());
                serviceSubtaskDetailRatioExports = serviceSubtaskService.statQuestionOptionBySubtaskIds(subtaskIds, serviceSubtaskVO.getStartOutHospTime(), serviceSubtaskVO.getEndOutHospTime());
            }
            QuestionResultVO questionResultVO = new QuestionResultVO();
            questionResultVO.setServiceType(serviceSubtaskVO.getServiceType());
            questionResultVO.setEndOutHospTime(serviceSubtaskVO.getEndOutHospTime());
            questionResultVO.setStartOutHospTime(serviceSubtaskVO.getStartOutHospTime());
            serviceSubtaskDetailRatioExports = serviceSubtaskService.getDetailRatio(questionResultVO, serviceSubtaskList);
        }
@@ -478,6 +417,8 @@
        if (ObjectUtils.isNotEmpty(user)) serviceSubtask.setOrgid(user.getOrgid());
        if (ObjectUtils.isNotEmpty(user)) serviceSubtask.setCampusid(user.getCampusid());
        serviceSubtask.setCampusid(user.getCampusid());
        serviceSubtask.setCreateBy(user.getNickName());
        serviceSubtask.setUpdateBy(user.getNickName());
        return success(serviceSubtaskService.insertServiceSubtask(serviceSubtask));
    }
@@ -996,7 +937,6 @@
        return AjaxResult.success("【collectHISDaysBefore】同步任务已启动,天数为" + day + "天,请稍后查看结果");
    }
    @PostMapping("/syncMedOperForShiyi")
    public AjaxResult syncMedOperForShiyi(@RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime) {
        // ç«‹å³è¿”回,后台异步执行
@@ -1005,4 +945,66 @@
        });
        return AjaxResult.success("同步任务已启动,请稍后查看结果");
    }
    @PostMapping("/dealSubtaskDeadline")
    public AjaxResult dealSubtaskDeadline(@RequestParam("orgid") String orgid, @RequestParam("day") Integer day) {
        // ç«‹å³è¿”回,后台异步执行
        ryTask.dealSubtaskDeadline(orgid, day);
        return AjaxResult.success("【dealSubtaskDeadline】同步任务已启动,天数为" + day + "天,请稍后查看结果");
    }
    /**
     * å¸¦Redis缓存的统计查询,供patItem和patItemCount共用,条件不变时直接命中缓存
     */
    private Map<String, Object> getPatItemCountWithCache(ServiceSubtaskEntity serviceSubtaskEntity) {
        Map<String, Object> map = new HashMap<>();
        LoginUser loginUser = getLoginUser();
        Long userId = null;
        if (ObjectUtils.isNotEmpty(loginUser) && ObjectUtils.isNotEmpty(loginUser.getUser())) {
            userId = loginUser.getUser().getUserId();
        }
        if (serviceSubtaskEntity.getSendstateView() != null) {
            //            1:待随访(1 è¢«é¢†å–、2 å¾…发送、3 å·²å‘送、5 å‘送失败、7、超时);2:已完成( 6 å·²å®Œæˆï¼‰ã€3:无需随访(4 ä¸æ‰§è¡Œï¼‰
            if (serviceSubtaskEntity.getSendstateView() == 1)
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(1L, 2L, 3L, 5L, 7L)));
            if (serviceSubtaskEntity.getSendstateView() == 2)
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(6L)));
            if (serviceSubtaskEntity.getSendstateView() == 3)
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(4L)));
        }
        if (ObjectUtils.isNotEmpty(userId)) {
            Map<String, Object> redisMap = redisCache.getCacheObject(userId + "patItemCount");
            Boolean redisFlag = false;
            if (MapUtils.isNotEmpty(redisMap)) {
                ServiceSubtaskEntity oldCondition = (ServiceSubtaskEntity) redisMap.get("searchCondition");
                if (ObjectUtils.isNotEmpty(oldCondition) && isSameCondition(oldCondition, serviceSubtaskEntity)) {
                    redisFlag = true;
                    map = redisMap;
                    redisCache.setCacheObject(userId + "patItemCount", map, 60, TimeUnit.MINUTES);
                }
            }
            if (!redisFlag) {
                map = serviceSubtaskService.patItemCount(serviceSubtaskEntity);
                map.put("searchCondition", serviceSubtaskEntity);
                redisCache.setCacheObject(userId + "patItemCount", map, 120, TimeUnit.MINUTES);
            }
        } else {
            map = serviceSubtaskService.patItemCount(serviceSubtaskEntity);
        }
        return map;
    }
    /**
     * æ¯”较两个ServiceSubtaskVO的查询条件是否一致
     * ä½¿ç”¨åå°„比较所有字段,排除分页参数和无关字段
     */
    private boolean isSameCondition(ServiceSubtaskEntity oldCondition, ServiceSubtaskEntity newCondition) {
        // ä½¿ç”¨ReflectUtils的通用方法比较,排除分页参数等无关字段
        return ReflectUtils.equalsAllFields(oldCondition, newCondition,
                // æŽ’除的字段:分页参数、序列化ID、时间戳等
                "pageNum", "pageSize", "serialVersionUID", "createBy", "createTime", "updateBy", "updateTime", "searchValue", "params");
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskDetailController.java
@@ -6,10 +6,14 @@
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.DtoConversionUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.service.ISysConfigService;
import com.smartor.domain.*;
import com.smartor.domain.DTO.QuestionResultDTO;
import com.smartor.domain.DTO.ServiceSubtaskDetailDTO;
import com.smartor.domain.VO.QuestionResultVO;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.service.IServiceSubtaskDetailService;
import com.smartor.service.IServiceSubtaskService;
import io.swagger.annotations.Api;
@@ -19,6 +23,7 @@
import org.springframework.web.bind.annotation.*;
import java.util.*;
import java.util.stream.Collectors;
import static com.ruoyi.framework.datasource.DynamicDataSourceContextHolder.log;
@@ -192,4 +197,41 @@
        map = ServiceSubtaskDetailService.getServiceSubtaskDetails(serviceSubtaskDetailVO);
        return map;
    }
    /**
     * æŸ¥è¯¢æ‚£è€…随访信息
     */
    @ApiOperation("省立同德满意度数据统计")
    @PostMapping("/sltaMydTotalByScore")
    public Map<String, Object> sltaMydTotal(@RequestBody QuestionResultVO questionResultVO) {
        List<ServiceSubtaskRes> serviceSubtaskResList = null;
        ServiceSubtaskEntity serviceSubtaskEntity = new ServiceSubtaskEntity();
        serviceSubtaskEntity.setServiceType(questionResultVO.getServiceType());
        serviceSubtaskEntity.setEndOutHospTime(questionResultVO.getEndOutHospTime());
        serviceSubtaskEntity.setStartOutHospTime(questionResultVO.getStartOutHospTime());
        serviceSubtaskEntity.setDeptOrDistrict(questionResultVO.getDeptOrDistrict());
        serviceSubtaskEntity.setLeavehospitaldistrictcodes(questionResultVO.getLeavehospitaldistrictcodes());
        if (serviceSubtaskEntity != null) {
            List<ServiceSubtask> serviceSubtasks = serviceSubtaskService.getServiceSubtasks(serviceSubtaskEntity);
            serviceSubtaskResList = DtoConversionUtils.sourceToTarget(serviceSubtasks, ServiceSubtaskRes.class);
        }
        List<ServiceSubtaskDetailRatioExport> detailList = serviceSubtaskService.getDetailRatio(questionResultVO, serviceSubtaskResList);
        // æŒ‰ questiontext åˆ†ç»„后转换为 QuestionResultVO
        List<QuestionResultDTO> result = new ArrayList<>();
        if (!detailList.isEmpty()) {
            Map<String, List<ServiceSubtaskDetailRatioExport>> groupedMap = detailList.stream()
                    .collect(Collectors.groupingBy(ServiceSubtaskDetailRatioExport::getQuestiontext));
            groupedMap.forEach((questionText, exportList) -> {
                QuestionResultDTO questionResultDTO = new QuestionResultDTO();
                questionResultDTO.setQeustionText(questionText);
                questionResultDTO.setSubtaskDetailRatioExportList(exportList);
                result.add(questionResultDTO);
            });
        }
        return success(result);
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskDetailTraceController.java
@@ -4,11 +4,9 @@
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.PageUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.smartor.domain.DTO.DetailTraceDealDTO;
import com.smartor.domain.ServiceSubtaskDetailTrace;
import com.smartor.domain.VO.DetailTraceDealVO;
import com.smartor.domain.VO.SatisfactionExceptConfigQuestionReqVO;
ruoyi-admin/src/main/java/com/ruoyi/web/controller/sso/SSOController.java
@@ -14,12 +14,18 @@
import com.ruoyi.system.service.ISysUserService;
import com.smartor.domain.SSOTokenResponse;
import com.smartor.domain.SSOUserInfo;
import com.smartor.domain.ServiceSubtask;
import com.smartor.domain.VO.ServiceSubtaskVO;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.service.IServiceSubtaskService;
import com.smartor.service.impl.ServiceSubtaskServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.*;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.util.ObjectUtils;
@@ -32,9 +38,7 @@
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.*;
/**
 * SSO单点登录控制器
@@ -93,6 +97,9 @@
    private ISysConfigService sysConfigService;
    private final RestTemplate restTemplate;
    @Autowired
    private IServiceSubtaskService serviceSubtaskService;
    public SSOController() {
        // é…ç½®RestTemplate超时
@@ -188,6 +195,9 @@
    @GetMapping("ssoGoServiceSubtaskList")
    public RedirectView ssoGoServiceSubtaskList(@RequestParam(value = "code", required = false) String code,
                                                @RequestParam(value = "sfzh", required = false) String sfzh) {
        // é‡å®šå‘地址对象(重定向地址
        RedirectView redirectView = new RedirectView();
        log.info("收到ssoGoServiceSubtaskList请求,开始重定向到授权服务器,code = {}, sfzh = {}",code, sfzh);
        String path = sysConfigService.selectConfigByKey("sys.qddz");
        String redirectUri = "https://9.208.2.190:8092/prod-api/sso/ssoLoginLyra";
@@ -196,11 +206,21 @@
        String clientSecret = "suifangxt";
        String scope = "openid";
        ServiceSubtaskEntity subtask = new ServiceSubtaskEntity();
        subtask.setSfzh(sfzh);
        subtask.setSort(0);
        List<ServiceSubtask> serviceSubtaskList = serviceSubtaskService.selectServiceSubtaskList(subtask);
        ServiceSubtask serviceSubtask = null;
        if(CollectionUtils.isNotEmpty(serviceSubtaskList)){
            serviceSubtask = serviceSubtaskList.get(0);
        }else {
            redirectView.setUrl(path + "/login?error=sso_failed");
            return redirectView;
        }
//        String authorizeUrl = lyraPath + "/mediinfo-lyra-authserver/connect/authorize";
        String accessTokenUrl = lyraPath + "/mediinfo-lyra-authserver/connect/token";
        String userInfoUrl =  lyraPath + "/mediinfo-lyra-authserver/connect/userinfo";
        // é‡å®šå‘地址对象(重定向地址
        RedirectView redirectView = new RedirectView();
        try {
            SSOTokenResponse accessToken = getAccessTokenLyra(code, accessTokenUrl, clientId, clientSecret, redirectUri,true);
            log.info("获取到的token:" + accessToken);
@@ -223,8 +243,14 @@
                return buildRedirect(path + "/login");
            }
            String redirectUrl = path + "/loginSSO?token=" + loginToken + "&orgid=" + orgid +
                     "&sfzh=" + sfzh + "&orgname=null&ZuHuID=null&deptCode=null";
            String voiceType = (StringUtils.isNotEmpty(serviceSubtask.getType())
                    && serviceSubtask.getType().equals("1")) ? "1" : "0";
            String redirectUrl = path + "/loginSSO?token=" + loginToken +
                    "&orgid=" + orgid + "&campusid=" + serviceSubtask.getCampusid() +
                    "&taskid=" + serviceSubtask.getTaskid() + "&patid=" + serviceSubtask.getPatid() +
                    "&id=" + serviceSubtask.getId() + "&voiceType=" + voiceType +
                    "&visitCount=" + serviceSubtask.getVisitCount() + "&sfzh=" + sfzh +
                    "&orgname=null&ZuHuID=null&deptCode=null";
            log.info("【SSO登录】重定向地址:{}", redirectUrl);
            return buildRedirect(redirectUrl);
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -2,6 +2,7 @@
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.entity.SysUserDept;
@@ -78,7 +79,7 @@
            //通用密码:Hrs#当前年月日*
            token = loginService.getTokenWN(loginBody.getUsername());
        } else {
            token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), loginBody.getUuid(), loginBody.getOrgid(), loginBody.getCampusid());
            token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), loginBody.getUuid(), loginBody.getOrgid(), loginBody.getCampusid(), loginBody.getUserType());
        }
        ajax.put(Constants.TOKEN, token);
        return ajax;
@@ -123,12 +124,14 @@
//    @IpWhitelist
    @GetMapping("/SSOLogin")
    public RedirectView SSOLogin(@RequestParam(required = false) String campusid, @RequestParam(required = false) String deptId, @RequestParam(required = false) String systype, String orgid, String userName, String token) {
      log.info("SSOLogin的入参,campusid:{},  deptId:{},  systype:{},  orgid:{},  userName:{},  token:{}",campusid,deptId,systype,orgid,userName,token);
        if (StringUtils.isEmpty(userName) && StringUtils.isEmpty(token) && StringUtils.isEmpty(orgid)) {
            throw new BaseException("参数不能为空");
        }
        String path = null;
        if (StringUtils.isEmpty(systype)) path = sysConfigService.selectConfigByKey("sys.qddz");
        else path = sysConfigService.selectConfigByKey("sys.qddz.yd");
        log.info("qddz的查询值为,path:{}",path);
        if (StringUtils.isEmpty(path)) {
            throw new BaseException("请配置前端地址");
@@ -220,18 +223,18 @@
        ajax.put("user", user);
        ajax.put("roles", roles);
        ajax.put("permissions", permissions);
        List<SysUserDept> sysUserDeptKSs = null;
        List<SysUserDept> sysUserDeptBQs = null;
        List<SysDept> sysDeptKSs = null;
        List<SysDept> sysDeptBQs = null;
        SysUserDept sysUserDept = new SysUserDept();
        sysUserDept.setUserId(user.getUserId());
        sysUserDept.setDeptType("1");
        sysUserDept.setOrgid(user.getOrgid());
        sysUserDept.setCampusid(user.getCampusid());
        sysUserDeptKSs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
        ajax.put("belongDepts", sysUserDeptKSs);
        sysDeptKSs = sysDeptService.selectLeafSysDeptListBySysUserDept(sysUserDept);
        ajax.put("belongDepts", sysDeptKSs);
        sysUserDept.setDeptType("2");
        sysUserDeptBQs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
        ajax.put("belongWards", sysUserDeptBQs);
        sysDeptBQs = sysDeptService.selectLeafSysDeptListBySysUserDept(sysUserDept);
        ajax.put("belongWards", sysDeptBQs);
        return ajax;
    }
ruoyi-admin/src/main/resources/application-xh.yml
@@ -192,7 +192,7 @@
#本 åœ° çŸ­ä¿¡è¯·æ±‚地址(这个服务是我们自己写的)
#xhsmsPath: http://192.168.2.13:8092/sendSms
#新华短信请求地址(这个服务是我们自己写的)
xhsmsPath: http://192.16.4.220:8092/sendSms
xhsmsPath: http://192.16.4.220:8092/sms
#帐号
xhsmsAccount: 911124
#接口密码
ruoyi-admin/src/main/resources/application.yml
@@ -75,7 +75,7 @@
    # å›½é™…化资源文件路径
    basename: i18n/messages
  profiles:
    active: ls
    active: druid
  # æ–‡ä»¶ä¸Šä¼ 
  servlet:
@@ -173,3 +173,6 @@
sms_serviceCode:
sms_appkey:
sms_flag:
shurl:
shversion:
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java
@@ -44,4 +44,9 @@
     */
    private String deptId;
    /**
     * ç”¨æˆ·ç±»åž‹
     */
    private String userType;
}
ruoyi-common/src/main/java/com/ruoyi/common/utils/ArrayListUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
package com.ruoyi.common.utils;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
public class ArrayListUtils {
    /**
     * æ ¹æ®ID将两个List拆分为:仅List1独有、仅List2独有、两者共有
     *
     * @param list1 åˆ—表1
     * @param list2 åˆ—表2
     * @param idExtractor ID提取函数
     * @return Map包含三个Key: "onlyIn1", "onlyIn2", "common"
     */
    public static <T, K> Map<String, List<T>> splitListsById(List<T> list1, List<T> list2, Function<T, K> idExtractor) {
        // 1. æå–ID集合,用于快速判断存在性
        Set<K> ids1 = list1.stream().map(idExtractor).collect(Collectors.toSet());
        Set<K> ids2 = list2.stream().map(idExtractor).collect(Collectors.toSet());
        // 2. è®¡ç®—ID层面的差集和交集
        Set<K> onlyIn1Ids = new HashSet<>(ids1);
        onlyIn1Ids.removeAll(ids2); // List1独有的ID
        Set<K> onlyIn2Ids = new HashSet<>(ids2);
        onlyIn2Ids.removeAll(ids1); // List2独有的ID
        Set<K> commonIds = new HashSet<>(ids1);
        commonIds.retainAll(ids2); // å…±æœ‰çš„ID
        // 3. æ ¹æ®ID过滤原始对象列表
        List<T> onlyIn1 = list1.stream()
                .filter(item -> onlyIn1Ids.contains(idExtractor.apply(item)))
                .collect(Collectors.toList());
        List<T> onlyIn2 = list2.stream()
                .filter(item -> onlyIn2Ids.contains(idExtractor.apply(item)))
                .collect(Collectors.toList());
        // æ³¨æ„ï¼šå…±æœ‰éƒ¨åˆ†é€šå¸¸åˆå¹¶ä¸¤ä¸ªåˆ—表中的元素,或者只取其中一个。
        // è¿™é‡Œç­–略是:保留list1和list2中所有ID重合的对象(如果业务要求去重或合并对象属性,需额外处理)
        List<T> common = new ArrayList<>();
        common.addAll(list1.stream()
                .filter(item -> commonIds.contains(idExtractor.apply(item)))
                .collect(Collectors.toList()));
//        common.addAll(list2.stream()
//                .filter(item -> commonIds.contains(idExtractor.apply(item)))
//                .collect(Collectors.toList()));
        Map<String, List<T>> result = new HashMap<>();
        result.put("onlyIn1", onlyIn1);
        result.put("onlyIn2", onlyIn2);
        result.put("common", common);
        return result;
    }
}
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
@@ -81,7 +81,7 @@
     * @param uuid     å”¯ä¸€æ ‡è¯†
     * @return ç»“æžœ
     */
    public String login(String username, String password, String code, String uuid, String orgid, String campusid) {
    public String login(String username, String password, String code, String uuid, String orgid, String campusid, String userType) {
        boolean captchaEnabled = configService.selectCaptchaEnabled();
        // éªŒè¯ç å¼€å…³
        if (captchaEnabled) {
@@ -91,7 +91,7 @@
        Authentication authentication = null;
        try {
            if (StringUtils.isEmpty(campusid)) campusid = "1";
            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username + "&" + orgid + "&" + campusid, password);
            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username + "&" + orgid + "&" + campusid + "&" + userType, password);
            AuthenticationContextHolder.setContext(authenticationToken);
            // è¯¥æ–¹æ³•会去调用UserDetailsServiceImpl.loadUserByUsername
            authentication = authenticationManager.authenticate(authenticationToken);
ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/CollectHISServiceImpl.java
@@ -4,10 +4,13 @@
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.entity.SysUserDept;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.ArrayListUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.quartz.mapper.CollectHISMapper;
import com.ruoyi.quartz.service.ICollectHISService;
import com.smartor.domain.*;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.mapper.*;
import com.smartor.service.IPatMedOuthospService;
import lombok.extern.slf4j.Slf4j;
@@ -60,6 +63,9 @@
    private PatArchiveMapper patArchiveMapper;
    @Autowired
    private ServiceSubtaskMapper serviceSubtaskMapper;
    @Autowired
    private ThreadPoolTaskExecutor taskExecutor;
    @Autowired
@@ -67,6 +73,9 @@
    @Autowired
    private UtilsMapper utilsMapper;
    @Autowired
    private RedisCache redisCache;
    private static final long SHARDING_THRESHOLD = 5_000_000L;
    private static final String PAT_ARCHIVE_TABLE = "pat_archive";
@@ -339,6 +348,11 @@
        log.info("同步手术信息数量" + patMedOperations.size());
        for (PatMedOperation operation : patMedOperations) {
            try {
                if(ObjectUtils.isNotEmpty(operation.getCanceltime())){
                    //作废删除操作
                    cancelOper(operation);
                    continue;
                }
                Long patId = patIdHisMap.get(operation.getPatidHis());
                if (patId == null) {
                    patId = syncSinglePatient(operation.getPatidHis());
@@ -351,12 +365,12 @@
                    operation.setPatid(patId);
                }
                PatMedOperation oper = new PatMedOperation();
                oper.setOpid(operation.getOpid());
                oper.setOpreqid(operation.getOpreqid());
                List<PatMedOperation> patMedOperations1 = patMedOperationMapper.selectPatMedOperationList(oper);
                if (CollectionUtils.isNotEmpty(patMedOperations1)) {
                    operation.setId(patMedOperations1.get(0).getId());
                    operation.setUpdateTime(new Date());
                    count += patMedOperationMapper.updatePatMedOperation(patMedOperations1.get(0));
                    count += patMedOperationMapper.updatePatMedOperation(operation);
                    syncOperItem(operation);
                } else {
                    operation.setCreateTime(new Date());
@@ -370,6 +384,59 @@
        return count;
    }
    private Integer cancelOper(PatMedOperation oper){
        PatMedOperation operationVo = new PatMedOperation();
        operationVo.setOpreqid(oper.getOpreqid());
        List<PatMedOperation> operations = patMedOperationMapper.selectPatMedOperationList(operationVo);
        PatMedOperation operation = new PatMedOperation();
        if(CollectionUtils.isEmpty(operations)){
            return 0;
        }else {
            operation = operations.get(0);
        }
        log.info("手术作废id=" + operation.getId());
        PatMedOperationItem pmoi = new PatMedOperationItem();
        //获取需要出院手术随访,未处理的数据
        pmoi.setOpid(operation.getId().toString());
        List<PatMedOperationItem> patMedOperationItems
                = patMedOperationItemMapper.selectOperationItemList(pmoi);
        List<Long> operationItemIds = patMedOperationItems.stream()
                .map(PatMedOperationItem::getId)
                .filter(Objects::nonNull)
                .distinct()
                .collect(Collectors.toList());
        //不需要服务了,需要通过patid和sendstate=1,2,3,5,7去查询一下,service_subtask里是否有正在执行的任务,
        //有的话,立即停了
        List<Long> sendstates = Arrays.asList(1L, 2L, 3L, 5L, 7L);
        List<ServiceSubtask> serviceSubtaskList = new ArrayList<>();
        ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
        serviceSubtaskVO.setOrgid(operation.getOrgid());
        serviceSubtaskVO.setPatid(operation.getPatid());
        serviceSubtaskVO.setSendstates(sendstates);
        serviceSubtaskVO.setOperationItemIds(operationItemIds);
        serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
        //去redis中,查询是否有subid,有的话移除cache-exist
        if (CollectionUtils.isNotEmpty(serviceSubtaskList)) {
            for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
                log.info("需要移除的subId为:{}", serviceSubtask.getId().toString());
                serviceSubtask.setSendstate(4L);
                serviceSubtask.setRemark("手术撤销");
                serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                redisCache.removeElementFromList("cache-exist", serviceSubtask.getId().toString());
                redisCache.removeElementFromList("cache-0", serviceSubtask.getId().toString());
                redisCache.removeElementFromList("cache-1", serviceSubtask.getId().toString());
                redisCache.removeElementFromList("cache-2", serviceSubtask.getId().toString());
                redisCache.removeElementFromList("cache-3", serviceSubtask.getId().toString());
                redisCache.removeElementFromList("cache-4", serviceSubtask.getId().toString());
            }
        }
        operation.setUpdateTime(new Date());
        patMedOperationMapper.updatePatMedOperation(operation);
        patMedOperationItemMapper.deleteSoftPatMedOperationItemByOpId(operation.getOpid());
        return 1;
    }
    /**
     * åŒæ­¥æ‰‹æœ¯ä¿¡æ¯
     *
@@ -377,34 +444,67 @@
     * @return
     */
    private Integer syncOperItem(PatMedOperation operation) {
        if(ObjectUtils.isNotEmpty(operation.getId())){
            operation.setOpid(operation.getId().toString());
        }
        operation.setUpdateTime(new Date());
        patMedOperationMapper.updatePatMedOperation(operation);
        Integer count = 0;
        PatMedOperationItem patMedOperationItem = new PatMedOperationItem();
        patMedOperationItem.setOrgid(operation.getOrgid());
        if(StringUtils.isNotEmpty(operation.getOpid())){
            patMedOperationItem.setOpid(operation.getOpid());
            patMedOperationItem.setLastStartTime(operation.getLastStartTime());
            patMedOperationItem.setLastEndTime(operation.getLastEndTime());
            List<PatMedOperationItem> patMedOperationItems = chMapper.selectOperItemList(patMedOperationItem);
            PatMedOperationItem patMedOperationItem = new PatMedOperationItem();
            //patMedOperation.opReqid = patMedOperationItem.operationid
            List<PatMedOperationItem> patMedOperationItems = new ArrayList<>();
            if (ObjectUtils.isNotEmpty(operation.getOpreqid())){
                patMedOperationItem.setOperationid(operation.getOpreqid());
                patMedOperationItems = chMapper.selectOperItemList(patMedOperationItem);
            }else {
                log.info("同步手术详情信息:手术申请单ID为空!");
                return count;
            }
            PatMedOperationItem operItem = new PatMedOperationItem();
            operItem.setOperationid(operation.getOpreqid());
            List<PatMedOperationItem> patMedOperationItems1 = patMedOperationItemMapper.selectPatMedOperationItemList(operItem);
            Map<String, List<PatMedOperationItem>> maps = ArrayListUtils.splitListsById(patMedOperationItems,
                    patMedOperationItems1, PatMedOperationItem::getOperationid);
            //只在视图的数据不在本地的数据,执行新增操作
            List<PatMedOperationItem> addItems = maps.get("onlyIn1");
            //只在本地的数据不在视图的数据,执行删除操作
            List<PatMedOperationItem> delItems = maps.get("onlyIn2");
            //重叠的数据,执行更新操作 patMedOperationItems的数据
            List<PatMedOperationItem> editItems = maps.get("common");
            log.info("同步手术详情信息数量" + patMedOperationItems.size());
            for (PatMedOperationItem operationItem : patMedOperationItems) {
                try {
            try{
                for (PatMedOperationItem operationItem : addItems) {
                    operationItem.setInhospstate(operation.getInhospstate());
                    operationItem.setSerialnum(operation.getSerialnum());
                    PatMedOperationItem operItem = new PatMedOperationItem();
                    operItem.setOpid(operationItem.getOpid());
                    operItem.setOperationid(operationItem.getOperationid());
                    List<PatMedOperationItem> patMedOperationItems1 = patMedOperationItemMapper.selectPatMedOperationItemList(operItem);
                    if (CollectionUtils.isNotEmpty(patMedOperationItems1)) {
                        operationItem.setId(patMedOperationItems1.get(0).getId());
                        operationItem.setUpdateTime(new Date());
                        count += patMedOperationItemMapper.updatePatMedOperationItem(operationItem);
                    } else {
                        operation.setCreateTime(new Date());
                        count += patMedOperationItemMapper.insertPatMedOperationItem(operationItem);
                    }
                } catch (Exception ex) {
                    log.info("同步手术详情信息:" + ex.getMessage());
                    operationItem.setOpid(operation.getId().toString());
                    operationItem.setOperationid(operation.getOpreqid());
                    operationItem.setOpercheckFlag("0");
                    operationItem.setCreateTime(new Date());
                    count += patMedOperationItemMapper.insertPatMedOperationItem(operationItem);
                }
                for (PatMedOperationItem operationItem : delItems) {
                    operationItem.setUpdateTime(new Date());
                    count += patMedOperationItemMapper.deletePatMedOperationItemByOperationid(operationItem.getOperationid());
                }
                for (PatMedOperationItem operationItem : editItems) {
                    operationItem.setInhospstate(operation.getInhospstate());
                    operationItem.setSerialnum(operation.getSerialnum());
                    operationItem.setOpid(operation.getId().toString());
                    operationItem.setOperationid(operation.getOpreqid());
                    operationItem.setUpdateTime(new Date());
                    count += patMedOperationItemMapper.updatePatMedOperationItemByOperationid(operationItem);
                }
                log.info("同步手术id={}详情信息数量, æ–°å¢ž{}条,删除{}条,修改{}条", operation.getId(), addItems.size(), delItems.size(), editItems.size());
            } catch (Exception ex) {
                log.info("同步手术详情信息:" + ex.getMessage());
            }
//            try {
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
@@ -395,7 +395,7 @@
                    iIcd10Service.queryAddIcd10();
                }
                // nhfy/sltd回溯30天分段采集判断(每段最多7天)
                // nhfy/sltd回溯30天分段采集判断(每段最多4天)
                boolean isBackfill = (active.trim().equals("nhfy") || active.trim().equals("sltd")) && StringUtils.isNotBlank(todayZeroStr);
                if (isBackfill) {
                    DateTimeFormatter dateFmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@@ -403,7 +403,7 @@
                    LocalDate segEndDate = todayZero.toLocalDate();
                    int segCount = 0;
                    while (!segStart.isAfter(segEndDate)) {
                        LocalDate segEnd = segStart.plusDays(6);
                        LocalDate segEnd = segStart.plusDays(3);
                        if (segEnd.isAfter(segEndDate)) {
                            segEnd = segEndDate;
                        }
@@ -1771,48 +1771,65 @@
     * å¤„理超时随访任务
     * @return
     */
    public void dealSubtaskDeadline(Integer deadlineDay){
    public void dealSubtaskDeadline(String orgid, Integer deadlineDay){
        //获取任务信息
        ServiceTask st = new ServiceTask();
        st.setDelFlag("0");
        st.setLongTask(1);
        st.setNexttaskflag("1");
        st.setOrgid(orgid);
        List<ServiceTask> serviceTasks = serviceTaskMapper.selectServiceTaskList(st);
        for (ServiceTask serviceTask : serviceTasks) {
            deadlineDay = -deadlineDay;
            Date deadline = DateUtils.addDays(new Date(), deadlineDay);
            //通过任务ID拿到患者信息,并且随访时间得是今天之前的
            ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
            serviceSubtaskVO.setOrgid(orgid);
            serviceSubtaskVO.setSendstate(7L);
            //只扫描首次随访的
            serviceSubtaskVO.setVisitCount(1);
            serviceSubtaskVO.setTaskid(serviceTask.getTaskid());
            serviceSubtaskVO.setEndOutHospTime(deadline);
            List<ServiceSubtask> serviceSubtaskList
                    = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
            log.info("【dealSubtaskDeadline】获取到{}个超时任务, taskid={}", serviceSubtaskList.size(), serviceTask.getTaskid());
            for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
                PatMedInhosp patMedInhospVo = new PatMedInhosp();
                patMedInhospVo.setOrgid(serviceSubtask.getOrgid());
                patMedInhospVo.setInhospid(serviceSubtask.getInhospid());
                List<PatMedInhosp> patMedInhospList = iPatMedInhospService.selectPatMedInhospList(patMedInhospVo);
                PatMedInhosp patMedInhosp = new PatMedInhosp();
                if (!patMedInhospList.isEmpty()) {
                    patMedInhosp = patMedInhospList.get(0);
                }else {
                    continue;
                }
                if(ObjectUtils.isEmpty(serviceTask.getNexttaskid())){
                    continue;
                }
                ServiceTask nextServiceTask = serviceTaskMapper.selectServiceTaskByTaskid(serviceTask.getNexttaskid());
                PatArchive patArchive = patArchiveService.selectPatArchiveByPatid(serviceSubtask.getPatid());
                String config = configService.selectConfigByKey("visit.early.day");
                Integer type = 1;
        Date deadline = DateUtils.addDays(new Date(), deadlineDay);
        //通过任务ID拿到患者信息,并且随访时间得是今天之前的
        ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
        serviceSubtaskVO.setSendstate(7L);
        serviceSubtaskVO.setVisitCount(1);
        serviceSubtaskVO.setEndOutHospTime(deadline);
        List<ServiceSubtask> serviceSubtaskList
                = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
        log.info("【dealSubtaskDeadline】获取到{}个超时任务", serviceSubtaskList.size());
        for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
            PatMedInhosp patMedInhosp = new PatMedInhosp();
            patMedInhosp.setInhospid(serviceSubtask.getInhospid());
            List<PatMedInhosp> patMedInhospList = iPatMedInhospService.selectPatMedInhospList(patMedInhosp);
            if (patMedInhospList.size() > 0) {
                serviceSubtask.setIsVisitAgain(2);
                serviceSubtask.setRemark(StringUtils.isNotEmpty(serviceSubtask.getRemark()) ? serviceSubtask.getRemark() + ";患者再入院了" : "患者再入院了");
                serviceSubtask.setSendstate(4L);
                serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                //return "无需再次随访,患者再入院了";
            }else {
                continue;
            }
            //新增再次随访任务
            ServiceSubtask serviceSubtaskAgain = DtoConversionUtils.sourceToTarget(serviceSubtask, ServiceSubtask.class);
            serviceSubtaskAgain.setId(null);
            serviceSubtaskAgain.setUpid(serviceSubtask.getId().intValue());
            serviceSubtaskAgain.setVisitCount(serviceSubtask.getVisitCount() + 1);
            serviceSubtaskAgain.setSendstate(2L);
            serviceSubtaskAgain.setCreateTime(new Date());
            serviceSubtaskAgain.setUpdateTime(new Date());
            serviceSubtaskAgain.setVisitType(serviceSubtask.getVisitType());
            serviceSubtaskAgain.setVisitDeptCode(serviceSubtask.getVisitDeptCode());
            serviceSubtaskAgain.setVisitDeptName(serviceSubtask.getVisitDeptName());
            int i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtaskAgain);
            if (i == 1) {
                //再次随访任务创建成功后,原任务改为失败状态
                serviceSubtask.setIsVisitAgain(2);
                serviceSubtask.setSendstate(5L);
                serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                //新增再次随访任务
                ServiceSubtask serviceSubtaskAgain = iPatMedInhospService.boxedServiceSubtask(nextServiceTask,
                        patMedInhosp, patArchive, config, type);
                serviceSubtaskAgain.setId(null);
                serviceSubtaskAgain.setUpid(serviceSubtask.getId().intValue());
                serviceSubtaskAgain.setVisitCount(serviceSubtask.getVisitCount() + 1);
                serviceSubtaskAgain.setSendstate(2L);
                serviceSubtaskAgain.setCreateTime(new Date());
                serviceSubtaskAgain.setUpdateTime(new Date());
                serviceSubtaskAgain.setVisitType(serviceSubtask.getVisitType());
                serviceSubtaskAgain.setVisitDeptCode(serviceSubtask.getVisitDeptCode());
                serviceSubtaskAgain.setVisitDeptName(serviceSubtask.getVisitDeptName());
                int i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtaskAgain);
                if (i == 1) {
                    //再次随访任务创建成功后,原任务改为失败状态
                    serviceSubtask.setSendstate(5L);
                    serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                }
            }
        }
    }
ruoyi-quartz/src/main/resources/mapper/quartz/CollectHISMapper.xml
@@ -658,7 +658,8 @@
        b.leavehospitaldistrictname,
        b.leavehospitaldistrictid,
        b.deptid,
        b.leaveldeptid
        b.leaveldeptid,
        b.del_flag
        FROM
        healthy_inhosp b
        where 1=1
@@ -826,6 +827,7 @@
        o.paname,
        o.opreqid,
        o.opreqcode,
        o.canceltime,
        o.opsstatus,
        o.optypecode,
        o.optypename,
@@ -887,7 +889,7 @@
        o.nurse_name ,
        o.check_flag ,
        o.long_task_reason,
        o.opid ,
        null as opid ,
        o.opcode ,
        o.opdesc,
        o.oplevelcode ,
@@ -897,6 +899,9 @@
        where 1=1
        <if test="orgid != null and orgid != ''">
            AND o.orgid = #{orgid}
        </if>
        <if test="opreqid != null and opreqid != ''">
            AND o.opreqid = #{opreqid}
        </if>
        <if test="lastStartTime != null and lastStartTime != ''">
            and to_char(o.last_Update_Time, 'YYYY-MM-DD HH24:MI:SS') >= #{lastStartTime}
@@ -910,7 +915,7 @@
            resultMap="PatMedOperationItemResult">
        select
               oi.operationid,
               oi.opid,
               null as opid,
               oi.opcode,
               oi.opdesc,
               oi.main_flag,
@@ -940,6 +945,9 @@
        <if test="opid != null and opid != ''">
            AND oi.opid = #{opid}
        </if>
        <if test="operationid != null and operationid != ''">
            AND oi.operationid = #{operationid}
        </if>
        <if test="lastStartTime != null and lastStartTime != ''">
            and oi.last_Update_Time &gt;= to_date(#{lastStartTime}, 'YYYY-MM-DD HH24:MI:SS')
        </if>
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -4,6 +4,7 @@
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.entity.*;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.DtoConversionUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
@@ -182,14 +183,16 @@
        String[] split = userName.split("&");
        SysUser sysUser = userMapper.selectUserByUserNameByCondition(split[0], split[1], null);
        if (Objects.isNull(sysUser)) return sysUser;
        //这里只卡用户类型为“患者”的
        if (sysUser.getUserType().equals("患者") && StringUtils.isNotEmpty(split[3]) && !split[3].equals("null") && !sysUser.getUserType().equals(split[3].trim()))
            throw new BaseException("当前用户类型与登录用户类型不一致");
        boolean isAdmin = StringUtils.isNotEmpty(split[0]) && "admin".equals(split[0]);
        IUserExtInfoService userExtInfoService = SpringUtils.getBean(IUserExtInfoService.class);
        Executor executor = SpringUtils.getBean("threadPoolTaskExecutor");
        // === å¹¶è¡ŒæŸ¥è¯¢: ç”¨æˆ·æœºæž„信息 + éƒ¨é—¨åˆ—表 ===
        CompletableFuture<Map<String, String>> orgInfoFuture = CompletableFuture.supplyAsync(() ->
                userExtInfoService.getUserOrgInfo(sysUser.getUserId().toString(), split[1], split[2]), executor);
        CompletableFuture<Map<String, String>> orgInfoFuture = CompletableFuture.supplyAsync(() -> userExtInfoService.getUserOrgInfo(sysUser.getUserId().toString(), split[1], split[2]), executor);
        CompletableFuture<List<SysDept>> deptsFuture;
        if (isAdmin) {
@@ -341,10 +344,7 @@
        //获取当前登陆人的机构和院�?
        IUserExtInfoService userExtInfoService2 = SpringUtils.getBean(IUserExtInfoService.class);
        Map<String, String> userOrgInfo2 = userExtInfoService2.getUserOrgInfo(
                sysUser.getUserId().toString(),
                split[1],
                split[3]);
        Map<String, String> userOrgInfo2 = userExtInfoService2.getUserOrgInfo(sysUser.getUserId().toString(), split[1], split[3]);
        if (!userOrgInfo2.isEmpty()) {
            sysUser.setOrgid(userOrgInfo2.get("orgid"));
            sysUser.setCampusid(userOrgInfo2.get("campusid"));
ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml
@@ -291,7 +291,7 @@
        and d.del_flag = 0
        and ud.del_flag = 0
        <if test="orgid != null">and d.orgid = #{orgid} and ud.orgid = #{orgid}</if>
        <if test="campusid != null">and d.campusid = #{campusid} and ud.campusid = #{campusid}</if>
        <if test="campusid != null">and d.campusid = #{campusid}</if>
        <if test="userId != null">and ud.user_id = #{userId}</if>
        <if test="deptType != null and deptType != ''">and d.dept_type = #{deptType}</if>
    </select>
smartor/src/main/java/com/smartor/domain/DTO/AiMatcherDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.smartor.domain.DTO;
import com.smartor.domain.IvrTaskTemplateTargetoption;
import lombok.Data;
import java.util.List;
/**
 * ai的入参
 */
@Data
public class AiMatcherDto {
    // èŠå¤©ID
    private Integer memoryId;
    // ç”¨æˆ·å›žç­”
    private String userAnswer;
    // é€‰é¡¹åˆ—表
    private List<IvrTaskTemplateTargetoption> options;
}
smartor/src/main/java/com/smartor/domain/DTO/QuestionResultDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.smartor.domain.DTO;
import com.ruoyi.common.core.domain.BaseEntity;
import com.smartor.domain.ServiceSubtaskDetailRatioExport;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * é—®å·ç»“æžœ
 *
 * @author ruoyi
 * @date 2024-02-02
 */
@ApiModel(value = "QuestionResultDTO", description = "问卷结果")
@Data
public class QuestionResultDTO extends BaseEntity {
    private static final long serialVersionUID = 1L;
    /**
     * é—®å·é¢˜ç›®
     */
    @ApiModelProperty(value = "问卷题目")
    private String qeustionText;
    /**
     * é—®å·ç»“果集合
     */
    @ApiModelProperty(value = "问卷结果集合")
    private List<ServiceSubtaskDetailRatioExport> subtaskDetailRatioExportList;
}
smartor/src/main/java/com/smartor/domain/IvrLibaTemplateScript.java
@@ -372,6 +372,20 @@
    @ApiModelProperty(value = "报备科室责任人编码(如果多个科室用逗号分割)")
    private String reportDeptPersonCode;
    /**
     * æµè½¬ç§‘室责任人编码 (如果多个科室用逗号分割)
     */
    @Excel(name = "流转科室责任人编码(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "流转科室责任人编码(如果多个科室用逗号分割)")
    private String circulationDeptPersonCode;
    /**
     * æµè½¬ç§‘室责任人名称 (如果多个科室用逗号分割)
     */
    @Excel(name = "流转科室责任人名称(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "流转科室责任人名称(如果多个科室用逗号分割)")
    private String circulationDeptPersonName;
//    /**
//     * é—®é¢˜ç»“果(给“值类型”是文本或者数值用的)
//     */
smartor/src/main/java/com/smartor/domain/IvrTaskTemplateScript.java
@@ -359,6 +359,23 @@
    @ApiModelProperty(value = "报备科室责任人编码(如果多个科室用逗号分割)")
    private String reportDeptPersonCode;
    /**
     * æµè½¬ç§‘室责任人编码 (如果多个科室用逗号分割)
     */
    @Excel(name = "流转科室责任人编码(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "流转科室责任人编码(如果多个科室用逗号分割)")
    private String circulationDeptPersonCode;
    /**
     * æµè½¬ç§‘室责任人名称 (如果多个科室用逗号分割)
     */
    @Excel(name = "流转科室责任人名称(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "流转科室责任人名称(如果多个科室用逗号分割)")
    private String circulationDeptPersonName;
    /**
     * é—®é¢˜é€‰é¡¹
     */
smartor/src/main/java/com/smartor/domain/IvrTaskTemplateScriptVO.java
@@ -392,6 +392,20 @@
    private String reportDeptPersonCode;
    /**
     * æµè½¬ç§‘室责任人编码 (如果多个科室用逗号分割)
     */
    @Excel(name = "流转科室责任人编码(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "流转科室责任人编码(如果多个科室用逗号分割)")
    private String circulationDeptPersonCode;
    /**
     * æµè½¬ç§‘室责任人名称 (如果多个科室用逗号分割)
     */
    @Excel(name = "流转科室责任人名称(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "流转科室责任人名称(如果多个科室用逗号分割)")
    private String circulationDeptPersonName;
    /**
     * è¯æœ¯é€‰é¡¹
     */
    @ApiModelProperty(value = "话术选项")
smartor/src/main/java/com/smartor/domain/OutboundConfigAddReqVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
package com.smartor.domain;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * æ–°å¢žå¤–呼实例配置请求 VO
 */
@Data
@ApiModel(value = "OutboundConfigAddReqVO", description = "新增外呼实例配置请求")
public class OutboundConfigAddReqVO {
    @ApiModelProperty(value = "项目名称", required = true)
    private String name;
    @ApiModelProperty(value = "坐席号 å¦‚:10001_1000", required = true)
    private String agent;
    @ApiModelProperty(value = "资源组号", required = true)
    private String tenantId;
    @ApiModelProperty(value = "执行坐席组主键 ID isVgc ç­‰äºŽ 0 æ—¶å¿…å¡«")
    private String queueId;
    @ApiModelProperty(value = "呼叫类型 1:预测试;2:预览式", required = true)
    private String callType;
    @ApiModelProperty(value = "外呼速率 isVgc ç­‰äºŽ 0 æ—¶å¿…å¡«")
    private String ratio;
    @ApiModelProperty(value = "IVR æµç¨‹ ID isVgc ç­‰äºŽ 1 æ—¶å¿…å¡«")
    private String ivrId;
    @ApiModelProperty(value = "是否启用语音群呼 0 å¦ 1 å¯åЍ é»˜è®¤ä¸º 0")
    private String isVgc;
    @ApiModelProperty(value = "唯一值,原样返回,找到对应的响应信息", required = true)
    private String actionID;
    @ApiModelProperty(value = "号码池策略 ID")
    private String numberBatch;
    @ApiModelProperty(value = "最大振铃时长 å•位/秒(默认 60)")
    private String maxRingTime;
    @ApiModelProperty(value = "第三方关联数据")
    private String data;
}
smartor/src/main/java/com/smartor/domain/OutboundInstanceResVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
package com.smartor.domain;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * å¤–呼实例配置响应 VO
 */
@Data
@ApiModel(value = "OutboundInstanceResVO", description = "外呼实例配置响应")
public class OutboundInstanceResVO {
    @ApiModelProperty(value = "项目 ID")
    private String id;
    @ApiModelProperty(value = "项目名称")
    private String name;
    @ApiModelProperty(value = "创建人")
    private String nameCn;
    @ApiModelProperty(value = "外呼类型 1:预测试;2:预览式")
    private String callType;
    @ApiModelProperty(value = "速率")
    private String ratio;
    @ApiModelProperty(value = "状态 2:可执行 3:执行中 4:暂停中 5:已结束")
    private String status;
    @ApiModelProperty(value = "名单数")
    private String contactNum;
    @ApiModelProperty(value = "执行数")
    private String callNum;
    @ApiModelProperty(value = "应答数")
    private String touchNum;
    @ApiModelProperty(value = "参与坐席组")
    private String queueDn;
    @ApiModelProperty(value = "创建时间")
    private String createTime;
    @ApiModelProperty(value = "开始时间")
    private String startTime;
    @ApiModelProperty(value = "结束时间")
    private String endTime;
    @ApiModelProperty(value = "二次呼叫间隔")
    private String idleTime;
    @ApiModelProperty(value = "第三方关联数据")
    private String data;
    @ApiModelProperty(value = "ivr æµç¨‹ä¸»é”® id")
    private String ivrId;
    @ApiModelProperty(value = "最大振铃时长")
    private String maxRingTime;
    @ApiModelProperty(value = "资源组号")
    private String tenantId;
    @ApiModelProperty(value = "0 å¦ 1 å¯åЍ")
    private String isVgc;
    @ApiModelProperty(value = "号码池 id")
    private String numberBatch;
}
smartor/src/main/java/com/smartor/domain/PatMedInhosp.java
@@ -331,7 +331,7 @@
     */
    @ApiModelProperty(value = "入院病区长期任务,是否处理:0 æœªå¤„理   1 å¤„理成功    2 å¤„理失败 ")
    private String inWardcheckFlag;
    /**
     * è¯å“å®£æ•™é•¿æœŸä»»åŠ¡ï¼Œæ˜¯å¦å¤„ç†ï¼š0 æœªå¤„理   1 å¤„理
     */
@@ -396,7 +396,7 @@
    /**
     * å‡ºå…¥é™¢æ ‡è¯†
     */
    @ApiModelProperty("出入院标识:0入院  1出院 2 è½¬ç§‘  3 é¢„入院")
    @ApiModelProperty("出入院标识:0入院  1出院 2 è½¬ç§‘  3 é¢„入院  4.满意度")
    private Integer cry;
    /**
smartor/src/main/java/com/smartor/domain/PatSatisfaction.java
@@ -8,6 +8,7 @@
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
 * æ‚£è€…满意度对象 pat_satisfaction
@@ -155,6 +156,9 @@
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date endTime;
    @ApiModelProperty(value = "主键Id集合")
    private List<Long> ids;
    /**
     * pageNum
     */
smartor/src/main/java/com/smartor/domain/ServiceSubtask.java
@@ -1,15 +1,13 @@
package com.smartor.domain;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import java.util.Date;
import java.util.List;
/**
 * å•一任务(随访)对象 ivr_tasksingle
@@ -595,7 +593,7 @@
    /**
     * æ‚£è€…来源
     */
    @ApiModelProperty(value = "患者来源:0本地患者表    1外部患者表")
    @ApiModelProperty(value = "任务病人的来源:0:医院患者;1:外部患者  2:导入患者")
    private String patfrom;
    /**
smartor/src/main/java/com/smartor/domain/ServiceSubtaskDetailRatioExport.java
@@ -35,6 +35,15 @@
    @Excel(name = "比例")
    private String ratio;
    @Excel(name = "分数")
    private String score;
    @ApiModelProperty(value = "问题类型(1.单选 2多选 3问答 4填空  5其它)")
    private String valueType;
    @Excel(name = "选项")
    private String targetvalue;
    @Excel(name = "任务名称")
    private String taskname;
smartor/src/main/java/com/smartor/domain/ServiceSubtaskDetailTrace.java
@@ -370,13 +370,68 @@
    private String dutyDeptPersonCode;
    @Excel(name = "报备科室责任人名称(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "报备科室名称(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "报备科室责任人名称(如果多个科室用逗号分割)")
    private String reportDeptPersonName;
    @Excel(name = "报备科室编码(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "报备科室责任人编码(如果多个科室用逗号分割)")
    private String reportDeptPersonCode;
    /**
     * æµè½¬ç§‘室责任人编码 (如果多个科室用逗号分割)
     */
    @Excel(name = "流转科室责任人编码(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "流转科室责任人编码(如果多个科室用逗号分割)")
    private String circulationDeptPersonCode;
    /**
     * æµè½¬ç§‘室责任人名称 (如果多个科室用逗号分割)
     */
    @Excel(name = "流转科室责任人名称(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "流转科室责任人名称(如果多个科室用逗号分割)")
    private String circulationDeptPersonName;
    /**
     * æµè½¬ç§‘室责任人编码 (如果多个科室用逗号分割)
     */
    @Excel(name = "流转科室编码(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "流转科室编码(如果多个科室用逗号分割)")
    private String circulationDeptCode;
    /**
     * æµè½¬ç§‘室责任人名称 (如果多个科室用逗号分割)
     */
    @Excel(name = "流转科室名称(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "流转科室名称(如果多个科室用逗号分割)")
    private String circulationDeptName;
    /**
     * æµè½¬ç§‘室责任人名称 (如果多个科室用逗号分割)
     */
    @Excel(name = "流转说明")
    @ApiModelProperty(value = "流转说明")
    private String circulationExplain;
    /**
     * æµè½¬ç§‘室责任人名称 (如果多个科室用逗号分割)
     */
    @Excel(name = "流转时间")
    @ApiModelProperty(value = "流转时间")
    private Date circulationTime;
    /**
     * æµè½¬çŠ¶æ€ï¼š0不流转(默认) 1流转
     */
    @Excel(name = "流转状态:0不流转(默认) 1流转")
    @ApiModelProperty(value = "流转状态:0不流转(默认) 1流转")
    private String circulationStatus;
    @Excel(name = "流转人姓名")
    @ApiModelProperty(value = "流转人姓名")
    private String circulationPersonName;
    @Excel(name = "流转人编码")
    @ApiModelProperty(value = "流转人编码")
    private String circulationPersonCode;
}
smartor/src/main/java/com/smartor/domain/ServiceSubtaskExport.java
@@ -19,6 +19,14 @@
@Data
public class ServiceSubtaskExport extends BaseEntity {
    private static final long serialVersionUID = 1L;
//
//    /**
//     * ç§‘室名称
//     */
//    @Excel(name = "主键")
//    @ApiModelProperty(value = "主键")
//    private Long id;
    /**
     * ç§‘室名称
smartor/src/main/java/com/smartor/domain/SvyLibTemplateScript.java
@@ -315,6 +315,20 @@
    private String reportDeptPersonCode;
    /**
     * æµè½¬ç§‘室责任人编码 (如果多个科室用逗号分割)
     */
    @Excel(name = "流转科室责任人编码(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "流转科室责任人编码(如果多个科室用逗号分割)")
    private String circulationDeptPersonCode;
    /**
     * æµè½¬ç§‘室责任人名称 (如果多个科室用逗号分割)
     */
    @Excel(name = "流转科室责任人名称(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "流转科室责任人名称(如果多个科室用逗号分割)")
    private String circulationDeptPersonName;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("满意度意见异常(只针对文本)")
smartor/src/main/java/com/smartor/domain/SvyLibTemplateScriptVO.java
@@ -331,6 +331,22 @@
    @ApiModelProperty(value = "报备科室责任人编码(如果多个科室用逗号分割)")
    private String reportDeptPersonCode;
    /**
     * æµè½¬ç§‘室责任人编码 (如果多个科室用逗号分割)
     */
    @Excel(name = "流转科室责任人编码(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "流转科室责任人编码(如果多个科室用逗号分割)")
    private String circulationDeptPersonCode;
    /**
     * æµè½¬ç§‘室责任人名称 (如果多个科室用逗号分割)
     */
    @Excel(name = "流转科室责任人名称(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "流转科室责任人名称(如果多个科室用逗号分割)")
    private String circulationDeptPersonName;
    @Excel(name = "分类ID集合")
    @ApiModelProperty(value = "分类ID集合")
    private List<Long> categoryids;
smartor/src/main/java/com/smartor/domain/SvyTaskTemplateScript.java
@@ -279,6 +279,19 @@
    private String reportDeptPersonCode;
    /**
     * æµè½¬ç§‘室责任人编码 (如果多个科室用逗号分割)
     */
    @Excel(name = "流转科室责任人编码(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "流转科室责任人编码(如果多个科室用逗号分割)")
    private String circulationDeptPersonCode;
    /**
     * æµè½¬ç§‘室责任人名称 (如果多个科室用逗号分割)
     */
    @Excel(name = "流转科室责任人名称(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "流转科室责任人名称(如果多个科室用逗号分割)")
    private String circulationDeptPersonName;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("满意度意见异常(只针对文本)")
smartor/src/main/java/com/smartor/domain/SvyTaskTemplateScriptVO.java
@@ -359,11 +359,25 @@
    @ApiModelProperty(value = "报备科室名称(如果多个科室用逗号分割)")
    private String reportDeptPersonName;
    @Excel(name = "报备科室编码(如果多个科室用逗号分割)")
    @Excel(name = "报备科室责任人编码(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "报备科室责任人编码(如果多个科室用逗号分割)")
    private String reportDeptPersonCode;
    /**
     * æµè½¬ç§‘室责任人编码 (如果多个科室用逗号分割)
     */
    @Excel(name = "流转科室责任人编码(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "流转科室责任人编码(如果多个科室用逗号分割)")
    private String circulationDeptPersonCode;
    /**
     * æµè½¬ç§‘室责任人名称 (如果多个科室用逗号分割)
     */
    @Excel(name = "流转科室责任人名称(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "流转科室责任人名称(如果多个科室用逗号分割)")
    private String circulationDeptPersonName;
    /**
     * é—®åˆ¸é¢˜ç›®åˆ†ç±»ID集合
     */
    @ApiModelProperty("满意度意见异常(只针对文本)")
smartor/src/main/java/com/smartor/domain/VO/DetailTraceDealVO.java
@@ -99,5 +99,61 @@
    @Excel(name = "报备科室编码(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "报备科室责任人编码(如果多个科室用逗号分割)")
    private String reportDeptPersonCode;
    /**
     * æµè½¬ç§‘室责任人编码 (如果多个科室用逗号分割)
     */
    @Excel(name = "流转科室责任人编码(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "流转科室责任人编码(如果多个科室用逗号分割)")
    private String circulationDeptPersonCode;
    /**
     * æµè½¬ç§‘室责任人名称 (如果多个科室用逗号分割)
     */
    @Excel(name = "流转科室责任人名称(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "流转科室责任人名称(如果多个科室用逗号分割)")
    private String circulationDeptPersonName;
    /**
     * æµè½¬ç§‘室责任人编码 (如果多个科室用逗号分割)
     */
    @Excel(name = "流转科室编码(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "流转科室编码(如果多个科室用逗号分割)")
    private String circulationDeptCode;
    /**
     * æµè½¬ç§‘室责任人名称 (如果多个科室用逗号分割)
     */
    @Excel(name = "流转科室名称(如果多个科室用逗号分割)")
    @ApiModelProperty(value = "流转科室名称(如果多个科室用逗号分割)")
    private String circulationDeptName;
    /**
     * æµè½¬ç§‘室责任人名称 (如果多个科室用逗号分割)
     */
    @Excel(name = "流转说明")
    @ApiModelProperty(value = "流转说明")
    private String circulationExplain;
    /**
     * æµè½¬ç§‘室责任人名称 (如果多个科室用逗号分割)
     */
    @Excel(name = "流转时间")
    @ApiModelProperty(value = "流转时间")
    private Date circulationTime;
    /**
     * æµè½¬çŠ¶æ€ï¼š0不流转(默认) 1流转
     */
    @Excel(name = "流转状态:0不流转(默认) 1流转")
    @ApiModelProperty(value = "流转状态:0不流转(默认) 1流转")
    private Integer circulationStatus;
    @Excel(name = "流转人姓名")
    @ApiModelProperty(value = "流转人姓名")
    private String circulationPersonName;
    @Excel(name = "流转人编码")
    @ApiModelProperty(value = "流转人编码")
    private String circulationPersonCode;
}
smartor/src/main/java/com/smartor/domain/VO/QuestionResultVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,96 @@
package com.smartor.domain.VO;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import java.util.List;
/**
 * é—®é¢˜ç»“æžœDTO
 *
 * @author ruoyi
 * @date 2024-02-02
 */
@ApiModel(value = "QuestionResultVO", description = "问题结果VO")
@Data
public class QuestionResultVO extends BaseEntity {
    private static final long serialVersionUID = 1L;
    /**
     * ç§‘室与病区的查询是or还是and:   1:and(默认)(离院病区与离院科室组合)     2:or(离院病区与离院科室组合)    3:and(离院病区与随访科室组合)   4:or(离院病区与随访科室组合)
     */
    @ApiModelProperty(value = "科室与病区的查询是or还是and:   1:and(默认)(离院病区与离院科室组合)     2:or(离院病区与离院科室组合)    3:and(离院病区与随访科室组合)   4:or(离院病区与随访科室组合)")
    private String deptOrDistrict = "1";
    /**
     *
     */
    @ApiModelProperty(value = "主键id")
    private Long subId;
    /**
     * å‡ºé™¢ç—…区编号
     */
    @ApiModelProperty(value = "出院病区集合(必填)")
    private List<String> leavehospitaldistrictcodes;
    /**
     * ä¸»é”®id集合
     */
    @ApiModelProperty(value = "主键id集合")
    private List<Long> subIdList;
    /**
     * å¼€å§‹å‡ºé™¢æ—¥æœŸ
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "开始出院日期")
    private Date startOutHospTime;
    /**
     * ç»“束出院日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "结束出院日期")
    private Date endOutHospTime;
    /**
     * é—®é¢˜å†…容
     */
    @ApiModelProperty(value = "问题内容")
    private String questionContent;
    /**
     * åˆ†æ•°æŸ¥è¯¢å¼€å§‹
     */
    @ApiModelProperty(value = "分数查询开始")
    private Double startScore;
    /**
     * åˆ†æ•°æŸ¥è¯¢ç»“束
     */
    @ApiModelProperty(value = "分数查询结束")
    private Double endScore;
    /**
     * æœåŠ¡ç±»åž‹(1、监测评估;2、出院随访;3、门诊随访;4、宣教关怀;5、复诊通知;6、满意度调查;7、患者报告; 8、其他通知)
     */
    @Excel(name = "服务类型(1、监测评估;2、出院随访;3、门诊随访;4、宣教关怀;5、复诊管理;6、满意度调查;7、患者报告; 8、其他通知 9体检随访 10.医技随访  11,影像专科随访  12、心电专科随访, 13专科随访)")
    @ApiModelProperty(value = "服务类型(1、监测评估;2、出院随访;3、门诊随访;4、宣教关怀;5、复诊管理;6、满意度调查;7、患者报告; 8、其他通知 9体检随访 10.医技随访  11,影像专科随访  12、心电专科随访, 13专科随访)")
    private String serviceType;
    @ApiModelProperty(value = "问题类型(1.单选 2多选 3问答 4填空  5其它)")
    private String valueType;
}
smartor/src/main/java/com/smartor/domain/VO/ServiceSubtaskVO.java
@@ -292,6 +292,20 @@
    @ApiModelProperty(value = "完成时间")
    private Date finishtime;
    /**
     * å®Œæˆæ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "完成时间(开始查询)")
    private Date finishtimeStart;
    /**
     * å®Œæˆæ—¶é—´(结束查询)
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "完成时间(结束查询)")
    private Date finishtimeEnd;
    /**
     * å°±è¯Šè®°å½•编号
smartor/src/main/java/com/smartor/domain/entity/ServiceSubtaskEntity.java
@@ -307,6 +307,19 @@
    @ApiModelProperty(value = "完成时间")
    private Date finishtime;
    /**
     * å®Œæˆæ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "完成时间(开始查询)")
    private Date finishtimeStart;
    /**
     * å®Œæˆæ—¶é—´(结束查询)
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "完成时间(结束查询)")
    private Date finishtimeEnd;
    /**
     * å°±è¯Šè®°å½•编号
@@ -799,4 +812,10 @@
//    @Excel(name = " å‘送状态 1 è¢«é¢†å–(在任务中是新建,在服务中是被领取)  2 å¾…发送  3 å·²å‘送  4 ä¸æ‰§è¡Œ  5 å‘送失败 6 å·²å®Œæˆ\") ")
    @ApiModelProperty(value = "页面展示状态 ï¼š1:待随访(1 è¢«é¢†å–、2 å¾…发送、3 å·²å‘送、5 å‘送失败、7、超时);2:已完成( 6 å·²å®Œæˆï¼‰ã€3:无需随访(4 ä¸æ‰§è¡Œï¼‰")
    private Long sendstateView;
    @ApiModelProperty(value = "手术记录id å¯¹åº”pat_med_operation_item.id")
    private Long operationItemId;
    @ApiModelProperty(value = "手术记录id集合")
    private List<Long> operationItemIds;
}
smartor/src/main/java/com/smartor/mapper/PatMedOperationItemMapper.java
@@ -53,6 +53,14 @@
    public int updatePatMedOperationItem(PatMedOperationItem patMedOperationItem);
    /**
     * ä¿®æ”¹æ‚£è€…检查检验记录子
     *
     * @param patMedOperationItem æ‚£è€…检查检验记录子
     * @return ç»“æžœ
     */
    public int updatePatMedOperationItemByOperationid(PatMedOperationItem patMedOperationItem);
    /**
     * åˆ é™¤æ‚£è€…检查检验记录子
     *
     * @param id æ‚£è€…检查检验记录子主键
@@ -77,6 +85,22 @@
    public int deleteHardPatMedOperationItemByOpId(String opid);
    /**
     * åˆ é™¤æ‚£è€…检查检验记录子
     *
     * @param operationid æ‚£è€…检查检验记录子主键
     * @return ç»“æžœ
     */
    public int deletePatMedOperationItemByOperationid(Long operationid);
    /**
     * åˆ é™¤æ‚£è€…检查检验记录子
     *
     * @param opid æ‚£è€…检查检验记录子主键
     * @return ç»“æžœ
     */
    public int deleteSoftPatMedOperationItemByOpId(String opid);
    /**
     * æŸ¥è¯¢æ‚£è€…检查检验记录子列表
     *
     * @param patMedOperationItem æ‚£è€…检查检验记录子
smartor/src/main/java/com/smartor/mapper/ServiceSubtaskMapper.java
@@ -78,14 +78,12 @@
     * @param scheduleId è®¡åˆ’主键
     * @param loopCount  è½®æ¬¡ï¼ˆ0=首轮)
     */
    public int countActiveByScheduleIdAndLoop(@Param("scheduleId") Long scheduleId,
                                              @Param("loopCount") Long loopCount);
    public int countActiveByScheduleIdAndLoop(@Param("scheduleId") Long scheduleId, @Param("loopCount") Long loopCount);
    /**
     * ä»»åŠ¡ç»„ï¼ˆappltype=5):拉取某一轮次的全部 subtask(用于克隆到下一轮)。
     */
    public List<ServiceSubtask> selectByScheduleIdAndLoop(@Param("scheduleId") Long scheduleId,
                                                          @Param("loopCount") Long loopCount);
    public List<ServiceSubtask> selectByScheduleIdAndLoop(@Param("scheduleId") Long scheduleId, @Param("loopCount") Long loopCount);
    /**
     * éšè®¿åŠæ—¶çŽ‡ï¼šåº”éšè®¿æ—¶é—´<实际随访时间
@@ -259,21 +257,21 @@
    /**
     * ç»Ÿè®¡é—®é¢˜çš„选项的百分比
     *
     * @param taskIds           ä»»åŠ¡ ID åˆ—表 (用于服务类型 2)
     * @param startOutHospTime
     * @param endOutHospTime
     * @param taskIds          ä»»åŠ¡ ID åˆ—表 (用于服务类型 2)
     * @param startOutHospTime
     * @param endOutHospTime
     * @return
     */
    List<ServiceSubtaskDetailRatioExport> statQuestionOption(@Param("taskIds") List<Long> taskIds, @Param("startOutHospTime") Date startOutHospTime, @Param("endOutHospTime") Date endOutHospTime);
    List<ServiceSubtaskDetailRatioExport> statQuestionOption(@Param("taskIds") List<Long> taskIds, @Param("startOutHospTime") Date startOutHospTime, @Param("endOutHospTime") Date endOutHospTime, @Param("scoreStart") Double scoreStart, @Param("scoreEnd") Double scoreEnd, @Param("questiontext") String questiontext, @Param("valueType") String valueType);
    /**
     * æ ¹æ®å­ä»»åŠ¡ ID ç»Ÿè®¡é—®é¢˜çš„选项的百分比(用于满意度统计 serviceType=6)
     *
     * @param subtaskIds        å­ä»»åŠ¡ ID åˆ—表 (只能单个 taskid ä¸‹çš„æ‰€æœ‰å­ä»»åŠ¡ id)
     * @param startOutHospTime
     * @param endOutHospTime
     * @param subtaskIds       å­ä»»åŠ¡ ID åˆ—表 (只能单个 taskid ä¸‹çš„æ‰€æœ‰å­ä»»åŠ¡ id)
     * @param startOutHospTime
     * @param endOutHospTime
     * @return
     */
    List<ServiceSubtaskDetailRatioExport> statQuestionOptionBySubtaskIds(@Param("subtaskIds") List<Long> subtaskIds, @Param("startOutHospTime") Date startOutHospTime, @Param("endOutHospTime") Date endOutHospTime);
    List<ServiceSubtaskDetailRatioExport> statQuestionOptionBySubtaskIds(@Param("subtaskIds") List<Long> subtaskIds, @Param("startOutHospTime") Date startOutHospTime, @Param("endOutHospTime") Date endOutHospTime, @Param("scoreStart") Double scoreStart, @Param("scoreEnd") Double scoreEnd, @Param("questiontext") String questiontext, @Param("valueType") String valueType);
}
smartor/src/main/java/com/smartor/mapper/SvyLibTemplateScriptMapper.java
@@ -1,6 +1,5 @@
package com.smartor.mapper;
import com.smartor.domain.IvrLibaTemplateScript;
import com.smartor.domain.SvyLibTemplateScript;
import com.smartor.domain.SvyLibTemplateScriptVO;
import org.apache.ibatis.annotations.Mapper;
smartor/src/main/java/com/smartor/service/IPatSatisfactionService.java
@@ -40,6 +40,14 @@
    public int insertPatSatisfaction(PatSatisfaction patSatisfaction);
    /**
     * æ‰¹é‡æ–°å¢žæ‚£è€…满意度
     *
     * @param patSatisfactions æ‚£è€…满意度
     * @return ç»“æžœ
     */
    public int batchInsert(List<PatSatisfaction> patSatisfactions);
    /**
     * ä¿®æ”¹æ‚£è€…满意度
     *
     * @param patSatisfaction æ‚£è€…满意度
smartor/src/main/java/com/smartor/service/IServiceExternalService.java
@@ -119,6 +119,12 @@
    public Boolean addOperationInfo(@RequestBody Map dataMap);
    /**
     * æ’¤é”€æ‰‹æœ¯ä¿¡æ¯
     */
    public Boolean cancelOperationInfo(@RequestBody Map dataMap);
    /**
     * æ–°å¢žåŒ»ç–—组医生
     */
    public Boolean addMedicalTeam(Map dataMap);
smartor/src/main/java/com/smartor/service/IServiceSubtaskService.java
@@ -2,8 +2,10 @@
import com.ruoyi.common.core.domain.AjaxResult;
import com.smartor.domain.*;
import com.smartor.domain.DTO.QuestionResultDTO;
import com.smartor.domain.ServiceSubtask;
import com.smartor.domain.VO.HeLibraryCountVO;
import com.smartor.domain.VO.QuestionResultVO;
import com.smartor.domain.VO.ServiceSubtaskCotinueCountVO;
import com.smartor.domain.VO.TransferDeptVO;
import com.smartor.domain.entity.ServiceSubtaskEntity;
@@ -53,8 +55,11 @@
     */
    public List<ServiceSubtaskRes> patItem(ServiceSubtaskEntity serviceSubtaskEntity);
    public List<ServiceSubtask> getServiceSubtasks(ServiceSubtaskEntity serviceSubtaskEntity);
    /**
     * è½¬ç§»ç§‘室病区
     *
     * @param transferDeptVO
     * @return
     */
@@ -134,6 +139,16 @@
    public PhoneCallBackSHVO processResust(PhoneCallResultYQVO phoneCallReqYQVO);
    /**
     * é—®é¢˜ç»“果占比
     *
     * @param QuestionResultVO
     * @param serviceSubtaskRes
     * @return
     */
    public List<ServiceSubtaskDetailRatioExport> getDetailRatio(QuestionResultVO questionResultVO, List<ServiceSubtaskRes> serviceSubtaskRes);
    /**
     * é›¨ç»®ä»»åŠ¡æ‹‰å–
     *
     * @return
@@ -211,15 +226,15 @@
     * @param taskIds
     * @return
     */
    public List<ServiceSubtaskDetailRatioExport> statQuestionOption(List<Long> taskIds, Date startOutHospTime, Date endOutHospTime);
    public List<ServiceSubtaskDetailRatioExport> statQuestionOption(List<Long> taskIds, Date startOutHospTime, Date endOutHospTime, String scriptContent, Double scoreStart, Double scoreEnd, String valueType);
    /**
     * æ ¹æ®å­ä»»åŠ¡ ID ç»Ÿè®¡é—®é¢˜çš„选项的百分比(用于满意度统计 serviceType=6)
     *
     * @param subtaskIds        å­ä»»åŠ¡ ID åˆ—表
     * @param subtaskIds å­ä»»åŠ¡ ID åˆ—表
     * @return
     */
    public List<ServiceSubtaskDetailRatioExport> statQuestionOptionBySubtaskIds(List<Long> subtaskIds, Date startOutHospTime, Date endOutHospTime);
    public List<ServiceSubtaskDetailRatioExport> statQuestionOptionBySubtaskIds(List<Long> subtaskIds, Date startOutHospTime, Date endOutHospTime, String scriptContent, Double scoreStart, Double scoreEnd, String valueType);
    public String scanGenerateSubtask(ServiceTask serviceTaskVo);
smartor/src/main/java/com/smartor/service/impl/PatArchiveImportServiceImpl.java
@@ -199,8 +199,11 @@
                        int start = patArchiveImport.getIdcardno().length() - 6;
                        String lastSixDigits = patArchiveImport.getIdcardno().substring(start, start + 6);
                        sysUser.setUserName(lastSixDigits);
                        //密码:xh@123456
                        sysUser.setPassword("$2a$10$zja67LEWTESHutljd8bqEeRy.VgWb./8iJPpFR6VjTUa7ZYNfRRrO");
                        //原密码:xh@123456
                        //sysUser.setPassword("$2a$10$zja67LEWTESHutljd8bqEeRy.VgWb./8iJPpFR6VjTUa7ZYNfRRrO");
                        //新密码:123456
                        sysUser.setPassword("$2a$10$1CRhRCwPEqhEI4bkXYFOLu.ga0PLfDhI3pnvVQ1GX0sbHY3N/UJky");
                        sysUser.setPhonenumber(patArchiveImport.getTelcode());
                        sysUser.setUserType("患者");
                        sysUser.setDeptId(395L);
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
@@ -300,7 +300,7 @@
                } catch (Exception e) {
                    log.error("人员入院科室处理出异常了:{}", e.getMessage());
                    patMedInhosp1.setInDeptcheckFlag("2");
                    patMedInhosp1.setLongTaskReason("人员入院科室处理出异常了:" + e.getMessage());
                    patMedInhosp1.setLongTaskReason("人员入院科室处理出异常了");
                    patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
                }
            }
@@ -727,7 +727,7 @@
                            //再入院逻辑
                            //景宁 å‡ºé™¢é¦–次(7天)随访一定要做
                            boolean firstVisit = false;
                            if (orgId.equals("47255004333112711A1001") && serviceSubtask1.getVisitCount() != null && serviceSubtask1.getVisitCount() == 1) {
                            if (orgId.equals("47255004333112711A1001")) {
                                firstVisit = true;
                            }
                            if (!firstVisit) {
@@ -865,7 +865,7 @@
        if (CollectionUtils.isEmpty(serviceTasks)) {
            log.info("该手术对应手术等级的长期任务不存在,任务ID为:{}", taskid);
            patMedOperationItem.setOpercheckFlag("2");
            patMedOperationItem.setLongTaskReason(longTaskReason + " & è¯¥æ‰‹æœ¯å¯¹åº”手术等级的长期任务不存在,任务ID为:" + taskid);
            patMedOperationItem.setLongTaskReason(" & è¯¥æ‰‹æœ¯å¯¹åº”手术等级的长期任务不存在,任务ID为:" + taskid +";");
            patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem);
            return;
        } else {
@@ -971,7 +971,7 @@
                PatMedOperationItem patMedOperationItem2 = new PatMedOperationItem();
                patMedOperationItem2.setId(patMedOperationItem.getId());
                patMedOperationItem2.setOpercheckFlag("2");
                patMedOperationItem2.setRemark("生成子任务失败 4");
                patMedOperationItem2.setLongTaskReason("生成子任务失败 4;");
                patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem2);
            }
        } catch (Exception e) {
@@ -981,7 +981,7 @@
            PatMedOperationItem patMedOperationItem2 = new PatMedOperationItem();
            patMedOperationItem2.setId(patMedOperationItem.getId());
            patMedOperationItem2.setOpercheckFlag("2");
            patMedOperationItem2.setRemark("生成子任务报错回滚 4");
            patMedOperationItem2.setLongTaskReason("生成子任务报错回滚 4;");
            patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem2);
            e.printStackTrace();
        }
@@ -1188,7 +1188,7 @@
            newDate = addDays(patMedInhosp1.getEndtime(), serviceTask.getSendDay().intValue());
        } else {
            patMedOperationItem.setOpercheckFlag("2");
            patMedOperationItem.setRemark(patMedOperationItem.getRemark() + "& è¯¥æ‚£è€…手术出院时间为空,手术详情ID为:" + patMedOperationItem.getId());
            patMedOperationItem.setLongTaskReason("该患者手术出院时间为空,手术详情ID为:" + patMedOperationItem.getId() + ";");
            patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem);
//            patMedInhosp1.setDeptcheckFlag("2");
//            patMedInhosp1.setRemark(patMedInhosp1.getRemark() + "& è¯¥æ‚£è€…手术出院时间为空,出院记录ID为:" + patMedInhosp1.getInhospid());
@@ -1251,7 +1251,7 @@
                        }
                        //景宁 å‡ºé™¢é¦–次(7天)随访一定要做
                        boolean firstVisit = false;
                        if (serviceSubtask1.getOrgid().equals("47255004333112711A1001") && serviceSubtask1.getVisitCount() != null && serviceSubtask1.getVisitCount() == 1) {
                        if (serviceSubtask1.getOrgid().equals("47255004333112711A1001")) {
                            firstVisit = true;
                        }
                        if (!firstVisit) {
@@ -1324,7 +1324,7 @@
                if (CollectionUtils.isEmpty(serviceTaskopers) || serviceTaskopers.size() == 0) {
                    PatMedOperationItem patMedOperationItem = patMedOperationItemMapper.selectPatMedOperationItemById(opItem.getId());
                    patMedOperationItem.setOpercheckFlag("2");
                    patMedOperationItem.setLongTaskReason(patMedOperationItem.getLongTaskReason() + "所患的手术未配置长期任务;");
                    patMedOperationItem.setLongTaskReason("所患的手术未配置长期任务;");
                    patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem);
                } else {
                    for (ServiceTaskoper serviceTaskoper : serviceTaskopers) {
smartor/src/main/java/com/smartor/service/impl/PatSatisfactionServiceImpl.java
@@ -5,7 +5,11 @@
import java.util.*;
import java.util.stream.Collectors;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.entity.SysUserDept;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.Arith;
import com.ruoyi.common.utils.ArrayListUtils;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.DtoConversionUtils;
import com.smartor.domain.*;
@@ -19,6 +23,8 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.smartor.service.IPatSatisfactionService;
import static com.ruoyi.common.utils.SecurityUtils.getLoginUser;
/**
 * æ‚£è€…满意度Service业务层处理
@@ -101,6 +107,50 @@
    }
    /**
     * æ–°å¢žæ‚£è€…满意度
     *
     * @param patSatisfactions æ‚£è€…满意度
     * @return ç»“æžœ
     */
    @Override
    public int batchInsert(List<PatSatisfaction> patSatisfactions) {
        if(CollectionUtils.isEmpty(patSatisfactions)){
            return 0;
        }
        List<Long> ids = patSatisfactions.stream().map(PatSatisfaction::getId).
                distinct().collect(Collectors.toList());
        List<PatSatisfaction> patSatisfactionsOld = new ArrayList<>();
        PatSatisfaction patSatisfactionVo = new PatSatisfaction();
        patSatisfactionVo.setIds(ids);
        patSatisfactionsOld = patSatisfactionMapper.selectPatSatisfactionList(patSatisfactionVo);
        Map<String, List<PatSatisfaction>> maps = ArrayListUtils.splitListsById(patSatisfactions,
                patSatisfactionsOld, PatSatisfaction::getId);
        //只在patSatisfactions的数据,执行新增操作
        List<PatSatisfaction> addItems = maps.get("onlyIn1");
        //只在patSatisfactionsOld的数据,执行删除操作
//        List<PatSatisfaction> delItems = maps.get("onlyIn2");
        //重叠的数据,执行更新操作
        List<PatSatisfaction> editItems = maps.get("common");
        Integer count = 0;
        LoginUser loginUser = getLoginUser();
        SysUser user = loginUser.getUser();
        for (PatSatisfaction patSatisfaction0 : editItems) {
            patSatisfaction0.setUpdateBy(user.getNickName());
            patSatisfaction0.setUpdateTime(DateUtils.getNowDate());
            count = count + patSatisfactionMapper.updatePatSatisfaction(patSatisfaction0);
        }
        for (PatSatisfaction patSatisfaction1 : addItems) {
            patSatisfaction1.setCreateBy(user.getNickName());
            patSatisfaction1.setOrgid(user.getOrgid());
            patSatisfaction1.setCreateTime(DateUtils.getNowDate());
            patSatisfaction1.setUpdateTime(DateUtils.getNowDate());
            count = count + patSatisfactionMapper.insertPatSatisfaction(patSatisfaction1);
        }
        return count;
    }
    /**
     * ä¿®æ”¹æ‚£è€…满意度
     *
     * @param patSatisfaction æ‚£è€…满意度
smartor/src/main/java/com/smartor/service/impl/ServiceExternalServiceImpl.java
@@ -816,10 +816,16 @@
            patMedInhosp1.setDiagname(StringUtils.isNotEmpty(patMedInhosp1.getLeavediagname()) ? patMedInhosp1.getLeavediagname() : hospPatientDiagnoseInfos2.get(0).getZhenDuanMC());
        }
        patMedInhosp1.setInhospstate("1");
        String orgid = ObjectUtils.isNotEmpty(BingRenXX) && ObjectUtils.isNotEmpty(BingRenXX.get("ZuZhiJGID")) ? BingRenXX.get("ZuZhiJGID").toString() : null;
        if(StringUtils.isNotEmpty(orgid) && orgid.equals("47246103233112211A1001")){
            //缙云二院 ä½é™¢è®°å½•不更新状态
        }else {
            patMedInhosp1.setInhospstate("1");
        }
        if (CollectionUtils.isNotEmpty(patMedInhospList)) {
            patMedInhosp1.setUpdateTime(new Date());
            patMedInhosp1.setOrgid(ObjectUtils.isNotEmpty(BingRenXX) && ObjectUtils.isNotEmpty(BingRenXX.get("ZuZhiJGID")) ? BingRenXX.get("ZuZhiJGID").toString() : null);
            patMedInhosp1.setOrgid(orgid);
            if (CollectionUtils.isNotEmpty(noLongTask) && noLongTask.contains(patMedInhosp1.getOrgid())) {
                //不需要长期任务随访
                patMedInhosp1.setFuflag("0");
@@ -832,7 +838,7 @@
                patMedInhosp1.setHospitalcode(ObjectUtils.isNotEmpty(BingRenXX.get("ZuZhiJGID")) ? BingRenXX.get("ZuZhiJGID").toString() : null);
                patMedInhosp1.setLeavehospitaldistrictname(ObjectUtils.isNotEmpty(BingRenXX.get("DangQianBQMC")) ? BingRenXX.get("DangQianBQMC").toString() : null);
                patMedInhosp1.setLeavehospitaldistrictcode(ObjectUtils.isNotEmpty(BingRenXX.get("DangQianBQID")) ? BingRenXX.get("DangQianBQID").toString() : null);
                patMedInhosp1.setOrgid(ObjectUtils.isNotEmpty(BingRenXX.get("ZuZhiJGID")) ? BingRenXX.get("ZuZhiJGID").toString() : null);
                patMedInhosp1.setOrgid(orgid);
                //丽水无院区,默认值是 1
                patMedInhosp1.setCampusid("1");
                patMedInhosp1.setPatno(ObjectUtils.isNotEmpty(BingRenXX.get("BingRenID")) ? BingRenXX.get("BingRenID").toString() : null);
@@ -1514,6 +1520,81 @@
        return true;
    }
    @Override
    public Boolean cancelOperationInfo(Map dataMap) {
        log.info("ServiceExternalServiceImpl---cancelOperationInfo的撤销的值为:{}", dataMap);
        Map yeWuXX = (Map) dataMap.get("YeWuXX");
        Map<String, Object> BingRenXX = ObjectUtils.isNotEmpty(yeWuXX) ? (Map<String, Object>) yeWuXX.get("BingRenXX") : null;
        ExternalInHospPatientInfo externalInHospPatientInfo = BeanUtil.mapToBean(BingRenXX, ExternalInHospPatientInfo.class, true);
        PatArchive patArchive = addPatArchive(externalInHospPatientInfo, null, null);
        //手术撤销
        Map<String, Object> sscx = ObjectUtils.isNotEmpty(yeWuXX) ? (Map<String, Object>) yeWuXX.get("ShouShuCX") : null;
        ExternalOperationInfo externalOperationInfo = null;
        if (ObjectUtils.isNotEmpty(sscx))
            externalOperationInfo = BeanUtil.mapToBean(sscx, ExternalOperationInfo.class, true);
        PatMedOperation patMedOperation = new PatMedOperation();
        patMedOperation.setPatid(patArchive.getId());
        patMedOperation.setOrgid(patArchive.getOrgid());
        patMedOperation.setOpreqcode(externalOperationInfo.getShenQingDID());
        //查询一下,该患者是否已经有这些数据
        List<PatMedOperation> patMedOperations = patMedOperationMapper.selectPatMedOperationList(patMedOperation);
        if (CollectionUtils.isNotEmpty(patMedOperations)) {
            for(PatMedOperation operation : patMedOperations){
                Long id = operation.getId();
                //如果手术撤销,直接删除该条手术信息
                if (ObjectUtils.isNotEmpty(sscx)) {
                    operation.setId(id);
                    operation.setCheckFlag("1");
                    operation.setDelFlag("1");
                    //同时去查询,是否在subtask中生成任务,如果生成出得立马删除
                    //            æ‰‹æœ¯éšè®¿
                    PatMedOperationItem pmoi = new PatMedOperationItem();
                    //获取需要出院手术随访,未处理的数据
                    pmoi.setOpid(operation.getId().toString());
                    List<PatMedOperationItem> patMedOperationItems
                            = patMedOperationItemMapper.selectOperationItemList(pmoi);
                    List<Long> operationItemIds = patMedOperationItems.stream()
                            .map(PatMedOperationItem::getId)
                            .filter(Objects::nonNull)
                            .distinct()
                            .collect(Collectors.toList());
                    //不需要服务了,需要通过patid和sendstate=1,2,3,5,7去查询一下,service_subtask里是否有正在执行的任务,
                    //有的话,立即停了
                    List<Long> sendstates = Arrays.asList(1L, 2L, 3L, 5L, 7L);
                    List<ServiceSubtask> serviceSubtaskList = new ArrayList<>();
                    ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
                    serviceSubtaskVO.setOrgid(patArchive.getOrgid());
                    serviceSubtaskVO.setPatid(patArchive.getId());
                    serviceSubtaskVO.setSendstates(sendstates);
                    serviceSubtaskVO.setOperationItemIds(operationItemIds);
                    serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
                    //去redis中,查询是否有subid,有的话移除cache-exist
                    if (CollectionUtils.isNotEmpty(serviceSubtaskList)) {
                        for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
                            log.info("需要移除的subId为:{}", serviceSubtask.getId().toString());
                            serviceSubtask.setSendstate(4L);
                            serviceSubtask.setRemark("手术撤销");
                            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                            redisCache.removeElementFromList("cache-exist", serviceSubtask.getId().toString());
                            redisCache.removeElementFromList("cache-0", serviceSubtask.getId().toString());
                            redisCache.removeElementFromList("cache-1", serviceSubtask.getId().toString());
                            redisCache.removeElementFromList("cache-2", serviceSubtask.getId().toString());
                            redisCache.removeElementFromList("cache-3", serviceSubtask.getId().toString());
                            redisCache.removeElementFromList("cache-4", serviceSubtask.getId().toString());
                        }
                    }
                    operation.setUpdateTime(new Date());
                    patMedOperationMapper.updatePatMedOperation(operation);
                    patMedOperationItemMapper.deleteSoftPatMedOperationItemByOpId(operation.getOpid());
                }
            }
        }
        return true;
    }
    //新增患者基本信息
    private PatArchive addPatArchive(ExternalInHospPatientInfo externalInHospPatientInfo, ExternalInHospPatientAddrInfo externalInHospPatientAddrInfo, ExternalInHospPatientLiaisonInfo externalInHospPatientLiaisonInfo) {
        Date parse = null;
@@ -2007,6 +2088,7 @@
                return true;
            case "SM_SQ_CheXiao":
                log.info("手术撤销入参类型为:{}", type);
                cancelOperationInfo(dataMap);
                return true;
            case "TJ_YW_BaoGaoXX":
                log.info("体检报告入参类型为:{}", type);
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java
@@ -377,16 +377,6 @@
            log.error("将该key和value从redis中,serviceSubtask的值为--------:{}", serviceSubtask);
            if (score != null && !score.isEmpty()) serviceSubtask.setScore(score);
            serviceSubtaskMapper.updateServiceSubtaskByCondition(serviceSubtask);
            //修改住院满意度状态(避免重复查询)
            if (serviceSubtask.getServiceType() != null && "6".equals(serviceSubtask.getServiceType())) {
                Long inhospid = serviceSubtask.getInhospid();
                if (inhospid != null) {
                    PatMedInhosp patMedInhosp = new PatMedInhosp();
                    patMedInhosp.setInhospMydFlag("1");
                    patMedInhosp.setInhospid(inhospid);
                    patMedInhospMapper.updatePatMedInhosp(patMedInhosp);
                }
            }
            //将当前发送状态改成 9 å®Œæˆï¼ˆç¼“å­˜ preachform æŸ¥è¯¢ï¼‰
            String currentPreachform = serviceSubtask.getCurrentPreachform();
@@ -1123,6 +1113,8 @@
            subtaskDetailTrace.setDutyDeptPersonName(svyTaskTemplateScriptVO.getDutyDeptPersonName());
            subtaskDetailTrace.setReportDeptPersonCode(svyTaskTemplateScriptVO.getReportDeptPersonCode());
            subtaskDetailTrace.setReportDeptPersonName(svyTaskTemplateScriptVO.getReportDeptPersonName());
            subtaskDetailTrace.setCirculationDeptPersonCode(svyTaskTemplateScriptVO.getCirculationDeptPersonCode());
            subtaskDetailTrace.setCirculationDeptPersonName(svyTaskTemplateScriptVO.getCirculationDeptPersonName());
            Long existTraceId = existingTraceIdMap.get(subtaskDetailTrace.getScriptid());
            if (existTraceId != null) {
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
@@ -22,9 +22,11 @@
import com.smartor.common.MtSubmitSmUtil;
import com.smartor.common.ScheduleSubtaskBuilder;
import com.smartor.config.PhoneUtils;
import com.smartor.domain.DTO.QuestionResultDTO;
import com.smartor.domain.DTO.ServiceSubtaskDetailDTO;
import com.smartor.domain.*;
import com.smartor.domain.VO.HeLibraryCountVO;
import com.smartor.domain.VO.QuestionResultVO;
import com.smartor.domain.VO.ServiceSubtaskCotinueCountVO;
import com.smartor.domain.VO.TransferDeptVO;
import com.smartor.domain.entity.ServiceSubtaskEntity;
@@ -36,6 +38,7 @@
import org.apache.commons.lang3.ObjectUtils;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.junit.Test;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.Cacheable;
@@ -414,26 +417,7 @@
    @Override
    public List<ServiceSubtaskRes> patItem(ServiceSubtaskEntity serviceSubtaskEntity) {
        if (serviceSubtaskEntity.getSendstateView() != null) {
            //            1:待随访(1 è¢«é¢†å–、2 å¾…发送、3 å·²å‘送、5 å‘送失败、7、超时);2:已完成( 6 å·²å®Œæˆï¼‰ã€3:无需随访(4 ä¸æ‰§è¡Œï¼‰
            if (serviceSubtaskEntity.getSendstateView() == 1)
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(1L, 2L, 3L, 5L, 7L)));
            if (serviceSubtaskEntity.getSendstateView() == 2)
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(6L)));
            if (serviceSubtaskEntity.getSendstateView() == 3)
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(4L)));
        }
        //患者获取随访任务-需要查询同个患者(身份证)所有的任务 æ™¯å®
        if (StringUtils.isNotEmpty(serviceSubtaskEntity.getOrgid()) && serviceSubtaskEntity.getOrgid().equals("47255004333112711A1001")) {
            if (ObjectUtils.isNotEmpty(serviceSubtaskEntity.getPatid())) {
                PatArchive patArchive = patArchiveService.selectPatArchiveByPatid(serviceSubtaskEntity.getPatid());
                if (ObjectUtils.isNotEmpty(patArchive) && StringUtils.isNotEmpty(patArchive.getIdcardno())) {
                    serviceSubtaskEntity.setPatid(null);
                    serviceSubtaskEntity.setSfzh(patArchive.getIdcardno());
                }
            }
        }
        List<ServiceSubtask> selectServiceSubtaskList = this.selectServiceSubtaskList(serviceSubtaskEntity);
        List<ServiceSubtask> selectServiceSubtaskList = getServiceSubtasks(serviceSubtaskEntity);
        List<ServiceSubtaskRes> serviceSubtaskResList = new ArrayList<>();
        for (ServiceSubtask serviceSubtask : selectServiceSubtaskList) {
@@ -469,6 +453,30 @@
            serviceSubtaskResList.add(serviceSubtaskRes);
        }
        return serviceSubtaskResList;
    }
    public List<ServiceSubtask> getServiceSubtasks(ServiceSubtaskEntity serviceSubtaskEntity) {
        if (serviceSubtaskEntity.getSendstateView() != null) {
            //            1:待随访(1 è¢«é¢†å–、2 å¾…发送、3 å·²å‘送、5 å‘送失败、7、超时);2:已完成( 6 å·²å®Œæˆï¼‰ã€3:无需随访(4 ä¸æ‰§è¡Œï¼‰
            if (serviceSubtaskEntity.getSendstateView() == 1)
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(1L, 2L, 3L, 5L, 7L)));
            if (serviceSubtaskEntity.getSendstateView() == 2)
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(6L)));
            if (serviceSubtaskEntity.getSendstateView() == 3)
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(4L)));
        }
        //患者获取随访任务-需要查询同个患者(身份证)所有的任务 æ™¯å®
        if (StringUtils.isNotEmpty(serviceSubtaskEntity.getOrgid()) && serviceSubtaskEntity.getOrgid().equals("47255004333112711A1001")) {
            if (ObjectUtils.isNotEmpty(serviceSubtaskEntity.getPatid())) {
                PatArchive patArchive = patArchiveService.selectPatArchiveByPatid(serviceSubtaskEntity.getPatid());
                if (ObjectUtils.isNotEmpty(patArchive) && StringUtils.isNotEmpty(patArchive.getIdcardno())) {
                    serviceSubtaskEntity.setPatid(null);
                    serviceSubtaskEntity.setSfzh(patArchive.getIdcardno());
                }
            }
        }
        List<ServiceSubtask> selectServiceSubtaskList = this.selectServiceSubtaskList(serviceSubtaskEntity);
        return selectServiceSubtaskList;
    }
    @Override
@@ -636,14 +644,19 @@
     */
    @Override
    public Map<String, Object> insertServiceSubtask(ServiceSubtask serviceSubtask) {
        List<ServiceSubtask> serviceSubtasks = null;
        //先查询一下该患者是否已经创建根据serviceType,sendstate,inhospid,patid,orgid
        ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
        serviceSubtaskVO.setServiceType(serviceSubtask.getServiceType());
        serviceSubtaskVO.setSendstates(new ArrayList<>(Arrays.asList(1L, 2L, 3L, 5L, 7L)));
        serviceSubtaskVO.setPatid(serviceSubtask.getPatid());
        serviceSubtaskVO.setOrgid(serviceSubtask.getOrgid());
        serviceSubtaskVO.setCampusid(serviceSubtask.getCampusid());
        List<ServiceSubtask> serviceSubtasks = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
        //这样判断主要是为了想让新华医院的外部导入患者创建任务,也能用这个接口
        if (StringUtils.isEmpty(serviceSubtask.getPatfrom()) || !serviceSubtask.getPatfrom().equals("2")) {
            ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
            serviceSubtaskVO.setServiceType(serviceSubtask.getServiceType());
            serviceSubtaskVO.setInhospid(serviceSubtask.getInhospid());
            serviceSubtaskVO.setSendstates(new ArrayList<>(Arrays.asList(1L, 2L, 3L, 5L, 7L)));
            serviceSubtaskVO.setPatid(serviceSubtask.getPatid());
            serviceSubtaskVO.setOrgid(serviceSubtask.getOrgid());
            serviceSubtaskVO.setCampusid(serviceSubtask.getCampusid());
            serviceSubtasks = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
        }
        RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample();
        String format = null;
        if (CollectionUtils.isNotEmpty(serviceSubtasks)) {
@@ -657,8 +670,27 @@
            serviceSubtask = serviceSubtask1;
        } else {
            //如果不存在,则新增
            ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
            if (ObjectUtils.isNotEmpty(serviceTask)) {
                serviceSubtask.setDeptcode(serviceTask.getDeptcode());
                serviceSubtask.setTaskDesc(serviceTask.getTaskDesc());
                serviceSubtask.setTaskName(serviceTask.getTaskName());
                serviceSubtask.setDeptname(serviceTask.getDeptname());
                serviceSubtask.setTemplatename(serviceTask.getTemplatename());
            }
            serviceSubtask.setCreateTime(DateUtils.getNowDate());
            serviceSubtaskMapper.insertServiceSubtask(serviceSubtask);
            //修改住院满意度状态(避免重复查询)
            if (serviceSubtask.getServiceType() != null && "6".equals(serviceSubtask.getServiceType())) {
                Long inhospid = serviceSubtask.getInhospid();
                if (inhospid != null) {
                    PatMedInhosp patMedInhosp = new PatMedInhosp();
                    patMedInhosp.setInhospMydFlag("1");
                    patMedInhosp.setInhospid(inhospid);
                    patMedInhospMapper.updatePatMedInhosp(patMedInhosp);
                }
            }
            format = getOutPath(serviceSubtask, rsaPublicKeyExample);
        }
@@ -706,8 +738,12 @@
        patMedInhosp.setInhospstate("0");
        List<PatMedInhosp> patMedInhospList = patMedInhospMapper.selectPatMedInhospList(patMedInhosp);
        PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(serviceSubtask1.getPatid());
        if (patMedInhospList.size() > 0) {
        //景宁 æ–°å¢žå†æ¬¡éšè®¿ä¸èƒ½è§¦å‘患者再入院
        boolean inhospAgain = true;
        if (serviceSubtask1.getOrgid().equals("47255004333112711A1001")) {
            inhospAgain = false;
        }
        if (patMedInhospList.size() > 0 && inhospAgain) {
            serviceSubtask1.setIsVisitAgain(2);
            serviceSubtask1.setRemark(StringUtils.isNotEmpty(serviceSubtask.getRemark()) ? serviceSubtask.getRemark() + ";患者再入院了" : "患者再入院了");
            serviceSubtask1.setSendstate(4L);
@@ -2887,6 +2923,12 @@
                collect = rawData.stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDrcode()).orElse("Unknown")));
                break;
            case "management_doctor_code":
                rawData = rawData.stream()
                        .peek(item -> {
                            item.setDrname(item.getManagementDoctor());
                            item.setDrcode(item.getManagementDoctorCode());
                        })
                        .collect(Collectors.toList());
                collect = rawData.stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getManagementDoctorCode()).orElse("Unknown")));
                break;
            case "deptcode":
@@ -4970,23 +5012,107 @@
    }
    @Override
    public List<ServiceSubtaskDetailRatioExport> statQuestionOption(List<Long> taskIds, Date startOutHospTime, Date endOutHospTime) {
    public List<ServiceSubtaskDetailRatioExport> statQuestionOption(List<Long> taskIds, Date startOutHospTime, Date endOutHospTime, String scriptContent, Double scoreStart, Double scoreEnd,String valueType) {
        //先清理一下重复数据
        List<Long> repeatIds = serviceSubtaskDetailMapper.selectRepeatDetailIds();
        if (!CollectionUtils.isEmpty(repeatIds)) {
            serviceSubtaskDetailMapper.deleteRepeatDetailByIds(repeatIds);
        }
        return serviceSubtaskMapper.statQuestionOption(taskIds, startOutHospTime, endOutHospTime);
        List<ServiceSubtaskDetailRatioExport> serviceSubtaskDetailRatioExports = serviceSubtaskMapper.statQuestionOption(taskIds, startOutHospTime, endOutHospTime, scoreStart, scoreEnd, scriptContent, valueType);
        // å¤„理 targetvalue:按 & åˆ†å‰²æˆå¤šæ¡è®°å½•
        List<ServiceSubtaskDetailRatioExport> result = new ArrayList<>();
        for (ServiceSubtaskDetailRatioExport export : serviceSubtaskDetailRatioExports) {
            if (StringUtils.isNotEmpty(export.getTargetvalue()) && export.getTargetvalue().contains("&")) {
                String[] values = export.getTargetvalue().split("&");
                // å¦‚果有多条目标值,拆分成多行
                for (String value : values) {
                    //先去 result ä¸­æŸ¥ä¸€ä¸‹ï¼Œæœ‰æ²¡æœ‰è¿™ä¸ª questiontext å’Œå¯¹åº”çš„ targetvalue
                    ServiceSubtaskDetailRatioExport existingExport = result.stream()
                            .filter(e -> e.getQuestiontext().equals(export.getQuestiontext())
                                    && value.trim().equals(e.getTargetvalue()))
                            .findFirst()
                            .orElse(null);
                    if (existingExport != null && existingExport.getRatio().equals("0") && existingExport.getCount().equals("0")) {
                        //如果存在,则将 result é‡Œçš„这个问题所对应的 Targetvalue=value è¿™æ¡æ•°æ®æ›´æ–°æˆå½“前这条数据
                        if(value.equals(export.getOptionresult())) {
                            existingExport.setRatio(export.getRatio());
                            existingExport.setScore(export.getScore());
                            existingExport.setCount(export.getCount());
                            existingExport.setOptionresult(export.getOptionresult());
                        }
                    } else if (existingExport != null && !existingExport.getRatio().equals("0")) {
                        continue;
                    } else {
                        ServiceSubtaskDetailRatioExport newExport = DtoConversionUtils.sourceToTarget(export, ServiceSubtaskDetailRatioExport.class);
                        newExport.setTargetvalue(value.trim()); // targetvalue æ˜¾ç¤ºå•个选项
                        if (!value.equals(export.getOptionresult())) {
                            newExport.setOptionresult(null);
                            newExport.setCount("0");
                            newExport.setRatio("0");
                        }
                        result.add(newExport);
                    }
                }
            } else {
                // targetvalue ä¸åŒ…含 &,直接添加到结果
                result.add(export);
            }
        }
        return result;
    }
    @Override
    public List<ServiceSubtaskDetailRatioExport> statQuestionOptionBySubtaskIds(List<Long> subtaskIds, Date startOutHospTime, Date endOutHospTime) {
    public List<ServiceSubtaskDetailRatioExport> statQuestionOptionBySubtaskIds(List<Long> subtaskIds, Date startOutHospTime, Date endOutHospTime, String scriptContent, Double scoreStart, Double scoreEnd,String valueType) {
        //先清理一下重复数据
        List<Long> repeatIds = serviceSubtaskDetailMapper.selectRepeatDetailIds();
        if (!CollectionUtils.isEmpty(repeatIds)) {
            serviceSubtaskDetailMapper.deleteRepeatDetailByIds(repeatIds);
        }
        return serviceSubtaskMapper.statQuestionOptionBySubtaskIds(subtaskIds, startOutHospTime, endOutHospTime);
        List<ServiceSubtaskDetailRatioExport> serviceSubtaskDetailRatioExports = serviceSubtaskMapper.statQuestionOptionBySubtaskIds(subtaskIds, startOutHospTime, endOutHospTime, scoreStart, scoreEnd, scriptContent,valueType);
        // å¤„理 targetvalue:按 & åˆ†å‰²æˆå¤šæ¡è®°å½•
        List<ServiceSubtaskDetailRatioExport> result = new ArrayList<>();
        for (ServiceSubtaskDetailRatioExport export : serviceSubtaskDetailRatioExports) {
            if (StringUtils.isNotEmpty(export.getTargetvalue()) && export.getTargetvalue().contains("&")) {
                String[] values = export.getTargetvalue().split("&");
                // å¦‚果有多条目标值,拆分成多行
                for (String value : values) {
                    //先去 result ä¸­æŸ¥ä¸€ä¸‹ï¼Œæœ‰æ²¡æœ‰è¿™ä¸ª questiontext å’Œå¯¹åº”çš„ targetvalue
                    ServiceSubtaskDetailRatioExport existingExport = result.stream()
                            .filter(e -> e.getQuestiontext().equals(export.getQuestiontext())
                                    && value.trim().equals(e.getTargetvalue()))
                            .findFirst()
                            .orElse(null);
                    if (existingExport != null && existingExport.getRatio().equals("0") && existingExport.getCount().equals("0")) {
                        //如果存在,则将 result é‡Œçš„这个问题所对应的 Targetvalue=value è¿™æ¡æ•°æ®æ›´æ–°æˆå½“前这条数据
                        if(value.equals(export.getOptionresult())) {
                            existingExport.setRatio(export.getRatio());
                            existingExport.setScore(export.getScore());
                            existingExport.setCount(export.getCount());
                            existingExport.setOptionresult(export.getOptionresult());
                        }
                    } else if (existingExport != null && !existingExport.getRatio().equals("0")) {
                        continue;
                    } else {
                        ServiceSubtaskDetailRatioExport newExport = DtoConversionUtils.sourceToTarget(export, ServiceSubtaskDetailRatioExport.class);
                        newExport.setTargetvalue(value.trim()); // targetvalue æ˜¾ç¤ºå•个选项
                        if (!value.equals(export.getOptionresult())) {
                            newExport.setOptionresult(null);
                            newExport.setCount("0");
                            newExport.setRatio("0");
                        }
                        result.add(newExport);
                    }
                }
            } else {
                // targetvalue ä¸åŒ…含 &,直接添加到结果
                result.add(export);
            }
        }
        return result;
    }
    /**
@@ -5674,6 +5800,28 @@
        return back;
    }
    /**
     * é—®é¢˜ç»“果占比
     *
     * @param serviceSubtaskEntity
     * @param serviceSubtaskRes
     * @return
     */
    public List<ServiceSubtaskDetailRatioExport> getDetailRatio(QuestionResultVO questionResultVO, List<ServiceSubtaskRes> serviceSubtaskRes) {
        List<ServiceSubtaskDetailRatioExport> serviceSubtaskDetailRatioExports = null;
        if (StringUtils.isNotEmpty(questionResultVO.getServiceType()) && questionResultVO.getServiceType().equals("2")) {
            //获取serviceSubtaskList中的所有taskid
            List<Long> taskIds = serviceSubtaskRes.stream().map(ServiceSubtaskRes::getTaskid).filter(ObjectUtils::isNotEmpty).distinct().collect(Collectors.toList());
            serviceSubtaskDetailRatioExports = statQuestionOption(taskIds, questionResultVO.getStartOutHospTime(), questionResultVO.getEndOutHospTime(), questionResultVO.getQuestionContent(), questionResultVO.getStartScore(), questionResultVO.getEndScore(),questionResultVO.getValueType());
        } else if (StringUtils.isNotEmpty(questionResultVO.getServiceType()) && questionResultVO.getServiceType().equals("6")) {
            //满意度统计 ï¼ˆé€šè¿‡ subtask çš„ id åŽ»ç»Ÿè®¡ï¼‰
            List<Long> subtaskIds = serviceSubtaskRes.stream().map(ServiceSubtaskRes::getId).collect(Collectors.toList());
            serviceSubtaskDetailRatioExports = statQuestionOptionBySubtaskIds(subtaskIds, questionResultVO.getStartOutHospTime(), questionResultVO.getEndOutHospTime(), questionResultVO.getQuestionContent(), questionResultVO.getStartScore(), questionResultVO.getEndScore(),questionResultVO.getValueType());
        }
        return serviceSubtaskDetailRatioExports;
    }
    //获取任务组信息
    private void findServiceTaskScheduleVO(ServiceTaskVO serviceTaskVO) {
        if (StringUtils.isNotEmpty(serviceTaskVO.getAppltype()) && serviceTaskVO.getAppltype().equals("5")) {
smartor/src/main/resources/mapper/smartor/IvrLibaTemplateScriptMapper.xml
@@ -59,6 +59,8 @@
        <result property="dutyDeptPersonCode" column="duty_dept_person_code"/>
        <result property="reportDeptPersonCode" column="report_dept_person_name"/>
        <result property="reportDeptPersonName" column="report_dept_person_code"/>
        <result property="circulationDeptPersonCode" column="circulation_dept_person_code"/>
        <result property="circulationDeptPersonName" column="circulation_dept_person_name"/>
    </resultMap>
    <sql id="selectIvrLibaTemplateScriptVo">
@@ -69,6 +71,8 @@
               duty_dept_person_code,
               report_dept_person_name,
               report_dept_person_code,
               circulation_dept_person_code,
               circulation_dept_person_name,
               dimension,
               sort,
               script_assortname,
@@ -193,6 +197,12 @@
        <if test="reportDeptPersonCode != null  and reportDeptPersonCode != ''">and report_dept_person_code like concat('%', #{reportDeptPersonCode},
            '%')
        </if>
        <if test="circulationDeptPersonCode != null  and circulationDeptPersonCode != ''">and circulation_dept_person_code like concat('%', #{circulationDeptPersonCode},
            '%')
        </if>
        <if test="circulationDeptPersonName != null  and circulationDeptPersonName != ''">and circulation_dept_person_name like concat('%', #{circulationDeptPersonName},
            '%')
        </if>
    </select>
@@ -283,6 +293,8 @@
            <if test="dutyDeptPersonCode != null  and dutyDeptPersonCode != ''">duty_dept_person_code,</if>
            <if test="reportDeptPersonName != null  and reportDeptPersonName != ''">report_dept_person_name,</if>
            <if test="reportDeptPersonCode != null  and reportDeptPersonCode != ''">report_dept_person_code,</if>
            <if test="circulationDeptPersonCode != null  and circulationDeptPersonCode != ''">circulation_dept_person_code,</if>
            <if test="circulationDeptPersonName != null  and circulationDeptPersonName != ''">circulation_dept_person_name,</if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="scriptno != null">#{scriptno},</if>
@@ -337,6 +349,8 @@
            <if test="dutyDeptPersonCode != null  and dutyDeptPersonCode != ''">#{dutyDeptPersonCode},</if>
            <if test="reportDeptPersonName != null  and reportDeptPersonName != ''">#{reportDeptPersonName},</if>
            <if test="reportDeptPersonCode != null  and reportDeptPersonCode != ''">#{reportDeptPersonCode},</if>
            <if test="circulationDeptPersonCode != null  and circulationDeptPersonCode != ''">#{circulationDeptPersonCode},</if>
            <if test="circulationDeptPersonName != null  and circulationDeptPersonName != ''">#{circulationDeptPersonName},</if>
        </trim>
    </insert>
@@ -374,6 +388,8 @@
            <if test="dutyDeptPersonCode != null  and dutyDeptPersonCode != ''">duty_dept_person_code = #{dutyDeptPersonCode},</if>
            <if test="reportDeptPersonName != null  and reportDeptPersonName != ''">report_dept_person_name = #{reportDeptPersonName},</if>
            <if test="reportDeptPersonCode != null  and reportDeptPersonCode != ''">report_dept_person_code = #{reportDeptPersonCode},</if>
            <if test="circulationDeptPersonName != null  and circulationDeptPersonName != ''">circulation_dept_person_name = #{circulationDeptPersonName},</if>
            <if test="circulationDeptPersonCode != null  and circulationDeptPersonCode != ''">circulation_dept_person_code = #{circulationDeptPersonCode},</if>
            <if test="targetid != null">targetid = #{targetid},</if>
            <if test="scriptTopic != null">script_topic = #{scriptTopic},</if>
            <if test="nextScriptno != null">next_scriptno = #{nextScriptno},</if>
smartor/src/main/resources/mapper/smartor/IvrTaskTemplateScriptMapper.xml
@@ -59,6 +59,8 @@
        <result property="dutyDeptPersonCode" column="duty_dept_person_code"/>
        <result property="reportDeptPersonCode" column="report_dept_person_name"/>
        <result property="reportDeptPersonName" column="report_dept_person_code"/>
        <result property="circulationDeptPersonCode" column="circulation_dept_person_code"/>
        <result property="circulationDeptPersonName" column="circulation_dept_person_name"/>
    </resultMap>
    <sql id="selectIvrTaskTemplateScriptVo">
@@ -75,6 +77,8 @@
               duty_dept_person_code,
               report_dept_person_name,
               report_dept_person_code,
               circulation_dept_person_code,
               circulation_dept_person_name,
               sort,
               ivrtext,
               script_type,
@@ -178,6 +182,14 @@
            #{reportDeptPersonCode},
            '%')
        </if>
        <if test="circulationDeptPersonCode != null  and circulationDeptPersonCode != ''">and circulation_dept_person_code like concat('%',
            #{circulationDeptPersonCode},
            '%')
        </if>
        <if test="circulationDeptPersonName != null  and circulationDeptPersonName != ''">and circulation_dept_person_name like concat('%',
            #{circulationDeptPersonName},
            '%')
        </if>
    </select>
    <select id="selectIvrTaskTemplateScriptByID" parameterType="Long" resultMap="IvrTaskTemplateScriptResult">
@@ -241,6 +253,8 @@
            <if test="dutyDeptPersonCode != null  and dutyDeptPersonCode != ''">duty_dept_person_code,</if>
            <if test="reportDeptPersonName != null  and reportDeptPersonName != ''">report_dept_person_name,</if>
            <if test="reportDeptPersonCode != null  and reportDeptPersonCode != ''">report_dept_person_code,</if>
            <if test="circulationDeptPersonCode != null  and circulationDeptPersonCode != ''">circulation_dept_person_code,</if>
            <if test="circulationDeptPersonName != null  and circulationDeptPersonName != ''">circulation_dept_person_name,</if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="taskid != null">#{taskid},</if>
@@ -295,6 +309,8 @@
            <if test="dutyDeptPersonCode != null  and dutyDeptPersonCode != ''">#{dutyDeptPersonCode},</if>
            <if test="reportDeptPersonName != null  and reportDeptPersonName != ''">#{reportDeptPersonName},</if>
            <if test="reportDeptPersonCode != null  and reportDeptPersonCode != ''">#{reportDeptPersonCode},</if>
            <if test="circulationDeptPersonCode != null  and circulationDeptPersonCode != ''">#{circulationDeptPersonCode},</if>
            <if test="circulationDeptPersonName != null  and circulationDeptPersonName != ''">#{circulationDeptPersonName},</if>
        </trim>
    </insert>
@@ -355,6 +371,8 @@
            <if test="dutyDeptPersonCode != null  and dutyDeptPersonCode != ''">duty_dept_person_code = #{dutyDeptPersonCode},</if>
            <if test="reportDeptPersonName != null  and reportDeptPersonName != ''">report_dept_person_name = #{reportDeptPersonName},</if>
            <if test="reportDeptPersonCode != null  and reportDeptPersonCode != ''">report_dept_person_code = #{reportDeptPersonCode},</if>
            <if test="circulationDeptPersonName != null  and circulationDeptPersonName != ''">circulation_dept_person_name = #{circulationDeptPersonName},</if>
            <if test="circulationDeptPersonCode != null  and circulationDeptPersonCode != ''">circulation_dept_person_code = #{circulationDeptPersonCode},</if>
        </trim>
        where id = #{id}
    </update>
smartor/src/main/resources/mapper/smartor/PatMedInhospMapper.xml
@@ -246,6 +246,7 @@
        AND a.del_flag = 0
        AND b.del_flag = 0
        AND a.idcardno IS NOT NULL
        <if test="inhospid != null">and b.inhospid = #{inhospid}</if>
        <if test="startOutHospTime != null ">and date_format(b.endtime,'%y%m%d') &gt;=
            date_format(#{startOutHospTime},'%y%m%d')
        </if>
@@ -369,7 +370,7 @@
            order by b.endtime desc
        </if>
        <if test="cry != null and cry==0">
            order by b.starttime desc
            order by b.starttime desc , b.bed_no asc
        </if>
    </select>
smartor/src/main/resources/mapper/smartor/PatMedOperationItemMapper.xml
@@ -309,6 +309,86 @@
        where id = #{id}
    </update>
    <update id="updatePatMedOperationItemByOperationid" parameterType="com.smartor.domain.PatMedOperationItem">
        update pat_med_operation_item
        <trim prefix="SET" suffixOverrides=",">
            <if test="opid != null">opid =
                #{opid},
            </if>
            <if test="opcode != null">opcode =
                #{opcode},
            </if>
            <if test="opdesc != null">opdesc =
                #{opdesc},
            </if>
            <if test="mainFlag != null">main_flag =
                #{mainFlag},
            </if>
            <if test="incitypecode != null">incitypecode =
                #{incitypecode},
            </if>
            <if test="incitypedesc != null">incitypedesc =
                #{incitypedesc},
            </if>
            <if test="oplevelcode != null">oplevelcode =
                #{oplevelcode},
            </if>
            <if test="opleveldesc != null">opleveldesc =
                #{opleveldesc},
            </if>
            <if test="opposition != null">opposition =
                #{opposition},
            </if>
            <if test="delFlag != null">del_flag =
                #{delFlag},
            </if>
            <if test="updateBy != null">update_by =
                #{updateBy},
            </if>
            <if test="updateTime != null">update_time =
                #{updateTime},
            </if>
            <if test="createBy != null">create_by =
                #{createBy},
            </if>
            <if test="createTime != null">create_time =
                #{createTime},
            </if>
            <if test="isupload != null">isupload =
                #{isupload},
            </if>
            <if test="uploadTime != null">upload_time =
                #{uploadTime},
            </if>
            <if test="orgid != null">orgid =
                #{orgid},
            </if>
            <if test="pguid != null">pguid =
                #{pguid},
            </if>
            <if test="guid != null">guid =
                #{guid},
            </if>
            <if test="pid != null">pid =
                #{pid},
            </if>
            <if test="opercheckFlag != null">opercheck_flag =
                #{opercheckFlag},
            </if>
            <if test="longTaskReason != null">long_task_reason =
                #{longTaskReason},
            </if>
            <if test="inhospstate != null">inhospstate =
                #{inhospstate},
            </if>
            <if test="serialnum != null">serialnum =
                #{serialnum},
            </if>
        </trim>
        where operationid = #{operationid}
        and opcode = #{opcode}
    </update>
    <insert id="insertPatMedOperationItems">
        insert into pat_med_operation_item
        <trim prefix="(" suffix=")" suffixOverrides=",">
@@ -442,7 +522,25 @@
    <delete id="deleteHardPatMedOperationItemByOpId" parameterType="String">
        delete from pat_med_operation_item
               where opid = #{opid}
               and opercheck_flag != 1
    </delete>
    <update id="deletePatMedOperationItemByOperationid" parameterType="Long">
        update  pat_med_operation_item
        <trim prefix="SET" suffixOverrides=",">
            del_flag =1
        </trim>
        where operationid = #{operationid}
        and opercheck_flag != 1
    </update>
    <update id="deleteSoftPatMedOperationItemByOpId" parameterType="String">
        update pat_med_operation_item
        <trim prefix="SET" suffixOverrides=",">
            del_flag =1
        </trim>
        where opid = #{opid}
    </update>
    <select id="selectOperationItemList" parameterType="com.smartor.domain.PatMedOperationItem"
            resultMap="PatMedOperationItemResult">
@@ -457,7 +555,7 @@
        from pat_med_operation pmo
        join pat_med_operation_item pmoi
        on pmoi.opid = pmo.opid
        left join pat_med_inhosp pmi
        join pat_med_inhosp pmi
        on pmo.serialnum = pmi.serialnum
        where
        pmo.del_flag = '0'
smartor/src/main/resources/mapper/smartor/PatSatisfactionMapper.xml
@@ -114,6 +114,13 @@
            <if test="endTime != null">
                AND date_format(update_time,'%y%m%d') &lt;= date_format(#{endTime},'%y%m%d')
            </if>
            <if test="ids != null and ids.size()>0">
                AND id IN
                <foreach collection="ids" item="idItem" open="(" separator=","
                         close=")">
                    #{idItem}
                </foreach>
            </if>
    </select>
    <select id="selectPatSatisfactionById" parameterType="Long"
smartor/src/main/resources/mapper/smartor/ServiceSubtaskDetailTraceMapper.xml
@@ -59,14 +59,33 @@
        <result property="dutyDeptPersonCode" column="duty_dept_person_code"/>
        <result property="reportDeptPersonCode" column="report_dept_person_name"/>
        <result property="reportDeptPersonName" column="report_dept_person_code"/>
        <result property="circulationDeptPersonCode" column="circulation_dept_person_code"/>
        <result property="circulationDeptPersonName" column="circulation_dept_person_name"/>
        <result property="circulationDeptCode" column="circulation_dept_code"/>
        <result property="circulationDeptName" column="circulation_dept_name"/>
        <result property="circulationExplain" column="circulation_explain"/>
        <result property="circulationTime" column="circulation_time"/>
        <result property="circulationStatus" column="circulation_status"/>
        <result property="circulationPersonName" column="circulation_person_name"/>
        <result property="circulationPersonCode" column="circulation_person_code"/>
    </resultMap>
    <sql id="selectServiceSubtaskDetailTtraceVo">
        select id,
               circulation_status,
               circulation_person_name,
               circulation_person_code,
               duty_dept_person_name,
               duty_dept_person_code,
               report_dept_person_name,
               report_dept_person_code,
               circulation_dept_person_code,
               circulation_dept_person_name,
               circulation_dept_code,
               circulation_dept_name,
               circulation_explain,
               circulation_time,
               detail_id,
               is_myd_exception,
               dimension,
@@ -277,6 +296,33 @@
        <if test="reportDeptPersonCode != null  and reportDeptPersonCode != ''">
            and report_dept_person_code like concat('%', #{reportDeptPersonCode}, '%')
        </if>
        <if test="circulationDeptPersonCode != null  and circulationDeptPersonCode != ''">
            and circulation_dept_person_code like concat('%', #{circulationDeptPersonCode}, '%')
        </if>
        <if test="circulationDeptPersonName != null  and circulationDeptPersonName != ''">
            and circulation_dept_person_name like concat('%', #{circulationDeptPersonName}, '%')
        </if>
        <if test="circulationDeptCode != null  and circulationDeptCode != ''">
            and circulation_dept_code like concat('%', #{circulationDeptCode}, '%')
        </if>
        <if test="circulationDeptName != null  and circulationDeptName != ''">
            and circulation_dept_name like concat('%', #{circulationDeptName}, '%')
        </if>
        <if test="circulationExplain != null  and circulationExplain != ''">
            and circulation_explain like concat('%', #{circulationExplain}, '%')
        </if>
        <if test="circulationTime != null ">
            and circulation_time = #{circulationTime}
        </if>
        <if test="circulationStatus != null ">
            and circulation_status = #{circulationStatus}
        </if>
        <if test="circulationPersonName != null  and circulationPersonName != ''">
            and circulation_person_name like concat('%', #{circulationPersonName}, '%')
        </if>
        <if test="circulationPersonCode != null  and circulationPersonCode != ''">
            and circulation_person_code =#{circulationPersonCode}
        </if>
        <if test="pageSize != null  and pageNum != null">limit ${pageSize} OFFSET ${pageNum}</if>
    </select>
@@ -325,6 +371,33 @@
        </if>
        <if test="reportDeptPersonCode != null  and reportDeptPersonCode != ''">
            and report_dept_person_code like concat('%', #{reportDeptPersonCode}, '%')
        </if>
        <if test="circulationDeptPersonCode != null  and circulationDeptPersonCode != ''">
            and circulation_dept_person_code like concat('%', #{circulationDeptPersonCode}, '%')
        </if>
        <if test="circulationDeptPersonName != null  and circulationDeptPersonName != ''">
            and circulation_dept_person_name like concat('%', #{circulationDeptPersonName}, '%')
        </if>
        <if test="circulationDeptCode != null  and circulationDeptCode != ''">
            and circulation_dept_code like concat('%', #{circulationDeptCode}, '%')
        </if>
        <if test="circulationDeptName != null  and circulationDeptName != ''">
            and circulation_dept_name like concat('%', #{circulationDeptName}, '%')
        </if>
        <if test="circulationExplain != null  and circulationExplain != ''">
            and circulation_explain like concat('%', #{circulationExplain}, '%')
        </if>
        <if test="circulationTime != null ">
            and circulation_time = #{circulationTime}
        </if>
        <if test="circulationStatus != null ">
            and circulation_status = #{circulationStatus}
        </if>
        <if test="circulationPersonName != null  and circulationPersonName != ''">
            and circulation_person_name like concat('%', #{circulationPersonName}, '%')
        </if>
        <if test="circulationPersonCode != null  and circulationPersonCode != ''">
            and circulation_person_code =#{circulationPersonCode}
        </if>
    </select>
@@ -447,6 +520,31 @@
            </if>
            <if test="reportDeptPersonCode != null">report_dept_person_code,
            </if>
            <if test="circulationDeptPersonCode != null">circulation_dept_person_code,
            </if>
            <if test="circulationDeptPersonName != null">circulation_dept_person_name,
            </if>
            <if test="circulationDeptCode != null ">
                circulation_dept_code,
            </if>
            <if test="circulationDeptName != null">
                circulation_dept_name,
            </if>
            <if test="circulationExplain != null ">
                circulation_explain,
            </if>
            <if test="circulationTime != null ">
                circulation_time,
            </if>
            <if test="circulationStatus != null ">
                circulation_status,
            </if>
            <if test="circulationPersonName != null  and circulationPersonName != ''">
                circulation_person_name,
            </if>
            <if test="circulationPersonCode != null  and circulationPersonCode != ''">
                circulation_person_code,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="detailId != null">#{detailId},
@@ -556,6 +654,31 @@
            <if test="reportDeptPersonName != null">#{reportDeptPersonName},
            </if>
            <if test="reportDeptPersonCode != null">#{reportDeptPersonCode},
            </if>
            <if test="circulationDeptPersonCode != null">#{circulationDeptPersonCode},
            </if>
            <if test="circulationDeptPersonName != null">#{circulationDeptPersonName},
            </if>
            <if test="circulationDeptCode != null">
                #{circulationDeptCode},
            </if>
            <if test="circulationDeptName != null">
                #{circulationDeptName},
            </if>
            <if test="circulationExplain != null">
                #{circulationExplain},
            </if>
            <if test="circulationTime != null ">
                #{circulationTime},
            </if>
            <if test="circulationStatus != null ">
               #{circulationStatus},
            </if>
            <if test="circulationPersonName != null  and circulationPersonName != ''">
               #{circulationPersonName},
            </if>
            <if test="circulationPersonCode != null  and circulationPersonCode != ''">
              #{circulationPersonCode},
            </if>
        </trim>
    </insert>
@@ -725,6 +848,33 @@
            <if test="reportDeptPersonCode != null">report_dept_person_code =
                #{reportDeptPersonCode},
            </if>
            <if test="circulationDeptPersonCode != null">circulation_dept_person_code =
                #{circulationDeptPersonCode},
            </if>
            <if test="circulationDeptPersonName != null">circulation_dept_person_name =
                #{circulationDeptPersonName},
            </if>
            <if test="circulationDeptCode != null">circulation_dept_code =
                #{circulationDeptCode},
            </if>
            <if test="circulationDeptName != null">circulation_dept_name =
                #{circulationDeptName},
            </if>
            <if test="circulationExplain != null">circulation_explain =
                #{circulationExplain},
            </if>
            <if test="circulationTime != null">circulation_time =
                #{circulationTime},
            </if>
            <if test="circulationStatus != null ">
                circulation_status = #{circulationStatus},
            </if>
            <if test="circulationPersonName != null  and circulationPersonName != ''">
                circulation_person_name =#{circulationPersonName},
            </if>
            <if test="circulationPersonCode != null  and circulationPersonCode != ''">
                circulation_person_code =#{circulationPersonCode},
            </if>
        </trim>
        where id = #{id}
    </update>
smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml
@@ -358,6 +358,12 @@
                #{itemTaskId}
            </foreach>
        </if>
        <if test="operationItemIds != null and operationItemIds.size() > 0">
            AND operation_item_id IN
            <foreach collection="operationItemIds" item="operationItemIdItem" open="(" separator="," close=")">
                #{operationItemIdItem}
            </foreach>
        </if>
        <if test="templateid != null  and templateid != ''">and templateid = #{templateid}</if>
        <if test="templatename != null  and templatename != ''">and templatename like concat('%', #{templatename},
            '%')
@@ -373,6 +379,12 @@
        </if>
        <if test="endSendDateTime != null">
            AND date_format(visit_time,'%y%m%d') &lt;= date_format(#{endSendDateTime},'%y%m%d')
        </if>
        <if test="finishtimeStart != null">
            AND date_format(finishtime,'%y%m%d') &gt;= date_format(#{finishtimeStart},'%y%m%d')
        </if>
        <if test="finishtimeEnd != null">
            AND date_format(finishtime,'%y%m%d') &lt;= date_format(#{finishtimeEnd},'%y%m%d')
        </if>
        <if test="longSendTime != null">
            AND date_format(long_send_time,'%y%m%d') &lt;= date_format(#{longSendTime},'%y%m%d')
@@ -483,6 +495,7 @@
        <if test="libtemplatename != null ">and libtemplatename = #{libtemplatename}</if>
        <if test="openid != null ">and openid = #{openid}</if>
        <if test="sendstate != null ">and sendstate = #{sendstate}</if>
        <if test="operationItemId != null ">and operation_item_id = #{operationItemId}</if>
        <if test="drname != null  and drname != ''">and drname like concat('%', #{drname}, '%')</if>
        <if test="taskName != null  and taskName != ''">and task_name like concat('%', #{taskName}, '%')</if>
        <if test="drcode != null and drcode != ''">and (drcode = #{drcode}</if>
@@ -3043,6 +3056,9 @@
        t.taskid AS taskid,
        t.task_name AS taskName,
        d.asrtext AS optionresult,
        d.score AS score,
        d.targetvalue AS targetvalue,
        d.value_type AS valueType,
        COUNT(*) AS count,
        CONCAT(ROUND(COUNT(*) * 100.0 / t2.total_count, 2), '%') AS ratio
        FROM
@@ -3058,32 +3074,53 @@
        service_task t
        INNER JOIN service_subtask s ON s.taskid = t.taskid
        INNER JOIN service_subtask_detail d ON d.sub_id = s.id
        WHERE t.taskid IN
        <foreach collection="taskIds" item="taskId" open="(" separator="," close=")">
            #{taskId}
        </foreach>
        WHERE 1=1
        <if test="taskIds != null and taskIds.size() > 0">
            AND t.taskid IN
            <foreach collection="taskIds" item="taskId" open="(" separator="," close=")">
                #{taskId}
            </foreach>
        </if>
        <if test="valueType != null">AND d.value_type = #{valueType}</if>
        <if test="scoreStart != null">AND d.score &gt;= #{scoreStart}</if>
        <if test="scoreEnd != null">AND d.score &lt;= #{scoreEnd}</if>
        <if test="questiontext != null  and questiontext != ''">and d.questiontext like concat('%', #{questiontext},
            '%')
        </if>
        and s.sendstate=6
        and d.del_flag=0
        GROUP BY
        t.taskid,
        d.questiontext
        ) t2 ON t2.taskid = t.taskid AND t2.questiontext = d.questiontext
        WHERE t.taskid IN
        <foreach collection="taskIds" item="taskId" open="(" separator="," close=")">
            #{taskId}
        </foreach>
        WHERE 1=1
        <if test="taskIds != null and taskIds.size() > 0">
            AND t.taskid IN
            <foreach collection="taskIds" item="taskId" open="(" separator="," close=")">
                #{taskId}
            </foreach>
        </if>
        <if test="valueType != null">AND d.value_type = #{valueType}</if>
        <if test="scoreStart != null">AND d.score &gt;= #{scoreStart}</if>
        <if test="scoreEnd != null">AND d.score &lt;= #{scoreEnd}</if>
        <if test="questiontext != null  and questiontext != ''">and d.questiontext like concat('%', #{questiontext},
            '%')
        </if>
        AND s.sendstate = 6
        and d.del_flag=0
      <if test="startOutHospTime != null">
        AND date_format(s.endtime,'%y%m%d') &gt;= date_format(#{startOutHospTime},'%y%m%d')
    </if>
        <if test="startOutHospTime != null">
            AND date_format(s.endtime,'%y%m%d') &gt;= date_format(#{startOutHospTime},'%y%m%d')
        </if>
        <if test="endOutHospTime != null">
            AND date_format(s.endtime,'%y%m%d') &lt;= date_format(#{endOutHospTime},'%y%m%d')
        </if>
        GROUP BY
        t.taskid,
        d.questiontext,
        d.asrtext
        d.score,
        d.targetvalue,
        d.asrtext,
        d.value_type
        ORDER BY
        d.questiontext,
        t.taskid
@@ -3096,6 +3133,9 @@
        t.taskid AS taskid,
        t.task_name AS taskName,
        d.asrtext AS optionresult,
        d.score AS score,
        d.targetvalue AS targetvalue,
        d.value_type AS valueType,
        COUNT(*) AS count,
        CONCAT(ROUND(COUNT(*) * 100.0 / t2.total_count, 2), '%') AS ratio
        FROM
@@ -3110,20 +3150,34 @@
            service_task t
            INNER JOIN service_subtask s ON s.taskid = t.taskid
            INNER JOIN service_subtask_detail d ON d.sub_id = s.id
            WHERE s.id IN
            WHERE 1=1
            <if test="subtaskIds != null and subtaskIds.size() > 0">
            AND s.id IN
            <foreach collection="subtaskIds" item="subtaskId" open="(" separator="," close=")">
                #{subtaskId}
            </foreach>
            </if>
        <if test="valueType != null">AND d.value_type &gt;= #{valueType}</if>
        <if test="scoreStart != null">AND d.score = #{scoreStart}</if>
        <if test="scoreEnd != null">AND d.score &lt;= #{scoreEnd}</if>
        <if test="questiontext != null  and questiontext != ''">and d.questiontext like concat('%', #{questiontext}, '%')</if>
            AND s.sendstate = 6
            AND d.del_flag=0
            GROUP BY d.questiontext  -- â† å…³é”®ä¿®æ”¹ï¼šæŒ‰é¢˜ç›®åˆ†ç»„统计每个题目的总数
        ) t2 ON t2.questiontext = d.questiontext  -- â† å…³è”到当前题目
        WHERE s.id IN
            GROUP BY d.questiontext
        ) t2 ON t2.questiontext = d.questiontext
        WHERE 1=1
        <if test="subtaskIds != null and subtaskIds.size() > 0">
        AND s.id IN
        <foreach collection="subtaskIds" item="subtaskId" open="(" separator="," close=")">
            #{subtaskId}
        </foreach>
        </if>
        AND s.sendstate = 6
        AND d.del_flag=0
        <if test="valueType != null">AND d.value_type &gt;= #{valueType}</if>
        <if test="scoreStart != null">AND d.score &gt;= #{scoreStart}</if>
        <if test="scoreEnd != null">AND d.score &lt;= #{scoreEnd}</if>
        <if test="questiontext != null  and questiontext != ''">and d.questiontext like concat('%', #{questiontext}, '%')</if>
      <if test="startOutHospTime != null">
        AND date_format(s.endtime,'%y%m%d') &gt;= date_format(#{startOutHospTime},'%y%m%d')
    </if>
@@ -3133,6 +3187,8 @@
        GROUP BY
        t.taskid,
        d.questiontext,
        d.score,
        d.targetvalue,
        d.asrtext
        ORDER BY
        d.questiontext,
smartor/src/main/resources/mapper/smartor/SvyLibTemplateScriptMapper.xml
@@ -56,6 +56,8 @@
        <result property="reportDeptPersonName" column="report_dept_person_code"/>
        <result property="isMydException" column="is_myd_exception"/>
        <result property="dimension" column="dimension"/>
        <result property="circulationDeptPersonCode" column="circulation_dept_person_code"/>
        <result property="circulationDeptPersonName" column="circulation_dept_person_name"/>
    </resultMap>
@@ -108,6 +110,7 @@
               script_picture,
               script_topic,
               isavailable, language, otherdata, value_type, reply, scoretype
                , circulation_dept_person_code, circulation_dept_person_name
        from svy_lib_template_script
    </sql>
@@ -192,6 +195,14 @@
            #{reportDeptPersonCode},
            '%')
        </if>
        <if test="circulationDeptPersonCode != null  and circulationDeptPersonCode != ''">and circulation_dept_person_code like concat('%',
            #{circulationDeptPersonCode},
            '%')
        </if>
        <if test="circulationDeptPersonName != null  and circulationDeptPersonName != ''">and circulation_dept_person_name like concat('%',
            #{circulationDeptPersonName},
            '%')
        </if>
        <if test="pageSize != null  and pageNum != null">limit ${pageSize} OFFSET ${pageNum}</if>
    </select>
@@ -218,6 +229,14 @@
            </if>
            <if test="reportDeptPersonCode != null  and reportDeptPersonCode != ''">and report_dept_person_code like concat('%',
                #{reportDeptPersonCode},
                '%')
            </if>
            <if test="circulationDeptPersonCode != null  and circulationDeptPersonCode != ''">and circulation_dept_person_code like concat('%',
                #{circulationDeptPersonCode},
                '%')
            </if>
            <if test="circulationDeptPersonName != null  and circulationDeptPersonName != ''">and circulation_dept_person_name like concat('%',
                #{circulationDeptPersonName},
                '%')
            </if>
            <if test="dimensionList == null ">and dimension IS NOT NULL </if>
@@ -284,6 +303,8 @@
            <if test="dutyDeptPersonCode != null  and dutyDeptPersonCode != ''">duty_dept_person_code,</if>
            <if test="reportDeptPersonName != null  and reportDeptPersonName != ''">report_dept_person_name,</if>
            <if test="reportDeptPersonCode != null  and reportDeptPersonCode != ''">report_dept_person_code,</if>
            <if test="circulationDeptPersonCode != null  and circulationDeptPersonCode != ''">circulation_dept_person_code,</if>
            <if test="circulationDeptPersonName != null  and circulationDeptPersonName != ''">circulation_dept_person_name,</if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="nextScriptno != null">#{nextScriptno},</if>
@@ -337,6 +358,8 @@
            <if test="dutyDeptPersonCode != null  and dutyDeptPersonCode != ''">#{dutyDeptPersonCode},</if>
            <if test="reportDeptPersonName != null  and reportDeptPersonName != ''">#{reportDeptPersonName},</if>
            <if test="reportDeptPersonCode != null  and reportDeptPersonCode != ''">#{reportDeptPersonCode},</if>
            <if test="circulationDeptPersonCode != null  and circulationDeptPersonCode != ''">#{circulationDeptPersonCode},</if>
            <if test="circulationDeptPersonName != null  and circulationDeptPersonName != ''">#{circulationDeptPersonName},</if>
        </trim>
    </insert>
@@ -396,6 +419,8 @@
            <if test="dutyDeptPersonCode != null  and dutyDeptPersonCode != ''">duty_dept_person_code = #{dutyDeptPersonCode},</if>
            <if test="reportDeptPersonName != null  and reportDeptPersonName != ''">report_dept_person_name = #{reportDeptPersonName},</if>
            <if test="reportDeptPersonCode != null  and reportDeptPersonCode != ''">report_dept_person_code = #{reportDeptPersonCode},</if>
            <if test="circulationDeptPersonName != null  and circulationDeptPersonName != ''">circulation_dept_person_name = #{circulationDeptPersonName},</if>
            <if test="circulationDeptPersonCode != null  and circulationDeptPersonCode != ''">circulation_dept_person_code = #{circulationDeptPersonCode},</if>
        </trim>
        where id = #{id}
    </update>
smartor/src/main/resources/mapper/smartor/SvyTaskTemplateScriptMapper.xml
@@ -55,6 +55,8 @@
        <result property="reportDeptPersonName" column="report_dept_person_code"/>
        <result property="isMydException" column="is_myd_exception"/>
        <result property="dimension" column="dimension"/>
        <result property="circulationDeptPersonCode" column="circulation_dept_person_code"/>
        <result property="circulationDeptPersonName" column="circulation_dept_person_name"/>
    </resultMap>
    <sql id="selectSvyTaskTemplateScriptVo">
@@ -82,6 +84,7 @@
               scriptid,
               script_topic, language, categoryName, script_content, is_must, del_flag, update_by, update_time, create_by, create_time, isupload, upload_time, orgid, pid, guid, value_type, targetoptions, script_type, targetid, targetvalue, next_scriptno, script_result, otherdata, picture_path
                , duty_dept_person_name, duty_dept_person_code, report_dept_person_name, report_dept_person_code
                 , circulation_dept_person_code, circulation_dept_person_name
        from svy_task_template_script
    </sql>
@@ -152,6 +155,12 @@
            <if test="reportDeptPersonCode != null  and reportDeptPersonCode != ''">and report_dept_person_code like concat('%', #{reportDeptPersonCode},
                '%')
            </if>
            <if test="circulationDeptPersonCode != null  and circulationDeptPersonCode != ''">and circulation_dept_person_code like concat('%', #{circulationDeptPersonCode},
                '%')
            </if>
            <if test="circulationDeptPersonName != null  and circulationDeptPersonName != ''">and circulation_dept_person_name like concat('%', #{circulationDeptPersonName},
                '%')
            </if>
    </select>
    <select id="selectSvyTaskTemplateScriptByID" parameterType="Long" resultMap="SvyTaskTemplateScriptResult">
@@ -212,6 +221,8 @@
            <if test="dutyDeptPersonCode != null  and dutyDeptPersonCode != ''">duty_dept_person_code,</if>
            <if test="reportDeptPersonName != null  and reportDeptPersonName != ''">report_dept_person_name,</if>
            <if test="reportDeptPersonCode != null  and reportDeptPersonCode != ''">report_dept_person_code,</if>
            <if test="circulationDeptPersonCode != null  and circulationDeptPersonCode != ''">circulation_dept_person_code,</if>
            <if test="circulationDeptPersonName != null  and circulationDeptPersonName != ''">circulation_dept_person_name,</if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="taskid != null">#{taskid},</if>
@@ -263,6 +274,8 @@
            <if test="dutyDeptPersonCode != null  and dutyDeptPersonCode != ''">#{dutyDeptPersonCode},</if>
            <if test="reportDeptPersonName != null  and reportDeptPersonName != ''">#{reportDeptPersonName},</if>
            <if test="reportDeptPersonCode != null  and reportDeptPersonCode != ''">#{reportDeptPersonCode},</if>
            <if test="circulationDeptPersonCode != null  and circulationDeptPersonCode != ''">#{circulationDeptPersonCode},</if>
            <if test="circulationDeptPersonName != null  and circulationDeptPersonName != ''">#{circulationDeptPersonName},</if>
        </trim>
    </insert>
@@ -320,6 +333,8 @@
            <if test="dutyDeptPersonCode != null  and dutyDeptPersonCode != ''">duty_dept_person_code = #{dutyDeptPersonCode},</if>
            <if test="reportDeptPersonName != null  and reportDeptPersonName != ''">report_dept_person_name = #{reportDeptPersonName},</if>
            <if test="reportDeptPersonCode != null  and reportDeptPersonCode != ''">report_dept_person_code = #{reportDeptPersonCode},</if>
            <if test="circulationDeptPersonName != null  and circulationDeptPersonName != ''">circulation_dept_person_name = #{circulationDeptPersonName},</if>
            <if test="circulationDeptPersonCode != null  and circulationDeptPersonCode != ''">circulation_dept_person_code = #{circulationDeptPersonCode},</if>
        </trim>
        where id = #{d}
    </update>