liusheng
2 天以前 eb3195e397b023cfae1ee4dea7fbc29f1271504f
代码提交
已添加2个文件
已修改11个文件
1387 ■■■■■ 文件已修改
jh-module-ecg/jh-module-ecg-api/src/main/java/cn/lihu/jh/module/ecg/enums/ErrorCodeConstants.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jh-module-ecg/jh-module-ecg-biz/pom.xml 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/appointment/vo/AppointmentSaveReqVO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/devrent/DevRentController.java 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/external/ExternalController.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/dataobject/appointment/AppointmentDO.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/mysql/appointment/AppointmentMapper.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/enums/HisCheckCodeEnum.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/appointment/AppointmentService.java 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/appointment/AppointmentServiceImpl.java 544 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/devrent/DevRentServiceImpl.java 510 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jh-server/src/main/resources/application-prod.yaml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
jh-server/src/main/resources/application.yaml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jh-module-ecg/jh-module-ecg-api/src/main/java/cn/lihu/jh/module/ecg/enums/ErrorCodeConstants.java
@@ -17,6 +17,9 @@
    ErrorCode APPOINTMENT_EXIST_TODAY = new ErrorCode(1_010_001_020, "当天预约已存在");
    ErrorCode APPOINTMENT_HAVE_QUEUED = new ErrorCode(1_010_001_030, "您已经在排队中了");
    ErrorCode APPOINTMENT_NOT_BILLING = new ErrorCode(1_010_001_040, "查询不到开单信息");
    ErrorCode APPOINTMENT_CREATE_FAIL = new ErrorCode(1_010_001_050, "申请单创建失败");
    ErrorCode APPOINTMENT_UPDATE_FAIL = new ErrorCode(1_010_001_060, "申请单更新失败");
    ErrorCode APPOINTMENT_STATUS_UPDATE_FAIL = new ErrorCode(1_010_001_070, "申请单状态更新");
    ErrorCode ROOM_NOT_EXISTS = new ErrorCode(1_010_002_000, "诊室和诊疗床不存在");
    ErrorCode ROOM_NOT_SIT = new ErrorCode(1_010_002_001, "请重新就座");
jh-module-ecg/jh-module-ecg-biz/pom.xml
@@ -146,6 +146,35 @@
            <scope>test</scope>
        </dependency>
        <!-- WebService相关依赖 -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>3.5.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>3.5.5</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.ws</groupId>
            <artifactId>jaxws-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>javax.jws</groupId>
            <artifactId>javax.jws-api</artifactId>
            <version>1.1</version>
        </dependency>
        <!-- Spring Boot é…ç½®å¤„理器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>
</project>
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/appointment/vo/AppointmentSaveReqVO.java
@@ -1,6 +1,7 @@
package cn.lihu.jh.module.ecg.controller.admin.appointment.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
@@ -21,6 +22,11 @@
    @Schema(description = "就诊流水号", example = "2024546")
    //@NotEmpty(message = "就诊流水号")
    private String episodeId;
    /**
     * æ‚£è€…来源类型  01问诊 02急诊 03体检 04住院
     */
    private Integer patSrc;
    @Schema(description = "患者编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "29034")
    @NotEmpty(message = "患者编号不能为空")
@@ -82,4 +88,7 @@
    @Schema(description = "已付款")
    private Integer paid;
    @TableField(exist = false)
    private String status;
}
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/devrent/DevRentController.java
@@ -1,8 +1,10 @@
package cn.lihu.jh.module.ecg.controller.admin.devrent;
import cn.lihu.jh.framework.security.core.util.SecurityFrameworkUtils;
import cn.lihu.jh.module.ecg.dal.dataobject.appointment.AppointmentDO;
import cn.lihu.jh.module.ecg.dal.dataobject.devmanage.DeviceDO;
import cn.lihu.jh.module.ecg.enums.DevStateEnum;
import cn.lihu.jh.module.ecg.service.appointment.AppointmentService;
import cn.lihu.jh.module.ecg.service.devmanage.DeviceService;
import cn.lihu.jh.module.ecg.service.queue.QueueService;
import lombok.extern.slf4j.Slf4j;
@@ -24,6 +26,7 @@
import cn.lihu.jh.framework.excel.core.util.ExcelUtils;
import cn.lihu.jh.framework.apilog.core.annotation.ApiAccessLog;
import static cn.lihu.jh.framework.apilog.core.enums.OperateTypeEnum.*;
import cn.lihu.jh.module.ecg.controller.admin.devrent.vo.*;
@@ -49,6 +52,9 @@
    @Resource
    private QueueService queueService;
    @Resource
    private AppointmentService appointmentService;
    // å¸¸è§„检查 å®Œæˆ
    @PostMapping("/routine-finish")
@@ -135,7 +141,7 @@
    @Operation(summary = "遗失")
    @PreAuthorize("@ss.hasPermission('ecg:doctor:task')")
    public CommonResult<Long> devLose(@Valid @RequestBody DevRentSaveReqVO loseReqVO) {
        loseReqVO.setState( DevStateEnum.LOST.getState() );
        loseReqVO.setState(DevStateEnum.LOST.getState());
        return devRentService.dismantleExceptionOperation(loseReqVO);
    }
@@ -143,7 +149,7 @@
    @Operation(summary = "损坏")
    @PreAuthorize("@ss.hasPermission('ecg:doctor:task')")
    public CommonResult<Long> devDamage(@Valid @RequestBody DevRentSaveReqVO damageReqVO) {
        damageReqVO.setState( DevStateEnum.DAMAGED.getState() );
        damageReqVO.setState(DevStateEnum.DAMAGED.getState());
        return devRentService.dismantleExceptionOperation(damageReqVO);
    }
