liusheng
7 天以前 24166f2d9ae0bb72f061a38b96a113b1b6e44fbc
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
@@ -9,6 +9,7 @@
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.*;
import com.smartor.common.FtpService;
import com.smartor.common.RandomStringGenerator;
import com.smartor.common.SendService;
import com.smartor.config.PhoneUtils;
import com.smartor.domain.*;
@@ -58,9 +59,6 @@
    private IServiceTaskService serviceTaskService;
    @Autowired
    private IvrTaskTemplateTargetoptionMapper serviceTaskScriptTargetoptionMapper;
    @Autowired
    private IvrTaskVisitResultMapper serviceTaskVisitResultMapper;
    @Autowired
@@ -74,12 +72,18 @@
    @Autowired
    private IIvrTaskTemplateService ivrTaskTemplateService;
    @Autowired
    private IIvrTaskTemplateScriptService iIvrTaskTemplateScriptService;
    @Autowired
    private IvrTaskTemplateTargetoptionMapper serviceTaskScriptTargetoptionMapper;
    @Autowired
    private ISvyTaskTemplateService svyTaskTemplateService;
    @Autowired
    private IIvrTaskTemplateScriptService iIvrTaskTemplateScriptService;
    private ISvyLibTemplateScriptService svyLibTemplateScriptService;
    @Autowired
    private ISvyLibTemplateTargetoptionService svyLibTemplateTargetoptionService;
    @Autowired
    private IServiceOutPathService iServiceOutPathService;
@@ -98,9 +102,6 @@
    @Value("${ASRCallBackPath}")
    private String ASRCallBackPath;
    @Autowired
    private SendService sendService;
    @Value("${hangup}")
    private String hangup;
@@ -125,6 +126,7 @@
    @Value("${phoneUpEveryHour}")
    private Integer phoneUpEveryHour;
    @Value("${phoneEndHour}")
    private Integer phoneEndHour;
@@ -251,9 +253,36 @@
    @Override
    public List<ServiceSubtask> patItem(ServiceSubtaskVO serviceSubtaskVO) {
        List<ServiceSubtask> selectServiceSubtaskList = this.selectServiceSubtaskList(serviceSubtaskVO);
        //根据出院 时间倒序
//        List<ServiceSubtask> sortedServiceSubtaskList = selectServiceSubtaskList.stream().sorted(Comparator.comparing(ServiceSubtask::getEndtime).reversed()).collect(Collectors.toList());
        return selectServiceSubtaskList;
        List<ServiceSubtask> serviceSubtaskList = new ArrayList<>();
        //获取分数
        for (ServiceSubtask serviceSubtask : selectServiceSubtaskList) {
            //计算患者的分数
            if (serviceSubtask.getScore() == null || BigDecimal.ZERO.equals(serviceSubtask.getScore())) {
                //如果为空的话,去detail里拿到每个题的选项分,如果是作答题,直接拿题目分(前题,该模板是分数类型)
                Map<String, Object> map = getScore(serviceSubtask, serviceSubtaskVO.getDetailResult());
                serviceSubtask.setScore((BigDecimal) map.get("score"));
                serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                if ((Boolean) map.get("isExist") == true) {
                    //测试完删除(应付测试用的)
                    serviceSubtaskList.add(serviceSubtask);
                }
            } else {
                //测试完删除(应付测试用的)
                if (!StringUtils.isEmpty(serviceSubtaskVO.getDetailResult())) {
                    ServiceSubtaskDetail serviceSubtaskDetail = new ServiceSubtaskDetail();
                    serviceSubtaskDetail.setSubId(serviceSubtask.getId());
                    List<ServiceSubtaskDetail> serviceSubtaskDetails = serviceSubtaskDetailMapper.selectServiceSubtaskDetailList(serviceSubtaskDetail);
                    for (ServiceSubtaskDetail ssd : serviceSubtaskDetails) {
                        if (ssd.getAsrtext().equals(serviceSubtaskVO.getDetailResult())) {
                            serviceSubtaskList.add(serviceSubtask);
                        }
                    }
                }else {
                    serviceSubtaskList.add(serviceSubtask);
                }
            }
        }
        return serviceSubtaskList;
    }
    @Override
