eight
2024-12-10 f77fbfc8c07881f5239ce49b0dc78faaec3628b0
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/appointment/AppointmentServiceImpl.java
@@ -1,12 +1,20 @@
package cn.lihu.jh.module.ecg.service.appointment;
import cn.lihu.jh.framework.common.util.date.DateUtils;
import cn.lihu.jh.framework.common.util.date.LocalDateTimeUtils;
import cn.lihu.jh.module.ecg.controller.admin.queue.vo.QueueSaveReqVO;
import cn.lihu.jh.module.ecg.dal.dataobject.checktype.CheckTypeDO;
import cn.lihu.jh.module.ecg.dal.dataobject.patient.PatDetails;
import cn.lihu.jh.module.ecg.dal.dataobject.queue.QueueDO;
import cn.lihu.jh.module.ecg.feign.RemoteDataService;
import cn.lihu.jh.module.ecg.feign.RestApiReqBodyVo;
import cn.lihu.jh.module.ecg.feign.RestApiResult;
import cn.lihu.jh.module.ecg.feign.dto.AppointmentExternal;
import cn.lihu.jh.module.ecg.service.config.EcgConfigService;
import cn.lihu.jh.module.ecg.service.queue.QueueService;
import cn.lihu.jh.module.ecg.service.queue.QueueServiceTxFunctions;
import cn.lihu.jh.module.ecg.service.queuesequence.QueueSequenceService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -20,8 +28,15 @@
import cn.lihu.jh.module.ecg.dal.mysql.appointment.AppointmentMapper;
import javax.annotation.Resource;
import javax.xml.crypto.Data;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static cn.lihu.jh.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.lihu.jh.framework.common.pojo.CommonResult.error;
@@ -34,10 +49,17 @@
 */
@Service
@Validated
@Slf4j
public class AppointmentServiceImpl implements AppointmentService {
    @Resource
    private EcgConfigService ecgConfigService;
    @Resource
    private RemoteDataService remoteDataService;
    @Resource
    private QueueSequenceService queueSequenceService;
    @Resource
    private QueueService queueService;
@@ -51,9 +73,13 @@
        AppointmentDO appointment = BeanUtils.toBean(createReqVO, AppointmentDO.class);
        appointment.setBookTime( LocalDateTime.now() );
        appointment.setBookSrc( 1 );
        appointmentMapper.insert(appointment);
        try {
            appointmentMapper.insert(appointment);
        } catch (DuplicateKeyException e) {
            throw exception(APPOINTMENT_EXIST_TODAY);
        }
        // 返回
        return appointment.getId();
    }