@@ -180,7 +186,7 @@
        DevRentRespVO devRentRespVO = BeanUtils.toBean(devRent, DevRentRespVO.class);
        DeviceDO deviceDO = deviceService.getDevice( devRent.getDevId() );
        DeviceDO deviceDO = deviceService.getDevice(devRent.getDevId());
        if (null != deviceDO) {
            devRentRespVO.setCategory(deviceDO.getCategory());
            devRentRespVO.setBrand(deviceDO.getBrand());
@@ -202,21 +208,18 @@
    @Operation(summary = "导出装机拆机 Excel")
    @PreAuthorize("@ss.hasPermission('ecg:dev-rent:export')")
    @ApiAccessLog(operateType = EXPORT)
    public void exportDevRentExcel(@Valid DevRentPageReqVO pageReqVO,
              HttpServletResponse response) throws IOException {
    public void exportDevRentExcel(@Valid DevRentPageReqVO pageReqVO, HttpServletResponse response) throws IOException {
        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
        List<DevRentDO> list = devRentService.getDevRentPage(pageReqVO).getList();
        // å¯¼å‡º Excel
        ExcelUtils.write(response, "装机拆机.xls", "数据", DevRentRespVO.class,
                        BeanUtils.toBean(list, DevRentRespVO.class));
        ExcelUtils.write(response, "装机拆机.xls", "数据", DevRentRespVO.class, BeanUtils.toBean(list, DevRentRespVO.class));
    }
    @GetMapping("/get-free-rent")
    @Operation(summary = "根据患者或设备, èŽ·å–å·²é¢†å–ç§Ÿèµæƒ…å†µ")
    @PreAuthorize("@ss.hasPermission('ecg:doctor:task')")
    public CommonResult<DevRentRespVO> getFreeRent( @Valid DevRentSearchReqVO searchReqVO )
    {
        DevRentDO devRent = devRentService.getFreeRent( searchReqVO );
    public CommonResult<DevRentRespVO> getFreeRent(@Valid DevRentSearchReqVO searchReqVO) {
        DevRentDO devRent = devRentService.getFreeRent(searchReqVO);
        if (null == devRent) {
            return CommonResult.success(null);
        }
@@ -228,16 +231,15 @@
    @GetMapping("/get-ready-rent")
    @Operation(summary = "获取已领取租赁情况")
    @PreAuthorize("@ss.hasPermission('ecg:doctor:task')")
    public CommonResult<DevRentRespVO> getReadyRent( @Valid DevRentSearchReqVO searchReqVO )
    {
        DevRentDO devRent = devRentService.getReadyOrCancelledRent( searchReqVO );
    public CommonResult<DevRentRespVO> getReadyRent(@Valid DevRentSearchReqVO searchReqVO) {
        DevRentDO devRent = devRentService.getReadyOrCancelledRent(searchReqVO);
        if (null == devRent) {
            return CommonResult.success(null);
        }
        DevRentRespVO devRentRespVO = BeanUtils.toBean(devRent, DevRentRespVO.class);
        DeviceDO deviceDO = deviceService.getDevice( devRent.getDevId() );
        DeviceDO deviceDO = deviceService.getDevice(devRent.getDevId());
        if (null != deviceDO) {
            devRentRespVO.setCategory(deviceDO.getCategory());
            devRentRespVO.setBrand(deviceDO.getBrand());
@@ -250,39 +252,37 @@
    @GetMapping("/get-existing-rent")
    @Operation(summary = "获取已安装、已领用的租赁情况")
    @PreAuthorize("@ss.hasPermission('ecg:doctor:task')")
    public CommonResult<DevRentRespVO> getInstalledRent( @Valid DevRentSearchReqVO searchReqVO )
    {
        DevRentDO devRent = devRentService.getExistingRent( searchReqVO );
    public CommonResult<DevRentRespVO> getInstalledRent(@Valid DevRentSearchReqVO searchReqVO) {
        DevRentDO devRent = devRentService.getExistingRent(searchReqVO);
        if (null == devRent) {
            return CommonResult.success(null);
        }
        DeviceDO deviceDO = deviceService.getDevice( devRent.getDevId() );
        DeviceDO deviceDO = deviceService.getDevice(devRent.getDevId());
        DevRentRespVO devRentRespVO = BeanUtils.toBean(devRent, DevRentRespVO.class);
        devRentRespVO.setCategory( deviceDO.getCategory() );
        devRentRespVO.setBrand( deviceDO.getBrand() );
        devRentRespVO.setModel( deviceDO.getModel() );
        devRentRespVO.setDevState( devRent.getState() );
        devRentRespVO.setCategory(deviceDO.getCategory());
        devRentRespVO.setBrand(deviceDO.getBrand());
        devRentRespVO.setModel(deviceDO.getModel());
        devRentRespVO.setDevState(devRent.getState());
        return CommonResult.success(devRentRespVO);
    }
    @GetMapping("/get-dismantled-rent")
    @Operation(summary = "获取已拆卸租赁情况")
    @PreAuthorize("@ss.hasPermission('ecg:doctor:task')")
    public CommonResult<DevRentRespVO> getDismantledRent( @Valid DevRentSearchReqVO searchReqVO )
    {
        DevRentDO devRent = devRentService.getDismantledRent( searchReqVO );
    public CommonResult<DevRentRespVO> getDismantledRent(@Valid DevRentSearchReqVO searchReqVO) {
        DevRentDO devRent = devRentService.getDismantledRent(searchReqVO);
        if (null == devRent) {
            return CommonResult.success(null);
        }
        DeviceDO deviceDO = deviceService.getDevice( devRent.getDevId() );
        DeviceDO deviceDO = deviceService.getDevice(devRent.getDevId());
        DevRentRespVO devRentRespVO = BeanUtils.toBean(devRent, DevRentRespVO.class);
        devRentRespVO.setCategory( deviceDO.getCategory() );
        devRentRespVO.setBrand( deviceDO.getBrand() );
        devRentRespVO.setModel( deviceDO.getModel() );
        devRentRespVO.setCategory(deviceDO.getCategory());
        devRentRespVO.setBrand(deviceDO.getBrand());
        devRentRespVO.setModel(deviceDO.getModel());
        return CommonResult.success(devRentRespVO);
    }
@@ -296,8 +296,7 @@
        String userHisId = SecurityFrameworkUtils.getLoginUserHisId();
        Integer result = devRentService.feeConfirm(rentId, userHisId, userNickname, true);
        if (1 == result)
            return CommonResult.error(result, "确费失败");
        if (1 == result) return CommonResult.error(result, "确费失败");
        return CommonResult.success(result);
    }
@@ -312,8 +311,7 @@
        String userHisId = SecurityFrameworkUtils.getLoginUserHisId();
        Integer result = devRentService.feeConfirm(rentId, userHisId, userNickname, false);
        if (1 == result)
            return CommonResult.error(result, "取消确费失败");
        if (1 == result) return CommonResult.error(result, "取消确费失败");
        return CommonResult.success(result);
    }
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/external/ExternalController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,80 @@
package cn.lihu.jh.module.ecg.controller.admin.external;
import cn.lihu.jh.framework.common.pojo.CommonResult;
import cn.lihu.jh.module.ecg.enums.ActionTypeEnum;
import cn.lihu.jh.module.ecg.service.appointment.AppointmentService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.annotation.security.PermitAll;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Map;
import java.util.function.Consumer;
import static cn.lihu.jh.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.lihu.jh.framework.common.pojo.CommonResult.success;
import static cn.lihu.jh.module.ecg.enums.ErrorCodeConstants.APPOINTMENT_CREATE_FAIL;
@Tag(name = "供第三方调用接口")
@RestController
@RequestMapping("/ecg/external")
@Validated
@Slf4j
public class ExternalController {
    @Resource
    private AppointmentService appointmentService;
    /**
     * é€šç”¨æŽ¥å£
     * <p>
     * æ”¯æŒä»¥ä¸‹action类型:
     * - S0201ECG: é¢„约创建
     * - S0202ECG: é¢„约更新
     *
     * @param dataMap è¯·æ±‚数据
     * @param headers è¯·æ±‚头,必须包含action字段
     * @return å¤„理结果
     */
    @PermitAll
    @Operation(summary = "通用接口")
    @PostMapping("/generalInterface")
    public CommonResult<Boolean> generalInterface(
            @RequestBody @NotNull(message = "请求数据不能为空") Map<String, Object> dataMap,
            @RequestHeader @NotEmpty(message = "请求头不能为空") Map<String, String> headers) {
        log.info("[generalInterface][开始处理请求 action({}) dataMap({})]", headers.get("action"), dataMap);
        String actionType = headers.get("action");
        ActionTypeEnum action = ActionTypeEnum.getByType(actionType);
        if (action == null) {
            log.warn("[generalInterface][未知的action类型 action({})]", actionType);
            throw exception(APPOINTMENT_CREATE_FAIL);
        }
        try {
            // ä½¿ç”¨ç­–略模式处理不同的action
            Map<ActionTypeEnum, Consumer<Map<String, Object>>> actionHandlers = Map.of(
                    ActionTypeEnum.S0201ECG, appointmentService::handleAppointmentCreate,
                    ActionTypeEnum.S0202ECG, appointmentService::handleAppointmentUpdate,
                    ActionTypeEnum.S040501HIS, appointmentService::handleAppointmentStateUpdate,
                    ActionTypeEnum.S050401, appointmentService::handleCheckAppointmentUpdate,
                    ActionTypeEnum.S050501, appointmentService::handleCheckAppointmentUpdate
            );
            Consumer<Map<String, Object>> handler = actionHandlers.get(action);
            if (handler == null) {
                throw exception(APPOINTMENT_CREATE_FAIL);
            }
            handler.accept(dataMap);
            return success(true);
        } catch (Exception e) {
            throw exception(APPOINTMENT_CREATE_FAIL);
        }
    }
}
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/dataobject/appointment/AppointmentDO.java
@@ -11,6 +11,7 @@
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.lihu.jh.framework.mybatis.core.dataobject.BaseDO;
@@ -57,7 +58,7 @@
    private String patName;
    /**
     * æ‚£è€…性别
     *
     * <p>
     * æžšä¸¾ {@link TODO system_user_sex å¯¹åº”的类}
     */
    private Byte patGender;
@@ -115,7 +116,6 @@
    private LocalDateTime bookTime;
    /**
     * é¢„约检查类型
     *
     */
    private Integer bookCheckType;
    /**
@@ -137,4 +137,6 @@
    @TableField(exist = false)
    private Integer bookSeqNum;
}
    private String status;
}
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/mysql/appointment/AppointmentMapper.java
@@ -1,11 +1,11 @@
package cn.lihu.jh.module.ecg.dal.mysql.appointment;
import cn.lihu.jh.framework.common.pojo.PageResult;
import cn.lihu.jh.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.lihu.jh.framework.mybatis.core.mapper.BaseMapperX;
import cn.lihu.jh.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.lihu.jh.module.ecg.controller.admin.appointment.vo.AppointmentPageReqVO;
import cn.lihu.jh.module.ecg.dal.dataobject.appointment.AppointmentDO;
import org.apache.ibatis.annotations.Mapper;
import cn.lihu.jh.module.ecg.controller.admin.appointment.vo.*;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
@@ -21,12 +21,9 @@
public interface AppointmentMapper extends BaseMapperX<AppointmentDO> {
    default PageResult<AppointmentDO> selectPage(AppointmentPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<AppointmentDO>()
                .eqIfPresent(AppointmentDO::getApplyNo, reqVO.getApplyNo())
                .eqIfPresent(AppointmentDO::getEpisodeId, reqVO.getEpisodeId())
                .eqIfPresent(AppointmentDO::getPatId, reqVO.getPatId())
                .likeIfPresent(AppointmentDO::getPatName, reqVO.getPatName())
                .eqIfPresent(AppointmentDO::getPatName, reqVO.getPatName())
                .eqIfPresent(AppointmentDO::getPatGender, reqVO.getPatGender())
                .eqIfPresent(AppointmentDO::getPatBirthday, reqVO.getPatBirthday())
                .eqIfPresent(AppointmentDO::getPatMobile, reqVO.getPatMobile())
@@ -37,27 +34,25 @@
                .eqIfPresent(AppointmentDO::getPatDeptDesc, reqVO.getPatDeptDesc())
                .eqIfPresent(AppointmentDO::getPatWardCode, reqVO.getPatWardCode())
                .eqIfPresent(AppointmentDO::getPatWardDesc, reqVO.getPatWardDesc())
                .eqIfPresent(AppointmentDO::getPatBedNo, reqVO.getPatBedNo())
                .eqIfPresent(AppointmentDO::getBookDate, reqVO.getBookDate())
                .eqIfPresent(AppointmentDO::getBookTimeslot, reqVO.getBookTimeslot())
                .betweenIfPresent(AppointmentDO::getBookTime, reqVO.getBookTime())
                .eqIfPresent(AppointmentDO::getBookCheckType, reqVO.getBookCheckType())
                .eqIfPresent(AppointmentDO::getBookSrc, reqVO.getBookSrc())
                .eqIfPresent(AppointmentDO::getPaid, reqVO.getPaid())
                .orderByDesc(AppointmentDO::getId));
    }
/*
    @Select("select * from lihu.appointment where pat_id = #{patId} and to_days(book_date) = to_days(Now())")
    List<AppointmentDO> getCurrentPatId(@Param("patId") String patId);
*/
    List<AppointmentDO> getCurrentPatId(String patId);
    @Select("select * from lihu.appointment where pat_id = #{patId} and book_check_type = #{checkType} and to_days(book_date) = to_days(Now()) limit 1")
    AppointmentDO getCurrentByPatAndCheckType(@Param("patId") String patId, @Param("checkType") Integer checkType);
    @Select("select * from lihu.appointment where pat_id = #{patId} and book_check_type = #{checkType} and to_days(book_date) = to_days(#{book_date}) limit 1")
    AppointmentDO getByPatAndCheckTypeAndBookDate(@Param("patId") String patId, @Param("checkType") Integer checkType, @Param("book_date") LocalDate book_date);
    AppointmentDO getByPatAndCheckTypeAndBookDate(@Param("patId") String patId, @Param("checkType") Integer checkType);
    @Select("select * from lihu.appointment where episode_id = #{episodeId} and apply_no = #{applyNo} limit 1")
    AppointmentDO getByEpisodeIdAndApplyNo(@Param("episodeId") String episodeId, @Param("applyNo") String applyNo);
    @Select("select * from lihu.appointment where apply_no = #{applyNo} limit 1")
    AppointmentDO getByApplyNo(@Param("applyNo") String applyNo);
}
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/enums/HisCheckCodeEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
package cn.lihu.jh.module.ecg.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
 * His的Check_type类型枚举
 */
@Getter
@AllArgsConstructor
public enum HisCheckCodeEnum {
    Y691133607("691133607", "100"), Y201605("201605", "200"), Y200327("200327", "300"), Y201652("201652", "400"), Y502490914("502490914", "500"), Y419562119("419562119", "600"), Y201604("201604", "700"), Y1202042("1202042", "800"), Y1202058("1202058", "900"), Y1202065("1202065", "1000"), Y559542128("559542128", "1100"), Y590244511("590244511", "1200"), Y666454217("666454217", "1300"), Y720791490("720791490", "1400"), Y720792077("720792077", "1500");
    /**
     * ç±»åž‹
     */
    private final String code;
    /**
     * æè¿°
     */
    private final String value;
    /**
     * æ ¹æ®ç±»åž‹èŽ·å–æžšä¸¾
     *
     * @param type ç±»åž‹
     * @return æžšä¸¾
     */
    public static String getByCode(String code) {
        for (HisCheckCodeEnum value : values()) {
            if (value.getCode().equals(code)) {
                return value.getValue();
            }
        }
        return null;
    }
    /**
     * æ ¹æ®ç±»åž‹èŽ·å–æžšä¸¾
     *
     * @param val å€¼ç±»åž‹
     * @return æžšä¸¾
     */
    public static String getByValue(String val) {
        for (HisCheckCodeEnum value : values()) {
            if (value.getValue().equals(val)) {
                return value.getCode();
            }
        }
        return null;
    }
}
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/appointment/AppointmentService.java
@@ -1,11 +1,14 @@
package cn.lihu.jh.module.ecg.service.appointment;
import cn.lihu.jh.module.ecg.controller.admin.appointment.vo.*;
import cn.lihu.jh.module.ecg.dal.dataobject.appointment.AppointmentDO;
import cn.lihu.jh.framework.common.pojo.PageResult;
import cn.lihu.jh.module.ecg.controller.admin.appointment.vo.AppointmentConfirmReqVO;
import cn.lihu.jh.module.ecg.controller.admin.appointment.vo.AppointmentPageReqVO;
import cn.lihu.jh.module.ecg.controller.admin.appointment.vo.AppointmentSaveReqVO;
import cn.lihu.jh.module.ecg.dal.dataobject.appointment.AppointmentDO;
import javax.validation.Valid;
import java.util.List;
import java.util.Map;
/**
 * é¢„约 Service æŽ¥å£
@@ -44,6 +47,45 @@
     */
    AppointmentDO getAppointment(Long id);
    /**
     * èŽ·å¾—é¢„çº¦åˆ†é¡µ
     *
     * @param pageReqVO åˆ†é¡µæŸ¥è¯¢
     * @return é¢„约分页
     */
    PageResult<AppointmentDO> getAppointmentPage(AppointmentPageReqVO pageReqVO);
    /**
     * ç”³è¯·å•创建
     *
     * @param dataMap è¯·æ±‚数据
     * @return é¢„约编号
     */
    Long handleAppointmentCreate(Map<String, Object> dataMap);
    /**
     * ç”³è¯·å•æ›´æ–°
     *
     * @param dataMap è¯·æ±‚数据
     */
    void handleAppointmentUpdate(Map<String, Object> dataMap);
    /**
     * ç”³è¯·å•状态更新
     *
     * @param dataMap è¯·æ±‚数据
     */
    void handleAppointmentStateUpdate(Map<String, Object> dataMap);
    /**
     * å¤„理检查预约状态新增
     *
     * @param dataMap è¯·æ±‚数据
     */
    void handleCheckAppointmentUpdate(Map<String, Object> dataMap);
    /**
     * èŽ·å¾—å½“å¤©çš„é¢„çº¦ æ ¹æ®PatID and CheckType
     *
@@ -55,20 +97,14 @@
    /**
     * èŽ·å¾—é¢„çº¦
     *
     * @param patId ç¼–号
     * @param patCode ç¼–号
     * @return é¢„约
     */
    List<AppointmentDO> queryAndCreateAppointmentByPatId(String patCode);
    /**
     * èŽ·å¾—é¢„çº¦åˆ†é¡µ
     *
     * @param pageReqVO åˆ†é¡µæŸ¥è¯¢
     * @return é¢„约分页
     */
    PageResult<AppointmentDO> getAppointmentPage(AppointmentPageReqVO pageReqVO);
    List<AppointmentDO> getAppointmentExtermal(String patId);
    Integer appoitmentConfirm(AppointmentConfirmReqVO appointmentConfirmReqVO);
    public AppointmentDO getByApplyNo(String applyNo);
}
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/appointment/AppointmentServiceImpl.java
@@ -1,45 +1,39 @@
package cn.lihu.jh.module.ecg.service.appointment;
import cn.lihu.jh.framework.common.pojo.PageResult;
import cn.lihu.jh.framework.common.util.date.DateUtils;
import cn.lihu.jh.framework.common.util.date.LocalDateTimeUtils;
import cn.lihu.jh.framework.common.util.object.BeanUtils;
import cn.lihu.jh.module.ecg.controller.admin.appointment.vo.AppointmentConfirmReqVO;
import cn.lihu.jh.module.ecg.controller.admin.appointment.vo.AppointmentPageReqVO;
import cn.lihu.jh.module.ecg.controller.admin.appointment.vo.AppointmentSaveReqVO;
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.appointment.AppointmentDO;
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.enums.HisCheckCodeEnum;
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.apache.ibatis.annotations.Param;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import cn.lihu.jh.module.ecg.controller.admin.appointment.vo.*;
import cn.lihu.jh.module.ecg.dal.dataobject.appointment.AppointmentDO;
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.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.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
import java.util.Optional;
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;
import static cn.lihu.jh.module.ecg.enums.ErrorCodeConstants.*;
/**
@@ -71,8 +65,6 @@
    public Long createAppointment(AppointmentSaveReqVO createReqVO) {
        // æ’å…¥
        AppointmentDO appointment = BeanUtils.toBean(createReqVO, AppointmentDO.class);
        appointment.setBookTime( LocalDateTime.now() );
        try {
            appointmentMapper.insert(appointment);
@@ -114,7 +106,7 @@
    @Override
    public AppointmentDO getCurAppointmentByPatIdAndCheckType(String patId, Integer checkType) {
        AppointmentDO appointmentDO = appointmentMapper.getByPatAndCheckTypeAndBookDate( patId, checkType, LocalDate.now() );
        AppointmentDO appointmentDO = appointmentMapper.getByPatAndCheckTypeAndBookDate(patId, checkType);
        return appointmentDO;
    }
@@ -125,23 +117,22 @@
    @Override
    public List<AppointmentDO> queryAndCreateAppointmentByPatId(String patCode) {
        // ä»ŽåŒ»é™¢å¹³å°æŸ¥è¯¢
        List<AppointmentDO> appointmentExtermalList = getAppointmentExtermal( patCode );
        List<AppointmentDO> appointmentExtermalList = getAppointmentExtermal(patCode);
        for ( int appointmentIndex = 0; appointmentIndex < appointmentExtermalList.size(); appointmentIndex++ ) {
        for (int appointmentIndex = 0; appointmentIndex < appointmentExtermalList.size(); appointmentIndex++) {
            AppointmentDO appointmentExtermal = appointmentExtermalList.get(appointmentIndex);
            if (null == appointmentExtermal )
                continue;
            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
                appointmentExtermal.setId(appointmentDO.getId()); // ç¡®ä¿ è¿”回值包含 appointment id
                // å¤„理第一次确认时还没有预约时间,再来确认时已有预约时间的情况
                if (appointmentDO.getBookDate() != appointmentExtermal.getBookDate()) {
                    appointmentMapper.updateById( appointmentExtermal );
                    appointmentMapper.updateById(appointmentExtermal);
                }
            }
        }
@@ -170,74 +161,77 @@
    @Override
    public List<AppointmentDO> getAppointmentExtermal(String patId) {
        List<AppointmentDO> curAppointDOList = new ArrayList<AppointmentDO>();
        RestApiReqBodyVo reqBodyVo = new RestApiReqBodyVo();
        if (18 == patId.length()) {
            reqBodyVo.setSfzh( patId );
        } else {
            reqBodyVo.setMzzyh(patId);
        }
        // QueryRisReportList   queryEcgRequest
        RestApiResult<AppointmentExternal> result = remoteDataService.httpApi("queryEcgRequest", "ECG", "ECG", reqBodyVo);
        if (0 == result.getRow().size()) {
            return curAppointDOList;
        }
        for (int appointIndex=0; appointIndex < result.getRow().size(); appointIndex++ ) {
            AppointmentExternal appointmentExternal = result.getRow().get( appointIndex );
            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 );
            // å…‰å¼€å•的情况,没有预约时间
            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;
        return appointmentMapper.getCurrentPatId(patId);
    }
//    @Override
//    public List<AppointmentDO> getAppointmentExtermal(String patId) {
//        List<AppointmentDO> curAppointDOList = new ArrayList<AppointmentDO>();
//
//        RestApiReqBodyVo reqBodyVo = new RestApiReqBodyVo();
//        if (18 == patId.length()) {
//            reqBodyVo.setSfzh( patId );
//        } else {
//            reqBodyVo.setMzzyh(patId);
//        }
//
//        // QueryRisReportList   queryEcgRequest
//        RestApiResult<AppointmentExternal> result = remoteDataService.httpApi("queryEcgRequest", "ECG", "ECG", reqBodyVo);
//        if (0 == result.getRow().size()) {
//            return curAppointDOList;
//        }
//
//        for (int appointIndex=0; appointIndex < result.getRow().size(); appointIndex++ ) {
//            AppointmentExternal appointmentExternal = result.getRow().get( appointIndex );
//
//            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 );
//
//            // å…‰å¼€å•的情况,没有预约时间
//            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 Integer appoitmentConfirm(AppointmentConfirmReqVO confirmReqVO) {
        AppointmentDO appointment = getAppointment(confirmReqVO.getId());
        if (null == appointment)
            throw exception(PATIENT_NOT_EXISTS);
        if (null == appointment) throw exception(PATIENT_NOT_EXISTS);
        // æ‰‹åŠ¨é¢„çº¦ï¼Œç›´æŽ¥è®¾ç½®é¢„çº¦æ—¥æœŸä¸ºå½“å¤©
        if (confirmReqVO.getIsVip() == 1) {
            appointment.setBookDate( LocalDate.now() );
            appointment.setBookDate(LocalDate.now());
        }
        if ( !DateUtils.isToday(appointment.getBookDate()) )
            throw exception( APPOINTMENT_NOT_TODAY);
        if (!DateUtils.isToday(appointment.getBookDate())) throw exception(APPOINTMENT_NOT_TODAY);
        Integer newSeqNo = null;
@@ -249,20 +243,20 @@
        try {
            QueueSaveReqVO queueSaveReqVO = new QueueSaveReqVO();
            queueSaveReqVO.setApplyNo( appointment.getApplyNo() );
            queueSaveReqVO.setEpisodeId( appointment.getEpisodeId() );
            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( confirmReqVO.getBookTimeslot() ); /*appointment.getBookTimeslot()*/
            queueSaveReqVO.setBookTimeslot(confirmReqVO.getBookTimeslot()); /*appointment.getBookTimeslot()*/
            queueSaveReqVO.setBookCheckType(appointment.getBookCheckType());
            queueSaveReqVO.setBookSeqNum( newSeqNo );
            queueSaveReqVO.setIsVip( confirmReqVO.getIsVip() );
            queueSaveReqVO.setBookSeqNum(newSeqNo);
            queueSaveReqVO.setIsVip(confirmReqVO.getIsVip());
            queueSaveReqVO.setPassed((byte) 0);
            queueSaveReqVO.setExpired((byte) 0);
            queueSaveReqVO.setPatDetails( getPatDetails(appointment) );
            queueSaveReqVO.setPatDetails(getPatDetails(appointment));
            queueService.queue(queueSaveReqVO);
        } catch (DuplicateKeyException duplicateKeyException) {
            throw exception(APPOINTMENT_HAVE_QUEUED);
@@ -271,67 +265,321 @@
        return newSeqNo;
    }
    private Integer getCorrespondingCheckType(String strPlanDefItemcode) {
        if (strPlanDefItemcode.equals("691133607"))
            return 100;
        else if (strPlanDefItemcode.equals("201605"))
            return 200;
        else if (strPlanDefItemcode.equals("200327"))
            return 300;
        else if (strPlanDefItemcode.equals("201652"))
            return 400;
        else if (strPlanDefItemcode.equals("502490914"))
            return 500;
        else if (strPlanDefItemcode.equals("419562119"))
            return 600;
        else if (strPlanDefItemcode.equals("201604"))
            return 700;
        else if (strPlanDefItemcode.equals("1202042"))
            return 800;
        else if (strPlanDefItemcode.equals("1202058"))
            return 900;
        else if (strPlanDefItemcode.equals("1202065"))
            return 1000;
        else if (strPlanDefItemcode.equals("559542128"))
            return 1100;
        else if (strPlanDefItemcode.equals("590244511"))
            return 1200;
        else if (strPlanDefItemcode.equals("666454217"))
            return 1300;
        else if (strPlanDefItemcode.equals("720791490"))
            return 1400;
        else if (strPlanDefItemcode.equals("720792077"))
            return 1500;
        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.setAppointmentId( appointment.getId() );
        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() );
        patDetails.setAppointmentId(appointment.getId());
        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;
    }
    @Override
    public Long handleAppointmentCreate(Map<String, Object> dataMap) {
        if (dataMap == null) {
            throw exception(APPOINTMENT_CREATE_FAIL);
        }
        try {
            // åˆ›å»ºAppointmentDO对象
            AppointmentDO appointment = new AppointmentDO();
            // ä»ŽdataMap中提取数据
            Map<String, Object> encounter = extractEncounter(dataMap);
            if (encounter == null) {
                throw exception(APPOINTMENT_CREATE_FAIL);
            }
            // è®¾ç½®å°±è¯Šæµæ°´å·
            Optional.ofNullable(encounter.get("id")).map(id -> (Map<String, Object>) id).map(id -> (List<?>) id.get("item")).filter(items -> items.size() > 1).map(items -> (Map<String, Object>) items.get(1)).map(item -> (String) item.get("extension")).ifPresent(appointment::setEpisodeId);
            Optional.ofNullable(encounter.get("location")).map(location -> (Map<String, Object>) location).map(location -> (Map<String, Object>) location.get("serviceDeliveryLocation")).map(serviceDeliveryLocation -> (Map<String, Object>) serviceDeliveryLocation.get("location")).map(location -> (Map<String, Object>) location.get("id")).map(id -> (Map<String, Object>) id.get("item")).map(item -> (String) item.get("extension")).ifPresent(appointment::setPatBedNo);
            // è®¾ç½®æ‚£è€…来源类型
            Optional.ofNullable(encounter.get("code")).map(code -> (Map<String, Object>) code).map(code -> (String) code.get("code")).map(Integer::parseInt).ifPresent(appointment::setPatSrc);
            // è®¾ç½®æ‚£è€…信息
            Optional.ofNullable(encounter.get("subject")).map(subject -> (Map<String, Object>) subject).map(subject -> (Map<String, Object>) subject.get("patient")).map(patient -> (Map<String, Object>) patient.get("patientPerson")).ifPresent(patientPerson -> {
                // è®¾ç½®æ‚£è€…ID
                Optional.ofNullable(encounter.get("subject")).map(subject -> (Map<String, Object>) subject).map(subject -> (Map<String, Object>) subject.get("patient")).map(patient -> (Map<String, Object>) patient.get("id")).map(id -> (Map<String, Object>) id).map(id -> (List<?>) id.get("item")).filter(items -> items.size() > 1).map(items -> (Map<String, Object>) items.get(1)).map(item -> (String) item.get("extension")).ifPresent(appointment::setPatId);
                // è®¾ç½®æ‚£è€…姓名
                Optional.ofNullable(patientPerson.get("name")).map(name -> (Map<String, Object>) name).map(name -> (Map<String, Object>) name.get("item")).map(item -> (Map<String, Object>) item.get("part")).map(part -> (String) part.get("value")).ifPresent(appointment::setPatName);
                // è®¾ç½®æ‚£è€…手机和电话
                Optional.ofNullable(patientPerson.get("telecom")).map(telecom -> (Map<String, Object>) telecom).map(telecom -> (Map<String, Object>) telecom.get("item")).map(item -> (String) item.get("value")).ifPresent(phone -> {
                    appointment.setPatMobile(phone);
                    appointment.setPatPhone(phone);
                });
                // è®¾ç½®æ‚£è€…性别
                Optional.ofNullable(patientPerson.get("administrativeGenderCode")).map(genderCode -> (Map<String, Object>) genderCode).map(genderCode -> (String) genderCode.get("code")).map(Byte::parseByte).ifPresent(appointment::setPatGender);
                // è®¾ç½®æ‚£è€…生日
                Optional.ofNullable(patientPerson.get("birthTime")).map(birthTime -> (Map<String, Object>) birthTime).map(birthTime -> (String) birthTime.get("value")).map(birthdayStr -> LocalDate.parse(birthdayStr, DateTimeFormatter.ofPattern("yyyyMMdd"))).ifPresent(appointment::setPatBirthday);
                // è®¾ç½®æ‚£è€…地址
                Optional.ofNullable(patientPerson.get("addr")).map(addr -> (Map<String, Object>) addr).map(addr -> (Map<String, Object>) addr.get("item")).map(item -> (Map<String, Object>) item.get("part")).map(part -> (String) part.get("value")).ifPresent(appointment::setPatAddr);
                // è®¾ç½®æ‚£è€…身份证号
                Optional.ofNullable(patientPerson.get("id")).map(id -> (Map<String, Object>) id).map(id -> (List<?>) id.get("item")).filter(items -> !items.isEmpty()).map(items -> (Map<String, Object>) items.get(0)).map(item -> (String) item.get("extension")).ifPresent(appointment::setPatIdentityId);
            });
            // è®¾ç½®ç§‘室和病区信息
            Optional.ofNullable(encounter.get("location")).map(location -> (Map<String, Object>) location).map(location -> (Map<String, Object>) location.get("serviceDeliveryLocation")).map(location -> (Map<String, Object>) location.get("serviceProviderOrganization")).ifPresent(org -> {
                // è®¾ç½®ç§‘室代码和名称
                Optional.ofNullable(org.get("id")).map(id -> (Map<String, Object>) id).map(id -> (Map<String, Object>) id.get("item")).map(item -> (String) item.get("extension")).ifPresent(appointment::setPatDeptCode);
                Optional.ofNullable(org.get("name")).map(name -> (Map<String, Object>) name).map(name -> (Map<String, Object>) name.get("item")).map(item -> (Map<String, Object>) item.get("part")).map(part -> (String) part.get("value")).ifPresent(appointment::setPatDeptDesc);
                // è®¾ç½®ç—…区代码和名称
                Optional.ofNullable(org.get("asOrganizationPartOf")).map(wardOrg -> (Map<String, Object>) wardOrg).map(wardOrg -> (Map<String, Object>) wardOrg.get("wholeOrganization")).ifPresent(wardOrg -> {
                    Optional.ofNullable(wardOrg.get("id")).map(id -> (Map<String, Object>) id).map(id -> (Map<String, Object>) id.get("item")).map(item -> (String) item.get("extension")).ifPresent(appointment::setPatWardCode);
                    Optional.ofNullable(wardOrg.get("name")).map(name -> (Map<String, Object>) name).map(name -> (Map<String, Object>) name.get("item")).map(item -> (Map<String, Object>) item.get("part")).map(part -> (String) part.get("value")).ifPresent(appointment::setPatWardDesc);
                });
            });
            // è®¾ç½®æ”¯ä»˜çŠ¶æ€
            Optional.ofNullable(dataMap.get("controlActProcess")).map(controlActProcess -> (Map<String, Object>) controlActProcess).map(controlActProcess -> (Map<String, Object>) controlActProcess.get("subject")).map(subject -> (Map<String, Object>) subject.get("observationRequest")).map(observationRequest -> (Map<String, Object>) observationRequest.get("zdy")).map(zdy -> {
                Object payStatus = zdy.get("PayStatus");
                if (payStatus != null) {
                    try {
                        return Integer.parseInt(payStatus.toString());
                    } catch (NumberFormatException e) {
                        log.warn("PayStatus转换失败: {}", payStatus);
                        return null;
                    }
                }
                return null;
            }).ifPresent(appointment::setPaid);
            // è®¾ç½®ç”³è¯·å•号
            Optional.ofNullable(dataMap.get("controlActProcess")).map(controlActProcess -> (Map<String, Object>) controlActProcess).map(controlActProcess -> (Map<String, Object>) controlActProcess.get("subject")).map(subject -> (Map<String, Object>) subject.get("observationRequest")).map(observationRequest -> (Map<String, Object>) observationRequest.get("id")).map(id -> (Map<String, Object>) id.get("item")).map(item -> (String) item.get("extension")).ifPresent(appointment::setApplyNo);
            //设置检查类型
//            String checkType = Optional.ofNullable(dataMap.get("controlActProcess")).map(controlActProcess -> (Map<String, Object>) controlActProcess).map(controlActProcess -> (Map<String, Object>) controlActProcess.get("component2")).map(component2 -> (Map<String, Object>) component2.get("observationRequest")).map(observationRequest -> (Map<String, Object>) observationRequest.get("code")).map(code -> (String) code.get("code")).orElseThrow(() -> exception(APPOINTMENT_CREATE_FAIL));
            String checkType = Optional.ofNullable(dataMap.get("controlActProcess")).map(controlActProcess -> (Map<String, Object>) controlActProcess).map(controlActProcess -> (Map<String, Object>) controlActProcess.get("subject")).map(subject -> (Map<String, Object>) subject.get("observationRequest")).map(observationRequest -> (Map<String, Object>) observationRequest.get("component2")).map(component2 -> (Map<String, Object>) component2.get("observationRequest")).map(observationRequest -> (Map<String, Object>) observationRequest.get("code")).map(code -> (String) code.get("code")).orElseThrow(() -> exception(APPOINTMENT_CREATE_FAIL));
            if (checkType != null || checkType != "")
                appointment.setBookCheckType(Integer.valueOf(HisCheckCodeEnum.getByCode(checkType.substring(1))));
            // å°†AppointmentDO转换为AppointmentSaveReqVO并保存
            AppointmentSaveReqVO saveReqVO = BeanUtils.toBean(appointment, AppointmentSaveReqVO.class);
            return createAppointment(saveReqVO);
        } catch (Exception e) {
            log.error("[handleAppointmentCreate][处理预约创建失败 dataMap({})]", dataMap, e);
            throw exception(APPOINTMENT_CREATE_FAIL);
        }
    }
    @Override
    public void handleAppointmentUpdate(Map<String, Object> dataMap) {
        if (dataMap == null) {
            throw exception(APPOINTMENT_UPDATE_FAIL);
        }
        try {
            // ä»ŽdataMap中提取申请单号
            String applyNo = Optional.ofNullable(dataMap.get("controlActProcess")).map(controlActProcess -> (Map<String, Object>) controlActProcess).map(controlActProcess -> (Map<String, Object>) controlActProcess.get("subject")).map(subject -> (Map<String, Object>) subject.get("observationRequest")).map(observationRequest -> (Map<String, Object>) observationRequest.get("id")).map(id -> (Map<String, Object>) id.get("item")).map(item -> (String) item.get("extension")).orElseThrow(() -> exception(APPOINTMENT_CREATE_FAIL));
            // æŸ¥è¯¢çŽ°æœ‰é¢„çº¦è®°å½•
            AppointmentDO existingAppointment = appointmentMapper.getByApplyNo(applyNo);
            // å¦‚果记录不存在,则调用handleAppointmentCreate进行新增
            if (existingAppointment == null) {
                handleAppointmentCreate(dataMap);
                return;
            }
            // ä»ŽdataMap中提取数据
            Map<String, Object> encounter = extractEncounter(dataMap);
            if (encounter == null) {
                throw exception(APPOINTMENT_CREATE_FAIL);
            }
            // æ›´æ–°å°±è¯Šæµæ°´å·
            Optional.ofNullable(encounter.get("id")).map(id -> (Map<String, Object>) id).map(id -> (List<?>) id.get("item")).filter(items -> items.size() > 1).map(items -> (Map<String, Object>) items.get(1)).map(item -> (String) item.get("extension")).ifPresent(existingAppointment::setEpisodeId);
            // è®¾ç½®åºŠä½å·
            Optional.ofNullable(encounter.get("location")).map(location -> (Map<String, Object>) location).map(location -> (Map<String, Object>) location.get("serviceDeliveryLocation")).map(serviceDeliveryLocation -> (Map<String, Object>) serviceDeliveryLocation.get("location")).map(location -> (Map<String, Object>) location.get("id")).map(id -> (Map<String, Object>) id.get("item")).map(item -> (String) item.get("extension")).ifPresent(existingAppointment::setPatBedNo);
            // æ›´æ–°æ‚£è€…来源类型
            Optional.ofNullable(encounter.get("code")).map(code -> (Map<String, Object>) code).map(code -> (String) code.get("code")).map(Integer::parseInt).ifPresent(existingAppointment::setPatSrc);
            // æ›´æ–°æ‚£è€…信息
            Optional.ofNullable(encounter.get("subject")).map(subject -> (Map<String, Object>) subject).map(subject -> (Map<String, Object>) subject.get("patient")).map(patient -> (Map<String, Object>) patient.get("patientPerson")).ifPresent(patientPerson -> {
                // æ›´æ–°æ‚£è€…ID
                Optional.ofNullable(encounter.get("subject")).map(subject -> (Map<String, Object>) subject).map(subject -> (Map<String, Object>) subject.get("patient")).map(patient -> (Map<String, Object>) patient.get("id")).map(id -> (Map<String, Object>) id).map(id -> (List<?>) id.get("item")).filter(items -> items.size() > 1).map(items -> (Map<String, Object>) items.get(1)).map(item -> (String) item.get("extension")).ifPresent(existingAppointment::setPatId);
                // æ›´æ–°æ‚£è€…姓名
                Optional.ofNullable(patientPerson.get("name")).map(name -> (Map<String, Object>) name).map(name -> (Map<String, Object>) name.get("item")).map(item -> (Map<String, Object>) item.get("part")).map(part -> (String) part.get("value")).ifPresent(existingAppointment::setPatName);
                // æ›´æ–°æ‚£è€…手机和电话
                Optional.ofNullable(patientPerson.get("telecom")).map(telecom -> (Map<String, Object>) telecom).map(telecom -> (Map<String, Object>) telecom.get("item")).map(item -> (String) item.get("value")).ifPresent(phone -> {
                    existingAppointment.setPatMobile(phone);
                    existingAppointment.setPatPhone(phone);
                });
                // æ›´æ–°æ‚£è€…性别
                Optional.ofNullable(patientPerson.get("administrativeGenderCode")).map(genderCode -> (Map<String, Object>) genderCode).map(genderCode -> (String) genderCode.get("code")).map(Byte::parseByte).ifPresent(existingAppointment::setPatGender);
                // æ›´æ–°æ‚£è€…生日
                Optional.ofNullable(patientPerson.get("birthTime")).map(birthTime -> (Map<String, Object>) birthTime).map(birthTime -> (String) birthTime.get("value")).map(birthdayStr -> LocalDate.parse(birthdayStr, DateTimeFormatter.ofPattern("yyyyMMdd"))).ifPresent(existingAppointment::setPatBirthday);
                // æ›´æ–°æ‚£è€…地址
                Optional.ofNullable(patientPerson.get("addr")).map(addr -> (Map<String, Object>) addr).map(addr -> (Map<String, Object>) addr.get("item")).map(item -> (Map<String, Object>) item.get("part")).map(part -> (String) part.get("value")).ifPresent(existingAppointment::setPatAddr);
                // æ›´æ–°æ‚£è€…身份证号
                Optional.ofNullable(patientPerson.get("id")).map(id -> (Map<String, Object>) id).map(id -> (List<?>) id.get("item")).filter(items -> !items.isEmpty()).map(items -> (Map<String, Object>) items.get(0)).map(item -> (String) item.get("extension")).ifPresent(existingAppointment::setPatIdentityId);
            });
            // æ›´æ–°ç§‘室和病区信息
            Optional.ofNullable(encounter.get("location")).map(location -> (Map<String, Object>) location).map(location -> (Map<String, Object>) location.get("serviceDeliveryLocation")).map(location -> (Map<String, Object>) location.get("serviceProviderOrganization")).ifPresent(org -> {
                // æ›´æ–°ç§‘室代码和名称
                Optional.ofNullable(org.get("id")).map(id -> (Map<String, Object>) id).map(id -> (Map<String, Object>) id.get("item")).map(item -> (String) item.get("extension")).ifPresent(existingAppointment::setPatDeptCode);
                Optional.ofNullable(org.get("name")).map(name -> (Map<String, Object>) name).map(name -> (Map<String, Object>) name.get("item")).map(item -> (Map<String, Object>) item.get("part")).map(part -> (String) part.get("value")).ifPresent(existingAppointment::setPatDeptDesc);
                // æ›´æ–°ç—…区代码和名称
                Optional.ofNullable(org.get("asOrganizationPartOf")).map(wardOrg -> (Map<String, Object>) wardOrg).map(wardOrg -> (Map<String, Object>) wardOrg.get("wholeOrganization")).ifPresent(wardOrg -> {
                    Optional.ofNullable(wardOrg.get("id")).map(id -> (Map<String, Object>) id).map(id -> (Map<String, Object>) id.get("item")).map(item -> (String) item.get("extension")).ifPresent(existingAppointment::setPatWardCode);
                    Optional.ofNullable(wardOrg.get("name")).map(name -> (Map<String, Object>) name).map(name -> (Map<String, Object>) name.get("item")).map(item -> (Map<String, Object>) item.get("part")).map(part -> (String) part.get("value")).ifPresent(existingAppointment::setPatWardDesc);
                });
            });
            // æ›´æ–°æ”¯ä»˜çŠ¶æ€
            Optional.ofNullable(dataMap.get("controlActProcess")).map(controlActProcess -> (Map<String, Object>) controlActProcess).map(controlActProcess -> (Map<String, Object>) controlActProcess.get("subject")).map(subject -> (Map<String, Object>) subject.get("observationRequest")).map(observationRequest -> (Map<String, Object>) observationRequest.get("zdy")).map(zdy -> {
                Object payStatus = zdy.get("PayStatus");
                if (payStatus != null) {
                    try {
                        return Integer.parseInt(payStatus.toString());
                    } catch (NumberFormatException e) {
                        log.warn("PayStatus转换失败: {}", payStatus);
                        return null;
                    }
                }
                return null;
            }).ifPresent(existingAppointment::setPaid);
            //设置检查类型
            String checkType = Optional.ofNullable(dataMap.get("controlActProcess")).map(controlActProcess -> (Map<String, Object>) controlActProcess).map(controlActProcess -> (Map<String, Object>) controlActProcess.get("subject")).map(subject -> (Map<String, Object>) subject.get("observationRequest")).map(observationRequest -> (Map<String, Object>) observationRequest.get("component2")).map(component2 -> (Map<String, Object>) component2.get("observationRequest")).map(observationRequest -> (Map<String, Object>) observationRequest.get("code")).map(code -> (String) code.get("code")).orElseThrow(() -> exception(APPOINTMENT_CREATE_FAIL));
            if (checkType != null || checkType != "")
                existingAppointment.setBookCheckType(Integer.valueOf(HisCheckCodeEnum.getByCode(checkType.substring(1))));
            // å°†AppointmentDO转换为AppointmentSaveReqVO并更新
            AppointmentSaveReqVO updateReqVO = BeanUtils.toBean(existingAppointment, AppointmentSaveReqVO.class);
            updateAppointment(updateReqVO);
        } catch (Exception e) {
            log.error("[handleAppointmentUpdate][申请单更新失败 dataMap({})]", dataMap, e);
            throw exception(APPOINTMENT_UPDATE_FAIL);
        }
    }
    @Override
    public void handleAppointmentStateUpdate(Map<String, Object> dataMap) {
        if (dataMap == null) {
            throw exception(APPOINTMENT_STATUS_UPDATE_FAIL);
        }
        // ä»ŽdataMap中提取申请单号
        String applyNo = Optional.ofNullable(dataMap.get("controlActProcess")).map(controlActProcess -> (Map<String, Object>) controlActProcess).map(controlActProcess -> (Map<String, Object>) controlActProcess.get("subject")).map(subject -> (Map<String, Object>) subject.get("placerGroup")).map(placerGroup -> (Map<String, Object>) placerGroup.get("component2")).map(component2 -> (Map<String, Object>) component2.get("observationRequest")).map(observationRequest -> (Map<String, Object>) observationRequest.get("id")).map(id -> (Map<String, Object>) id.get("item")).map(item -> (String) item.get("extension")).orElseThrow(() -> exception(APPOINTMENT_CREATE_FAIL));
        // æŸ¥è¯¢çŽ°æœ‰é¢„çº¦è®°å½•
        AppointmentDO existingAppointment = appointmentMapper.getByApplyNo(applyNo);
        // å¦‚果记录不存在,则调用handleAppointmentCreate进行新增
        if (existingAppointment == null) {
            handleAppointmentCreate(dataMap);
            return;
        }
        // ä»ŽdataMap中提取申请单号
        String status = Optional.ofNullable(dataMap.get("controlActProcess")).map(controlActProcess -> (Map<String, Object>) controlActProcess).map(controlActProcess -> (Map<String, Object>) controlActProcess.get("subject")).map(subject -> (Map<String, Object>) subject.get("placerGroup")).map(placerGroup -> (Map<String, Object>) placerGroup.get("component2")).map(component2 -> (Map<String, Object>) component2.get("observationRequest")).map(observationRequest -> (Map<String, Object>) observationRequest.get("component1")).map(component1 -> (Map<String, Object>) component1.get("processStep")).map(processStep -> (Map<String, Object>) processStep.get("code")).map(code -> (Map<String, Object>) code.get("displayName")).map(displayName -> (String) displayName.get("value")).orElseThrow(() -> exception(APPOINTMENT_CREATE_FAIL));
        existingAppointment.setStatus(status);
        // å°†AppointmentDO转换为AppointmentSaveReqVO并更新
        AppointmentSaveReqVO updateReqVO = BeanUtils.toBean(existingAppointment, AppointmentSaveReqVO.class);
        updateAppointment(updateReqVO);
    }
    /**
     * ä»ŽdataMap中提取encounter数据
     */
    private Map<String, Object> extractEncounter(Map<String, Object> dataMap) {
        return Optional.ofNullable(dataMap.get("controlActProcess")).map(controlActProcess -> (Map<String, Object>) controlActProcess).map(controlActProcess -> (Map<String, Object>) controlActProcess.get("subject")).map(subject -> (Map<String, Object>) subject.get("observationRequest")).map(observationRequest -> (Map<String, Object>) observationRequest.get("componentOf1")).map(componentOf1 -> (Map<String, Object>) componentOf1.get("encounter")).orElse(null);
    }
    @Override
    public void handleCheckAppointmentUpdate(Map<String, Object> dataMap) {
        // ä»ŽdataMap中获取controlActProcess
        Map<String, Object> controlActProcess = (Map<String, Object>) dataMap.get("controlActProcess");
        Map<String, Object> subject = (Map<String, Object>) controlActProcess.get("subject");
        Map<String, Object> actAppointment = (Map<String, Object>) subject.get("actAppointment");
        // èŽ·å–ç”³è¯·ç¼–å·
        List<Map<String, Object>> referencedOrders = (List<Map<String, Object>>) actAppointment.get("referencedOrder");
        String applyNo = null;
        if (!CollectionUtils.isEmpty(referencedOrders)) {
            Map<String, Object> actOrder = (Map<String, Object>) referencedOrders.get(0).get("actOrder");
            Map<String, Object> id = (Map<String, Object>) actOrder.get("id");
            applyNo = (String) id.get("extension");
        }
        if (applyNo == null) {
            log.warn("[handleCheckAppointmentUpdate][未找到申请编号]");
            return;
        }
        // æ ¹æ®applyNo查询预约记录
        AppointmentDO appointment = appointmentMapper.getByApplyNo(applyNo);
        if (appointment == null) {
            log.warn("[handleCheckAppointmentUpdate][未找到预约记录 applyNo({})]", applyNo);
            return;
        }
        // èŽ·å–é¢„çº¦æ—¶é—´
        Map<String, Object> effectiveTime = (Map<String, Object>) actAppointment.get("effectiveTime");
        Map<String, Object> any = (Map<String, Object>) effectiveTime.get("any");
        String bookTimeStr = (String) any.get("value");
        // èŽ·å–é¢„çº¦æ¥æº
        Map<String, Object> code = (Map<String, Object>) actAppointment.get("code");
        String bookSrc = (String) code.get("code");
        // è§£æžé¢„约时间
        LocalDateTime bookTime = LocalDateTime.parse(bookTimeStr, DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
        LocalDate bookDate = bookTime.toLocalDate();
        // èŽ·å–æ—¶é—´æ®µ
        String timeRange = (String) ((Map<String, Object>) actAppointment.get("ZDY")).get("time");
        String[] time1 = timeRange.split(" ");
        String[] times = time1[1].split("-");
        String startTime = times[0].trim();
        String endTime = times[1].trim();
        // è½¬æ¢æ—¶é—´æ®µæ ¼å¼ä¸ºhhmmhhmm
        int bookTimeslot = Integer.parseInt(startTime.replace(":", "")) * 10000 + Integer.parseInt(endTime.replace(":", ""));
        // æ›´æ–°é¢„约信息
        appointment.setBookDate(bookDate);
        appointment.setBookTimeslot(bookTimeslot);
        appointment.setBookTime(bookTime);
        appointment.setBookSrc(Integer.parseInt(bookSrc));
        // ä¿å­˜æ›´æ–°
        appointmentMapper.updateById(appointment);
    }
    public AppointmentDO getByApplyNo(String applyNo) {
        return appointmentMapper.getByApplyNo(applyNo);
    }
}
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) {
@@ -90,21 +96,20 @@
        Long rent_id = createReqVO.getId();
        List<Integer> jobTypeList = new ArrayList<Integer>();
        jobTypeList.add( DevRentStateEnum.ROUTINE_FINISH.getState());
        jobTypeList.add( DevRentStateEnum.ROUTINE_CANCELLED.getState());
        jobTypeList.add(DevRentStateEnum.ROUTINE_FINISH.getState());
        jobTypeList.add(DevRentStateEnum.ROUTINE_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);
            List<DevRentDO> devRentDOList = devRentMapper.selectByPatAndChecktypeAndState(createReqVO.getPatId(), createReqVO.getCheckType(), DevRentStateEnum.FREE.getState());
            if (devRentDOList.size() == 0) throw exception(DEV_INSTALL_NOT_APPOINTMENT);
            else if (devRentDOList.size() != 1) {
                throw  exception(DEV_INSTALL_EXCEPTION);
                throw exception(DEV_INSTALL_EXCEPTION);
            }
            rent_id = devRentDOList.getFirst().getId();
            createReqVO.setId( rent_id );
            createReqVO.setState( DevRentStateEnum.ROUTINE_FINISH.getState() );
            updateDevRent( createReqVO );
            createReqVO.setId(rent_id);
            createReqVO.setState(DevRentStateEnum.ROUTINE_FINISH.getState());
            updateDevRent(createReqVO);
            JobRecordSaveReqVO jobRecordSaveReqVO = new JobRecordSaveReqVO();
            jobRecordSaveReqVO.setRentId(rent_id);
@@ -114,21 +119,21 @@
            jobRecordSaveReqVO.setPatId(createReqVO.getPatId());
            jobRecordSaveReqVO.setPatName(createReqVO.getPatName());
            jobRecordSaveReqVO.setJobTime(createReqVO.getRentTime());
            jobRecordSaveReqVO.setJobType( DevRentStateEnum.ROUTINE_FINISH.getState() );
            jobRecordSaveReqVO.setJobType(DevRentStateEnum.ROUTINE_FINISH.getState());
            jobRecordSaveReqVO.setRemark(createReqVO.getRemark());
            jobRecordSaveReqVO.setSummary("");
            jobRecordSaveReqVO.setCheckType( createReqVO.getCheckType() );
            jobRecordSaveReqVO.setCheckType(createReqVO.getCheckType());
            JobRecordDO jobRecord = BeanUtils.toBean(jobRecordSaveReqVO, JobRecordDO.class);
            jobRecordMapper.insert(jobRecord);
        } else {
            // æ’¤é”€ æ”¾å¼ƒæ“ä½œ
            createReqVO.setState( DevRentStateEnum.ROUTINE_FINISH.getState() );
            createReqVO.setState(DevRentStateEnum.ROUTINE_FINISH.getState());
            updateDevRent( createReqVO );
            updateDevRent(createReqVO);
            jobRecordDO.setDevId(createReqVO.getDevId());
            jobRecordDO.setJobType( DevRentStateEnum.ROUTINE_FINISH.getState() );
            jobRecordDO.setJobType(DevRentStateEnum.ROUTINE_FINISH.getState());
            jobRecordDO.setJobTime(createReqVO.getRentTime());
            jobRecordDO.setRemark(createReqVO.getRemark());
            jobRecordDO.setUpdater(String.valueOf(userId));
@@ -140,16 +145,15 @@
        //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 );
        queueMapper.updateById(firstOnStageQueueItem);
        // æ£€æŸ¥é¡¹ç›®.亲和性 å¤„理逻辑
        CheckTypeDO checkTypeDO = queueServiceTxFunctions.getCheckTypeItem( firstOnStageQueueItem.getBookCheckType() );
        CheckTypeDO checkTypeDO = queueServiceTxFunctions.getCheckTypeItem(firstOnStageQueueItem.getBookCheckType());
        if (checkTypeDO.getAffinityCheckTypes().length > 0) {
            procAffinityWhenRoutineFinish( firstOnStageQueueItem.getPatId(), checkTypeDO.getAffinityCheckTypes() );
            procAffinityWhenRoutineFinish(firstOnStageQueueItem.getPatId(), checkTypeDO.getAffinityCheckTypes());
        }
        return CommonResult.success(rent_id);
@@ -157,6 +161,7 @@
    /**
     * é¢†ç”¨å®Œæˆ æ“ä½œ
     *
     * @param createReqVO åˆ›å»ºä¿¡æ¯
     * @return
     */
@@ -175,22 +180,29 @@
            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());
        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);
            List<DevRentDO> devRentDOList = devRentMapper.selectByPatAndChecktypeAndState(createReqVO.getPatId(), createReqVO.getCheckType(), DevRentStateEnum.FREE.getState());
            if (devRentDOList.size() == 0) throw exception(DEV_INSTALL_NOT_APPOINTMENT);
            else if (devRentDOList.size() != 1) {
                throw exception(DEV_INSTALL_EXCEPTION);
            }
            rent_id = devRentDOList.getFirst().getId();
            createReqVO.setId( rent_id );
            createReqVO.setState( DevRentStateEnum.RECEIVED.getState() );
            updateDevRent( createReqVO );
            createReqVO.setId(rent_id);
            createReqVO.setState(DevRentStateEnum.RECEIVED.getState());
            updateDevRent(createReqVO);
            JobRecordSaveReqVO jobRecordSaveReqVO = new JobRecordSaveReqVO();
            jobRecordSaveReqVO.setRentId(rent_id);
@@ -200,21 +212,21 @@
            jobRecordSaveReqVO.setPatId(createReqVO.getPatId());
            jobRecordSaveReqVO.setPatName(createReqVO.getPatName());
            jobRecordSaveReqVO.setJobTime(createReqVO.getRentTime());
            jobRecordSaveReqVO.setJobType( DevRentStateEnum.RECEIVED.getState() );
            jobRecordSaveReqVO.setJobType(DevRentStateEnum.RECEIVED.getState());
            jobRecordSaveReqVO.setRemark(createReqVO.getRemark());
            jobRecordSaveReqVO.setSummary("");
            jobRecordSaveReqVO.setCheckType( createReqVO.getCheckType() );
            jobRecordSaveReqVO.setCheckType(createReqVO.getCheckType());
            JobRecordDO jobRecord = BeanUtils.toBean(jobRecordSaveReqVO, JobRecordDO.class);
            jobRecordMapper.insert(jobRecord);
        } else {
            // æ’¤é”€ æ”¾å¼ƒæ“ä½œ
            createReqVO.setState( DevRentStateEnum.RECEIVED.getState() );
            createReqVO.setState(DevRentStateEnum.RECEIVED.getState());
            updateDevRent( createReqVO );
            updateDevRent(createReqVO);
            jobRecordDO.setDevId(createReqVO.getDevId());
            jobRecordDO.setJobType( DevRentStateEnum.RECEIVED.getState() );
            jobRecordDO.setJobType(DevRentStateEnum.RECEIVED.getState());
            jobRecordDO.setJobTime(createReqVO.getRentTime());
            jobRecordDO.setRemark(createReqVO.getRemark());
            jobRecordDO.setUpdater(String.valueOf(userId));
@@ -227,18 +239,17 @@
        //        QueueStatusEnum.ONSTAGE.getStatus(), QueueStatusEnum.RECEIVED.getStatus());
        // QueueStatusEnum.ONSTAGE  =>  QueueStatusEnum.RECEIVED
        QueueDO bedOnStageQueueItem = queueMapper.getBedFirstQueueItemByStatus(
                createReqVO.getRoomId(), createReqVO.getBedNo(), QueueStatusEnum.ONSTAGE.getStatus() );
        CheckTypeDO checkTypeDO = queueServiceTxFunctions.getCheckTypeItem( bedOnStageQueueItem.getBookCheckType() );
        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 ); // äº²å’Œæ ‡è®° æ¸…除,在安装阶段重新亲和
        bedOnStageQueueItem.setAffinityItem(0); // äº²å’Œæ ‡è®° æ¸…除,在安装阶段重新亲和
        // æ£€æŸ¥é¡¹ç›®.亲和性 å¤„理逻辑 , æ›´æ–° bedOnStageQueueItem
        if (checkTypeDO.getAffinityCheckTypes().length > 0) {
            procAffinityWhenReadyFinish(/*IN, OUT*/bedOnStageQueueItem, checkTypeDO.getAffinityCheckTypes());
        }
        queueMapper.updateById( bedOnStageQueueItem );
        queueMapper.updateById(bedOnStageQueueItem);
        return CommonResult.success(rent_id);
    }
