package com.ruoyi.task.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 lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.Cacheable;
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.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.ruoyi.template.mapper.IvrTaskTemplateTargetoptionMapper;
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;
import com.ruoyi.common.core.domain.entity.PatArchive;
import com.ruoyi.task.domain.DTO.ServiceSubtaskDetailDTO;
import com.ruoyi.task.domain.entity.ServiceSubtaskEntity;
import com.ruoyi.task.domain.ServiceStatisticsRequest;
import com.ruoyi.task.domain.ServiceStatisticsResponse;
import com.ruoyi.task.domain.ServiceSubtask;
import com.ruoyi.task.domain.ServiceSubtaskCount;
import com.ruoyi.task.domain.ServiceSubtaskCountReq;
import com.ruoyi.task.domain.ServiceSubtaskDetail;
import com.ruoyi.task.domain.ServiceSubtaskDetailVO;
import com.ruoyi.task.domain.ServiceSubtaskScriptCount;
import com.ruoyi.task.domain.ServiceSubtaskStatistic;
import com.ruoyi.task.domain.ServiceTask;
import com.ruoyi.task.domain.ServiceTaskdept;
import com.ruoyi.task.domain.ServiceTaskdiag;
import com.ruoyi.task.domain.ServiceTaskmedical;
import com.ruoyi.task.domain.ServiceTaskoper;
import com.ruoyi.task.domain.ServiceTaskSchedule;
import com.ruoyi.task.domain.ServiceTaskScheduleDetail;
import com.ruoyi.task.domain.TaskSendTimeVO;
import com.ruoyi.task.domain.VO.ServiceSubtaskCotinueCountVO;
import com.ruoyi.task.mapper.ServiceSubtaskDetailMapper;
import com.ruoyi.task.mapper.ServiceSubtaskMapper;
import com.ruoyi.task.domain.ServiceSubtaskDetailTrace;
import com.ruoyi.task.domain.ServiceOutPath;
import com.ruoyi.task.mapper.ServiceOutPathMapper;
import com.ruoyi.task.service.IServiceOutPathService;
import com.ruoyi.task.domain.ServiceSubtaskPreachform;
import com.ruoyi.task.api.spi.TaskPreachformPort;
import com.ruoyi.task.api.spi.TaskArchivePort;
import com.ruoyi.task.api.spi.TaskFtpPort;
import com.ruoyi.task.api.spi.TaskSysConfigPort;
import com.ruoyi.task.api.spi.TaskSysDeptPort;
import com.ruoyi.task.common.ScheduleSubtaskBuilder;
import com.ruoyi.task.domain.ServiceTaskScheduleVO;
import com.ruoyi.task.service.IServiceSubtaskService;
import com.ruoyi.task.service.IServiceTaskScheduleService;
import com.ruoyi.task.service.IServiceTaskService;
import com.ruoyi.task.service.IServiceTaskdeptService;
import com.ruoyi.task.service.IServiceTaskdiagService;
import com.ruoyi.task.service.IServiceTaskmedicalService;
import com.ruoyi.task.service.IServiceTaskoperService;
import com.ruoyi.task.domain.PatArchiveSrmVO;
import com.ruoyi.task.domain.PatTaskRelevance;
import com.ruoyi.task.domain.SendMagParam;
import com.ruoyi.task.domain.ServiceSubtaskDiagname;
import com.ruoyi.task.domain.ServiceSubtaskIsAbnormalStatistic;
import com.ruoyi.task.domain.ServiceSubtaskRes;
import com.ruoyi.task.domain.ServiceSubtaskTemplateVO;
import com.ruoyi.task.domain.ServiceTaskVO;
import com.ruoyi.task.domain.VO.TransferDeptVO;
/**
* 单一任务(随访)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 TaskPreachformPort taskPreachformPort;
@Autowired
private ServiceSubtaskDetailMapper serviceSubtaskDetailMapper;
@Autowired
private IServiceTaskService serviceTaskService;
@Autowired
private IvrTaskTemplateTargetoptionMapper serviceTaskScriptTargetoptionMapper;
@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 IServiceTaskScheduleService serviceTaskScheduleService;
@Autowired
private TaskArchivePort taskArchivePort;
@Autowired
private ScheduleSubtaskBuilder scheduleSubtaskBuilder;
@Autowired
private TaskFtpPort taskFtpPort;
@Autowired
private SvyLibScriptCategoryMapper svyLibScriptCategoryMapper;
@Value("${pub_key}")
private String pub_key;
@Autowired
private TaskSysConfigPort taskSysConfigPort;
/**
* 消息发送方工厂(短信/微信公众号),替代原来直接调用各站点发送代码的写法
*/
@Autowired
private SmsSenderFactory smsSenderFactory;
@Autowired
private WechatSenderFactory wechatSenderFactory;
@Value("${localIP}")
private String localIP;
@Value("${req_path}")
private String req_path;
@Autowired
private TaskSysDeptPort taskSysDeptPort;
@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