@@ -269,6 +298,7 @@
    @Override
    public Map<String, Object> patItemCount(ServiceSubtaskVO serviceSubtaskVO) {
        serviceSubtaskVO.setSendstate(null);
        serviceSubtaskVO.setPageSize(99999999);
        serviceSubtaskVO.setPageNum(1);
        List<ServiceSubtask> selectServiceSubtaskList = this.selectServiceSubtaskList(serviceSubtaskVO);
@@ -278,18 +308,15 @@
        Integer yc = 0;
        Integer fssb = 0;
        Integer yfs = 0;
        Integer xj = 0;
        Integer dfs = 0;
        Integer ywc = 0;
        Integer ywc2 = 0;
        Integer blq = 0;
        Integer dsf = 0;
        for (ServiceSubtask serviceSubtask : selectServiceSubtaskList) {
            if (serviceSubtask.getSendstate() == 4L) wzx = wzx + 1;
            else if (serviceSubtask.getSendstate() != 4L) ysf = ysf + 1;
            if (serviceSubtask.getSendstate() == 5L) fssb = fssb + 1;
            if (serviceSubtask.getSendstate() == 3L) yfs = yfs + 1;
            if (serviceSubtask.getSendstate() == 1L) xj = xj + 1;
            if (serviceSubtask.getSendstate() == 2L) dfs = dfs + 1;
            if (serviceSubtask.getSendstate() == 6L) ywc = ywc + 1;
            if (serviceSubtask.getSendstate() >= 3L || serviceSubtask.getSendstate() == 1L) yfs = yfs + 1;
            if (serviceSubtask.getSendstate() == 2L) dsf = dsf + 1;
            if (serviceSubtask.getSendstate() == 1L) blq = blq + 1;
            if (StringUtils.isNotEmpty(serviceSubtask.getExcep()) && serviceSubtask.getExcep().equals("1")) yc = yc + 1;
        }
        map.put("wzx", wzx);
@@ -297,10 +324,9 @@
        map.put("yc", yc);
        map.put("fssb", fssb);
        map.put("yfs", yfs);
        map.put("xj", xj);
        map.put("dfs", dfs);
        map.put("ywc", ywc);
        map.put("yfs2", yfs + ywc);
        map.put("blq", blq);
        map.put("dsf", dsf);
        return map;
    }