@@ -252,7 +263,7 @@
        DevRentDO devRentDO = getDevRent(rent_id);
        // å¯¹äºŽå·²æœ‰é¢†ç”¨ï¼Œä½†æ˜¯è£…机时使用的不是已领用设备,报错
        if ( null != devRentDO.getDevId() && !createReqVO.getDevId().equals(devRentDO.getDevId()) ) {
        if (null != devRentDO.getDevId() && !createReqVO.getDevId().equals(devRentDO.getDevId())) {
            throw exception(DEVICE_NOT_PAT_RECEIVED);
        }
@@ -264,23 +275,22 @@
        // æ£€æŸ¥ job_record ç”¨äºŽç¡®è®¤æ˜¯å¦æ˜¯ç¬¬ä¸€æ¬¡å®‰è£…操作
        List<Integer> jobTypeList = new ArrayList<Integer>();
        jobTypeList.add( DevRentStateEnum.INSTALLED.getState());
        jobTypeList.add( DevRentStateEnum.INSTALL_CANCELLED.getState());
        jobTypeList.add(DevRentStateEnum.INSTALLED.getState());
        jobTypeList.add(DevRentStateEnum.INSTALL_CANCELLED.getState());
        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() == 0)
                throw exception(DEV_INSTALL_NOT_RECEIVED);
            List<DevRentDO> devRentDOList = devRentMapper.selectByPatAndChecktypeAndState(createReqVO.getPatId(), createReqVO.getCheckType(), DevRentStateEnum.RECEIVED.getState());
            if (devRentDOList.size() == 0) throw exception(DEV_INSTALL_NOT_RECEIVED);
            else if (devRentDOList.size() != 1) {
                throw exception(DEV_INSTALL_EXCEPTION);
            }
            rent_id = devRentDOList.getFirst().getId();
            createReqVO.setId( rent_id );
            createReqVO.setState( DevRentStateEnum.INSTALLED.getState() );
            updateDevRent( createReqVO );
            createReqVO.setId(rent_id);
            createReqVO.setState(DevRentStateEnum.INSTALLED.getState());
            updateDevRent(createReqVO);
            JobRecordSaveReqVO jobRecordSaveReqVO = new JobRecordSaveReqVO();
            jobRecordSaveReqVO.setRentId(rent_id);
