liusheng
3 天以前 eb3195e397b023cfae1ee4dea7fbc29f1271504f
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/devrent/DevRentServiceImpl.java
@@ -1,43 +1,42 @@
package cn.lihu.jh.module.ecg.service.devrent;
import cn.lihu.jh.framework.common.pojo.CommonResult;
import cn.lihu.jh.framework.common.pojo.PageResult;
import cn.lihu.jh.framework.common.util.object.BeanUtils;
import cn.lihu.jh.framework.security.core.util.SecurityFrameworkUtils;
import cn.lihu.jh.module.ecg.controller.admin.devrent.vo.*;
import cn.lihu.jh.module.ecg.controller.admin.jobrecord.vo.JobRecordSaveReqVO;
import cn.lihu.jh.module.ecg.dal.dataobject.appointment.AppointmentDO;
import cn.lihu.jh.module.ecg.dal.dataobject.checktype.CheckTypeDO;
import cn.lihu.jh.module.ecg.dal.dataobject.devmanage.DeviceDO;
import cn.lihu.jh.module.ecg.dal.dataobject.devrent.DevRentDO;
import cn.lihu.jh.module.ecg.dal.dataobject.jobrecord.JobRecordDO;
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.dal.mysql.appointment.AppointmentMapper;
import cn.lihu.jh.module.ecg.dal.mysql.checktype.CheckTypeMapper;
import cn.lihu.jh.module.ecg.dal.mysql.devmanage.DeviceMapper;
import cn.lihu.jh.module.ecg.dal.mysql.devrent.DevRentMapper;
import cn.lihu.jh.module.ecg.dal.mysql.jobrecord.JobRecordMapper;
import cn.lihu.jh.module.ecg.dal.mysql.queue.QueueMapper;
import cn.lihu.jh.module.ecg.enums.DevRentStateEnum;
import cn.lihu.jh.module.ecg.enums.DevStateEnum;
import cn.lihu.jh.module.ecg.enums.QueueStatusEnum;
import cn.lihu.jh.module.ecg.feign.*;
import cn.lihu.jh.module.ecg.feign.FeeConfirmFeignService;
import cn.lihu.jh.module.ecg.service.queue.QueueServiceTxFunctions;
import cn.lihu.jh.module.ecg.webservice.client.JHFWWebServiceClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import cn.lihu.jh.module.ecg.controller.admin.devrent.vo.*;
import cn.lihu.jh.module.ecg.dal.dataobject.devrent.DevRentDO;
import cn.lihu.jh.framework.common.pojo.PageResult;
import cn.lihu.jh.framework.common.util.object.BeanUtils;
import cn.lihu.jh.module.ecg.dal.mysql.devrent.DevRentMapper;
import javax.annotation.Resource;
import static cn.lihu.jh.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.lihu.jh.framework.common.util.date.DateUtils.getCurTimeString;
import static cn.lihu.jh.module.ecg.enums.ErrorCodeConstants.*;
/**
@@ -66,10 +65,17 @@
    DeviceMapper deviceMapper;
    @Resource
    AppointmentMapper appointmentMapper;
    @Resource
    QueueMapper queueMapper;
    @Resource
    CheckTypeMapper checkTypeMapper;
    @Resource
    private JHFWWebServiceClient jhfwWebServiceClient;
    @Override
    public CommonResult<Long> registerOperation(DevRentSaveReqVO createReqVO) {
@@ -95,8 +101,7 @@
        JobRecordDO jobRecordDO = jobRecordMapper.selectByRentIdDocId(rent_id, userId, jobTypeList);
        if (null == jobRecordDO) {
            List<DevRentDO>  devRentDOList = devRentMapper.selectByPatAndChecktypeAndState(createReqVO.getPatId(), createReqVO.getCheckType(), DevRentStateEnum.FREE.getState());
            if (devRentDOList.size() == 0)
                throw  exception(DEV_INSTALL_NOT_APPOINTMENT);
            if (devRentDOList.size() == 0) throw exception(DEV_INSTALL_NOT_APPOINTMENT);
            else if (devRentDOList.size() != 1) {
                throw  exception(DEV_INSTALL_EXCEPTION);
            }
@@ -140,8 +145,7 @@
        //queueMapper.updateBedQueueStatus(createReqVO.getRoomId(), createReqVO.getBedNo(),
        //        QueueStatusEnum.ONSTAGE.getStatus(), QueueStatusEnum.FINISH.getStatus());
        QueueDO firstOnStageQueueItem = queueMapper.getBedFirstQueueItemByStatus(createReqVO.getRoomId(),
                                            createReqVO.getBedNo(), QueueStatusEnum.ONSTAGE.getStatus());
        QueueDO firstOnStageQueueItem = queueMapper.getBedFirstQueueItemByStatus(createReqVO.getRoomId(), createReqVO.getBedNo(), QueueStatusEnum.ONSTAGE.getStatus());
        // QueueStatusEnum.ONSTAGE  =>  QueueStatusEnum.FINISH
        firstOnStageQueueItem.setStatus(QueueStatusEnum.FINISH.getStatus());  // 默认状态 设置
        queueMapper.updateById( firstOnStageQueueItem );
@@ -157,6 +161,7 @@
    /**
     * 领用完成 操作
     *
     * @param createReqVO 创建信息
     * @return
     */
