package com.smartor.service.impl; 
 | 
  
 | 
import java.util.*; 
 | 
import java.util.stream.Collectors; 
 | 
  
 | 
import com.ruoyi.common.utils.DateUtils; 
 | 
import com.ruoyi.common.utils.DtoConversionUtils; 
 | 
import com.ruoyi.common.utils.StringUtils; 
 | 
import com.smartor.domain.*; 
 | 
import com.smartor.mapper.*; 
 | 
import lombok.extern.slf4j.Slf4j; 
 | 
import org.apache.commons.collections4.CollectionUtils; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.stereotype.Service; 
 | 
import com.smartor.service.IPatMedOperationService; 
 | 
  
 | 
/** 
 | 
 * 患者手术记录Service业务层处理 
 | 
 * 
 | 
 * @author lihu 
 | 
 * @date 2025-02-21 
 | 
 */ 
 | 
@Slf4j 
 | 
@Service 
 | 
public class PatMedOperationServiceImpl implements IPatMedOperationService { 
 | 
    @Autowired 
 | 
    private PatMedOperationMapper patMedOperationMapper; 
 | 
    @Autowired 
 | 
    private PatArchiveMapper patArchiveMapper; 
 | 
    @Autowired 
 | 
    private ServiceTaskoperMapper serviceTaskoperMapper; 
 | 
    @Autowired 
 | 
    private ServiceTaskMapper serviceTaskMapper; 
 | 
    @Autowired 
 | 
    private ServiceSubtaskMapper serviceSubtaskMapper; 
 | 
  