@@ -290,20 +300,20 @@
            jobRecordSaveReqVO.setPatId(createReqVO.getPatId());
            jobRecordSaveReqVO.setPatName(createReqVO.getPatName());
            jobRecordSaveReqVO.setJobTime(createReqVO.getRentTime());
            jobRecordSaveReqVO.setJobType( DevRentStateEnum.INSTALLED.getState() );
            jobRecordSaveReqVO.setJobType(DevRentStateEnum.INSTALLED.getState());
            jobRecordSaveReqVO.setRemark(createReqVO.getRemark());
            jobRecordSaveReqVO.setSummary("");
            jobRecordSaveReqVO.setCheckType( createReqVO.getCheckType() );
            jobRecordSaveReqVO.setCheckType(createReqVO.getCheckType());
            JobRecordDO jobRecord = BeanUtils.toBean(jobRecordSaveReqVO, JobRecordDO.class);
            jobRecordMapper.insert(jobRecord);
        } else {
            // æ’¤é”€ æ”¾å¼ƒæ“ä½œ
            createReqVO.setState( DevRentStateEnum.INSTALLED.getState() );
            updateDevRent( createReqVO );
            createReqVO.setState(DevRentStateEnum.INSTALLED.getState());
            updateDevRent(createReqVO);
            jobRecordDO.setDevId(createReqVO.getDevId());
            jobRecordDO.setJobType( DevRentStateEnum.INSTALLED.getState() );
            jobRecordDO.setJobType(DevRentStateEnum.INSTALLED.getState());
            jobRecordDO.setJobTime(createReqVO.getRentTime());
            jobRecordDO.setRemark(createReqVO.getRemark());
            jobRecordDO.setUpdater(String.valueOf(userId));
@@ -316,13 +326,12 @@
        //        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 );
        queueMapper.updateById(bedInstallingQueueItem);
        // æ£€æŸ¥é¡¹ç›®.亲和性 å¤„理逻辑
        CheckTypeDO checkTypeDO = queueServiceTxFunctions.getCheckTypeItem( bedInstallingQueueItem.getBookCheckType() );
        CheckTypeDO checkTypeDO = queueServiceTxFunctions.getCheckTypeItem(bedInstallingQueueItem.getBookCheckType());
        if (checkTypeDO.getAffinityCheckTypes().length > 0) {
            procAffinityWhenInstallFinish(bedInstallingQueueItem, checkTypeDO.getAffinityCheckTypes());
        }
@@ -333,41 +342,41 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long dismantleOperation(DevRentSaveReqVO updateReqVO) {
        updateReqVO.setState( DevRentStateEnum.DISMANTLED.getState() );
        updateDevRent( updateReqVO );
        updateReqVO.setState(DevRentStateEnum.DISMANTLED.getState());
        updateDevRent(updateReqVO);
        Long rentId = updateReqVO.getId();
        Long userId = SecurityFrameworkUtils.getLoginUserId();
        String userNickname = SecurityFrameworkUtils.getLoginUserNickname();
        // è®¾å¤‡æ¢å¤åˆ°ç©ºé—²
        markDevFree( updateReqVO.getDevId(), rentId );
        markDevFree(updateReqVO.getDevId(), rentId);
        List<Integer> jobTypeList = new ArrayList<Integer>();
        jobTypeList.add( DevRentStateEnum.DISMANTLED.getState());
        jobTypeList.add(DevRentStateEnum.DISMANTLED.getState());
        JobRecordDO jobRecordDO = jobRecordMapper.selectByRentIdDocId(updateReqVO.getId(), userId, jobTypeList);
        if (null == jobRecordDO) {
            JobRecordSaveReqVO jobRecordSaveReqVO = new JobRecordSaveReqVO();
            jobRecordSaveReqVO.setRentId( updateReqVO.getId() );
            jobRecordSaveReqVO.setDevId( updateReqVO.getDevId() );
            jobRecordSaveReqVO.setDocId( userId );
            jobRecordSaveReqVO.setDocName( userNickname );
            jobRecordSaveReqVO.setPatId( updateReqVO.getPatId() );
            jobRecordSaveReqVO.setPatName( updateReqVO.getPatName() );
            jobRecordSaveReqVO.setJobTime( updateReqVO.getReturnTime() );
            jobRecordSaveReqVO.setJobType( DevRentStateEnum.DISMANTLED.getState() );
            jobRecordSaveReqVO.setRemark( updateReqVO.getRemark() );
            jobRecordSaveReqVO.setSummary( updateReqVO.getInterference() + " " + updateReqVO.getBaseline() + " " + updateReqVO.getDetachment() );
            jobRecordSaveReqVO.setCheckType( updateReqVO.getCheckType() );
            jobRecordSaveReqVO.setRentId(updateReqVO.getId());
            jobRecordSaveReqVO.setDevId(updateReqVO.getDevId());
            jobRecordSaveReqVO.setDocId(userId);
            jobRecordSaveReqVO.setDocName(userNickname);
            jobRecordSaveReqVO.setPatId(updateReqVO.getPatId());
            jobRecordSaveReqVO.setPatName(updateReqVO.getPatName());
            jobRecordSaveReqVO.setJobTime(updateReqVO.getReturnTime());
            jobRecordSaveReqVO.setJobType(DevRentStateEnum.DISMANTLED.getState());
            jobRecordSaveReqVO.setRemark(updateReqVO.getRemark());
            jobRecordSaveReqVO.setSummary(updateReqVO.getInterference() + " " + updateReqVO.getBaseline() + " " + updateReqVO.getDetachment());
            jobRecordSaveReqVO.setCheckType(updateReqVO.getCheckType());
            JobRecordDO jobRecord = BeanUtils.toBean(jobRecordSaveReqVO, JobRecordDO.class);
            jobRecordMapper.insert(jobRecord);
        } else {
            jobRecordDO.setJobType( DevRentStateEnum.DISMANTLED.getState() );
            jobRecordDO.setJobTime( updateReqVO.getReturnTime() );
            jobRecordDO.setRemark( updateReqVO.getRemark() );
            jobRecordDO.setSummary( updateReqVO.getInterference() + " " + updateReqVO.getBaseline() + " " + updateReqVO.getDetachment() );
            jobRecordDO.setUpdater( String.valueOf(userId) );
            jobRecordDO.setUpdateTime( LocalDateTime.now() );
            jobRecordDO.setJobType(DevRentStateEnum.DISMANTLED.getState());
            jobRecordDO.setJobTime(updateReqVO.getReturnTime());
            jobRecordDO.setRemark(updateReqVO.getRemark());
            jobRecordDO.setSummary(updateReqVO.getInterference() + " " + updateReqVO.getBaseline() + " " + updateReqVO.getDetachment());
            jobRecordDO.setUpdater(String.valueOf(userId));
            jobRecordDO.setUpdateTime(LocalDateTime.now());
            jobRecordMapper.updateById(jobRecordDO);
        }
        return updateReqVO.getId();
@@ -376,36 +385,36 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long dataEntryOperation(DevRentSaveReqVO updateReqVO) {
        updateReqVO.setState( DevRentStateEnum.DATAENTERED.getState() );
        updateDevRent( updateReqVO );
        updateReqVO.setState(DevRentStateEnum.DATAENTERED.getState());
        updateDevRent(updateReqVO);
        Long userId = SecurityFrameworkUtils.getLoginUserId();
        String userNickname = SecurityFrameworkUtils.getLoginUserNickname();
        List<Integer> jobTypeList = new ArrayList<Integer>();
        jobTypeList.add( DevRentStateEnum.DATAENTERED.getState());
        jobTypeList.add(DevRentStateEnum.DATAENTERED.getState());
        JobRecordDO jobRecordDO = jobRecordMapper.selectByRentIdDocId(updateReqVO.getId(), userId, jobTypeList);
        if (null == jobRecordDO) {
            JobRecordSaveReqVO jobRecordSaveReqVO = new JobRecordSaveReqVO();
            jobRecordSaveReqVO.setRentId( updateReqVO.getId() );
            jobRecordSaveReqVO.setDevId( updateReqVO.getDevId() );
            jobRecordSaveReqVO.setDocId( userId );
            jobRecordSaveReqVO.setDocName( userNickname );
            jobRecordSaveReqVO.setPatId( updateReqVO.getPatId() );
            jobRecordSaveReqVO.setPatName( updateReqVO.getPatName() );
            jobRecordSaveReqVO.setJobTime( updateReqVO.getEntryTime() );
            jobRecordSaveReqVO.setJobType( DevRentStateEnum.DATAENTERED.getState() );
            jobRecordSaveReqVO.setRemark( updateReqVO.getRemark() );
            jobRecordSaveReqVO.setSummary( updateReqVO.getInterference() + " " + updateReqVO.getBaseline() + " " + updateReqVO.getDetachment() );
            jobRecordSaveReqVO.setCheckType( updateReqVO.getCheckType() );
            jobRecordSaveReqVO.setRentId(updateReqVO.getId());
            jobRecordSaveReqVO.setDevId(updateReqVO.getDevId());
            jobRecordSaveReqVO.setDocId(userId);
            jobRecordSaveReqVO.setDocName(userNickname);
            jobRecordSaveReqVO.setPatId(updateReqVO.getPatId());
            jobRecordSaveReqVO.setPatName(updateReqVO.getPatName());
            jobRecordSaveReqVO.setJobTime(updateReqVO.getEntryTime());
            jobRecordSaveReqVO.setJobType(DevRentStateEnum.DATAENTERED.getState());
            jobRecordSaveReqVO.setRemark(updateReqVO.getRemark());
            jobRecordSaveReqVO.setSummary(updateReqVO.getInterference() + " " + updateReqVO.getBaseline() + " " + updateReqVO.getDetachment());
            jobRecordSaveReqVO.setCheckType(updateReqVO.getCheckType());
            JobRecordDO jobRecord = BeanUtils.toBean(jobRecordSaveReqVO, JobRecordDO.class);
            jobRecordMapper.insert(jobRecord);
        } else {
            jobRecordDO.setJobType( DevRentStateEnum.DATAENTERED.getState() );
            jobRecordDO.setJobTime( updateReqVO.getEntryTime() );
            jobRecordDO.setRemark( updateReqVO.getRemark() );
            jobRecordDO.setSummary( updateReqVO.getInterference() + " " + updateReqVO.getBaseline() + " " + updateReqVO.getDetachment() );
            jobRecordDO.setUpdater( String.valueOf(userId) );
            jobRecordDO.setJobType(DevRentStateEnum.DATAENTERED.getState());
            jobRecordDO.setJobTime(updateReqVO.getEntryTime());
            jobRecordDO.setRemark(updateReqVO.getRemark());
            jobRecordDO.setSummary(updateReqVO.getInterference() + " " + updateReqVO.getBaseline() + " " + updateReqVO.getDetachment());
            jobRecordDO.setUpdater(String.valueOf(userId));
            jobRecordMapper.updateById(jobRecordDO);
        }
        return updateReqVO.getId();
@@ -420,23 +429,22 @@
        DevRentSaveReqVO createReqVO = BeanUtils.toBean(cancelReqVO, DevRentSaveReqVO.class);
        createReqVO.setDevId(null);
        createReqVO.setState( DevRentStateEnum.ROUTINE_CANCELLED.getState());
        createReqVO.setState(DevRentStateEnum.ROUTINE_CANCELLED.getState());
        Long rent_id = createReqVO.getId();
        List<Integer> jobTypeList = new ArrayList<Integer>();
        jobTypeList.add( DevRentStateEnum.ROUTINE_FINISH.getState());
        jobTypeList.add( DevRentStateEnum.ROUTINE_CANCELLED.getState());
        jobTypeList.add(DevRentStateEnum.ROUTINE_FINISH.getState());
        jobTypeList.add(DevRentStateEnum.ROUTINE_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() != 1)
                throw exception(ROUTINE_CHECK_EXIST);
            List<DevRentDO> devRentDOList = devRentMapper.selectByPatAndChecktypeAndState(createReqVO.getPatId(), createReqVO.getCheckType(), DevRentStateEnum.FREE.getState());
            if (devRentDOList.size() != 1) throw exception(ROUTINE_CHECK_EXIST);
            rent_id = devRentDOList.getFirst().getId();
            createReqVO.setId( rent_id );
            createReqVO.setState( DevRentStateEnum.ROUTINE_CANCELLED.getState() );
            updateDevRent( createReqVO );
            createReqVO.setId(rent_id);
            createReqVO.setState(DevRentStateEnum.ROUTINE_CANCELLED.getState());
            updateDevRent(createReqVO);
            JobRecordSaveReqVO jobRecordSaveReqVO = new JobRecordSaveReqVO();
            jobRecordSaveReqVO.setRentId(rent_id);
@@ -445,16 +453,16 @@
            jobRecordSaveReqVO.setDocName(userNickname);
            jobRecordSaveReqVO.setPatId(createReqVO.getPatId());
            jobRecordSaveReqVO.setPatName(createReqVO.getPatName());
            jobRecordSaveReqVO.setJobType( DevRentStateEnum.ROUTINE_CANCELLED.getState() );
            jobRecordSaveReqVO.setJobType(DevRentStateEnum.ROUTINE_CANCELLED.getState());
            jobRecordSaveReqVO.setJobTime(createReqVO.getRentTime());
            jobRecordSaveReqVO.setRemark(createReqVO.getRemark());
            jobRecordSaveReqVO.setSummary("");
            jobRecordSaveReqVO.setCheckType( createReqVO.getCheckType() );
            jobRecordSaveReqVO.setCheckType(createReqVO.getCheckType());
            JobRecordDO jobRecord = BeanUtils.toBean(jobRecordSaveReqVO, JobRecordDO.class);
            jobRecordMapper.insert(jobRecord);
        } else {
            updateDevRent( createReqVO );
            updateDevRent(createReqVO);
            jobRecordDO.setDevId(null);
            jobRecordDO.setJobType(DevRentStateEnum.ROUTINE_CANCELLED.getState());
@@ -476,28 +484,27 @@
        // è‹¥ä»Ž è£…机 æ”¹ä¸º å–消装机,恢复设备状态
        if (null != cancelReqVO.getDevId()) {
            markDevFree( cancelReqVO.getDevId(),  rentId );
            markDevFree(cancelReqVO.getDevId(), rentId);
        }
        DevRentSaveReqVO createReqVO = BeanUtils.toBean(cancelReqVO, DevRentSaveReqVO.class);
        createReqVO.setDevId(null);
        createReqVO.setState( DevRentStateEnum.RECEIVED_CANCELLED.getState());
        createReqVO.setState(DevRentStateEnum.RECEIVED_CANCELLED.getState());
        Long rent_id = createReqVO.getId();
        List<Integer> jobTypeList = new ArrayList<Integer>();
        jobTypeList.add( DevRentStateEnum.RECEIVED.getState());
        jobTypeList.add( DevRentStateEnum.RECEIVED_CANCELLED.getState());
        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() != 1)
                throw exception(DEV_INSTALL_EXIST);
            List<DevRentDO> devRentDOList = devRentMapper.selectByPatAndChecktypeAndState(createReqVO.getPatId(), createReqVO.getCheckType(), DevRentStateEnum.FREE.getState());
            if (devRentDOList.size() != 1) throw exception(DEV_INSTALL_EXIST);
            rent_id = devRentDOList.getFirst().getId();
            createReqVO.setId( rent_id );
            createReqVO.setState( DevRentStateEnum.RECEIVED_CANCELLED.getState() );
            updateDevRent( createReqVO );
            createReqVO.setId(rent_id);
            createReqVO.setState(DevRentStateEnum.RECEIVED_CANCELLED.getState());
            updateDevRent(createReqVO);
            JobRecordSaveReqVO jobRecordSaveReqVO = new JobRecordSaveReqVO();
            jobRecordSaveReqVO.setRentId(rent_id);
@@ -506,16 +513,16 @@
            jobRecordSaveReqVO.setDocName(userNickname);
            jobRecordSaveReqVO.setPatId(createReqVO.getPatId());
            jobRecordSaveReqVO.setPatName(createReqVO.getPatName());
            jobRecordSaveReqVO.setJobType( DevRentStateEnum.RECEIVED_CANCELLED.getState() );
            jobRecordSaveReqVO.setJobType(DevRentStateEnum.RECEIVED_CANCELLED.getState());
            jobRecordSaveReqVO.setJobTime(createReqVO.getRentTime());
            jobRecordSaveReqVO.setRemark(createReqVO.getRemark());
            jobRecordSaveReqVO.setSummary("");
            jobRecordSaveReqVO.setCheckType( createReqVO.getCheckType() );
            jobRecordSaveReqVO.setCheckType(createReqVO.getCheckType());
            JobRecordDO jobRecord = BeanUtils.toBean(jobRecordSaveReqVO, JobRecordDO.class);
            jobRecordMapper.insert(jobRecord);
        } else {
            updateDevRent( createReqVO );
            updateDevRent(createReqVO);
            jobRecordDO.setDevId(null);
            jobRecordDO.setJobType(DevRentStateEnum.RECEIVED_CANCELLED.getState());
@@ -537,28 +544,27 @@
        // è‹¥ä»Ž è£…机 æ”¹ä¸º å–消装机,恢复设备状态
        if (null != cancelReqVO.getDevId()) {
            markDevFree( cancelReqVO.getDevId(), rentId );
            markDevFree(cancelReqVO.getDevId(), rentId);
        }
        DevRentSaveReqVO createReqVO = BeanUtils.toBean(cancelReqVO, DevRentSaveReqVO.class);
        createReqVO.setDevId(null);
        createReqVO.setState( DevRentStateEnum.INSTALL_CANCELLED.getState() );
        createReqVO.setState(DevRentStateEnum.INSTALL_CANCELLED.getState());
        Long rent_id = createReqVO.getId();
        List<Integer> jobTypeList = new ArrayList<Integer>();
        jobTypeList.add( DevRentStateEnum.INSTALLED.getState());
        jobTypeList.add( DevRentStateEnum.INSTALL_CANCELLED.getState());
        jobTypeList.add(DevRentStateEnum.INSTALLED.getState());
        jobTypeList.add(DevRentStateEnum.INSTALL_CANCELLED.getState());
        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);
            List<DevRentDO> devRentDOList = devRentMapper.selectByPatAndChecktypeAndState(createReqVO.getPatId(), createReqVO.getCheckType(), DevRentStateEnum.RECEIVED.getState());
            if (devRentDOList.size() != 1) throw exception(DEV_INSTALL_EXIST);
            rent_id = devRentDOList.getFirst().getId();
            createReqVO.setId( rent_id );
            createReqVO.setState( DevRentStateEnum.INSTALL_CANCELLED.getState() );
            updateDevRent( createReqVO );
            createReqVO.setId(rent_id);
            createReqVO.setState(DevRentStateEnum.INSTALL_CANCELLED.getState());
            updateDevRent(createReqVO);
            JobRecordSaveReqVO jobRecordSaveReqVO = new JobRecordSaveReqVO();
            jobRecordSaveReqVO.setRentId(rent_id);
@@ -567,19 +573,19 @@
            jobRecordSaveReqVO.setDocName(userNickname);
            jobRecordSaveReqVO.setPatId(createReqVO.getPatId());
            jobRecordSaveReqVO.setPatName(createReqVO.getPatName());
            jobRecordSaveReqVO.setJobType( DevRentStateEnum.INSTALL_CANCELLED.getState() );
            jobRecordSaveReqVO.setJobType(DevRentStateEnum.INSTALL_CANCELLED.getState());
            jobRecordSaveReqVO.setJobTime(createReqVO.getRentTime());
            jobRecordSaveReqVO.setRemark(createReqVO.getRemark());
            jobRecordSaveReqVO.setSummary("");
            jobRecordSaveReqVO.setCheckType( createReqVO.getCheckType() );
            jobRecordSaveReqVO.setCheckType(createReqVO.getCheckType());
            JobRecordDO jobRecord = BeanUtils.toBean(jobRecordSaveReqVO, JobRecordDO.class);
            jobRecordMapper.insert(jobRecord);
        } else {
            updateDevRent( createReqVO );
            updateDevRent(createReqVO);
            jobRecordDO.setDevId(null);
            jobRecordDO.setJobType( DevRentStateEnum.INSTALL_CANCELLED.getState() );
            jobRecordDO.setJobType(DevRentStateEnum.INSTALL_CANCELLED.getState());
            jobRecordDO.setJobTime(createReqVO.getRentTime());
            jobRecordDO.setRemark(createReqVO.getRemark());
            jobRecordDO.setUpdater(String.valueOf(userId));
@@ -597,49 +603,46 @@
        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 );
        markDevDismantleException(updateReqVO.getDevId(), updateReqVO.getId(), updateReqVO.getReturnTime().toLocalDate(), devStateEnum);
        updateReqVO.setState( devRentStateEnum.getState() );
        updateDevRent( updateReqVO );
        updateReqVO.setState(devRentStateEnum.getState());
        updateDevRent(updateReqVO);
        Long userId = SecurityFrameworkUtils.getLoginUserId();
        String userNickname = SecurityFrameworkUtils.getLoginUserNickname();
        List<Integer> jobTypeList = new ArrayList<Integer>();
        jobTypeList.add( DevRentStateEnum.DAMAGED.getState());
        jobTypeList.add( DevRentStateEnum.LOST.getState());
        jobTypeList.add(DevRentStateEnum.DAMAGED.getState());
        jobTypeList.add(DevRentStateEnum.LOST.getState());
        JobRecordDO jobRecordDO = jobRecordMapper.selectByRentIdDocId(updateReqVO.getId(), userId, jobTypeList);
        if (null == jobRecordDO) {
            JobRecordSaveReqVO jobRecordSaveReqVO = new JobRecordSaveReqVO();
            jobRecordSaveReqVO.setRentId( updateReqVO.getId() );
            jobRecordSaveReqVO.setDevId( updateReqVO.getDevId() );
            jobRecordSaveReqVO.setDocId( userId );
            jobRecordSaveReqVO.setDocName( userNickname );
            jobRecordSaveReqVO.setPatId( updateReqVO.getPatId() );
            jobRecordSaveReqVO.setPatName( updateReqVO.getPatName() );
            jobRecordSaveReqVO.setJobTime( updateReqVO.getReturnTime() );
            jobRecordSaveReqVO.setJobType( devRentStateEnum.getState() );
            jobRecordSaveReqVO.setRemark( updateReqVO.getRemark() );
            jobRecordSaveReqVO.setSummary( updateReqVO.getInterference() + " " + updateReqVO.getBaseline() + " " + updateReqVO.getDetachment() );
            jobRecordSaveReqVO.setCheckType( updateReqVO.getCheckType() );
            jobRecordSaveReqVO.setRentId(updateReqVO.getId());
            jobRecordSaveReqVO.setDevId(updateReqVO.getDevId());
            jobRecordSaveReqVO.setDocId(userId);
            jobRecordSaveReqVO.setDocName(userNickname);
            jobRecordSaveReqVO.setPatId(updateReqVO.getPatId());
            jobRecordSaveReqVO.setPatName(updateReqVO.getPatName());
            jobRecordSaveReqVO.setJobTime(updateReqVO.getReturnTime());
            jobRecordSaveReqVO.setJobType(devRentStateEnum.getState());
            jobRecordSaveReqVO.setRemark(updateReqVO.getRemark());
            jobRecordSaveReqVO.setSummary(updateReqVO.getInterference() + " " + updateReqVO.getBaseline() + " " + updateReqVO.getDetachment());
            jobRecordSaveReqVO.setCheckType(updateReqVO.getCheckType());
            JobRecordDO jobRecord = BeanUtils.toBean(jobRecordSaveReqVO, JobRecordDO.class);
            jobRecordMapper.insert(jobRecord);
        } else {
            jobRecordDO.setJobType( devRentStateEnum.getState() );
            jobRecordDO.setJobTime( updateReqVO.getReturnTime() );
            jobRecordDO.setRemark( updateReqVO.getRemark() );
            jobRecordDO.setSummary( updateReqVO.getInterference() + " " + updateReqVO.getBaseline() + " " + updateReqVO.getDetachment() );
            jobRecordDO.setUpdater( String.valueOf(userId) );
            jobRecordDO.setUpdateTime( LocalDateTime.now() );
            jobRecordDO.setJobType(devRentStateEnum.getState());
            jobRecordDO.setJobTime(updateReqVO.getReturnTime());
            jobRecordDO.setRemark(updateReqVO.getRemark());
            jobRecordDO.setSummary(updateReqVO.getInterference() + " " + updateReqVO.getBaseline() + " " + updateReqVO.getDetachment());
            jobRecordDO.setUpdater(String.valueOf(userId));
            jobRecordDO.setUpdateTime(LocalDateTime.now());
            jobRecordMapper.updateById(jobRecordDO);
        }
