ソースを参照

add
优化定时任务

lifang 1 ヶ月 前
コミット
cc20f8838c

+ 106 - 0
nb-service/web-service/src/main/java/com/nb/web/service/bus/hospital/HospitalHisDataPullJob.java

@@ -0,0 +1,106 @@
+package com.nb.web.service.bus.hospital;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.nb.core.exception.CustomException;
+import com.nb.web.api.entity.BusInfusionHistoryEntity;
+import com.nb.web.service.bus.hospital.script.ScriptManager;
+import com.nb.web.service.bus.service.LocalBusHospitalService;
+import com.nb.web.service.bus.service.LocalBusInfusionHistoryService;
+import com.nb.web.service.quartz.util.SpringUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+/**
+ * 医院HIS数据拉取任务
+ * 用于定时从HIS系统拉取病人信息
+ */
+@Slf4j
+public class HospitalHisDataPullJob implements Job {
+
+    private LocalBusHospitalService hospitalService;
+
+    private LocalBusInfusionHistoryService infusionHistoryService;
+
+    private HospitalManagerRegister hospitalManagerRegister;
+
+    @Override
+    public void execute(JobExecutionContext context) throws JobExecutionException {
+        if(hospitalService==null){
+            hospitalService = SpringUtils.getBean(LocalBusHospitalService.class);
+        }
+        if(infusionHistoryService==null){
+            infusionHistoryService = SpringUtils.getBean(LocalBusInfusionHistoryService.class);
+        }
+        if(hospitalManagerRegister==null){
+            hospitalManagerRegister = SpringUtils.getBean(HospitalManagerRegister.class);
+        }
+
+        String hospitalId = context.getJobDetail().getJobDataMap().getString("hospitalId");
+        log.info("[定时拉取病人数据]开始执行任务,hospitalId:{}", hospitalId);
+
+        try {
+            // 拉取指定医院的数据
+            pullHospitalData(hospitalId);
+            log.info("[定时拉取病人数据]任务执行完成,hospitalId:{}", hospitalId);
+        } catch (Exception e) {
+            log.error("[定时拉取病人数据]任务执行异常,hospitalId:{}", hospitalId, e);
+        }
+    }
+
+    /**
+     * 拉取指定医院的数据
+     * @param hospitalId 医院ID
+     */
+    private void pullHospitalData(String hospitalId) {
+        try {
+            // 获取医院管理器
+            HospitalManager hospitalManager = hospitalManagerRegister.get(hospitalId);
+            if (hospitalManager == null) {
+                log.warn("[定时拉取病人数据]未找到医院管理器,hospitalId:{}", hospitalId);
+                return;
+            }
+            if (hospitalManager.getScriptSession().isOnline()) {
+                log.warn("[定时拉取病人数据]医院不在线,hospitalId:{}", hospitalId);
+                return;
+            }
+            // 拉取最新的50条输注信息,更新病人数据
+            Page<BusInfusionHistoryEntity> infusionHistoryPage = new Page<>(0, 9999, false);
+            infusionHistoryPage = infusionHistoryService.page(
+                    infusionHistoryPage,
+                    new QueryWrapper<BusInfusionHistoryEntity>().lambda()
+                            .eq(BusInfusionHistoryEntity::getTenantId, hospitalId)
+                            .eq(BusInfusionHistoryEntity::getFinished, false)
+                            .orderByDesc(BusInfusionHistoryEntity::getLastUploadTime)
+            );
+
+            List<BusInfusionHistoryEntity> records = infusionHistoryPage.getRecords();
+            if (CollUtil.isNotEmpty(records)) {
+                Set<String> patientCodes = records.stream()
+                        .map(BusInfusionHistoryEntity::getPatientCode)
+                        .collect(Collectors.toSet());
+
+                for (String patientCode : patientCodes) {
+                    log.info("[拉取病人信息]hospitalId:{}, patientCode:{}", hospitalId, patientCode);
+                    try {
+                        hospitalManager.getScriptSession()
+                                .asyncGetPatientInfo(patientCode, 10, TimeUnit.SECONDS, false);
+                    } catch (Exception e) {
+                        log.warn("[拉取病人信息失败]hospitalId:{}, patientCode:{}", hospitalId, patientCode, e);
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.error("[定时拉取病人数据]处理医院数据异常,hospitalId:{}", hospitalId, e);
+        }
+    }
+}