@@ -87,20 +113,49 @@
    }
    @Override
    public AppointmentDO getAppointmentByPatId(String patId) {
        // 先从医院平台查询
        AppointmentDO appointmentExtermal = getAppointmentExtermal( patId );
        if (null != appointmentExtermal && null != appointmentExtermal.getBookDate()) {
            // 查询DB中 是否已经存在
            AppointmentDO appointmentDO = appointmentMapper.getCurrentPatId( patId );
            if (null == appointmentDO ) {
                appointmentMapper.insert( appointmentExtermal );
                return appointmentExtermal;
    public AppointmentDO getCurAppointmentByPatIdAndCheckType(String patId, Integer checkType) {
        AppointmentDO appointmentDO = appointmentMapper.getByPatAndCheckTypeAndBookDate( patId, checkType, LocalDate.now() );
        return appointmentDO;
    }
    /**
     * @param patCode 编号 : !!! 不一定就是本系统的 患者编号(patID), 根源在于 检查单扫描出来的编号 不一定是 本系统的 患者编号(patID)
     * @return
     */
    @Override
    public List<AppointmentDO> queryAndCreateAppointmentByPatId(String patCode) {
        // 从医院平台查询
        List<AppointmentDO> appointmentExtermalList = getAppointmentExtermal( patCode );
        for ( int appointmentIndex = 0; appointmentIndex < appointmentExtermalList.size(); appointmentIndex++ ) {
            AppointmentDO appointmentExtermal = appointmentExtermalList.get(appointmentIndex);
            if (null == appointmentExtermal )
                continue;
            // 从DB查询预约,是否已经存在
            AppointmentDO appointmentDO = appointmentMapper.getByEpisodeIdAndApplyNo(appointmentExtermal.getEpisodeId(), appointmentExtermal.getApplyNo());
            if (null == appointmentDO) {
                appointmentMapper.insert(appointmentExtermal);
            } else {
                appointmentExtermal.setId( appointmentDO.getId() ); // 确保 返回值包含 appointment id
            }
            return appointmentDO;
        }
        return appointmentMapper.getCurrentPatId( patId );
        // 查询[queue表]补充 book_seq_num 到返回值中
        if (!appointmentExtermalList.isEmpty()) {
            List<Long> appointIdlist = appointmentExtermalList.stream().map(appointmentDO -> appointmentDO.getId()).toList();
            List<QueueDO> simpleQueueDOList = queueService.selectBookSeqNumByAppointIdList(appointIdlist);
            if (!simpleQueueDOList.isEmpty()) {
                Map<Long, Integer> mapAppointIdVsBookSeqNo = simpleQueueDOList.stream().collect(Collectors.toMap(QueueDO::getAppointId, QueueDO::getBookSeqNum));
                appointmentExtermalList.forEach(appointmentExterma -> appointmentExterma.setBookSeqNum(mapAppointIdVsBookSeqNo.get(appointmentExterma.getId())));
            }
        }
        // 不从DB查询
        //List<AppointmentDO> appointmentDOList = appointmentMapper.getCurrentPatId( patCode );
        //return 0 == appointmentDOList.size() ? null : appointmentDOList.get(0);
        return appointmentExtermalList;
    }
    @Override
@@ -109,70 +164,106 @@
    }
    @Override
    public AppointmentDO getAppointmentExtermal(String mzzyh) {
    public List<AppointmentDO> getAppointmentExtermal(String patId) {
        List<AppointmentDO> curAppointDOList = new ArrayList<AppointmentDO>();
        RestApiReqBodyVo reqBodyVo = new RestApiReqBodyVo();
        //reqBodyVo.setSfzh(confirmReqVO.getPatId());
        reqBodyVo.setMzzyh( mzzyh );
        if (18 == patId.length()) {
            reqBodyVo.setSfzh( patId );
        } else {
            reqBodyVo.setMzzyh(patId);
        }
        // QueryRisReportList   queryEcgRequest
        RestApiResult<AppointmentExternal> result = remoteDataService.httpApi("queryEcgRequest", "ECG", "ECG", reqBodyVo);
        result.getCode();
        if (0 == result.getRow().size()) {
            return curAppointDOList;
        }
        AppointmentExternal appointmentExternal = result.getRow().get(0);
        for (int appointIndex=0; appointIndex < result.getRow().size(); appointIndex++ ) {
            AppointmentExternal appointmentExternal = result.getRow().get( appointIndex );
        AppointmentDO appointmentDO = BeanUtils.toBean( appointmentExternal, AppointmentDO.class );
            AppointmentDO appointmentDO = BeanUtils.toBean(appointmentExternal, AppointmentDO.class);
            appointmentDO.setApplyNo( appointmentExternal.getReqIdeApplyno() );
            appointmentDO.setEpisodeId( appointmentExternal.getEpisodeID() );
            appointmentDO.setPatSrc( getCorrespondingPatientSource(appointmentExternal.getAdmTypeCode()) );
            appointmentDO.setPatId(appointmentExternal.getPatientID()); // 内容为 身份证号 或 门诊住院号
            appointmentDO.setPatName(appointmentExternal.getPatName());
            appointmentDO.setPatGender(Byte.valueOf(appointmentExternal.getPatgender()));
            appointmentDO.setPatBirthday(DateUtils.ofUTC(appointmentExternal.getEncPatBirthDate()).toLocalDate());
            appointmentDO.setPatIdentityId(appointmentExternal.getIdentityID());
            appointmentDO.setPatAddr(appointmentExternal.getAddress());
            appointmentDO.setPatDeptCode(appointmentExternal.getPatLocDeptCode());
            appointmentDO.setPatDeptDesc(appointmentExternal.getPatLocDeptDesc());
            appointmentDO.setPatWardCode(appointmentExternal.getPatLocWardCode());
            appointmentDO.setPatWardDesc(appointmentExternal.getPatLocWardDesc());
            appointmentDO.setPatMobile(appointmentExternal.getPhone());
            appointmentDO.setPatBedNo(appointmentExternal.getEnBedno());
            appointmentDO.setBookCheckType(getCorrespondingCheckType(appointmentExternal.getPlanDefItemList().getPlanDefItem().getPlanDefItemcode()));
            appointmentDO.setBookTime(DateUtils.ofUTC(appointmentExternal.getReqAuthoredOn()));  // 开单时间
            appointmentDO.setBookSrc( 0 );
        appointmentDO.setPatId( appointmentExternal.getPatientID() ); // 内容为 身份证号 或 门诊住院号
        appointmentDO.setPatName( appointmentExternal.getPatName() );
        appointmentDO.setPatGender( Byte.valueOf(appointmentExternal.getPatgender()) );
        appointmentDO.setPatBirthday( appointmentExternal.getEncPatBirthDate() );
        appointmentDO.setPatIdentityId( appointmentExternal.getIdentityID() );
        appointmentDO.setPatAddr( appointmentExternal.getAddress() );
        appointmentDO.setPatDeptCode( appointmentExternal.getPatLocDeptCode() );
        appointmentDO.setPatDeptDesc( appointmentExternal.getPatLocDeptDesc() );
        appointmentDO.setPatWardCode( appointmentExternal.getPatLocWardCode() );
        appointmentDO.setPatWardDesc( appointmentExternal.getPatLocWardDesc() );
        appointmentDO.setPatMobile( appointmentExternal.getPhone() );
        appointmentDO.setPatBedNo( appointmentExternal.getEnBedno() );
        appointmentDO.setBookId( appointmentExternal.getReqIdeApplyno() );
        appointmentDO.setBookDate( appointmentExternal.getReqExtBooktime().toLocalDate() );
        appointmentDO.setBookCheckType( getCorrespondingCheckType(appointmentExternal.getPlanDefItemList().getPlanDefItem().getPlanDefItemcode()) );
        appointmentDO.setBookTime( appointmentExternal.getReqAuthoredOn() );
        LocalDateTime bookStartTime = appointmentExternal.getReqExtBooktime();
        LocalDateTime bookEndTime = bookStartTime.plusMinutes(30);
        appointmentDO.setBookTimeslot( (bookStartTime.getHour()*100 + bookStartTime.getMinute())*10000 + bookEndTime.getHour()*100 + bookEndTime.getMinute() );
        appointmentDO.setBookSrc( 0 );
        appointmentDO.setPaid( 1 );
        return appointmentDO;
            // 光开单的情况,没有预约时间
            if (null != appointmentExternal.getReqExtBooktime() ) {
                appointmentDO.setBookDate(DateUtils.ofUTC(appointmentExternal.getReqExtBooktime()).toLocalDate());
                LocalDateTime bookStartTime = DateUtils.ofUTC(appointmentExternal.getReqExtBooktime());
                LocalDateTime bookEndTime = bookStartTime.plusMinutes( ecgConfigService.getTimeslotLength());
                appointmentDO.setBookTimeslot((bookStartTime.getHour() * 100 + bookStartTime.getMinute()) * 10000 + bookEndTime.getHour() * 100 + bookEndTime.getMinute());
            }
            appointmentDO.setPaid( 0 );
            curAppointDOList.add( appointmentDO );
        }
        return curAppointDOList;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public String appoitmentConfirm(AppointmentConfirmReqVO confirmReqVO) {
    public Integer appoitmentConfirm(AppointmentConfirmReqVO confirmReqVO) {
        AppointmentDO appointment = getAppointment(confirmReqVO.getId());
        if (null == appointment)
            throw exception(PATIENT_NOT_EXISTS);
        // 手动预约,直接设置预约日期为当天
        if (confirmReqVO.getIsVip() == 1) {
            appointment.setBookDate( LocalDate.now() );
        }
        if ( !DateUtils.isToday(appointment.getBookDate()) )
            throw exception( APPOINTMENT_NOT_TODAY);
        Integer newSeqNo = null;
        if (confirmReqVO.getIsVip() == 0) {
            newSeqNo = queueSequenceService.distributeSeqNo(confirmReqVO.getBookCheckType(), confirmReqVO.getBookTimeslot());
        } else {
            newSeqNo = queueSequenceService.distributeVipSeqNo(confirmReqVO.getBookCheckType(), confirmReqVO.getBookTimeslot());
        }
        try {
            QueueSaveReqVO queueSaveReqVO = new QueueSaveReqVO();
            queueSaveReqVO.setApplyNo( appointment.getApplyNo() );
            queueSaveReqVO.setEpisodeId( appointment.getEpisodeId() );
            queueSaveReqVO.setAppointId(appointment.getId());
            queueSaveReqVO.setPatId(appointment.getPatId());
            queueSaveReqVO.setPatName(appointment.getPatName());
            queueSaveReqVO.setPatGender(appointment.getPatGender());
            queueSaveReqVO.setBookDate(appointment.getBookDate());
            queueSaveReqVO.setBookTimeslot(appointment.getBookTimeslot());
            queueSaveReqVO.setBookTimeslot( confirmReqVO.getBookTimeslot() ); /*appointment.getBookTimeslot()*/
            queueSaveReqVO.setBookCheckType(appointment.getBookCheckType());
            queueSaveReqVO.setBookSeqNum( newSeqNo );
            queueSaveReqVO.setIsVip( confirmReqVO.getIsVip() );
            queueSaveReqVO.setPassed((byte) 0);
            queueSaveReqVO.setExpired((byte) 0);
            queueSaveReqVO.setPatDetails( appointment.getPatDeptDesc() + "-" + appointment.getPatWardDesc() + "-" + appointment.getPatBedNo());
            queueSaveReqVO.setPatDetails( getPatDetails(appointment) );
            queueService.queue(queueSaveReqVO);
        } catch (DuplicateKeyException duplicateKeyException) {
            throw exception(APPOINTMENT_HAVE_QUEUED);
        }
        return "确认成功";
        return newSeqNo;
    }
    private Integer getCorrespondingCheckType(String strPlanDefItemcode) {
@@ -209,4 +300,32 @@
        return 100;
    }
}
    private Integer getCorrespondingPatientSource(String admTypeCode) {
        if (admTypeCode.equals("AMB"))
            return 1;
        else if (admTypeCode.equals("EMER"))
            return 2;
        else if (admTypeCode.equals("IMP"))
            return 3;
        else if (admTypeCode.equals("PHY"))
            return 4;
        return 0;
    }
    private PatDetails getPatDetails(AppointmentDO appointment) {
        PatDetails patDetails = new PatDetails();
        patDetails.setId( appointment.getPatId() );
        patDetails.setName( appointment.getPatName() );
        patDetails.setMobile( appointment.getPatMobile() );
        patDetails.setDeptCode( appointment.getPatDeptCode() );
        patDetails.setDeptDesc( appointment.getPatDeptDesc() );
        patDetails.setWardCode( appointment.getPatWardCode() );
        patDetails.setWardDesc( appointment.getPatWardDesc() );
        patDetails.setBedNo( appointment.getPatBedNo() );
        patDetails.setSource( appointment.getPatSrc() );
        return patDetails;
    }
}