@@ -692,34 +695,34 @@
    @Override
    public DevRentDO getExistingRent(DevRentSearchReqVO searchReqVO) {
        List<Integer> stateList = new ArrayList<>();
        stateList.add( DevRentStateEnum.INSTALLED.getState() );
        stateList.add( DevRentStateEnum.RECEIVED.getState());
        searchReqVO.setStateList( stateList );
        stateList.add(DevRentStateEnum.INSTALLED.getState());
        stateList.add(DevRentStateEnum.RECEIVED.getState());
        searchReqVO.setStateList(stateList);
        return devRentMapper.getRentByState(searchReqVO);
    }
    @Override
    public DevRentDO getFreeRent(DevRentSearchReqVO searchReqVO) {
        List<Integer> stateList = new ArrayList<>();
        stateList.add( DevRentStateEnum.FREE.getState() );
        searchReqVO.setStateList( stateList );
        stateList.add(DevRentStateEnum.FREE.getState());
        searchReqVO.setStateList(stateList);
        return devRentMapper.getRentByState(searchReqVO);
    }
    @Override
    public DevRentDO getReadyOrCancelledRent(DevRentSearchReqVO searchReqVO) {
        List<Integer> stateList = new ArrayList<>();
        stateList.add( DevRentStateEnum.RECEIVED.getState() );
        stateList.add( DevRentStateEnum.RECEIVED_CANCELLED.getState());
        searchReqVO.setStateList( stateList );
        stateList.add(DevRentStateEnum.RECEIVED.getState());
        stateList.add(DevRentStateEnum.RECEIVED_CANCELLED.getState());
        searchReqVO.setStateList(stateList);
        return devRentMapper.getRentByState(searchReqVO);
    }
    @Override
    public DevRentDO getDismantledRent(DevRentSearchReqVO searchReqVO) {
        List<Integer> stateList = new ArrayList<>();
        stateList.add( DevRentStateEnum.DISMANTLED.getState() );
        searchReqVO.setStateList( stateList );
        stateList.add(DevRentStateEnum.DISMANTLED.getState());
        searchReqVO.setStateList(stateList);
        return devRentMapper.getRentByState(searchReqVO);
    }