@@ -175,14 +180,21 @@
            throw exception(DEVICE_NOT_FREE);
        }
//        //设备领取完成后,此时检查登记写成了,需要将这个回写给集成平台
//        String action = "S0405";
//        String message = "";
//        jhfwWebServiceClient.callJHFWTYRK(action, message);
        List<Integer> jobTypeList = new ArrayList<Integer>();
        jobTypeList.add( DevRentStateEnum.RECEIVED.getState());
        jobTypeList.add( DevRentStateEnum.RECEIVED_CANCELLED.getState());
        JobRecordDO jobRecordDO = jobRecordMapper.selectByRentIdDocId(rent_id, userId, jobTypeList);
        if (null == jobRecordDO) {
            List<DevRentDO>  devRentDOList = devRentMapper.selectByPatAndChecktypeAndState(createReqVO.getPatId(), createReqVO.getCheckType(), DevRentStateEnum.FREE.getState());
            if (devRentDOList.size() == 0)
                throw exception(DEV_INSTALL_NOT_APPOINTMENT);
            if (devRentDOList.size() == 0) throw exception(DEV_INSTALL_NOT_APPOINTMENT);
            else if (devRentDOList.size() != 1) {
                throw exception(DEV_INSTALL_EXCEPTION);
            }
@@ -227,8 +239,7 @@
        //        QueueStatusEnum.ONSTAGE.getStatus(), QueueStatusEnum.RECEIVED.getStatus());
        // QueueStatusEnum.ONSTAGE  =>  QueueStatusEnum.RECEIVED
        QueueDO bedOnStageQueueItem = queueMapper.getBedFirstQueueItemByStatus(
                createReqVO.getRoomId(), createReqVO.getBedNo(), QueueStatusEnum.ONSTAGE.getStatus() );
        QueueDO bedOnStageQueueItem = queueMapper.getBedFirstQueueItemByStatus(createReqVO.getRoomId(), createReqVO.getBedNo(), QueueStatusEnum.ONSTAGE.getStatus());
        CheckTypeDO checkTypeDO = queueServiceTxFunctions.getCheckTypeItem( bedOnStageQueueItem.getBookCheckType() );
        bedOnStageQueueItem.setStatus(QueueStatusEnum.RECEIVED.getStatus());  // [已领用] 状态
        bedOnStageQueueItem.setAffinityItem( 0 ); // 亲和标记 清除,在安装阶段重新亲和
@@ -271,8 +282,7 @@
        // 第一次 安装操作
        if (null == jobRecordDO) {
            List<DevRentDO>  devRentDOList = devRentMapper.selectByPatAndChecktypeAndState(createReqVO.getPatId(), createReqVO.getCheckType(), DevRentStateEnum.RECEIVED.getState());
            if (devRentDOList.size() == 0)
                throw exception(DEV_INSTALL_NOT_RECEIVED);
            if (devRentDOList.size() == 0) throw exception(DEV_INSTALL_NOT_RECEIVED);
            else if (devRentDOList.size() != 1) {
                throw exception(DEV_INSTALL_EXCEPTION);
            }
@@ -316,8 +326,7 @@
        //        QueueStatusEnum.INSTALLING.getStatus(), QueueStatusEnum.FINISH.getStatus());
        // QueueStatusEnum.INSTALLING  =>  QueueStatusEnum.FINISH
        QueueDO bedInstallingQueueItem = queueMapper.getBedFirstQueueItemByStatus(
                            createReqVO.getRoomId(), createReqVO.getBedNo(), QueueStatusEnum.INSTALLING.getStatus());
        QueueDO bedInstallingQueueItem = queueMapper.getBedFirstQueueItemByStatus(createReqVO.getRoomId(), createReqVO.getBedNo(), QueueStatusEnum.INSTALLING.getStatus());
        bedInstallingQueueItem.setStatus(QueueStatusEnum.FINISH.getStatus());  // 默认状态 设置
        queueMapper.updateById( bedInstallingQueueItem );
@@ -430,8 +439,7 @@
        JobRecordDO jobRecordDO = jobRecordMapper.selectByRentIdDocId(rent_id, userId, jobTypeList);
        if (null == jobRecordDO) {
            List<DevRentDO>  devRentDOList = devRentMapper.selectByPatAndChecktypeAndState(createReqVO.getPatId(), createReqVO.getCheckType(), DevRentStateEnum.FREE.getState());
            if (devRentDOList.size() != 1)
                throw exception(ROUTINE_CHECK_EXIST);
            if (devRentDOList.size() != 1) throw exception(ROUTINE_CHECK_EXIST);
            rent_id = devRentDOList.getFirst().getId();
            createReqVO.setId( rent_id );
@@ -491,8 +499,7 @@
        JobRecordDO jobRecordDO = jobRecordMapper.selectByRentIdDocId(rent_id, userId, jobTypeList);
        if (null == jobRecordDO) {
            List<DevRentDO>  devRentDOList = devRentMapper.selectByPatAndChecktypeAndState(createReqVO.getPatId(), createReqVO.getCheckType(), DevRentStateEnum.FREE.getState());
            if (devRentDOList.size() != 1)
                throw exception(DEV_INSTALL_EXIST);
            if (devRentDOList.size() != 1) throw exception(DEV_INSTALL_EXIST);
            rent_id = devRentDOList.getFirst().getId();
            createReqVO.setId( rent_id );
@@ -552,8 +559,7 @@
        JobRecordDO jobRecordDO = jobRecordMapper.selectByRentIdDocId(rent_id, userId, jobTypeList);
        if (null == jobRecordDO) {
            List<DevRentDO>  devRentDOList = devRentMapper.selectByPatAndChecktypeAndState(createReqVO.getPatId(), createReqVO.getCheckType(), DevRentStateEnum.RECEIVED.getState());
            if (devRentDOList.size() != 1)
                throw exception(DEV_INSTALL_EXIST);
            if (devRentDOList.size() != 1) throw exception(DEV_INSTALL_EXIST);
            rent_id = devRentDOList.getFirst().getId();
            createReqVO.setId( rent_id );
@@ -597,13 +603,10 @@
        if (updateReqVO.getState() == DevStateEnum.DAMAGED.getState()) {
            devStateEnum = DevStateEnum.DAMAGED;
            devRentStateEnum = DevRentStateEnum.DAMAGED;
        }
        else if (updateReqVO.getState() == DevStateEnum.LOST.getState()) {
        } else if (updateReqVO.getState() == DevStateEnum.LOST.getState()) {
            devStateEnum = DevStateEnum.LOST;
            devRentStateEnum = DevRentStateEnum.LOST;
        }
        else
            throw exception(DEV_DISMANTLE_EXCEPTION);
        } else throw exception(DEV_DISMANTLE_EXCEPTION);
        // 设备遗失时, 标注遗失
        markDevDismantleException( updateReqVO.getDevId(), updateReqVO.getId(), updateReqVO.getReturnTime().toLocalDate(), devStateEnum );
@@ -735,34 +738,10 @@
            return 2;
        }
        PatDetails patDetails = devRentDO.getPatDetails();
        HisFeeConfirmReqBody hisFeeConfirmReqBody = new HisFeeConfirmReqBody();
        MsgHeader msgHeader = new MsgHeader();
        msgHeader.setMsgType("ODS_2212");
        msgHeader.setMsgVersion("3.0");
        msgHeader.setSender("ECG");
        hisFeeConfirmReqBody.setMsgHeader(msgHeader);
        Item item = new Item();
        item.setItemCode( getHisCheckCode(devRentDO.getCheckType()) ); //
        item.setItemStatus( isFeeConfirmOrCancel? "5" : "6" ); // 5 确费 6 取消确费
        item.setExeOrganization("47162057-2");
        item.setExeDeptName("心电科");
        item.setExeDept("心电科");
        item.setExeDoctor( hisId ); //
        item.setExeDoctorName( userNickname ); //
        item.setExeDateTime( getCurTimeString() ); //
        ExmRequest exmRequest = new ExmRequest();
        exmRequest.setAuthorOrganization("47162057-2");
        exmRequest.setRequestId( devRentDO.getApplyNo() );  //
        exmRequest.setPatientType( getPatientType(patDetails.getSource()) ); //
        exmRequest.setItem(item);
        hisFeeConfirmReqBody.setExmRequest(exmRequest);
        Integer returnValue = 1;
        try {
            HisFeeConfirmRespResult result = feeConfirmFeignService.httpFeeApi("UpdateExmRequestStatus", "ECG", "ECG", hisFeeConfirmReqBody);
            log.info( result.getMsgHeader().getStatus() );
            returnValue = result.getMsgHeader().getStatus().equals("true") ? 0 : 1;
            AppointmentDO appointmentDO = appointmentMapper.getByApplyNo(devRentDO.getApplyNo());
            returnValue = appointmentDO.getPaid() == 1 ? 0 : 1;
        } catch (RuntimeException ex) {
            returnValue = 1;
        }
@@ -791,8 +770,7 @@
    // 标记 设备已被使用
    private Integer markDevInUse(String devId, Long rentId) {
        DeviceDO deviceDO = deviceMapper.getDeviceByDevId(devId);
        if (null == deviceDO)
            return 0;
        if (null == deviceDO) return 0;
        if (DevStateEnum.RECEIVED.isEqual(deviceDO.getState()) && rentId.equals(deviceDO.getRentId())) {
            deviceDO.setState( DevStateEnum.INUSE.getState() );
@@ -838,8 +816,7 @@
    private void procAffinityWhenRoutineFinish(String patId, Integer[] affinityCheckTypes) {
        // 如果存在 [亲和-排队] 亲和项,则选择 其中一个亲和项 接替其 处于 [就诊中]
        List<QueueDO> affinityAffinityWaitingItems = queueMapper.getCurPatGivenCheckTypesAndStatus(
                                patId, affinityCheckTypes, QueueStatusEnum.AFFINITY.getStatus());
        List<QueueDO> affinityAffinityWaitingItems = queueMapper.getCurPatGivenCheckTypesAndStatus(patId, affinityCheckTypes, QueueStatusEnum.AFFINITY.getStatus());
        if (!affinityAffinityWaitingItems.isEmpty()) {
            QueueDO tmpQueueDO = affinityAffinityWaitingItems.get(0);
            tmpQueueDO.setStatus(QueueStatusEnum.ONSTAGE.getStatus());
@@ -852,10 +829,7 @@
     */
    private void procAffinityWhenReadyFinish(/*IN,OUT*/QueueDO bedOnStageQueueItem, Integer[] affinityCheckTypes) {
        // 如果存在 [安装中] [安装过号] [安装召回] 能被依附的检查项,则依附到其中一个检查项
        List<QueueDO> affinityInstallingItems = queueMapper.getCurPatGivenCheckTypesAndStatusList(
                bedOnStageQueueItem.getPatId(), affinityCheckTypes,
                List.of(QueueStatusEnum.INSTALLING.getStatus(), QueueStatusEnum.PASSED_INSTALL.getStatus(),
                        QueueStatusEnum.RECALLED_INSTALL.getStatus()));
        List<QueueDO> affinityInstallingItems = queueMapper.getCurPatGivenCheckTypesAndStatusList(bedOnStageQueueItem.getPatId(), affinityCheckTypes, List.of(QueueStatusEnum.INSTALLING.getStatus(), QueueStatusEnum.PASSED_INSTALL.getStatus(), QueueStatusEnum.RECALLED_INSTALL.getStatus()));
        if (!affinityInstallingItems.isEmpty()) {
            QueueDO affinityInstallingItem = affinityInstallingItems.get(0);
            bedOnStageQueueItem.setStatus(QueueStatusEnum.AFFINITY_INSTALL.getStatus()); // 亲和-领用
@@ -865,8 +839,7 @@
        }
        // 如果存在 [亲和-排队] 亲和项,则选择 其中一个亲和项 接替其 处于 [就诊中]
        List<QueueDO> affinityAffinityWaitingItems = queueMapper.getCurPatGivenCheckTypesAndStatus(
                bedOnStageQueueItem.getPatId(), affinityCheckTypes, QueueStatusEnum.AFFINITY.getStatus());
        List<QueueDO> affinityAffinityWaitingItems = queueMapper.getCurPatGivenCheckTypesAndStatus(bedOnStageQueueItem.getPatId(), affinityCheckTypes, QueueStatusEnum.AFFINITY.getStatus());
        if (!affinityAffinityWaitingItems.isEmpty()) {
            QueueDO tmpQueueDO = affinityAffinityWaitingItems.get(0);
            tmpQueueDO.setStatus(QueueStatusEnum.ONSTAGE.getStatus());
@@ -876,8 +849,7 @@
    // 如果存在 [亲和-领用] 亲和项,则选择 其中一个亲和项 接替其 处于 [安装中]
    private void procAffinityWhenInstallFinish(QueueDO bedInstallingQueueItem, Integer[] affinityCheckTypes) {
        List<QueueDO> affinityAffinityReceivedItems = queueMapper.getCurPatGivenCheckTypesAndStatus(
                bedInstallingQueueItem.getPatId(), affinityCheckTypes, QueueStatusEnum.AFFINITY_INSTALL.getStatus());
        List<QueueDO> affinityAffinityReceivedItems = queueMapper.getCurPatGivenCheckTypesAndStatus(bedInstallingQueueItem.getPatId(), affinityCheckTypes, QueueStatusEnum.AFFINITY_INSTALL.getStatus());
        if (!affinityAffinityReceivedItems.isEmpty()) {
            QueueDO tmpQueueDO = affinityAffinityReceivedItems.get(0);
            tmpQueueDO.setStatus(QueueStatusEnum.INSTALLING.getStatus());
@@ -888,47 +860,29 @@
    }
    private String getHisCheckCode(Integer checkType) {
        if (100 == checkType)
            return "691133607";
        else if (200 == checkType)
            return "201605";
        else if (300 == checkType)
            return "200327";
        else if (400 == checkType)
            return "201652";
        else if (500 == checkType)
            return "502490914";
        else if (600 == checkType)
            return "419562119";
        else if (700 == checkType)
            return "201604";
        else if (800 == checkType)
            return "1202042";
        else if (900 == checkType)
            return "1202058";
        else if (1000 == checkType)
            return "1202065";
        else if (1100 == checkType)
            return "559542128";
        else if (1200 == checkType)
            return "590244511";
        else if (1300 == checkType)
            return "666454217";
        else if (1400 == checkType)
            return "720791490";
        else if (1500 == checkType)
            return "720792077";
        if (100 == checkType) return "691133607";
        else if (200 == checkType) return "201605";
        else if (300 == checkType) return "200327";
        else if (400 == checkType) return "201652";
        else if (500 == checkType) return "502490914";
        else if (600 == checkType) return "419562119";
        else if (700 == checkType) return "201604";
        else if (800 == checkType) return "1202042";
        else if (900 == checkType) return "1202058";
        else if (1000 == checkType) return "1202065";
        else if (1100 == checkType) return "559542128";
        else if (1200 == checkType) return "590244511";
        else if (1300 == checkType) return "666454217";
        else if (1400 == checkType) return "720791490";
        else if (1500 == checkType) return "720792077";
        return "691133607";
    }
    String getPatientType( Integer patientSource ) {
        if (1 == patientSource || 2 == patientSource)
            return "01";
        else if (3 == patientSource)
            return "03";
        else if (4 == patientSource)
            return "04";
        if (1 == patientSource || 2 == patientSource) return "01";
        else if (3 == patientSource) return "03";
        else if (4 == patientSource) return "04";
        return "01";
    }