Prechádzať zdrojové kódy

厦门五院:异步规则提醒

wangsy 1 rok pred
rodič
commit
e149c9fa31

+ 3 - 3
pom.xml

@@ -206,8 +206,8 @@
 			<groupId>com.oracle</groupId>
 			<artifactId>ojdbc6</artifactId>
 			<version>11.2.0.3</version>
-			<scope>system</scope>
-			<systemPath>D:/攻心小虫/公司/朗通医疗/项目/质控/通用/代码/mrqc-sys/lib/ojdbc6.jar</systemPath>
+<!--			<scope>system</scope>-->
+<!--			<systemPath>D:/攻心小虫/公司/朗通医疗/项目/质控/通用/代码/mrqc-sys/lib/ojdbc6.jar</systemPath>-->
 		</dependency>
 		
 		<dependency>
@@ -304,7 +304,7 @@
 						<resource>
 							<targetPath>/</targetPath>
 							<directory>${project.build.directory}</directory>
-							<include>${project.build.finalName}.jar</include>
+							<include>${project.buiFld.finalName}.jar</include>
 						</resource>
 					</resources>
 					<serverId>docker-registry</serverId>

+ 1 - 0
src/main/java/com/diagbot/config/ResourceServerConfigurer.java

@@ -149,6 +149,7 @@ public class ResourceServerConfigurer extends ResourceServerConfigurerAdapter {
                 .antMatchers("/qc/data/sendRecordTypes").permitAll()
                 .antMatchers("/qc/data/sendMrRecordIng").permitAll()
                 .antMatchers("/qc/data/sendStructuralData").permitAll()
+                .antMatchers("/qc/data/sendTest").permitAll()
                 .antMatchers("/qc/data/sendStructuralOneOld").permitAll()
                 .antMatchers("/qc/data/sendStructuralMoreOld").permitAll()
                 .antMatchers("/qc/data/sendStructuralDateOld").permitAll()

+ 1 - 0
src/main/java/com/diagbot/config/security/UrlAccessDecisionManager.java

@@ -193,6 +193,7 @@ public class UrlAccessDecisionManager implements AccessDecisionManager {
                 || matchers("/qc/data/sendRecordTypes", request)
                 || matchers("/qc/data/sendMrRecordIng", request)
                 || matchers("/qc/data/sendStructuralData", request)
+                || matchers("/qc/data/sendTest", request)
                 || matchers("/qc/data/sendStructuralOneOld", request)
                 || matchers("/qc/data/sendStructuralMoreOld", request)
                 || matchers("/qc/data/sendStructuralDateOld", request)

+ 91 - 0
src/main/java/com/diagbot/entity/MedTaskQueue.java

@@ -0,0 +1,91 @@
+package com.diagbot.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author
+ * @since 2023-08-12
+ */
+@Data
+public class MedTaskQueue implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 医院ID
+     */
+    private Long hospitalId;
+;
+    /**
+     * 病历号
+     */
+    private String behospitalCode;
+
+    /**
+     * 档案号
+     */
+    private String patientId;
+
+    /**
+     * 模板名称
+     */
+    private String modeName;
+
+    /**
+     * 是否为单文书(1是,2否)
+     */
+    private String isAnalyze;
+
+    /**
+     * 任务号
+     */
+    private String workId;
+
+    /**
+     * 入参
+     */
+    private String paramIn;
+
+    /**
+     * 是否执行,N:未执行,Y:已执行
+     */
+    private String isExecute;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 备注
+     */
+    private String remark;
+}

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 419 - 261
src/main/java/com/diagbot/facade/BehospitalInfoFacade.java


+ 15 - 0
src/main/java/com/diagbot/facade/MedTaskQueueFacade.java

@@ -0,0 +1,15 @@
+package com.diagbot.facade;
+
+import com.diagbot.service.impl.MedTaskQueueServiceImpl;
+import org.springframework.stereotype.Component;
+
+
+/**
+ * @Description:
+ * @author:
+ * @time: 2023/8/12 11:39
+ */
+@Component
+public class MedTaskQueueFacade extends MedTaskQueueServiceImpl {
+
+}

+ 5 - 5
src/main/java/com/diagbot/facade/OldDataFacade.java

@@ -43,7 +43,7 @@ public class OldDataFacade {
      */
     public void execute(){
         LocalDateTime now = LocalDateTime.now();
-        now = now.minus(5, ChronoUnit.DAYS);
+        now = now.minus(1, ChronoUnit.DAYS);
         List<BehospitalInfo> list = behospitalInfoFacade.list(new QueryWrapper<BehospitalInfo>()
         .le("leave_hospital_date", DateUtil.now())
         .ge("leave_hospital_date",now));
@@ -53,10 +53,10 @@ public class OldDataFacade {
                     sendOnebehospitalCode.sendOnebehospitalCode(behospitalInfo.getBehospitalCode(),behospitalInfo.getFileCode());
                     try {
                         //拉取数据完后评分
-                        AnalyzeRunVO analyzeRunVO = new AnalyzeRunVO();
-                        analyzeRunVO.setHospitalId(Long.valueOf("7"));
-                        analyzeRunVO.setBehospitalCode(behospitalInfo.getBehospitalCode());
-                        behospitalInfoFacade.analyzeApi(analyzeRunVO);
+//                        AnalyzeRunVO analyzeRunVO = new AnalyzeRunVO();
+//                        analyzeRunVO.setHospitalId(Long.valueOf("7"));
+//                        analyzeRunVO.setBehospitalCode(behospitalInfo.getBehospitalCode());
+//                        behospitalInfoFacade.analyzeApi(analyzeRunVO, aMedAbnormalInfoFacade, behospitalInfoFacade);
                     } catch (Exception e) {
                         aMedAbnormalInfoFacade.saveAbnormalInfo("历史数据拉取完评分异常", "", "", JSON.toJSONString(behospitalInfo), e.getMessage());
                     }

+ 1 - 1
src/main/java/com/diagbot/facade/data/ABehospitalInfoFacade.java

@@ -189,7 +189,7 @@ public class ABehospitalInfoFacade extends BehospitalInfoServiceImpl {
         Integer a =0;
         //妇科日间手术判断
         if (StringUtil.isNotBlank(s.getWardName()) &&
-                (s.getWardName().contains("妇科") || s.getWardName().contains("产科") || s.getWardName().contains("儿科")) &&
+                (s.getWardName().contains("泌尿外科") || s.getWardName().contains("妇科") || s.getWardName().contains("产科") || s.getWardName().contains("儿科")) &&
                 s.getBehospitalDate() != null && s.getLeaveHospitalDate() != null){
             int days = (int)((s.getLeaveHospitalDate().getTime()-s.getBehospitalDate().getTime())/(1000*3600*24));
             if (days < 3) {

+ 233 - 61
src/main/java/com/diagbot/facade/data/StructuralDataFacade.java

@@ -1,12 +1,15 @@
 package com.diagbot.facade.data;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-
+import java.util.*;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.diagbot.entity.*;
+import com.diagbot.enums.IsDeleteEnum;
+import com.diagbot.facade.MedTaskQueueFacade;
+import com.diagbot.util.StringUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -14,17 +17,6 @@ import org.springframework.stereotype.Component;
 import com.alibaba.fastjson.JSON;
 import com.diagbot.dto.AnalyzeRunDTO;
 import com.diagbot.dto.RespDTO;
-import com.diagbot.entity.BehospitalInfo;
-import com.diagbot.entity.DoctorAdvice;
-import com.diagbot.entity.HomeDiagnoseInfo;
-import com.diagbot.entity.HomeOperationInfo;
-import com.diagbot.entity.MedCrisisInfo;
-import com.diagbot.entity.MedLisInfo;
-import com.diagbot.entity.MedLisResult;
-import com.diagbot.entity.MedPacsInfo;
-import com.diagbot.entity.MedPacsResult;
-import com.diagbot.entity.StrInformedConsent;
-import com.diagbot.entity.StrTalkInform;
 import com.diagbot.enums.ModeIdEnum;
 import com.diagbot.enums.TableNameEnum;
 import com.diagbot.facade.BehospitalInfoFacade;
@@ -114,7 +106,7 @@ public class StructuralDataFacade {
     @Autowired
     private AStrConsultationRecordFacade aStrConsultationRecordFacade;
     @Autowired
-    private AMedAbnormalInfoFacade aMedAbnormalInfoFacade;
+    private AMedAbnormalInfoFacade aMedAbnormalInfoFacade = new AMedAbnormalInfoFacade();
     @Autowired
     private ReadProperties readProperties;
     @Autowired
@@ -143,14 +135,18 @@ public class StructuralDataFacade {
     private MedLisInfoFacade medLisInfoFacade;
     @Autowired
     private MedPacsInfoFacade medPacsInfoFacade;
+    @Autowired
+    private MedTaskQueueFacade medTaskQueueFacade;
 
     private FJTZDBConnHarp fjtzdbConnHarp = new FJTZDBConnHarp();
+    private BlockingQueue<StructuralDataFacade> taskQueue = new LinkedBlockingQueue<>();
+    private BlockingQueue<StructuralDataFacade> taskQueueAnalyzeApi = new LinkedBlockingQueue<>();
 
-
-    public RespDTO<Map<String, Object>> sendStructuralData(StructuralDataVo structuralDataVos) {
+    public RespDTO<Map<String, Object>> sendStructuralData(StructuralDataVo structuralDataVos, AMedAbnormalInfoFacade aMedAbnormalInfoFacade, BehospitalInfoFacade behospitalInfoFacade) {
 
         if (structuralDataVos != null) {
             if (StringUtils.isEmpty(structuralDataVos.getBehospitalCode())) {
+                System.out.println("任务完成++++++++++++++++++++");
                 return RespDTO.onError("请输入病历号!");
             } else if (null == structuralDataVos.getHospitalId()) {
                 return RespDTO.onError("请输入医院编码!");
@@ -184,7 +180,8 @@ public class StructuralDataFacade {
             } else {
                 execute(structuralDataVos);
             }
-
+            // 是否质控标识,为0则不进行质控评分
+//            if(structuralDataVos.getIsQcScore() == 1){
             long time2 = System.currentTimeMillis();
             System.out.println("装载数据所耗时为-----" + (time2 - time1));
 
@@ -197,19 +194,91 @@ public class StructuralDataFacade {
             }
 
             //返回评分结构体
-            RespDTO<Map<String, Object>> msg = mrIng(structuralDataVos);
+            RespDTO<Map<String, Object>> msg = mrIng(structuralDataVos, aMedAbnormalInfoFacade, behospitalInfoFacade);
             long time3 = System.currentTimeMillis();
             System.out.println("评分所耗时为--------" + (time3 - time2));
-            aMedAbnormalInfoFacade.saveAbnormalInfo("sendStructuralData总耗时", structuralDataVos.getBehospitalCode(), ""+(time3-time1), JSON.toJSONString(structuralDataVos), "sendStructuralData耗时");
-            aMedAbnormalInfoFacade.saveAbnormalInfo("装载数据所耗时为", structuralDataVos.getBehospitalCode(), ""+(time3-time1), JSON.toJSONString(structuralDataVos), "装载数据所耗时为");
+            aMedAbnormalInfoFacade.saveAbnormalInfo("sendStructuralData总耗时", structuralDataVos.getBehospitalCode(), "" + (time3 - time1), JSON.toJSONString(structuralDataVos), "sendStructuralData耗时");
+            aMedAbnormalInfoFacade.saveAbnormalInfo("装载数据所耗时为", structuralDataVos.getBehospitalCode(), "" + (time3 - time1), JSON.toJSONString(structuralDataVos), "装载数据所耗时为");
             return msg;
+//            }
+//            return RespDTO.onSuc(null);
         } else {
             return RespDTO.onError("未接收到数据!");
         }
 
     }
 
-    public RespDTO<Map<String, Object>> sendStructuralDataTest(StructuralDataVo structuralDataVos,HashSet<String>  modeIds) {
+    public void startAsyncProcessing(StructuralDataVo structuralDataVos) {
+        Thread workerThread = new Thread(() -> {
+            while (true) {
+                try {
+                    StructuralDataFacade take = taskQueue.take();
+                    if (take != null) {
+                        take.sendStructuralData(structuralDataVos, aMedAbnormalInfoFacade, behospitalInfoFacade);
+                        if (structuralDataVos.getWorkId() != null) {
+                            UpdateWrapper<MedTaskQueue> medTaskQueueUpdate = new UpdateWrapper<>();
+                            medTaskQueueUpdate.eq("hospital_id", structuralDataVos.getHospitalId()).eq("work_id", structuralDataVos.getWorkId()).set("is_execute", IsDeleteEnum.Y.getKey()).set("gmt_modified", new Date());
+                            medTaskQueueFacade.update(medTaskQueueUpdate);
+                        }
+                    }
+                } catch (InterruptedException e) {
+                    Thread.currentThread().interrupt();
+                }
+            }
+        });
+        workerThread.start();
+    }
+
+    public boolean addToQueue(StructuralDataVo structuralDataVos) {
+        //判断modeName是否在
+        List<String> modeList = Arrays.asList("入院记录", "首次病程录", "死亡病例讨论记录", "上级医师查房记录", "出院小结", "住院病案首页", "会诊记录"
+                , "一般手术记录", "术前讨论、术前小结", "手术知情同意书", "术后首次病程及谈话记录", "疑难病例讨论记录", "手术安全核查表"
+                , "抢救记录", "死亡记录", "病危通知书", "转入记录", "转出记录", "阶段小结", "病重通知书", "会诊结果单");
+
+        if (modeList.contains(structuralDataVos.getModeName())) {
+            //如果任务列表中存在该病历,则返回
+            int count = medTaskQueueFacade.count(new QueryWrapper<MedTaskQueue>()
+                    .eq("behospital_code", structuralDataVos.getBehospitalCode())
+                    .eq("hospital_id", structuralDataVos.getHospitalId())
+                    .eq("is_deleted", IsDeleteEnum.N.getKey())
+                    .eq("is_analyze", "1")
+                    .eq("is_execute", IsDeleteEnum.N.getKey())
+            );
+            System.out.println("单文书质控查询到数量为+++++++++++++++++++++++++++++:" + count);
+            if (count > 0) {
+                log.info("该病历信息已存在于任务队列中。。。。");
+                return false;
+            }
+
+            StructuralDataFacade task = new StructuralDataFacade(aMedAbnormalInfoFacade, behospitalInfoFacade);
+            long timestamp = System.currentTimeMillis(); //当前时间戳
+            //加入任务
+            if (taskQueue.offer(task)) {
+                MedTaskQueue medTaskQueue = new MedTaskQueue();
+                if (StringUtil.isBlank(structuralDataVos.getWorkId())) {
+                    medTaskQueue.setWorkId(String.valueOf(timestamp));
+                    structuralDataVos.setWorkId(String.valueOf(timestamp));
+                } else {
+                    medTaskQueue.setWorkId(structuralDataVos.getWorkId());
+                }
+                medTaskQueue.setHospitalId(structuralDataVos.getHospitalId());
+                medTaskQueue.setBehospitalCode(structuralDataVos.getBehospitalCode());
+                medTaskQueue.setPatientId(structuralDataVos.getPatientId());
+                medTaskQueue.setIsAnalyze("1");
+                medTaskQueue.setModeName(structuralDataVos.getModeName());
+                medTaskQueue.setParamIn(JSON.toJSONString(structuralDataVos));
+                medTaskQueue.setGmtCreate(new Date());
+                medTaskQueueFacade.save(medTaskQueue);
+                return true;
+            } else {
+                return false;
+            }
+        } else {
+            return false;
+        }
+    }
+
+    public RespDTO<Map<String, Object>> sendStructuralDataTest(StructuralDataVo structuralDataVos, HashSet<String> modeIds) {
 
         if (structuralDataVos != null) {
             if (StringUtils.isEmpty(structuralDataVos.getBehospitalCode())) {
@@ -222,14 +291,14 @@ public class StructuralDataFacade {
             //装载数据
             long time1 = System.currentTimeMillis();
             if (!structuralDataVos.getModeName().isEmpty()) {
-                structuralDataVos = isModeIdTest(structuralDataVos,modeIds);
+                structuralDataVos = isModeIdTest(structuralDataVos, modeIds);
                 if (structuralDataVos.getModeId().equals("0")) {
                     String recId = structuralDataVos.getRecId();
                     String[] modeList = {"23", "31", "32"};
                     for (String modeId : modeList) {
                         structuralDataVos.setModeId(modeId);
                         structuralDataVos.setRecId(recId + "-" + structuralDataVos.getModeId());
-                       // execute(structuralDataVos);
+                        // execute(structuralDataVos);
                     }
                 } else if (structuralDataVos.getModeId().equals("34")) {
                     String recId = structuralDataVos.getRecId();
@@ -241,10 +310,10 @@ public class StructuralDataFacade {
                     }
                 } else {
                     structuralDataVos.setRecId(structuralDataVos.getRecId() + "-" + structuralDataVos.getModeId());
-                   // execute(structuralDataVos);
+                    // execute(structuralDataVos);
                 }
             } else {
-               // execute(structuralDataVos);
+                // execute(structuralDataVos);
             }
 
             long time2 = System.currentTimeMillis();
@@ -259,11 +328,11 @@ public class StructuralDataFacade {
             }
 
             //返回评分结构体
-       //     RespDTO<Map<String, Object>> msg = mrIng(structuralDataVos);
+            //     RespDTO<Map<String, Object>> msg = mrIng(structuralDataVos);
             long time3 = System.currentTimeMillis();
             System.out.println("评分所耗时为--------" + (time3 - time2));
-        //    aMedAbnormalInfoFacade.saveAbnormalInfo("sendStructuralData总耗时", structuralDataVos.getBehospitalCode(), ""+(time3-time1), JSON.toJSONString(structuralDataVos), "sendStructuralData耗时");
-     //       aMedAbnormalInfoFacade.saveAbnormalInfo("装载数据所耗时为", structuralDataVos.getBehospitalCode(), ""+(time2-time1), JSON.toJSONString(structuralDataVos), "装载数据所耗时为");
+            //    aMedAbnormalInfoFacade.saveAbnormalInfo("sendStructuralData总耗时", structuralDataVos.getBehospitalCode(), ""+(time3-time1), JSON.toJSONString(structuralDataVos), "sendStructuralData耗时");
+            //       aMedAbnormalInfoFacade.saveAbnormalInfo("装载数据所耗时为", structuralDataVos.getBehospitalCode(), ""+(time2-time1), JSON.toJSONString(structuralDataVos), "装载数据所耗时为");
 
             return RespDTO.onSuc("111");
         } else {
@@ -271,6 +340,7 @@ public class StructuralDataFacade {
         }
 
     }
+
     /**
      * 判断所属模板再保存
      *
@@ -531,7 +601,7 @@ public class StructuralDataFacade {
      * @param
      * @return
      */
-    private RespDTO<Map<String, Object>> mrIng(StructuralDataVo structuralDataVos) {
+    private RespDTO<Map<String, Object>> mrIng(StructuralDataVo structuralDataVos, AMedAbnormalInfoFacade aMedAbnormalInfoFacade, BehospitalInfoFacade behospitalInfoFacade) {
         String behospitalCode = structuralDataVos.getBehospitalCode();
         Long hospitalId = structuralDataVos.getHospitalId();
         Long modeId = Long.valueOf(structuralDataVos.getModeId());
@@ -540,40 +610,42 @@ public class StructuralDataFacade {
             structuralDataVos.setModeId("63");
             execute(structuralDataVos);
         }
-        
+
         Map<String, Object> map = new HashMap<String, Object>();
-        if(structuralDataVos.getDockModeType().equals("0")) {
+        if (structuralDataVos.getDockModeType().equals("0")) {
             map.put("records", Arrays.asList(structuralDataVos));
-            
+
             AnalyzeRunVO vo = new AnalyzeRunVO();
-        	vo.setBehospitalCode(structuralDataVos.getBehospitalCode());
-        	vo.setHospitalId(structuralDataVos.getHospitalId());
+            vo.setBehospitalCode(structuralDataVos.getBehospitalCode());
+            vo.setHospitalId(structuralDataVos.getHospitalId());
+            vo.setIsQcScore(structuralDataVos.getIsQcScore());
+            vo.setPatientId(structuralDataVos.getPatientId());
             new Thread() {
-        		public void run() {
-        			System.gc();
-        			behospitalInfoFacade.analyzeApi(vo);
-        		}
-        	}.start();
-        	
+                public void run() {
+                    System.gc();
+                    behospitalInfoFacade.analyzeApi(vo, aMedAbnormalInfoFacade, behospitalInfoFacade);
+                }
+            }.start();
+
             return RespDTO.onSuc(map);
-        }else if (structuralDataVos.getDockModeType().equals("1")) {
+        } else if (structuralDataVos.getDockModeType().equals("1")) {
             //页面模式
             String url = readProperties.getProcessQcUrl() + "?behospitalCode=" + behospitalCode + "&hospitalId=" + hospitalId + "&modeId=" + modeId;
             map.put("url", url);
             return RespDTO.onSuc(map);
-        }else if(structuralDataVos.getDockModeType().equals("2")) {
-        	 AnalyzeRunVO analyzeRunVO = new AnalyzeRunVO();
-             analyzeRunVO.setBehospitalCode(behospitalCode);
-             analyzeRunVO.setHospitalId(hospitalId);
-             analyzeRunVO.setModeId(modeId);
-             AnalyzeRunDTO analyzeRunDTO = behospitalInfoFacade.analyzeRun(analyzeRunVO);
-             if (analyzeRunDTO.getMsgDTOList().size() > 0) {
-                 map.put("analyze", analyzeRunDTO.getMsgDTOList());
-             }
-             //接口引擎模式
-             return RespDTO.onSuc(map);
+        } else if (structuralDataVos.getDockModeType().equals("2")) {
+            AnalyzeRunVO analyzeRunVO = new AnalyzeRunVO();
+            analyzeRunVO.setBehospitalCode(behospitalCode);
+            analyzeRunVO.setHospitalId(hospitalId);
+            analyzeRunVO.setModeId(modeId);
+            AnalyzeRunDTO analyzeRunDTO = behospitalInfoFacade.analyzeRun(analyzeRunVO);
+            if (analyzeRunDTO.getMsgDTOList().size() > 0) {
+                map.put("analyze", analyzeRunDTO.getMsgDTOList());
+            }
+            //接口引擎模式
+            return RespDTO.onSuc(map);
         } else {
-        	 //页面模式
+            //页面模式
             String url = readProperties.getProcessQcUrl() + "?behospitalCode=" + behospitalCode + "&hospitalId=" + hospitalId + "&modeId=" + modeId;
             AnalyzeRunVO analyzeRunVO = new AnalyzeRunVO();
             analyzeRunVO.setBehospitalCode(behospitalCode);
@@ -588,7 +660,6 @@ public class StructuralDataFacade {
         }
     }
 
-    
 
     /**
      * 根据传来的信息编辑视图的sql语句
@@ -663,7 +734,7 @@ public class StructuralDataFacade {
         return structuralDataVo;
     }
 
-    public StructuralDataVo isModeIdTest(StructuralDataVo structuralDataVo,HashSet<String> modeIds) {
+    public StructuralDataVo isModeIdTest(StructuralDataVo structuralDataVo, HashSet<String> modeIds) {
         String modeName = structuralDataVo.getModeName();
         String modeId = "0";
         if (modeName.equals("入院记录")) {
@@ -717,9 +788,110 @@ public class StructuralDataFacade {
         }
         structuralDataVo.setModeId(modeId);
         modeIds.add(modeId);
-    //    aMedAbnormalInfoFacade.saveAbnormalInfo("his入参", structuralDataVo.getRecId(), JSON.toJSONString(structuralDataVo), "", "");
+        //    aMedAbnormalInfoFacade.saveAbnormalInfo("his入参", structuralDataVo.getRecId(), JSON.toJSONString(structuralDataVo), "", "");
         return structuralDataVo;
     }
 
+    public RespDTO<Boolean> sendAnalyzers(AnalyzeRunVO analyzeRunVO, AMedAbnormalInfoFacade aMedAbnormalInfoFacade, BehospitalInfoFacade behospitalInfoFacade) {
+
+        if (analyzeRunVO != null) {
+            if (StringUtils.isEmpty(analyzeRunVO.getBehospitalCode())) {
+                return RespDTO.onError("请输入病历号!");
+            } else if (null == analyzeRunVO.getHospitalId()) {
+                return RespDTO.onError("请输入医院编码!");
+            }
+
+            //返回评分结构体
+            behospitalInfoFacade.analyzeApi(analyzeRunVO, aMedAbnormalInfoFacade, behospitalInfoFacade);
+            return RespDTO.onSuc(true);
+        } else {
+            return RespDTO.onSuc(false);
+        }
+
+    }
+
+    public void startAsyncProcessingAnalyzeApi(AnalyzeRunVO analyzeRunVO) {
+        Thread workerThread = new Thread(() -> {
+            while (true) {
+                try {
+                    StructuralDataFacade take = taskQueueAnalyzeApi.take();
+                    if (take != null) {
+                        take.sendAnalyzers(analyzeRunVO, aMedAbnormalInfoFacade, behospitalInfoFacade);
+                        if (analyzeRunVO.getWorkId() != null) {
+                            UpdateWrapper<MedTaskQueue> medTaskQueueUpdate = new UpdateWrapper<>();
+                            medTaskQueueUpdate.eq("hospital_id", analyzeRunVO.getHospitalId()).eq("work_id", analyzeRunVO.getWorkId()).set("is_execute", IsDeleteEnum.Y.getKey()).set("gmt_modified", new Date());
+                            medTaskQueueFacade.update(medTaskQueueUpdate);
+                        }
+                    }
+                } catch (InterruptedException e) {
+                    Thread.currentThread().interrupt();
+                }
+            }
+        });
+        workerThread.start();
+    }
+
+    public boolean addToQueueAnalyzeApi(AnalyzeRunVO analyzeRunVO) {
+//        BehospitalInfoFacade task = new BehospitalInfoFacade(qcCasesEntryFacade, qcServiceClient, sysDictionaryFacade, medicalRecordFacade, strConsultationApplyFacade, strConsultationResultFacade, strConsultationNoteFacade,
+//                strConsultationRecordFacade, strAdmissionNoteFacade, strBloodResultFacade, strBloodTransfusionFacade, strCrisisNoteFacade, strDeathDiscussionFacade, strDeathNoteFacade,
+//                strDifficultCaseFacade, strFirstRecordFacade, strIllCriticallyFacade, strIllSeriouslFacade, strLeaveHospitalFacade, strOperativeFirstRecordFacade, strOperativeNoteFacade,
+//                strPeriodConclusionFacade, strPreoperativeDiscussionFacade, strRescueNoteFacade, strTransferInNoteFacade, strTransferOutNoteFacade, strWardRecordFacade, doctorAdviceFacade,
+//                medCrisisInfoFacade,strInvasiveOperativeNoteFacade, homePageFacade,medTransferRecordFacade,homeDiagnoseInfoFacade,homeOperationInfoFacade,basHospitalInfoFacade);
+        //如果任务列表中存在该病历,则返回
+        int count = medTaskQueueFacade.count(new QueryWrapper<MedTaskQueue>()
+                .eq("behospital_code", analyzeRunVO.getBehospitalCode())
+                .eq("hospital_id", analyzeRunVO.getHospitalId())
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("is_analyze", "2")
+                .eq("is_execute", IsDeleteEnum.N.getKey())
+        );
+        System.out.println("AnalyzeApi查询到数量为+++++++++++++++++++++++++++++:" + count);
+        if (count > 0) {
+            log.info("该病历信息已存在于任务队列中。。。。");
+            return false;
+        }
+
+        StructuralDataFacade task = new StructuralDataFacade(aMedAbnormalInfoFacade, behospitalInfoFacade);
+        long timestamp = System.currentTimeMillis(); //当前时间戳
+        //加入任务
+        if (taskQueueAnalyzeApi.offer(task)) {
+            MedTaskQueue medTaskQueue = new MedTaskQueue();
+            if (StringUtil.isBlank(analyzeRunVO.getWorkId())) {
+                medTaskQueue.setWorkId(String.valueOf(timestamp));
+                analyzeRunVO.setWorkId(String.valueOf(timestamp));
+            } else {
+                medTaskQueue.setWorkId(analyzeRunVO.getWorkId());
+            }
+            medTaskQueue.setHospitalId(analyzeRunVO.getHospitalId());
+            medTaskQueue.setBehospitalCode(analyzeRunVO.getBehospitalCode());
+            medTaskQueue.setPatientId(analyzeRunVO.getPatientId());
+            medTaskQueue.setIsAnalyze("2");
+            medTaskQueue.setParamIn(JSON.toJSONString(analyzeRunVO));
+            medTaskQueue.setGmtCreate(new Date());
+            medTaskQueueFacade.save(medTaskQueue);
+
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    public StructuralDataFacade(AMedAbnormalInfoFacade aMedAbnormalInfoFacade, BehospitalInfoFacade behospitalInfoFacade) {
+        this.aMedAbnormalInfoFacade = aMedAbnormalInfoFacade;
+        this.behospitalInfoFacade = behospitalInfoFacade;
+    }
+
+    public boolean sendTest(AnalyzeRunVO analyzeRunVO) {
+        //返回评分结构体
+        behospitalInfoFacade.analyzeApi(analyzeRunVO, aMedAbnormalInfoFacade, behospitalInfoFacade);
+
+        MedTaskQueue medTaskQueue = new MedTaskQueue();
+        medTaskQueue.setWorkId(analyzeRunVO.getWorkId());
+        medTaskQueue.setHospitalId(analyzeRunVO.getHospitalId());
+        medTaskQueue.setParamIn("测试接口返回:" + JSON.toJSONString(analyzeRunVO));
+        medTaskQueue.setGmtCreate(new Date());
+        medTaskQueueFacade.save(medTaskQueue);
+        return true;
+    }
 
 }

+ 185 - 8
src/main/java/com/diagbot/facade/data/StructuralOldDataFacade.java

@@ -1,26 +1,28 @@
 package com.diagbot.facade.data;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.diagbot.dto.RespDTO;
 import com.diagbot.entity.*;
+import com.diagbot.enums.IsDeleteEnum;
 import com.diagbot.enums.ModeIdEnum;
 import com.diagbot.enums.TableNameEnum;
-import com.diagbot.facade.BehospitalInfoFacade;
-import com.diagbot.facade.MedLisInfoFacade;
-import com.diagbot.facade.MedPacsInfoFacade;
+import com.diagbot.facade.*;
 import com.diagbot.facade.str.*;
 import com.diagbot.util.FJTZDBConnHarp;
 import com.diagbot.util.MapUtil;
 import com.diagbot.util.ReadProperties;
+import com.diagbot.vo.AnalyzeRunVO;
 import com.diagbot.vo.data.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
 
 @Slf4j
 @Component
@@ -102,10 +104,81 @@ public class StructuralOldDataFacade {
     @Autowired
     private MedPacsInfoFacade medPacsInfoFacade;
 
+    @Autowired
+    private QcCasesEntryFacade qcCasesEntryFacade;
+    @Autowired
+    QcClientFacade qcServiceClient;
+    @Autowired
+    MedicalRecordFacade medicalRecordFacade;
+    @Autowired
+    SysDictionaryFacade sysDictionaryFacade;
+    @Autowired
+    StrConsultationApplyFacade strConsultationApplyFacade;
+    @Autowired
+    StrConsultationResultFacade strConsultationResultFacade;
+    @Autowired
+    StrConsultationNoteFacade strConsultationNoteFacade;
+    @Autowired
+    StrConsultationRecordFacade strConsultationRecordFacade;
+    @Autowired
+    StrAdmissionNoteFacade strAdmissionNoteFacade;
+    @Autowired
+    StrBloodResultFacade strBloodResultFacade;
+    @Autowired
+    StrBloodTransfusionFacade strBloodTransfusionFacade;
+    @Autowired
+    StrCrisisNoteFacade strCrisisNoteFacade;
+    @Autowired
+    StrDeathDiscussionFacade strDeathDiscussionFacade;
+    @Autowired
+    StrDeathNoteFacade strDeathNoteFacade;
+    @Autowired
+    StrDifficultCaseFacade strDifficultCaseFacade;
+    @Autowired
+    StrFirstRecordFacade strFirstRecordFacade;
+    @Autowired
+    StrIllCriticallyFacade strIllCriticallyFacade;
+    @Autowired
+    StrIllSeriouslFacade strIllSeriouslFacade;
+    @Autowired
+    StrLeaveHospitalFacade strLeaveHospitalFacade;
+    @Autowired
+    StrOperativeFirstRecordFacade strOperativeFirstRecordFacade;
+    @Autowired
+    StrOperativeNoteFacade strOperativeNoteFacade;
+    @Autowired
+    StrPeriodConclusionFacade strPeriodConclusionFacade;
+    @Autowired
+    StrPreoperativeDiscussionFacade strPreoperativeDiscussionFacade;
+    @Autowired
+    StrRescueNoteFacade strRescueNoteFacade;
+    @Autowired
+    StrTransferInNoteFacade strTransferInNoteFacade;
+    @Autowired
+    StrTransferOutNoteFacade strTransferOutNoteFacade;
+    @Autowired
+    StrWardRecordFacade strWardRecordFacade;
+    @Autowired
+    MedTransferRecordFacade medTransferRecordFacade;
+    @Autowired
+    MedNurseFacade medNurseFacade;
+    @Autowired
+    MedCrisisInfoFacade medCrisisInfoFacade;
+    @Autowired
+    HomePageFacade homePageFacade;
+    @Autowired
+    DoctorAdviceFacade doctorAdviceFacade;
+    @Autowired
+    StrInvasiveOperativeNoteFacade strInvasiveOperativeNoteFacade;
+    @Autowired
+    HomeDiagnoseInfoFacade homeDiagnoseInfoFacade;
+    @Autowired
+    HomeOperationInfoFacade homeOperationInfoFacade;
+    @Autowired
+    BasHospitalInfoFacade basHospitalInfoFacade;
 
     private FJTZDBConnHarp fjtzdbConnHarp = new FJTZDBConnHarp();
 
-
     /**
      * 终末质控,根据时间来导入数据
      *
@@ -520,4 +593,108 @@ public class StructuralOldDataFacade {
         String sql = "select * from " + s.getTableName() + "  where  behospitalCode = '" + s.getBehospitalCode() + "' and patientId='" + s.getPatientId() + "'";
         return sql;
     }
+
+//    public RespDTO<Boolean> sendAnalyzers(StructuralDataVo structuralDataVos, AMedAbnormalInfoFacade aMedAbnormalInfoFacade, BehospitalInfoFacade behospitalInfoFacade) {
+//
+//        if (structuralDataVos != null) {
+//            if (StringUtils.isEmpty(structuralDataVos.getBehospitalCode())) {
+//                System.out.println("任务完成++++++++++++++++++++");
+//                return RespDTO.onError("请输入病历号!");
+//            } else if (null == structuralDataVos.getHospitalId()) {
+//                return RespDTO.onError("请输入医院编码!");
+//            } else if (StringUtils.isEmpty(structuralDataVos.getRecId())) {
+//                return RespDTO.onError("请输入文书id");
+//            }
+//
+//            //返回评分结构体
+//            behospitalInfoFacade.analyzeApi(vo, aMedAbnormalInfoFacade, behospitalInfoFacade);
+//            return RespDTO.onSuc(true);
+//        } else {
+//            return RespDTO.onSuc(false);
+//        }
+//
+//    }
+//
+//    public void startAsyncProcessingAnalyzeApi(AnalyzeRunVO analyzeRunVO) {
+//        Thread workerThread = new Thread(() -> {
+//            while (true) {
+//                try {
+//                    BehospitalInfoFacade take = taskQueueAnalyzeApi.take();
+//                    if (take != null) {
+//                        System.out.println(Thread.currentThread().getId() + "进入任务开始执行+++++++++++");
+//                        take.analyzeApi(analyzeRunVO, aMedAbnormalInfoFacade, behospitalInfoFacade);
+//                    }
+//                } catch (InterruptedException e) {
+//                    Thread.currentThread().interrupt();
+//                }
+//            }
+//        });
+//        workerThread.start();
+//    }
+//
+//    public boolean addToQueueAnalyzeApi() {
+//        BehospitalInfoFacade task = new BehospitalInfoFacade(qcCasesEntryFacade, qcServiceClient, sysDictionaryFacade, medicalRecordFacade, strConsultationApplyFacade, strConsultationResultFacade, strConsultationNoteFacade,
+//                strConsultationRecordFacade, strAdmissionNoteFacade, strBloodResultFacade, strBloodTransfusionFacade, strCrisisNoteFacade, strDeathDiscussionFacade, strDeathNoteFacade,
+//                strDifficultCaseFacade, strFirstRecordFacade, strIllCriticallyFacade, strIllSeriouslFacade, strLeaveHospitalFacade, strOperativeFirstRecordFacade, strOperativeNoteFacade,
+//                strPeriodConclusionFacade, strPreoperativeDiscussionFacade, strRescueNoteFacade, strTransferInNoteFacade, strTransferOutNoteFacade, strWardRecordFacade, doctorAdviceFacade,
+//                medCrisisInfoFacade,strInvasiveOperativeNoteFacade, homePageFacade,medTransferRecordFacade,homeDiagnoseInfoFacade,homeOperationInfoFacade,basHospitalInfoFacade);
+//        //加入任务
+//        if (taskQueueAnalyzeApi.offer(task)) {
+//            System.out.println(Thread.currentThread().getId() + "加入任务队列成功!++++++++++++++++++++++++++++++++++++++++++++++++++");
+//            return true;
+//        } else {
+//            System.out.println("加入任务队列失败!++++++++++++++++++++++");
+//            return false;
+//        }
+//    }
+
+    /**
+     * 通过构造函数注入
+     *
+     */
+    public StructuralOldDataFacade(AMedAbnormalInfoFacade aMedAbnormalInfoFacade, ABehospitalInfoFacade aBehospitalInfoFacade, AStrFirstRecordFacade aStrFirstRecordFacade, AStrBloodResultFacade aStrBloodResultFacade,
+                                   AStrBloodTransfusionFacade aStrBloodTransfusionFacade,AStrTransferInNoteFacade aStrTransferInNoteFacade, AStrTransferOutNoteFacade aStrTransferOutNoteFacade,AStrIllCriticallyFacade aStrIllCriticallyFacade,
+                                   AStrIllSeriouslFacade aStrIllSeriouslFacade,AStrDifficultCaseFacade aStrDifficultCaseFacade,AStrDeathNoteFacade aStrDeathNoteFacade,AStrDeathDiscussionFacade aStrDeathDiscussionFacade,
+                                   AStrOperativeFirstRecord aStrOperativeFirstRecord,AStrPreoperativeDiscussionFacade aStrPreoperativeDiscussionFacade, AStrOperativeNoteFacade aStrOperativeNoteFacade,AStrRescueNoteFacade aStrRescueNoteFacade,
+                                   AStrLeaveHospitalFacade aStrLeaveHospitalFacade,AStrConsultationResultFacade aStrConsultationResultFacade, AStrConsultationNoteFacade aStrConsultationNoteFacade,AStrConsultationRecordFacade aStrConsultationRecordFacade,
+                                   AStrPeriodConclusionFacade aStrPeriodConclusionFacade,AStrWardRecordFacade aStrWardRecordFacade, AHomePageFacade aHomePageFacade,AHomeDiagnoseInfoFacade aHomeDiagnoseInfoFacade,
+                                   AHomeOperationInfoFacade aHomeOperationInfoFacade,ADoctorAdviceFacade aDoctorAdviceFacade, MedPacsInfoFacade medPacsInfoFacade,AMedPacsResultFacade aMedPacsResultFacade,
+                                   MedLisInfoFacade medLisInfoFacade,AMedLisResultFacade aMedLisResultFacade,AStrTalkInformFacade aStrTalkInformFacade,AStrInformedConsentFacade aStrInformedConsentFacade,
+                                   AMedCrisisFacade aMedCrisisFacade,AStrAdmissionNoteFacade aStrAdmissionNoteFacade,AStrCrisisNoteFacade aStrCrisisNoteFacade){
+        this.aMedAbnormalInfoFacade = aMedAbnormalInfoFacade;
+        this.aBehospitalInfoFacade = aBehospitalInfoFacade;
+        this.aStrFirstRecordFacade = aStrFirstRecordFacade;
+        this.aStrBloodResultFacade = aStrBloodResultFacade;
+        this.aStrBloodTransfusionFacade = aStrBloodTransfusionFacade;
+        this.aStrTransferInNoteFacade = aStrTransferInNoteFacade;
+        this.aStrTransferOutNoteFacade = aStrTransferOutNoteFacade;
+        this.aStrIllCriticallyFacade = aStrIllCriticallyFacade;
+        this.aStrIllSeriouslFacade = aStrIllSeriouslFacade;
+        this.aStrDifficultCaseFacade = aStrDifficultCaseFacade;
+        this.aStrDeathNoteFacade = aStrDeathNoteFacade;
+        this.aStrDeathDiscussionFacade = aStrDeathDiscussionFacade;
+        this.aStrOperativeFirstRecord = aStrOperativeFirstRecord;
+        this.aStrPreoperativeDiscussionFacade = aStrPreoperativeDiscussionFacade;
+        this.aStrOperativeNoteFacade = aStrOperativeNoteFacade;
+        this.aStrRescueNoteFacade = aStrRescueNoteFacade;
+        this.aStrLeaveHospitalFacade = aStrLeaveHospitalFacade;
+        this.aStrConsultationResultFacade = aStrConsultationResultFacade;
+        this.aStrConsultationNoteFacade = aStrConsultationNoteFacade;
+        this.aStrConsultationRecordFacade = aStrConsultationRecordFacade;
+        this.aStrPeriodConclusionFacade = aStrPeriodConclusionFacade;
+        this.aStrWardRecordFacade = aStrWardRecordFacade;
+        this.aHomePageFacade = aHomePageFacade;
+        this.aHomeDiagnoseInfoFacade = aHomeDiagnoseInfoFacade;
+        this.aHomeOperationInfoFacade = aHomeOperationInfoFacade;
+        this.aDoctorAdviceFacade = aDoctorAdviceFacade;
+        this.medPacsInfoFacade = medPacsInfoFacade;
+        this.aMedPacsResultFacade = aMedPacsResultFacade;
+        this.medLisInfoFacade = medLisInfoFacade;
+        this.aMedLisResultFacade = aMedLisResultFacade;
+        this.aStrTalkInformFacade = aStrTalkInformFacade;
+        this.aStrInformedConsentFacade = aStrInformedConsentFacade;
+        this.aMedCrisisFacade = aMedCrisisFacade;
+        this.aStrAdmissionNoteFacade = aStrAdmissionNoteFacade;
+        this.aStrCrisisNoteFacade = aStrCrisisNoteFacade;
+    }
 }

+ 16 - 0
src/main/java/com/diagbot/mapper/MedTaskQueueMapper.java

@@ -0,0 +1,16 @@
+package com.diagbot.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.diagbot.entity.MedTaskQueue;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author
+ * @since 2023-08-12
+ */
+public interface MedTaskQueueMapper extends BaseMapper<MedTaskQueue> {
+
+}

+ 16 - 0
src/main/java/com/diagbot/service/MedTaskQueueService.java

@@ -0,0 +1,16 @@
+package com.diagbot.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.diagbot.entity.MedTaskQueue;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author
+ * @since 2023-08-12
+ */
+public interface MedTaskQueueService extends IService<MedTaskQueue> {
+
+}

+ 20 - 0
src/main/java/com/diagbot/service/impl/MedTaskQueueServiceImpl.java

@@ -0,0 +1,20 @@
+package com.diagbot.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.diagbot.entity.MedTaskQueue;
+import com.diagbot.mapper.MedTaskQueueMapper;
+import com.diagbot.service.MedTaskQueueService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2023-08-12
+ */
+@Service
+public class MedTaskQueueServiceImpl extends ServiceImpl<MedTaskQueueMapper, MedTaskQueue> implements MedTaskQueueService {
+
+}

+ 1 - 1
src/main/java/com/diagbot/task/PullDataTask.java

@@ -66,7 +66,7 @@ public class PullDataTask implements SchedulingConfigurer {
                     Calendar yesterday = new GregorianCalendar();
                     yesterday.setTime(new Date());
                     structuralDataVo.setStopDate(sdf.format(yesterday.getTime()));
-                    yesterday.add(yesterday.DATE, -30);
+                    yesterday.add(yesterday.DATE, -3);
                     structuralDataVo.setStartDate(sdf.format(yesterday.getTime()));
 
                     structuralOldDataFacade.sendStructuralDataOld(structuralDataVo);

+ 17 - 4
src/main/java/com/diagbot/util/FJTZDBConnHarp.java

@@ -868,7 +868,7 @@ public class FJTZDBConnHarp {
 	 * @param sql
 	 * @return
 	 */
-	public List<HisViewVo> getHisView(String sql){
+	public synchronized List<HisViewVo> getHisView(String sql){
 		List<HisViewVo> hisViewVos=Lists.newLinkedList();
 		try {
 			FJTZDBConnHarp dbconn=new FJTZDBConnHarp();
@@ -893,8 +893,6 @@ public class FJTZDBConnHarp {
 				hisViewVo.setKeyCN(rs.getString("key_cn"));//字段中文名
 				hisViewVo.setDeValue(rs.getString("de_value"));//字段值
 
-
-
 				if(null!=(rs.getString("recordDate"))){
 					hisViewVo.setRecordDate(DateUtil.parseDate(rs.getString("recordDate"),DateUtil.DATE_TIME_FORMAT));//质控日期
 				}
@@ -910,7 +908,22 @@ public class FJTZDBConnHarp {
 		} catch (Exception e) {
 			e.printStackTrace();
 		}finally {
-			close();
+			try {
+				if (this.rs != null) {
+					this.rs.close();
+					this.rs = null;
+				}
+				if (this.sta != null) {
+					this.sta.close();
+					this.sta = null;
+				}
+				if (this.connection != null) {
+					this.connection.close();
+					this.connection = null;
+				}
+			} catch (SQLException e) {
+				e.printStackTrace();
+			}
 		}
 		return hisViewVos;
 

+ 7 - 0
src/main/java/com/diagbot/vo/AnalyzeRunVO.java

@@ -24,4 +24,11 @@ public class AnalyzeRunVO {
     private String isPlacefile = "0";
     //默认分组
     private Integer NeedGroup = 1;
+    //档案号(病人id)
+    private  String patientId;
+    //是否质控评分标识(1:质控评分,0:不质控评分)默认为0
+    @NotNull(message = "isQcScore不能为空")
+    private Integer isQcScore = 0;
+    // 任务id
+    private String workId;
 }

+ 14 - 2
src/main/java/com/diagbot/vo/data/StructuralDataVo.java

@@ -3,6 +3,7 @@ package com.diagbot.vo.data;
 import lombok.Data;
 
 import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
 import java.util.Date;
 
 @Data
@@ -13,7 +14,7 @@ public class StructuralDataVo {
     private  String behospitalCode;
 
     /**
-     * 档案号
+     * 档案号(病人id)
      */
     private  String patientId;
 
@@ -22,7 +23,7 @@ public class StructuralDataVo {
      */
     private String recId;
 
-    /**
+    /**
      * 模板表名字
      */
     private String tableName;
@@ -54,6 +55,17 @@ public class StructuralDataVo {
      */
     private String emrTitle;
 
+    /**
+     * 任务id
+     */
+    private String workId;
+
+    /**
+     * 是否质控评分标识(1:质控评分,0:不质控评分)默认为0
+     */
+    @NotNull(message = "isQcScore不能为空")
+    private Integer isQcScore = 0;
+
     private String dockModeType;//对接模式类型编码,1:页面模式,2:接口引擎模式
 
 }

+ 23 - 9
src/main/java/com/diagbot/web/BehospitalInfoController.java

@@ -5,6 +5,8 @@ import java.util.Map;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 
+import com.diagbot.facade.data.StructuralDataFacade;
+import com.diagbot.facade.data.StructuralOldDataFacade;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -53,6 +55,8 @@ public class BehospitalInfoController {
     BehospitalInfoFacade behospitalInfoFacade;
     @Autowired
     private QcresultInfoFacade qcresultInfoFacade;
+    @Autowired
+    private StructuralDataFacade structuralDataFacade;
 
     @ApiOperation(value = "病历分页列表[by:zhoutg]",
             notes = "behospitalCode:病人住院序号<br>" +
@@ -119,19 +123,29 @@ public class BehospitalInfoController {
         return RespDTO.onSuc(behospitalInfoFacade.analyze(analyzeVO));
     }
 
+//    @Transactional
+//    @SysLogger("analyze_api")
+//    @PostMapping("/analyze_api")
+//    @ApiOperation(value = "评分-对外api接口[by:zhoutg]")
+//    public RespDTO<Map<String, Object> > analyzeApi(@RequestBody AnalyzeRunVO analyzeRunVO) {
+//
+//    	log.info("开始调用请求:传入的参数为:{}",JSON.toJSONString(analyzeRunVO));
+//    	new Thread() {
+//    		public void run() {
+//    			behospitalInfoFacade.analyzeApi(analyzeRunVO);
+//    		}
+//    	}.start();
+//        return RespDTO.onSuc(null);
+//    }
+
     @Transactional
     @SysLogger("analyze_api")
     @PostMapping("/analyze_api")
     @ApiOperation(value = "评分-对外api接口[by:zhoutg]")
-    public RespDTO<Map<String, Object> > analyzeApi(@RequestBody AnalyzeRunVO analyzeRunVO) {
-    	
-    	log.info("开始调用请求:传入的参数为:{}",JSON.toJSONString(analyzeRunVO));
-    	new Thread() {
-    		public void run() {
-    			behospitalInfoFacade.analyzeApi(analyzeRunVO);
-    		}
-    	}.start();
-        return RespDTO.onSuc(null);
+    public RespDTO<Boolean> analyzeApi(@RequestBody AnalyzeRunVO analyzeRunVO) {
+        structuralDataFacade.startAsyncProcessingAnalyzeApi(analyzeRunVO);
+        Boolean data = structuralDataFacade.addToQueueAnalyzeApi(analyzeRunVO);
+        return RespDTO.onSuc(data);
     }
 
     @ApiOperation(value = "新增质控条目[by:zhoutg]")

+ 21 - 10
src/main/java/com/diagbot/web/DataController.java

@@ -1,11 +1,10 @@
 package com.diagbot.web;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 import javax.validation.Valid;
 
+import com.diagbot.vo.AnalyzeRunVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -14,8 +13,6 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.alibaba.fastjson.JSON;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.diagbot.annotation.SysLogger;
 import com.diagbot.dto.RespDTO;
 import com.diagbot.dto.data.ABasDeptInfoDTO;
@@ -28,7 +25,6 @@ import com.diagbot.dto.data.AMedCrisisDTO;
 import com.diagbot.dto.data.AMedicalRecordContentDTO;
 import com.diagbot.dto.data.AMedicalRecordDTO;
 import com.diagbot.dto.data.AMedicalRecordTypeDTO;
-import com.diagbot.entity.MedAbnormalInfo;
 import com.diagbot.facade.data.ABasDeptInfoFacade;
 import com.diagbot.facade.data.ABasDoctorInfoFacade;
 import com.diagbot.facade.data.ABehospitalInfoFacade;
@@ -46,7 +42,6 @@ import com.diagbot.facade.data.AMedicalRecordFacade;
 import com.diagbot.facade.data.DeleteFlagFacade;
 import com.diagbot.facade.data.StructuralDataFacade;
 import com.diagbot.facade.data.StructuralOldDataFacade;
-import com.diagbot.facade.str.AStrOperativeNoteFacade;
 import com.diagbot.service.impl.DataConsistencyServiceImpl;
 import com.diagbot.vo.data.ABasDeptInfoVO;
 import com.diagbot.vo.data.ABehospitalInfoVO;
@@ -112,8 +107,6 @@ public class DataController {
     @Autowired
     private AMedAbnormalInfoFacade aMedAbnormalInfoFacade;
 
-
-    //
 //    @ApiOperation(value = "数据引擎-获取医院所有在职医生的基本信息")
 //    @PostMapping("/sendDoctorInfos")
 //    @SysLogger("sendDoctorInfos")
@@ -148,11 +141,20 @@ public class DataController {
         return aMedicalRecordFacade.executeMrRecordIng(aMrContentVO);
     }
 
+//    @ApiOperation(value = "单份病例保存并返回评分{厦门}")
+//    @PostMapping("/sendStructuralData")
+//    @SysLogger("sendStructuralData")
+//    public RespDTO<Map<String, Object>> sendStructuralData(@Valid @RequestBody StructuralDataVo structuralDataVos) {
+//        return structuralDataFacade.sendStructuralData(structuralDataVos);
+//    }
+
     @ApiOperation(value = "单份病例保存并返回评分{厦门}")
     @PostMapping("/sendStructuralData")
     @SysLogger("sendStructuralData")
-    public RespDTO<Map<String, Object>> sendStructuralData(@Valid @RequestBody StructuralDataVo structuralDataVos) {
-        return structuralDataFacade.sendStructuralData(structuralDataVos);
+    public RespDTO<Boolean> sendStructuralData(@Valid @RequestBody StructuralDataVo structuralDataVos) {
+        structuralDataFacade.startAsyncProcessing(structuralDataVos);
+        Boolean data = structuralDataFacade.addToQueue(structuralDataVos);
+        return RespDTO.onSuc(data);
     }
 
     @ApiOperation(value = "{历史病例导入单个病人}")
@@ -308,4 +310,13 @@ public class DataController {
     }
 
 
+    @ApiOperation(value = "厦门五院实时提醒返回参数获取(测试)")
+    @PostMapping("/sendTest")
+    @SysLogger("sendTest")
+    public RespDTO<Boolean> sendTest(@Valid @RequestBody AnalyzeRunVO analyzeRunVO) {
+        boolean data = structuralDataFacade.sendTest(analyzeRunVO);
+        return RespDTO.onSuc(data);
+    }
+
+
 }

+ 3 - 3
src/main/resources/application-dev.yml

@@ -59,9 +59,9 @@ spring:
     druid:
       driver-class-name: com.mysql.cj.jdbc.Driver
       platform: mysql
-      url: jdbc:mysql://192.168.2.71:3306/qc?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&allowMultiQueries=true
+      url: jdbc:mysql://192.168.2.31/qc?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&allowMultiQueries=true
       username: root
-      password: dsYun-test
+      password: dsYun8!@#
       # 连接池的配置信息
       # 初始化大小,最小,最大
       initialSize: 5
@@ -111,7 +111,7 @@ spring:
     database:
       cache: 8 # cache索引
       token: 8 # Token索引
-    host: 127.0.0.1  #Redis服务器地址
+    host: 192.168.2.31  #Redis服务器地址
     port: 6379 # Redis服务器连接端口(本地环境端口6378,其他环境端口是6379)
     password:  # Redis服务器连接密码(默认为空)
     lettuce:

+ 1 - 1
src/main/resources/bootstrap.yml

@@ -2,7 +2,7 @@ spring:
   application:
     name: mrqc-sys
   profiles:
-    active: dev
+    active: local
   main:
     allow-bean-definition-overriding: true
 

+ 5 - 3
src/main/resources/mapper/BehospitalInfoMapper.xml

@@ -151,13 +151,15 @@
         SELECT b.`name` model_name,c.score,c.msg,c.cases_entry_id,c.is_reject,c.id id,c.info,
         a.cases_id cases_id, d.score cases_score,b.id model_id, a.name standard_msg,
         c.opt_type, c.grade_type, c.gmt_create, c.gmt_modified,
-        a.type, a.drgs, c.is_deleted
-        FROM `qc_cases_entry` a, qc_mode b, med_qcresult_detail c, qc_cases_hospital d
-        where a.is_deleted = 'N' and b.is_deleted = 'N' and c.is_deleted = 'N' and d.is_deleted = 'N'
+        a.type, a.drgs, c.is_deleted, e.is_card_control
+        FROM `qc_cases_entry` a, qc_mode b, med_qcresult_detail c, qc_cases_hospital d, qc_cases_entry_hospital e
+        where a.is_deleted = 'N' and b.is_deleted = 'N' and c.is_deleted = 'N' and d.is_deleted = 'N' and e.is_deleted='N'
         and a.id = c.cases_entry_id
+        and a.id = e.cases_entry_id
         and a.mode_id = b.id
         AND c.cases_id = d.cases_id
         and c.hospital_id = d.hospital_id
+        and d.hospital_id = e.hospital_id
         and c.hospital_id = #{hospitalId}
         and c.behospital_code = #{behospitalCode}
         order by b.order_no, c.grade_type desc, a.order_no