@@ -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;
        }
@@ -778,10 +757,10 @@
        // è®¾å¤‡æ ‡æ³¨ å·²é¢†å–
        DeviceDO deviceDO = deviceMapper.getDeviceByDevId(devId);
        if (null != deviceDO && DevStateEnum.FREE.isEqual(deviceDO.getState())) {
            deviceDO.setState( DevStateEnum.RECEIVED.getState() );
            deviceDO.setRentId( rentId );
            deviceDO.setStateDate( LocalDate.now() );
            deviceDO.setPatDetails( patDetails );
            deviceDO.setState(DevStateEnum.RECEIVED.getState());
            deviceDO.setRentId(rentId);
            deviceDO.setStateDate(LocalDate.now());
            deviceDO.setPatDetails(patDetails);
            return deviceMapper.updateById(deviceDO);
        }
@@ -791,19 +770,18 @@
    // æ ‡è®° è®¾å¤‡å·²è¢«ä½¿ç”¨
    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() );
            deviceDO.setStateDate( LocalDate.now() );
            deviceDO.setState(DevStateEnum.INUSE.getState());
            deviceDO.setStateDate(LocalDate.now());
            return deviceMapper.updateById(deviceDO);
        }
        if (DevStateEnum.FREE.isEqual(deviceDO.getState())) {
            deviceDO.setState( DevStateEnum.INUSE.getState() );
            deviceDO.setStateDate( LocalDate.now() );
            deviceDO.setRentId( rentId );
            deviceDO.setState(DevStateEnum.INUSE.getState());
            deviceDO.setStateDate(LocalDate.now());
            deviceDO.setRentId(rentId);
            return deviceMapper.updateById(deviceDO);
        }