@@ -444,6 +470,19 @@
                return map;
            }
            //获取随访时间
            Date visitTime = null;
            List<TaskSendTimeVO> sendTimeslot = serviceTaskVO.getSendTimeslot();
            if (CollectionUtils.isNotEmpty(sendTimeslot) && sendTimeslot.size() > 0) {
                String dateString = sendTimeslot.get(0).getBegantime();
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                try {
                    visitTime = format.parse(dateString);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            //将任务信息放到服务表中
            ServiceSubtask serviceSubtask = DtoConversionUtils.sourceToTarget(serviceTaskVO, ServiceSubtask.class);
            serviceSubtask.setTaskid(serviceTask.getTaskid().longValue());
@@ -455,13 +494,12 @@
                    //将任务信息新增到随访服务表中
                    serviceSubtask.setSendname(patTaskRelevance.getName());
                    serviceSubtask.setAge(patTaskRelevance.getAge());
//                    serviceSubtask.setLibtemplateid(Long.valueOf(serviceTask.getLibtemplateid()));
                    serviceSubtask.setSfzh(patTaskRelevance.getIdcardno());
                    serviceSubtask.setPhone(patTaskRelevance.getTelcode());
                    serviceSubtask.setAddr(patTaskRelevance.getAddr());
                    serviceSubtask.setPatid(patTaskRelevance.getPatid());
                    serviceSubtask.setCreateTime(DateUtils.getNowDate());
                    serviceSubtask.setSendstate(1L);
                    serviceSubtask.setSendstate(2L);
                    if (serviceTaskVO.getLongTask() != null && serviceTaskVO.getLongTask() == 1)
                        serviceSubtask.setSendstate(2L);
                    serviceSubtask.setDeptcode(patTaskRelevance.getDeptCode());
@@ -477,12 +515,22 @@
                    serviceSubtask.setEndtime(patTaskRelevance.getEndtime());
                    serviceSubtask.setNurseId(patTaskRelevance.getNurseId());
                    serviceSubtask.setNurseName(patTaskRelevance.getNurseName());
                    serviceSubtask.setVisitTime(patTaskRelevance.getVisitTime());
                    serviceSubtask.setVisitTime(visitTime);
                    if (serviceTask.getSendType() == 2) {
                        serviceSubtask.setVisitTime(new Date());
                    }
                    if (serviceTaskVO.getLongTask() != null && serviceTaskVO.getLongTask() == 1)
                        serviceSubtask.setLongSendTime(patTaskRelevance.getLongSendTime());
                    //生成外链地址
                    String outPath = null;
                    if (serviceTaskVO.getType().equals("1"))
                        outPath = getOutPath(serviceSubtask.getPhone(), serviceSubtask.getTaskid(), serviceSubtask.getTaskName(), serviceSubtask.getPatid(), 1);
                    else if (serviceTaskVO.getType().equals("2"))
                        outPath = getOutPath(serviceSubtask.getPhone(), serviceSubtask.getTaskid(), serviceSubtask.getTaskName(), serviceSubtask.getPatid(), 2);
                    else if (serviceTaskVO.getType().equals("3"))
                        outPath = getOutPath(serviceSubtask.getPhone(), serviceSubtask.getTaskid(), serviceSubtask.getTaskName(), serviceSubtask.getPatid(), 3);
                    serviceSubtask.setOutPath(outPath);
                    serviceSubtaskMapper.insertServiceSubtask(serviceSubtask);
                    serviceSubtask.getId().intValue();
                }
@@ -597,11 +645,20 @@
                    serviceSubtask.setNurseName(patTaskRelevance.getNurseName());
                    serviceSubtask.setVisitTime(patTaskRelevance.getVisitTime());
                    serviceSubtask.setTextParam(new Gson().toJson(serviceTaskVO.getTextParam()));
                    //生成外链地址
                    String outPath = null;
                    if (serviceTaskVO.getType().equals("1"))
                        outPath = getOutPath(serviceSubtask.getPhone(), serviceSubtask.getTaskid(), serviceSubtask.getTaskName(), serviceSubtask.getPatid(), 1);
                    else if (serviceTaskVO.getType().equals("2"))
                        outPath = getOutPath(serviceSubtask.getPhone(), serviceSubtask.getTaskid(), serviceSubtask.getTaskName(), serviceSubtask.getPatid(), 2);
                    else if (serviceTaskVO.getType().equals("3"))
                        outPath = getOutPath(serviceSubtask.getPhone(), serviceSubtask.getTaskid(), serviceSubtask.getTaskName(), serviceSubtask.getPatid(), 3);
                    if (patTaskRelevance.getIsoperation() != null) {
                        if (patTaskRelevance.getIsoperation() == 2) serviceSubtask.setUpdateTime(new Date());
                        serviceSubtaskMapper.updateServiceSubtaskByCondition(serviceSubtask);
                        if (patTaskRelevance.getIsoperation() == 1) {
                            serviceSubtask.setSendstate(1L);
                            serviceSubtask.setSendstate(2L);
                            serviceSubtask.setCreateTime(new Date());
                            serviceSubtaskMapper.insertServiceSubtask(serviceSubtask);
                        }
@@ -1970,6 +2027,38 @@
        return serviceSubtaskStatistics;
    }
    /**
     * 服务统计查询 - 按时间维度统计出院/门诊随访数据
     *
     * @param request 统计请求参数
     * @return 统计结果列表
     */
    @Override
    public List<ServiceStatisticsResponse> getServiceStatistics(ServiceStatisticsRequest request) {
        log.info("getServiceStatistics的入参为:{}", request);
        // 参数校验
        if (request.getStartDate() == null || request.getEndDate() == null) {
            throw new IllegalArgumentException("开始日期和结束日期不能为空");
        }
        if (request.getStartDate().after(request.getEndDate())) {
            throw new IllegalArgumentException("开始日期不能晚于结束日期");
        }
        // 如果timeType为空,默认按天统计
        if (com.ruoyi.common.utils.StringUtils.isEmpty(request.getTimeType())) {
            request.setTimeType("day");
        }
        List<ServiceStatisticsResponse> result = serviceSubtaskMapper.getServiceStatistics(request);
        log.info("getServiceStatistics返回结果数量:{}", result.size());
        return result;
    }
    private ServiceSubtaskStatistic getStatistic(List<ServiceSubtask> serviceSubtaskList) {
        log.error("-------------serviceSubtaskList的值为:{}", serviceSubtaskList);
        ServiceSubtaskStatistic serviceSubtaskStatistic = new ServiceSubtaskStatistic();
@@ -2133,4 +2222,172 @@
        int remainingCalls = (int) (remainingHours * phoneUpEveryHour);
        return remainingCalls;
    }
    private String getOutPath(String phone, Long tid, String taskName, Long pId, Integer type) {
        //对url中两个参数加密
        RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample();
        String taskId = rsaPublicKeyExample.encryptedData(tid.toString(), pub_key);
        String outpath = null;
        try {
            String patid = rsaPublicKeyExample.encryptedData(pId.toString(), pub_key);
            SendMagParam sendMagParam = new SendMagParam();
            sendMagParam.setType("4");
            if (type == 1) {
                //随访
                ServiceOutPath serviceOutPath = new ServiceOutPath();
                serviceOutPath.setParam1(taskId);
                serviceOutPath.setParam2(patid);
                serviceOutPath.setCreateTime(new Date());
                serviceOutPath.setType(1);
                iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                //转成16进制
                String format = String.format("%03X", serviceOutPath.getId()) + RandomStringGenerator.generateRandomString();
                serviceOutPath.setRadix(format);
                outpath = localIP + ":" + req_path + "/sf?p=" + format;
                serviceOutPath.setUpdateTime(new Date());
                iServiceOutPathService.updateServiceOutPath(serviceOutPath);
                sendMagParam.setPhone(phone);
                sendMagParam.setUrl(outpath);
                sendMagParam.setContent("您好,邀请您填写出院随访调查表,请点击" + sendMagParam.getUrl() + "   填写。感谢您配合!");
            } else if (type == 2) {
                //问券(问题)
                ServiceOutPath serviceOutPath = new ServiceOutPath();
                serviceOutPath.setParam1(taskId);
                serviceOutPath.setParam2(patid);
                serviceOutPath.setParam3(taskName);
                serviceOutPath.setCreateTime(new Date());
                serviceOutPath.setType(2);
                iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                String format = String.format("%03X", serviceOutPath.getId()) + RandomStringGenerator.generateRandomString();
                serviceOutPath.setRadix(format);
                serviceOutPath.setUpdateTime(new Date());
                outpath = localIP + ":" + req_path + "/wt?p=" + format;
                iServiceOutPathService.updateServiceOutPath(serviceOutPath);
//                                sendMagParam.setUrl(ip + ":" + req_path + "/outsideChainwt?param1=" + taskId + "&param2=" + patid + "&param3=" + URLEncoder.encode(ivrTask1.getTaskName(), StandardCharsets.UTF_8.toString()) + "&param5=false");
                sendMagParam.setPhone(phone);
                sendMagParam.setUrl(outpath);
                sendMagParam.setContent("您好,邀请您填写出院调查表,请点击" + sendMagParam.getUrl() + "   填写。感谢您配合!");
                log.info("您好,邀请您填写出院调查表,请点击,{}", sendMagParam.getUrl());
            } else if (type == 3) {
                //宣教
                ServiceOutPath serviceOutPath = new ServiceOutPath();
                serviceOutPath.setParam1(taskId);
                serviceOutPath.setParam2(patid);
                serviceOutPath.setParam3(taskName);
                serviceOutPath.setCreateTime(new Date());
                serviceOutPath.setType(3);
                iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                String format = String.format("%03X", serviceOutPath.getId()) + RandomStringGenerator.generateRandomString();
                serviceOutPath.setRadix(format);
                serviceOutPath.setUpdateTime(new Date());
                outpath = localIP + ":" + req_path + "/xj?p=" + format;
                iServiceOutPathService.updateServiceOutPath(serviceOutPath);
                sendMagParam.setPhone(phone);
                sendMagParam.setUrl(outpath);
                sendMagParam.setContent("您好,邀请您填写出院宣教调查表,请点击" + sendMagParam.getUrl() + "查看。感谢您配合!");
                log.info("-----------sendMagParam的值为:{}", sendMagParam);
            }
        } catch (Exception e) {
            log.error("生成失败了:{}", e.getMessage());
        }
        return outpath;
    }
    private Map<String, Object> getScore(ServiceSubtask serviceSubtask, String detailResult) {
        Map<String, Object> map = new HashMap<>();
        Boolean isExist = false;
        //统计总分
        BigDecimal bigDecimal = BigDecimal.ZERO;
        if (serviceSubtask.getScore() != null && !BigDecimal.ZERO.equals(serviceSubtask.getScore())) {
            //如果有分数,直接返回
            map.put("score", serviceSubtask.getScore());
            //isExist应付测试用的,测试完后删除
            map.put("isExist", true);
            return map;
        }
        if (serviceSubtask.getScore() == null || BigDecimal.ZERO.equals(serviceSubtask.getScore())) {
            //如果为空的话,去detail里拿到每个题的选项分,如果是作答题,直接拿题目分(前题,该模板是分数类型)
            ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
            if (serviceTask.getType().equals("1")) {
                //如果是机器人语音
                IvrTaskTemplate ivrTaskTemplate = ivrTaskTemplateService.selectIvrTaskTemplateByID(serviceTask.getTemplateid());
                //判断是不是评分
                if (StringUtils.isNotEmpty(ivrTaskTemplate.getScoreType()) && ivrTaskTemplate.getScoreType().equals("1")) {
                    ServiceSubtaskDetail serviceSubtaskDetail = new ServiceSubtaskDetail();
                    serviceSubtaskDetail.setSubId(serviceSubtask.getId());
                    List<ServiceSubtaskDetail> serviceSubtaskDetailList = serviceSubtaskDetailMapper.selectServiceSubtaskDetailList(serviceSubtaskDetail);
                    for (ServiceSubtaskDetail serviceSubtaskDetail1 : serviceSubtaskDetailList) {
                        Long scriptid = serviceSubtaskDetail1.getScriptid();
                        IvrTaskTemplateScript ivrTaskTemplateScript = iIvrTaskTemplateScriptService.selectIvrTaskTemplateScriptByID(scriptid);
                        if (StringUtils.isNotEmpty(ivrTaskTemplateScript.getScriptType())) {
                            if (ivrTaskTemplateScript.getScriptType().equals("3") || ivrTaskTemplateScript.getScriptType().equals("4")) {
                                if (StringUtils.isNotEmpty(serviceSubtaskDetail1.getAsrtext())) {
                                    //不是选择题,直接拿题目分
                                    bigDecimal = bigDecimal.add(ivrTaskTemplateScript.getScore());
                                }
                            } else if (ivrTaskTemplateScript.getScriptType().equals("1") || ivrTaskTemplateScript.getScriptType().equals("2")) {
                                IvrTaskTemplateTargetoption ivrTaskTemplateTargetoption = new IvrTaskTemplateTargetoption();
                                ivrTaskTemplateTargetoption.setScriptid(scriptid);
                                List<IvrTaskTemplateTargetoption> ivrTaskTemplateTargetoptions = serviceTaskScriptTargetoptionMapper.selectIvrTaskTemplateTargetoptionList(ivrTaskTemplateTargetoption);
                                //获取选项,用选中的值去选项里匹配,拿到选项分
                                for (IvrTaskTemplateTargetoption ivrTaskTemplateTargetoption1 : ivrTaskTemplateTargetoptions) {
                                    if (ivrTaskTemplateTargetoption1.getTargetvalue().equals(serviceSubtaskDetail1.getMatchedtext())) {
                                        bigDecimal = bigDecimal.add(ivrTaskTemplateTargetoption1.getScore());
                                        //测试完删除
                                        if (StringUtils.isEmpty(detailResult) || ivrTaskTemplateTargetoption1.getTargetvalue().equals(detailResult)) {
                                            isExist = true;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            if (serviceTask.getType().equals("2")) {
                //如果是问卷
                SvyTaskTemplate svyTaskTemplate = svyTaskTemplateService.selectSvyTaskTemplateBySvyid(serviceTask.getTemplateid());
                //判断是不是评分
                if (StringUtils.isNotEmpty(svyTaskTemplate.getScoreType()) && svyTaskTemplate.getScoreType().equals("1")) {
                    ServiceSubtaskDetail serviceSubtaskDetail = new ServiceSubtaskDetail();
                    serviceSubtaskDetail.setSubId(serviceSubtask.getId());
                    List<ServiceSubtaskDetail> serviceSubtaskDetailList = serviceSubtaskDetailMapper.selectServiceSubtaskDetailList(serviceSubtaskDetail);
                    for (ServiceSubtaskDetail serviceSubtaskDetail1 : serviceSubtaskDetailList) {
                        Long scriptid = serviceSubtaskDetail1.getScriptid();
                        SvyLibTemplateScript svyLibTemplateScript = svyLibTemplateScriptService.selectSvyLibTemplateScriptByTopicid(scriptid);
                        if (StringUtils.isNotEmpty(svyLibTemplateScript.getScriptType())) {
                            if (svyLibTemplateScript.getScriptType().equals("3") || svyLibTemplateScript.getScriptType().equals("4")) {
                                if (StringUtils.isNotEmpty(serviceSubtaskDetail1.getAsrtext())) {
                                    //不是选择题,直接拿题目分
                                    bigDecimal = bigDecimal.add(svyLibTemplateScript.getScore());
                                }
                            } else if (svyLibTemplateScript.getScriptType().equals("1") || svyLibTemplateScript.getScriptType().equals("2")) {
                                SvyLibTemplateTargetoption svyLibTemplateTargetoption = new SvyLibTemplateTargetoption();
                                svyLibTemplateTargetoption.setScriptid(scriptid);
                                List<SvyLibTemplateTargetoption> svyLibTemplateTargetoptions = svyLibTemplateTargetoptionService.selectSvyLibTemplateTargetoptionList(svyLibTemplateTargetoption);
                                //获取选项,用选中的值去选项里匹配,拿到选项分
                                for (SvyLibTemplateTargetoption svyLibTemplateTargetoption1 : svyLibTemplateTargetoptions) {
                                    if (svyLibTemplateTargetoption1.getOptioncontent().equals(serviceSubtaskDetail1.getAsrtext())) {
                                        bigDecimal = bigDecimal.add(svyLibTemplateTargetoption1.getScore());
                                        //测试完删除
                                        if (StringUtils.isEmpty(detailResult) || svyLibTemplateTargetoption1.getOptioncontent().equals(detailResult)) {
                                            isExist = true;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        map.put("score", bigDecimal);
        map.put("isExist", isExist);
        return map;
    }
}