 | 
    /** 
 | 
     * 查询患者手术记录 
 | 
     * 
 | 
     * @param id 患者手术记录主键 
 | 
     * @return 患者手术记录 
 | 
     */ 
 | 
    @Override 
 | 
    public PatMedOperation selectPatMedOperationById(Long id) { 
 | 
        return patMedOperationMapper.selectPatMedOperationById(id); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 查询患者手术记录列表 
 | 
     * 
 | 
     * @param patMedOperation 患者手术记录 
 | 
     * @return 患者手术记录 
 | 
     */ 
 | 
    @Override 
 | 
    public List<PatMedOperation> selectPatMedOperationList(PatMedOperation patMedOperation) { 
 | 
        return patMedOperationMapper.selectPatMedOperationList(patMedOperation); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 新增患者手术记录 
 | 
     * 
 | 
     * @param patMedOperation 患者手术记录 
 | 
     * @return 结果 
 | 
     */ 
 | 
    @Override 
 | 
    public int insertPatMedOperation(PatMedOperation patMedOperation) { 
 | 
        patMedOperation.setCreateTime(DateUtils.getNowDate()); 
 | 
        return patMedOperationMapper.insertPatMedOperation(patMedOperation); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 修改患者手术记录 
 | 
     * 
 | 
     * @param patMedOperation 患者手术记录 
 | 
     * @return 结果 
 | 
     */ 
 | 
    @Override 
 | 
    public int updatePatMedOperation(PatMedOperation patMedOperation) { 
 | 
        patMedOperation.setUpdateTime(DateUtils.getNowDate()); 
 | 
        return patMedOperationMapper.updatePatMedOperation(patMedOperation); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 批量删除患者手术记录 
 | 
     * 
 | 
     * @param ids 需要删除的患者手术记录主键 
 | 
     * @return 结果 
 | 
     */ 
 | 
    @Override 
 | 
    public int deletePatMedOperationByIds(Long[] ids) { 
 | 
        return patMedOperationMapper.deletePatMedOperationByIds(ids); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 删除患者手术记录信息 
 | 
     * 
 | 
     * @param id 患者手术记录主键 
 | 
     * @return 结果 
 | 
     */ 
 | 
    @Override 
 | 
    public int deletePatMedOperationById(Long id) { 
 | 
        return patMedOperationMapper.deletePatMedOperationById(id); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public int dealOperationInfo() { 
 | 
        PatMedOperation patMedOperation = new PatMedOperation(); 
 | 
        //获取需要出院随访,未处理的数据 
 | 
        patMedOperation.setCheckFlag("0"); 
 | 
        List<PatMedOperation> patMedOperations = patMedOperationMapper.selectPatMedOperationList(patMedOperation); 
 | 
        log.error("dealOperationInfo需要处理的手术信息:{}", patMedOperations); 
 | 
  
 | 
        for (PatMedOperation patMedOperation1 : patMedOperations) { 
 | 
            //获取患者信息 
 | 
            PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedOperation1.getPatid()); 
 | 
            try { 
 | 
                //根据患者所在科室,获取该手术编码对应的长期任务 
 | 
                ServiceTaskoper serviceTaskoper = new ServiceTaskoper(); 
 | 
                serviceTaskoper.setLongtask(1L); 
 | 
                serviceTaskoper.setOpcode(patMedOperation1.getOpcode()); 
 | 
                List<ServiceTaskoper> serviceTaskopers = serviceTaskoperMapper.selectServiceTaskoperList(serviceTaskoper); 
 | 
                //如果部门模板为空(暂定,将出入院表的check_flag设置为2  ,long_task_reason 记录原因) 
 | 
                if (CollectionUtils.isEmpty(serviceTaskopers) || serviceTaskopers.size() == 0) { 
 | 
                    patMedOperation1.setCheckFlag("2"); 
 | 
                    patMedOperation1.setLongTaskReason("该手术编码,未配置长期任务;"); 
 | 
                    patMedOperationMapper.updatePatMedOperation(patMedOperation1); 
 | 
                    continue; 
 | 
                } else if (serviceTaskopers.size() > 1) { 
 | 
                    //如果查询出多个任务,那就取第一个,并在患者备注一下 
 | 
                    List<Long> taskIds = serviceTaskopers.stream().map(ServiceTaskoper::getTaskId).collect(Collectors.toList()); 
 | 
                    patMedOperation1.setLongTaskReason("该手术编码,有多个随访长期任务:" + taskIds); 
 | 
                    patMedOperationMapper.updatePatMedOperation(patMedOperation1); 
 | 
                    ServiceTaskoper serviceTaskoper1 = serviceTaskopers.get(0); 
 | 
                    serviceTaskopers = new ArrayList<>(); 
 | 
                    serviceTaskopers.add(serviceTaskoper1); 
 | 
                } 
 | 
  
 | 
                writeInSubTask(serviceTaskopers.get(0).getTaskId(), true, patMedOperation1, patArchive); 
 | 
  
 | 
            } catch (Exception e) { 
 | 
                e.printStackTrace(); 
 | 
                log.error("人员处理出异常了:{}", e.getMessage()); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        return 1; 
 | 
    } 
 | 
  
 | 
    //将患者放到subtask中 
 | 
    private void writeInSubTask(Long taskid, Boolean check, PatMedOperation patMedOperation1, PatArchive patArchive) { 
 | 
        String longTaskReason = patMedOperation1.getLongTaskReason(); 
 | 
        if (StringUtils.isEmpty(longTaskReason)) longTaskReason = ""; 
 | 
//            Long taskid = std.getTaskId(); 
 | 
        ServiceTask st = new ServiceTask(); 
 | 
        st.setTaskid(taskid); 
 | 
        st.setSendState(2L); 
 | 
        List<ServiceTask> serviceTasks = serviceTaskMapper.selectServiceTaskList(st); 
 | 
        if (CollectionUtils.isEmpty(serviceTasks)) { 
 | 
            log.error("该手术编码长期任务不存在,任务ID为:{}", taskid); 
 | 
            patMedOperation1.setCheckFlag("2"); 
 | 
            patMedOperation1.setLongTaskReason(longTaskReason + " & 该手术编码长期任务不存在,任务ID为:" + taskid); 
 | 
            patMedOperationMapper.updatePatMedOperation(patMedOperation1); 
 | 
            return; 
 | 
        } 
 | 
        ServiceTask serviceTask = serviceTasks.get(0); 
 | 
  
 | 
        //封装serviceSubtask 
 | 
        ServiceSubtask serviceSubtask = boxedServiceSubtask(serviceTask, patMedOperation1, patArchive); 
 | 
        int i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtask); 
 | 
  
 | 
        if (i == 1) { 
 | 
            //将check_flag改成1(已处理) 
 | 
            PatMedOperation patMedOperation = new PatMedOperation(); 
 | 
            patMedOperation.setId(patMedOperation1.getId()); 
 | 
            patMedOperation.setCheckFlag("1"); 
 | 
            patMedOperationMapper.updatePatMedOperation(patMedOperation); 
 | 
        } else { 
 | 
            //生成子任务失败, 
 | 
            log.error("生成子任务失败serviceSubtask为:{}", serviceSubtask); 
 | 
            PatMedOperation patMedOperation = new PatMedOperation(); 
 | 
            patMedOperation.setId(patMedOperation1.getId()); 
 | 
            patMedOperation.setRemark("生成子任务失败"); 
 | 
            patMedOperationMapper.updatePatMedOperation(patMedOperation); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    //封装serviceSubtask 
 | 
    private ServiceSubtask boxedServiceSubtask(ServiceTask serviceTask, PatMedOperation patMedOperation1, PatArchive patArchive) { 
 | 
        ServiceSubtask serviceSubtask = DtoConversionUtils.sourceToTarget(serviceTask, ServiceSubtask.class); 
 | 
        serviceSubtask.setTaskid(serviceTask.getTaskid()); 
 | 
        if (StringUtils.isNotEmpty(serviceTask.getLibtemplateid())) 
 | 
            serviceSubtask.setLibtemplateid(Long.valueOf(serviceTask.getLibtemplateid())); 
 | 
        serviceSubtask.setNurseId(patMedOperation1.getNurseId()); 
 | 
        serviceSubtask.setNurseName(patMedOperation1.getNurseName()); 
 | 
//        serviceSubtask.setInhospid(patMedOperation1.getInhospid()); 
 | 
        serviceSubtask.setDrcode(patMedOperation1.getDrcode()); 
 | 
        serviceSubtask.setDrname(patMedOperation1.getDrname()); 
 | 
        serviceSubtask.setDeptcode(patMedOperation1.getDeptcode()); 
 | 
        serviceSubtask.setDeptname(patMedOperation1.getDeptname()); 
 | 
        serviceSubtask.setTemplateid(serviceTask.getTemplateid()); 
 | 
        serviceSubtask.setTemplatename(serviceTask.getTemplatename()); 
 | 
        serviceSubtask.setPatid(patArchive.getId()); 
 | 
        serviceSubtask.setSendname(patArchive.getName()); 
 | 
        serviceSubtask.setSfzh(patArchive.getIdcardno()); 
 | 
        serviceSubtask.setPhone(patArchive.getTelcode()); 
 | 
        if (StringUtils.isBlank(patArchive.getTelcode())) serviceSubtask.setPhone(patArchive.getRelativetelcode()); 
 | 
        serviceSubtask.setSex(patArchive.getSex()); 
 | 
        serviceSubtask.setAge(patArchive.getAge()); 
 | 
        serviceSubtask.setSendstate(2L); 
 | 
        serviceSubtask.setStarttime(patMedOperation1.getOpreqtime()); 
 | 
        serviceSubtask.setEndtime(patMedOperation1.getOpreqtime()); 
 | 
        serviceSubtask.setServiceType("2"); 
 | 
        serviceSubtask.setPreachform(serviceTask.getPreachform()); 
 | 
        serviceSubtask.setHospType("2"); 
 | 
        serviceSubtask.setCreateTime(new Date()); 
 | 
        serviceSubtask.setUpdateTime(new Date()); 
 | 
//        serviceSubtask.setCreateBy(patMedInhosp1.getNurseName()); 
 | 
//        serviceSubtask.setLeavehospitaldistrictcode(patMedInhosp1.getLeavehospitaldistrictcode()); 
 | 
//        serviceSubtask.setLeavehospitaldistrictname(patMedInhosp1.getLeavehospitaldistrictname()); 
 | 
        //设置发送时间 
 | 
        if (serviceTask.getSendDay() == null) serviceTask.setSendDay(1L); 
 | 
        Date newDate = addDays(patMedOperation1.getOpreqtime(), serviceTask.getSendDay().intValue()); 
 | 
        serviceSubtask.setLongSendTime(newDate); 
 | 
        serviceSubtask.setVisitTime(newDate); 
 | 
        //患者发送时间 
 | 
        if (StringUtils.isNotEmpty(patArchive.getNotrequiredFlag()) && patArchive.getNotrequiredFlag().equals("1")) { 
 | 
            String remark = patArchive.getNotrequiredreason(); 
 | 
            serviceSubtask.setRemark(remark); 
 | 
            serviceSubtask.setResult("error"); 
 | 
//            serviceSubtask.setFinishtime(new Date()); 
 | 
            //不执行 
 | 
            serviceSubtask.setSendstate(4L); 
 | 
        } 
 | 
        return serviceSubtask; 
 | 
    } 
 | 
  
 | 
    private Date addDays(Date date, Integer days) { 
 | 
        if (days == null) { 
 | 
            days = 1; 
 | 
        } 
 | 
        Calendar calendar = Calendar.getInstance(); 
 | 
        calendar.setTime(date); 
 | 
        calendar.add(Calendar.DAY_OF_MONTH, days); 
 | 
        return calendar.getTime(); 
 | 
    } 
 | 
} 
 |