From eb3195e397b023cfae1ee4dea7fbc29f1271504f Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期六, 07 六月 2025 15:37:51 +0800
Subject: [PATCH] 代码提交

---
 jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/appointment/AppointmentServiceImpl.java |  544 +++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 396 insertions(+), 148 deletions(-)

diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/appointment/AppointmentServiceImpl.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/appointment/AppointmentServiceImpl.java
index 980feb8..13e68f3 100644
--- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/appointment/AppointmentServiceImpl.java
+++ b/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;
 
             // 浠嶥B鏌ヨ棰勭害锛屾槸鍚﹀凡缁忓瓨鍦�
             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();
+
+            // 浠巇ataMap涓彁鍙栨暟鎹�
+            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);
+
+
+            // 璁剧疆鎮h�呮潵婧愮被鍨�
+            Optional.ofNullable(encounter.get("code")).map(code -> (Map<String, Object>) code).map(code -> (String) code.get("code")).map(Integer::parseInt).ifPresent(appointment::setPatSrc);
+
+            // 璁剧疆鎮h�呬俊鎭�
+            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 -> {
+                // 璁剧疆鎮h�匢D
+                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);
+
+                // 璁剧疆鎮h�呭鍚�
+                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);
+
+                // 璁剧疆鎮h�呮墜鏈哄拰鐢佃瘽
+                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);
+                });
+
+                // 璁剧疆鎮h�呮�у埆
+                Optional.ofNullable(patientPerson.get("administrativeGenderCode")).map(genderCode -> (Map<String, Object>) genderCode).map(genderCode -> (String) genderCode.get("code")).map(Byte::parseByte).ifPresent(appointment::setPatGender);
+
+                // 璁剧疆鎮h�呯敓鏃�
+                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);
+
+                // 璁剧疆鎮h�呭湴鍧�
+                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);
+
+                // 璁剧疆鎮h�呰韩浠借瘉鍙�
+                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 -> {
+                // 璁剧疆绉戝浠g爜鍜屽悕绉�
+                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);
+
+                // 璁剧疆鐥呭尯浠g爜鍜屽悕绉�
+                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))));
+
+            // 灏咥ppointmentDO杞崲涓篈ppointmentSaveReqVO骞朵繚瀛�
+            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 {
+            // 浠巇ataMap涓彁鍙栫敵璇峰崟鍙�
+            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);
+
+            // 濡傛灉璁板綍涓嶅瓨鍦紝鍒欒皟鐢╤andleAppointmentCreate杩涜鏂板
+            if (existingAppointment == null) {
+                handleAppointmentCreate(dataMap);
+                return;
+            }
+
+            // 浠巇ataMap涓彁鍙栨暟鎹�
+            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);
+
+
+            // 鏇存柊鎮h�呮潵婧愮被鍨�
+            Optional.ofNullable(encounter.get("code")).map(code -> (Map<String, Object>) code).map(code -> (String) code.get("code")).map(Integer::parseInt).ifPresent(existingAppointment::setPatSrc);
+
+            // 鏇存柊鎮h�呬俊鎭�
+            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 -> {
+                // 鏇存柊鎮h�匢D
+                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);
+
+                // 鏇存柊鎮h�呭鍚�
+                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);
+
+                // 鏇存柊鎮h�呮墜鏈哄拰鐢佃瘽
+                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);
+                });
+
+                // 鏇存柊鎮h�呮�у埆
+                Optional.ofNullable(patientPerson.get("administrativeGenderCode")).map(genderCode -> (Map<String, Object>) genderCode).map(genderCode -> (String) genderCode.get("code")).map(Byte::parseByte).ifPresent(existingAppointment::setPatGender);
+
+                // 鏇存柊鎮h�呯敓鏃�
+                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);
+
+                // 鏇存柊鎮h�呭湴鍧�
+                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);
+
+                // 鏇存柊鎮h�呰韩浠借瘉鍙�
+                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 -> {
+                // 鏇存柊绉戝浠g爜鍜屽悕绉�
+                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);
+
+                // 鏇存柊鐥呭尯浠g爜鍜屽悕绉�
+                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))));
+
+            // 灏咥ppointmentDO杞崲涓篈ppointmentSaveReqVO骞舵洿鏂�
+            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);
+        }
+        // 浠巇ataMap涓彁鍙栫敵璇峰崟鍙�
+        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);
+
+        // 濡傛灉璁板綍涓嶅瓨鍦紝鍒欒皟鐢╤andleAppointmentCreate杩涜鏂板
+        if (existingAppointment == null) {
+            handleAppointmentCreate(dataMap);
+            return;
+        }
+
+
+        // 浠巇ataMap涓彁鍙栫敵璇峰崟鍙�
+        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);
+        // 灏咥ppointmentDO杞崲涓篈ppointmentSaveReqVO骞舵洿鏂�
+        AppointmentSaveReqVO updateReqVO = BeanUtils.toBean(existingAppointment, AppointmentSaveReqVO.class);
+        updateAppointment(updateReqVO);
+    }
+
+
+    /**
+     * 浠巇ataMap涓彁鍙杄ncounter鏁版嵁
+     */
+    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) {
+        // 浠巇ataMap涓幏鍙朿ontrolActProcess
+        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");
+
+        // 瑙f瀽棰勭害鏃堕棿
+        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);
+    }
 }
 

--
Gitblit v1.9.3