package com.smartor.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.core.service.IConfigService;
import com.ruoyi.satisfaction.api.SatisfactionFacade;
import com.ruoyi.message.sms.provider.sltd.ws.MessageSend;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.*;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.message.SendResult;
import com.ruoyi.message.sms.SmsSendRequest;
import com.ruoyi.message.sms.SmsSenderFactory;
import com.ruoyi.message.wechat.WechatSendRequest;
import com.ruoyi.message.wechat.WechatSenderFactory;
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.mapper.SysConfigMapper;
import com.ruoyi.system.service.ISysConfigService;
import com.smartor.common.FtpService;
import com.smartor.common.ScheduleSubtaskBuilder;
import com.ruoyi.common.utils.PhoneUtils;
import com.smartor.domain.DTO.*;
import com.smartor.domain.*;
import com.smartor.domain.VO.*;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.mapper.*;
import com.smartor.service.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import com.ruoyi.template.domain.VO.HeLibraryCountVO;
import com.ruoyi.inhospvisit.domain.PatMedInhosp;
import com.ruoyi.othervisit.domain.PatMedOperationItem;
import com.ruoyi.outpatientvisit.domain.PatMedOuthosp;
import com.ruoyi.outpatientvisit.domain.PatMedOuthospQueryReq;
import com.ruoyi.inhospvisit.api.InhospVisitFacade;
import com.ruoyi.outpatientvisit.api.OuthospDataFacade;
import com.ruoyi.othervisit.api.OtherVisitFacade;
import com.ruoyi.template.domain.IvrTaskTemplate;
import com.ruoyi.template.domain.IvrTaskTemplateScript;
import com.ruoyi.template.domain.IvrTaskTemplateScriptVO;
import com.ruoyi.template.domain.IvrTaskTemplateTargetoption;
import com.ruoyi.template.domain.IvrTaskTemplateVO;
import com.smartor.domain.IvrTaskVisitResult;
import com.ruoyi.template.mapper.IvrTaskTemplateTargetoptionMapper;
import com.smartor.mapper.IvrTaskVisitResultMapper;
import com.ruoyi.template.service.IIvrTaskTemplateScriptService;
import com.ruoyi.template.service.IIvrTaskTemplateService;
import com.ruoyi.template.service.IIvrTaskTemplateTargetoptionService;
import com.ruoyi.template.domain.IvrLibaExtemplatescript;
import com.ruoyi.template.mapper.IvrLibaExtemplatescriptMapper;
import com.ruoyi.template.domain.SvyLibScriptCategory;
import com.ruoyi.template.domain.SvyTaskTemplate;
import com.ruoyi.template.domain.SvyTaskTemplateScript;
import com.ruoyi.template.domain.SvyTaskTemplateScriptVO;
import com.ruoyi.template.domain.SvyTaskTemplateTargetoption;
import com.ruoyi.template.mapper.SvyLibScriptCategoryMapper;
import com.ruoyi.template.service.ISvyTaskTemplateScriptService;
import com.ruoyi.template.service.ISvyTaskTemplateService;
import static cn.hutool.core.convert.Convert.toHex;
/**
* 单一任务(随访)Service业务层处理
*
* @author ruoyi
* @date 2024-02-02
*/
@Slf4j
@Service
public class ServiceSubtaskServiceImpl implements IServiceSubtaskService {
/**
* 满意度模块对外门面(常驻 Bean)。
*
* 随访统计里的「满意度指数」({@code getSfStatisticsJoy})只能通过它取数;
* 满意度模块关闭时门面返回全零 Map,不影响随访统计的其它字段与启动。
*/
@Autowired
private SatisfactionFacade satisfactionFacade;
/**
* 跨模块访问一律经模块门面(禁止直连已搬走的 Mapper)。
*/
@Autowired
private OtherVisitFacade otherVisitFacade;
/**
* 跨模块访问一律经模块门面(禁止直连已搬走的 Mapper)。
*/
@Autowired
private OuthospDataFacade outhospDataFacade;
/**
* 跨模块访问一律经模块门面(禁止直连已搬走的 Mapper)。
*/
@Autowired
private InhospVisitFacade inhospVisitFacade;
@Autowired
private ServiceSubtaskMapper serviceSubtaskMapper;
@Autowired
private ServiceSubtaskPreachformMapper serviceSubtaskPreachformMapper;
@Autowired
private ServiceSubtaskDetailMapper serviceSubtaskDetailMapper;
@Autowired
private IServiceTaskService serviceTaskService;
@Autowired
private IvrTaskTemplateTargetoptionMapper serviceTaskScriptTargetoptionMapper;
@Autowired
private IvrTaskVisitResultMapper serviceTaskVisitResultMapper;
@Autowired
private IServiceTaskdeptService serviceTaskdeptService;
@Autowired
private IServiceTaskmedicalService serviceTaskmedicalService;
@Autowired
private IServiceTaskdiagService serviceTaskdiagService;
@Autowired
private IServiceTaskoperService serviceTaskoperService;
@Autowired
private RedisCache redisCache;
@Autowired
private IvrLibaExtemplatescriptMapper ivrLibaExtemplatescriptMapper;
@Autowired
private ISvyTaskTemplateScriptService svyTaskTemplateScriptService;
@Autowired
private IIvrTaskTemplateService ivrTaskTemplateService;
@Autowired
private ISvyTaskTemplateService svyTaskTemplateService;
@Autowired
private IIvrTaskTemplateScriptService iIvrTaskTemplateScriptService;
@Autowired
private IIvrTaskTemplateTargetoptionService iIvrTaskTemplateTargetoptionService;
@Autowired
private IServiceOutPathService iServiceOutPathService;
@Autowired
private IServiceSubtaskDetailTraceService traceService;
@Autowired
private IServiceTaskScheduleService serviceTaskScheduleService;
@Autowired
private IPatArchiveService patArchiveService;
@Autowired
private ScheduleSubtaskBuilder scheduleSubtaskBuilder;
@Autowired
private FtpService ftpService;
@Autowired
private PatArchiveMapper patArchiveMapper;
@Autowired
private SvyLibScriptCategoryMapper svyLibScriptCategoryMapper;
@Autowired
private IPatMedInhospService patMedInhospService;
@Value("${pri_key}")
private String pri_key;
@Value("${pub_key}")
private String pub_key;
@Value("${ASRCallBackPath}")
private String ASRCallBackPath;
@Autowired
private ISysConfigService configService;
@Autowired
private SysConfigMapper sysConfigMapper;
/**
* 消息发送方工厂(短信/微信公众号),替代原来直接调用各站点发送代码的写法
*/
@Autowired
private SmsSenderFactory smsSenderFactory;
@Autowired
private WechatSenderFactory wechatSenderFactory;
@Autowired
private RedisTemplate redisTemplate;
@Value("${hangup}")
private String hangup;
@Value("${app_key_yq}")
private String app_key_yq;
@Value("${ruoyi.profile}")
private String profile;
@Value("${voicePathPrefix}")
private String voicePathPrefix;
@Value("${localIP}")
private String localIP;
@Value("${req_path}")
private String req_path;
@Value("${phoneUpEveryHour}")
private Integer phoneUpEveryHour;
@Value("${phoneEndHour}")
private Integer phoneEndHour;
@Autowired
private IPatMedOuthospService patMedOuthospService;
@Autowired
private SysDept2Mapper sysDept2Mapper;
@Value("${spring.profiles.active}")
private String active;
@Autowired
private ServiceOutPathMapper serviceOutPathMapper;
private static final String KEY_SEP = "\u0001";
/**
* 查询单一任务(随访)
*
* @param id 单一任务(随访)主键
* @return 单一任务(随访)
*/
@Override
public ServiceSubtask selectServiceSubtaskById(Long id) {
return serviceSubtaskMapper.selectServiceSubtaskById(id);
}
@Override
public List selectServiceSubtaskByDiagname(ServiceSubtask serviceSubtask) {
return serviceSubtaskMapper.selectServiceSubtaskByDiagname(serviceSubtask);
}
/**
* 查询单一任务(随访)列表
*
* @param serviceSubtaskEntity 单一任务(随访)
* @return 单一任务(随访)
*/
@Override
public List selectServiceSubtaskList(ServiceSubtaskEntity serviceSubtaskEntity) {
return serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskEntity);
}
public List selectServiceSubtaskListAgain(ServiceSubtaskEntity serviceSubtaskEntity) {
return serviceSubtaskMapper.selectServiceSubtaskListAgain(serviceSubtaskEntity);
}
@Override
public ServiceTaskVO queryTaskByCondition(ServiceSubtask serviceSubtask) {
//定义患者与单一任务关联表集合
List patTaskRelevances = new ArrayList<>();
ServiceSubtaskEntity serviceSubtaskVO = DtoConversionUtils.sourceToTarget(serviceSubtask, ServiceSubtaskEntity.class);
List list = selectServiceSubtaskList(serviceSubtaskVO);
ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
if (ObjectUtils.isEmpty(serviceTask)) {
log.error("找不到对应的serviceTask, orgid:{}, taskid: {}", serviceSubtask.getOrgid(), serviceSubtask.getTaskid());
return null;
}
if (CollectionUtils.isEmpty(list) || list.size() == 0) {
ServiceTaskVO serviceTaskVO = DtoConversionUtils.sourceToTarget(serviceTask, ServiceTaskVO.class);
ObjectMapper objectMapper = new ObjectMapper();
try {
List