@@ -814,8 +792,8 @@
        // è®¾å¤‡æ ‡æ³¨é—失
        DeviceDO deviceDO = deviceMapper.getDeviceByDevId(devId);
        if (null != deviceDO && DevStateEnum.INUSE.isEqual(deviceDO.getState()) && rentId.equals(deviceDO.getRentId())) {
            deviceDO.setState( devStateEnum.getState() );
            deviceDO.setStateDate( localDate );
            deviceDO.setState(devStateEnum.getState());
            deviceDO.setStateDate(localDate);
            return deviceMapper.updateById(deviceDO);
        }
@@ -824,22 +802,21 @@
    private Integer markDevFree(String devId, Long rentId) {
        // è®¾å¤‡æ ‡æ³¨é—失 æ¢å¤ä¸ºç©ºé—²
        DeviceDO deviceDO = deviceMapper.getDeviceByDevId( devId );
        DeviceDO deviceDO = deviceMapper.getDeviceByDevId(devId);
        if (null != deviceDO && rentId.equals(deviceDO.getRentId())) {
            deviceDO.setState( DevStateEnum.FREE.getState() );
            deviceDO.setStateDate( LocalDate.now() );
            deviceDO.setState(DevStateEnum.FREE.getState());
            deviceDO.setStateDate(LocalDate.now());
            deviceDO.setRentId(null);
            deviceDO.setPatDetails(null);
            return deviceMapper.updateById(deviceDO);
        }
        return 0;
    }
    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,83 +829,60 @@
     */
    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()); // äº²å’Œ-领用
            bedOnStageQueueItem.setAffinityItem(1);
            bedOnStageQueueItem.setRoomId( affinityInstallingItem.getRoomId() );
            bedOnStageQueueItem.setBedNo( affinityInstallingItem.getBedNo() );  // é¢†ç”¨ åˆ° å®‰è£… å¯èƒ½ä¼šåœ¨ä¸åŒå·¥ä½
            bedOnStageQueueItem.setRoomId(affinityInstallingItem.getRoomId());
            bedOnStageQueueItem.setBedNo(affinityInstallingItem.getBedNo());  // é¢†ç”¨ åˆ° å®‰è£… å¯èƒ½ä¼šåœ¨ä¸åŒå·¥ä½
        }
        // å¦‚果存在 [亲和-排队] äº²å’Œé¡¹ï¼Œåˆ™é€‰æ‹© å…¶ä¸­ä¸€ä¸ªäº²å’Œé¡¹ æŽ¥æ›¿å…¶ å¤„于 [就诊中]
        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());
            queueMapper.updateById( tmpQueueDO );
            queueMapper.updateById(tmpQueueDO);
        }
    }
    // å¦‚果存在 [亲和-领用] äº²å’Œé¡¹ï¼Œåˆ™é€‰æ‹© å…¶ä¸­ä¸€ä¸ªäº²å’Œé¡¹ æŽ¥æ›¿å…¶ å¤„于 [安装中]
    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());
            tmpQueueDO.setRoomId( bedInstallingQueueItem.getRoomId() );
            tmpQueueDO.setBedNo( bedInstallingQueueItem.getBedNo() ); // ä»Ž [领用] åˆ° [安装], å¯éž¥åœ¨ä¸åŒå·¥ä½ä¸Šæ“ä½œ
            tmpQueueDO.setRoomId(bedInstallingQueueItem.getRoomId());
            tmpQueueDO.setBedNo(bedInstallingQueueItem.getBedNo()); // ä»Ž [领用] åˆ° [安装], å¯éž¥åœ¨ä¸åŒå·¥ä½ä¸Šæ“ä½œ
            queueMapper.updateById(tmpQueueDO);
        }
    }
    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";
    String getPatientType(Integer patientSource) {
        if (1 == patientSource || 2 == patientSource) return "01";
        else if (3 == patientSource) return "03";
        else if (4 == patientSource) return "04";
        return "01";
    }
jh-server/src/main/resources/application-prod.yaml
@@ -58,7 +58,7 @@
          #          url: jdbc:dm://127.0.0.1:5236?schema=RUOYI_VUE_PRO # DM è¿žæŽ¥çš„示例
          #          url: jdbc:kingbase8://127.0.0.1:54321/test  # äººå¤§é‡‘仓 KingbaseES è¿žæŽ¥çš„示例
          #          url: jdbc:postgresql://127.0.0.1:5432/postgres # OpenGauss è¿žæŽ¥çš„示例
          username: root
          username: lihu
          password: Smartor.2023
          #          username: sa # SQL Server è¿žæŽ¥çš„示例
          #          password: Jh@2024 # SQL Server è¿žæŽ¥çš„示例
jh-server/src/main/resources/application.yaml
@@ -3,6 +3,7 @@
    name: jh-server
  profiles:
#    active: prod
    active: stage
  main:
@@ -314,4 +315,4 @@
        key: pLXUGAwK5305
        customer: E77DF18BE109F454A5CD319E44BF5177
debug: false
debug: false