Sfoglia il codice sorgente

[task-6326] 试剂更换验证对接

huangws 2 mesi fa
parent
commit
83bfe9fafe

+ 6 - 0
GetDataByView/pom.xml

@@ -13,6 +13,7 @@
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
         <spring-boot.version>2.7.6</spring-boot.version>
+        <skipTests>true</skipTests>
     </properties>
     <dependencies>
         <dependency>
@@ -44,6 +45,11 @@
             <artifactId>lombok</artifactId>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>cn.com.kingbase</groupId>
+            <artifactId>kingbase8</artifactId>
+            <version>9.0.0</version> <!-- 请根据实际使用的驱动版本修改 -->
+        </dependency>
 <!--        <dependency>-->
 <!--            <groupId>org.springframework.boot</groupId>-->
 <!--            <artifactId>spring-boot-starter-log4j2</artifactId>-->

+ 13 - 21
GetDataByView/src/main/java/com/jyxt/getdatabyview/GetDataByViewApplication.java

@@ -15,6 +15,7 @@ import org.springframework.context.ConfigurableApplicationContext;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 @SpringBootApplication
 public class GetDataByViewApplication implements CommandLineRunner{
@@ -27,12 +28,13 @@ public class GetDataByViewApplication implements CommandLineRunner{
     @Autowired
     private IBPSRepository ibpsRepository;
 
+    @Value("${updateReagentCode}")
+    private String updateReagentCode;
+
     public static void main(String[] args) {
         SpringApplication.run(GetDataByViewApplication.class, args);
     }
 
-    @Value("${table.match}")
-    private String MatchStr;
 
     @Autowired
     private HandleData handleData;
@@ -42,29 +44,19 @@ public class GetDataByViewApplication implements CommandLineRunner{
 
     @Override
     public void run(String... args) throws Exception {
-//        System.out.println("in run");
         log.info("<-------------new turn start...------------->");
-        String[] MatchArr = MatchStr.split("@");
-        handleData.Test();
-        for (String curMatch : MatchArr) {
-            String LISTable = curMatch.split("|")[0];
-            String IBPSTale = curMatch.split("|")[1];
-            if(LISTable != null && !LISTable.isEmpty() &&
-                    IBPSTale != null && !IBPSTale.isEmpty()) {
-                List<Map<String, Object>> retList = lisViewRepository.query(LISTable);
-                for (Map<String, Object> retMap : retList) {
-                    if(retMap != null){
-                        try {
-                            handleData.HandleData(retMap, IBPSTale);
-                        }catch (Exception ex){
-                            log.error(ex.getMessage());
-                        }
-                    }
-                }
-            }
+        if(Objects.equals(updateReagentCode, "1")){
+            handleData.updateReagentCode();
+        } else if(Objects.equals(updateReagentCode, "0")){
+            handleData.Test();
+//            handleData.upadteReagentInfo();
+            handleData.HandleData();
+        } else if(Objects.equals(updateReagentCode, "2")){
+            handleData.lisTest();
         }
 
 
+
         log.info("<-------------this turn finish...------------->");
         context.close(); // 直接关闭上下文
     }

+ 297 - 95
GetDataByView/src/main/java/com/jyxt/getdatabyview/HandleData.java

@@ -5,10 +5,13 @@ import com.jyxt.getdatabyview.view.repository.LISViewRepository;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
+import java.sql.Timestamp;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.stream.Collectors;
 
 @Component
 public class HandleData {
@@ -20,107 +23,306 @@ public class HandleData {
     @Autowired
     private IBPSRepository ibpsRepository;
 
-    private static final String RESULT_DELIMITER = "\\^";
-
-    private static final List<String> qualityIndicatorList = Collections.unmodifiableList(
-            Arrays.asList(
-                    "总标本不合格率",                // 0
-                    "抗凝标本凝集率",                // 1
-                    "标本类型错误率",                // 2
-                    "标本容器错误率",                // 3
-                    "标本溶血率",                   // 4
-                    "标本采集量错误率",              // 5
-                    "急诊常规实验室内TAT中位数",      // 6
-                    "急诊生化免疫实验室内TAT中位数",   // 7
-                    "急诊凝血实验室内TAT中位数",      // 8
-                    "急诊血常规检验前周转时间中位数",   // 9
-                    "急诊血常规实验室内周转时间中位数", // 10
-                    "常规检验报告发放TAT时间符合率",   // 11
-                    "检验报告不正确率",              // 12
-                    "危急值通报率",                 // 13
-                    "危急值通报及时率",              // 14
-                    "标本合格率",                   // 15
-                    "TAT时间合格率",                // 16
-                    "报告准确率",                   // 17
-                    "危急值通报符合率"               // 18
-            )
-    );
-
-    public void startHandleData(String pingjiaId,String zhiliangzhibia,String bianzhishijian, String yuanshishuju) {
-
-        if (qualityIndicatorList.contains(zhiliangzhibia)){
-//            System.out.println(output);
-            log.info("ID: {}, zhiliangzhibia: {}, bianzhishijian: {}", pingjiaId, zhiliangzhibia, bianzhishijian);
-            int QIIndex = qualityIndicatorList.indexOf(zhiliangzhibia);
-            String DataDetail = "";
-            String dateRange = DateRangeUtil.getDateRange(bianzhishijian);
-            String[] resultParts = lisViewRepository.query(QIIndex,dateRange).split(RESULT_DELIMITER);
-//            String[] resultParts = new String[] {"", "", ""};
-//            if (pingjiaId.equals("1367710945618427904")) {
-//                resultParts = new String[] {"100", "10000", "10000"};
-//            }
-            String resultValue = resultParts[0];
-            if (resultValue.startsWith(".")) {
-                resultValue = "0" + resultValue;
+    public void Test(){
+        log.info("in Test");
+    }
+
+    public void HandleData() {
+        //log.info("ID: {}, zhiliangzhibia: {}, bianzhishijian: {}", pingjiaId, zhiliangzhibia, bianzhishijian);
+        //缓存用户和部门list
+        ibpsRepository.getBasicData();
+        List<Map<String, Object>> lisReagentList = lisViewRepository.getReagentLotVerification();
+        Timestamp currentTimestamp = getCurTime("yyyy-MM-dd HH:mm:ss");
+        List<Map<String, Object>> reagentMainList = new ArrayList<>();
+        List<Map<String, Object>> reagentSubList = new ArrayList<>();
+        long sequenceCounter = 0;
+        for (Map<String, Object> lisReagent : lisReagentList) {
+            List<String> pushUserList = new ArrayList<>();
+            String GroupCode = lisReagent.get("GroupCode").toString();
+            pushUserList = ibpsRepository.getPushList(GroupCode);
+            String PosID = ibpsRepository.getPosiByField(GroupCode,"DESC_","id_");
+            String reagentCode = lisReagent.get("ReagentNumber").toString();
+            String reagentID = ibpsRepository.getReagentByField(reagentCode,"bian_ma_","id_");
+            // 生成有序ID:时间戳+自增序列号
+            String orderedId = String.format("%d-%06d",
+                    currentTimestamp.getTime(),  // 使用时间戳
+                    sequenceCounter++            // 自增序列号
+            );
+            String diDian = ibpsRepository.getPosiByField("院本部","NAME_","id_");
+            String reagentName = lisReagent.get("ReagentName").toString();
+            String newBatchNumber = lisReagent.get("NewBatchNumber").toString();
+            String newExpiredDate = lisReagent.get("ExpiredDate").toString();
+            Map<String, String> oldReagentMap = ibpsRepository.getOldReagent(reagentCode);
+            String oldBatchNumber = String.valueOf(oldReagentMap.get("oldBatchNumber") == null ? "" : oldReagentMap.get("oldBatchNumber"));
+            String oldExpiredDate = String.valueOf(oldReagentMap.get("oldExpiredDate") == null ? "" : oldReagentMap.get("oldExpiredDate"));
+            String reagentType = ibpsRepository.getReagentByField(reagentCode,"bian_ma_","shi_shi_lei_bie_");
+            String deviceID = ibpsRepository.getReagentByField(reagentCode,"bian_ma_","yi_qi_she_bei_");
+            String deviceCode = ibpsRepository.getReagentByField(reagentCode,"bian_ma_","she_bei_bian_hao_");
+//            String reagentType = "定性";
+            String Status = reagentType == "定量" ? "定量待推送" : "定性待推送";
+            //组装主表数据数组
+            Map<String, Object> reagentMainMap = new HashMap<>();
+            reagentMainMap.put("id_", orderedId);
+            reagentMainMap.put("create_time_", String.valueOf(getCurTime("yyyy-MM-dd HH:mm:ss")));
+            reagentMainMap.put("shi_fou_guo_shen_", Status);
+            reagentMainMap.put("bian_zhi_bu_men_", PosID);
+            reagentMainMap.put("create_by_", String.join(",", pushUserList));
+            reagentMainMap.put("di_dian_", diDian);
+            reagentMainMap.put("shi_ji_ming_cheng", reagentName);
+            reagentMainMap.put("lei_xing_", "货运号更换");
+            reagentMainMap.put("xin_hao_", newBatchNumber);
+            reagentMainMap.put("fang_an_", "检验质控品");
+            reagentMainMap.put("ji_lu_lei_xing_", reagentType);
+            reagentMainMap.put("pan_duan_biao_zhu", "在参考范围以内的阳性标本按阳性符合计算,阳性标本(参考范围以外)计算偏倚百分比,比对的偏差范围在允许范围内为满足要求:各项目满足要求的比例应>80");
+            reagentMainMap.put("s_j_h_c_ming_chen", reagentID);
+            reagentMainMap.put("shi_ji_bian_ma_", reagentCode);
+            reagentMainMap.put("ming_cheng_id_", deviceID);
+            reagentMainMap.put("y_she_bei_bian_ha", deviceCode);
+
+            reagentMainList.add(reagentMainMap);
+            //组装子表数据数组
+            long sequenceSubCounter = 0;
+            Map<String, Object> reagentSubMap = new HashMap<>();
+            String subOrderId = orderedId+"_"+sequenceSubCounter;
+            reagentSubMap.put("id_", subOrderId);
+            sequenceSubCounter++;
+            reagentSubMap.put("id_", subOrderId);
+            reagentSubMap.put("parent_id_", orderedId);
+            reagentSubMap.put("create_time_", String.valueOf(getCurTime("yyyy-MM-dd HH:mm:ss")));
+            reagentSubMap.put("shi_ji_hao_cai_", reagentName);
+            reagentSubMap.put("shi_ji_xin_pi_hao", newBatchNumber);
+            reagentSubMap.put("shi_ji_jiu_pi_hao", oldBatchNumber);
+            reagentSubMap.put("jiu_you_xiao_qi_", oldExpiredDate);
+            reagentSubMap.put("xin_you_xiao_qi_", newExpiredDate);
+            reagentSubMap.put("shi_ji_hao_cai_id", reagentID);
+            reagentSubMap.put("shi_ji_bian_ma_", reagentCode);
+            reagentSubList.add(reagentSubMap);
+        }
+        String res = ibpsRepository.saveToTable(reagentMainList, "t_sjghyzjlb", "1");
+        if(res.equals("success")){
+            log.info("table:t_sjghyzjlb success insert:"+reagentMainList.size()+" datas");
+            if (!reagentSubList.isEmpty()) {
+                res = ibpsRepository.saveToTable(reagentSubList, "t_sjhcjlb", "1");
+                if ("success".equals(res)) {
+                    log.info("table:t_sjhcjlb success insert: {} datas", reagentSubList.size());
+                } else {
+                    log.info("fail insert t_sjhcjlb");
+                }
+            } else {
+                log.info("no data insert to t_sjhcjlb");
             }
-            String IsQualified = null;
-            if ((!Objects.equals(resultValue, ""))){
-                IsQualified = ValueEvaluator.evaluateValue(resultValue,yuanshishuju);
+        } else {
+            log.info("fail insert t_sjghyzjlb");
+        }
+    }
+
+
+    public void updateReagentCode() {
+        // 1. 获取数据
+        List<Map<String, Object>> lisReagentList = lisViewRepository.getBasicReagent();
+        List<Map<String, Object>> ibpsReagentList = ibpsRepository.getRagentInfo();
+
+        // 2. 前置校验
+        if (lisReagentList == null || lisReagentList.isEmpty() || ibpsReagentList == null || ibpsReagentList.isEmpty()) {
+            log.info("试剂数据为空,无需更新!");
+            return;
+        }
+
+        // 3. 将 LIS 试剂列表转为 Map,Key 为旧编码 (ReagentNumbeOld)
+        Map<String, String> lisOldToNewCodeMap = lisReagentList.stream()
+                .filter(lis -> lis.get("ReagentNumbeOld") != null && lis.get("ReagentNumber") != null)
+                .filter(lis -> !lis.get("ReagentNumbeOld").toString().trim().isEmpty() && !lis.get("ReagentNumber").toString().trim().isEmpty())
+                .collect(Collectors.toMap(
+                        lis -> lis.get("ReagentNumbeOld").toString().trim(),
+                        lis -> lis.get("ReagentNumber").toString().trim(),
+                        (existing, replacement) -> existing // 如果有重复的旧编码,保留第一个
+                ));
+
+        // 4. 准备需要更新的 IBPS 试剂列表
+        List<Map<String, Object>> needUpdateIbpsReagents = new ArrayList<>();
+
+        // 5. 遍历 IBPS 试剂,进行匹配和更新逻辑
+        for (Map<String, Object> ibpsReagent : ibpsReagentList) {
+            String ibpsOldCode = (String) ibpsReagent.get("bian_ma_");
+            Object ibpsId = ibpsReagent.get("id_"); // 获取 IBPS 表自身的主键 ID
+
+            // 过滤掉无效数据(编码为空,或者没有主键ID的无法更新)
+            if (ibpsOldCode == null || ibpsOldCode.trim().isEmpty() || ibpsId == null) {
+                continue;
             }
-            //总数统计
-            if (resultParts.length==2){
-                String total = resultParts[1];
-                if ((!Objects.equals(resultValue, ""))&&(!Objects.equals(resultValue,null))&&(!Objects.equals(resultValue,"-1"))) {
-//                System.out.println("output:"+ResultValue);
-                    log.info("Get LIS RetVal:{},zhiliangzhibiao:{},bianzhishijian:{}",resultParts,zhiliangzhibia,bianzhishijian);
-                    if (QIIndex==6){
-                        DataDetail = "同期临检(住院)及临检(门诊)的三大常规(血、尿、便)标本共 "+resultParts[1]+" 例";
-                    } else if (QIIndex==7){
-                        DataDetail = "同期临检急诊组的急诊生化、免疫标本共 "+resultParts[1]+" 例";
-                    } else if (QIIndex==8){
-                        DataDetail = "同期临检(住院)及临检(门诊) 的急诊血凝标本共 "+resultParts[1]+" 例";
-                    } else if ((QIIndex==9)||(QIIndex==10)){
-                        DataDetail = "同期临检(住院)及临检(门诊) 的急诊血常规标本共 "+resultParts[1]+" 例";
-                    }
-//                    qualityIndicatorRepository.save(pingjiaId, resultValue,total,DataDetail,IsQualified);
-                    //分子不需要整数
-                    //ibpsRepository.save(pingjiaId, resultValue,resultValue,DataDetail,IsQualified);
+
+            // 用 IBPS 当前的旧编码去匹配 LIS 的旧编码,并获取 LIS 的新编码
+            String matchedLisNewCode = lisOldToNewCodeMap.get(ibpsOldCode.trim());
+
+            if (matchedLisNewCode != null) {
+                Map<String, Object> updateData = new HashMap<>();
+                updateData.put("id_", ibpsId);
+                updateData.put("bian_ma_", matchedLisNewCode);
+
+                needUpdateIbpsReagents.add(updateData);
+            }
+        }
+        
+        if (!needUpdateIbpsReagents.isEmpty()) {
+            log.info("共匹配到 " + needUpdateIbpsReagents.size() + " 条 IBPS 试剂需要更新编码。");
+            String tableName = "t_sjhcjcsjpz";
+            String result = ibpsRepository.saveToTable(needUpdateIbpsReagents, tableName, "2");
+            if ("success".equals(result)) {
+                log.info("IBPS 试剂编码批量更新成功!");
+            } else {
+                log.info("IBPS 试剂编码批量更新失败:" + result);
+            }
+        } else {
+            log.info("没有需要更新的 IBPS 试剂编码。");
+        }
+    }
+
+
+    public void upadteReagentInfo() {
+        // 1. 获取两边的最新数据
+        List<Map<String, Object>> lisReagentList = lisViewRepository.getBasicReagent();
+        List<Map<String, Object>> ibpsReagentList = ibpsRepository.getRagentInfo();
+
+        // 2. 前置校验
+        if (lisReagentList == null || lisReagentList.isEmpty()) {
+            log.info("LIS 试剂数据为空,无法同步!");
+            return;
+        }
+
+        // 3. 将 LIS 试剂列表转为 Map,Key 为新编码 (ReagentNumber)
+        Map<String, Map<String, Object>> lisNewCodeMap = lisReagentList.stream()
+                .filter(lis -> lis.get("ReagentNumber") != null && !lis.get("ReagentNumber").toString().trim().isEmpty())
+                .collect(Collectors.toMap(
+                        lis -> lis.get("ReagentNumber").toString().trim(),
+                        lis -> lis,
+                        (existing, replacement) -> existing
+                ));
+
+        // 4. 准备需要更新和新增的 IBPS 试剂列表
+        List<Map<String, Object>> needUpdateIbpsReagents = new ArrayList<>();
+        List<Map<String, Object>> needInsertIbpsReagents = new ArrayList<>();
+
+        // 如果 IBPS 有数据,先把现有的 IBPS 数据转为 Set,方便快速判断某个编码是否已经存在
+        java.util.Set<String> existingIbpsCodes = new java.util.HashSet<>();
+        if (ibpsReagentList != null && !ibpsReagentList.isEmpty()) {
+            for (Map<String, Object> ibps : ibpsReagentList) {
+                String code = (String) ibps.get("bian_ma_");
+                if (code != null && !code.trim().isEmpty()) {
+                    existingIbpsCodes.add(code.trim());
                 }
-            } else if (resultParts.length==3){
-                String numerator = resultParts[1];
-                String denominator = resultParts[2];
-                if ((!Objects.equals(resultValue, ""))&&(!Objects.equals(resultValue,null))&&(!Objects.equals(resultValue,"-1"))){
-                    log.info("Get LIS RetVal:{},zhiliangzhibiao:{},bianzhishijian:{}",resultParts,zhiliangzhibia,bianzhishijian);
-                    if (QIIndex==0){
-                        DataDetail = "不合格标本数 "+resultParts[1]+" 例,同期标本总数 "+resultParts[2]+" 例";
-                    } else if (QIIndex==1){
-                        DataDetail = "凝集的标本数 "+resultParts[1]+" 例,同期需抗凝的标本总数 "+resultParts[2]+" 例";
-                    } else if (QIIndex==2){
-                        DataDetail = "类型错误或不适当的标本数 "+resultParts[1]+" 例,同期标本总数 "+resultParts[2]+" 例";
-                    } else if (QIIndex==3){
-                        DataDetail = "采集容器错误的标本数 "+resultParts[1]+" 例,同期标本总数 "+resultParts[2]+" 例";
-                    } else if (QIIndex==4){
-                        DataDetail = "溶血的标本 "+resultParts[1]+" 例,同期标本总数 "+resultParts[2]+" 例";
-                    } else if (QIIndex==5){
-                        DataDetail = "量不足或过多(抗凝标本)的标本数 "+resultParts[1]+" 例,同期标本总数 "+resultParts[2]+" 例";
-                    } else if (QIIndex==12){
-                        DataDetail = "实验室发出的不正确报告数 "+resultParts[1]+" 例,报告总数 "+resultParts[2]+" 例";
-                    } else if (QIIndex==13){
-                        DataDetail = "已通报危急值数 "+resultParts[1]+" 例,同期需要通报危急值总数 "+resultParts[2]+" 例";
-                    } else if (QIIndex==14){
-                        DataDetail = "危急值通报时间(从结果确认到与临床医生交流的时间)满足规定时间的检验项目数 "+resultParts[1]+" 例,同期需要危急值通报的检验项目总数 "+resultParts[2]+" 例";
-                    } else if (QIIndex==15){
-                        DataDetail = "全年合格标本总数 "+resultParts[1]+" 例,全年标本总数 "+resultParts[2]+" 例";
-                    } else if (QIIndex==17){
-                        DataDetail = "实验室发出的正确报告数 "+resultParts[1]+" 例,同期实验室发出报告总数 "+resultParts[2]+" 例";
-                    } else if (QIIndex==18){
-                        DataDetail = "危急值通报时间(从结果确认到与临床医生交流的时间)满足规定时间的检验项目数 "+resultParts[1]+" 例,同期需要危急值通报的检验项目总数 "+resultParts[2]+" 例";
+            }
+        }
+
+        // 5. 遍历 LIS 试剂,进行匹配、更新或新增的判断
+        for (Map<String, Object> lisReagent : lisNewCodeMap.values()) {
+            String lisCode = (String) lisReagent.get("ReagentNumber");
+            if (lisCode == null || lisCode.trim().isEmpty()) continue;
+            lisCode = lisCode.trim();
+            String currentCode = lisCode;
+            // 判断 IBPS 中是否已经存在该编码
+            if (existingIbpsCodes.contains(lisCode)) {
+                // --- 情况一:IBPS 中已存在,进行字段比对并更新 ---
+                // 找到对应的 IBPS 试剂对象
+                Map<String, Object> matchedIbpsReagent = ibpsReagentList.stream()
+                        .filter(ibps -> currentCode.equals(safeTrim(ibps.get("bian_ma_"))))
+                        .findFirst().orElse(null);
+
+                if (matchedIbpsReagent != null) {
+                    Map<String, Object> updateData = new HashMap<>();
+                    boolean hasChanged = false;
+
+                    // 定义需要比对的字段映射关系 (IBPS字段名 -> LIS字段名)
+                    Map<String, String> fieldMapping = new LinkedHashMap<>();
+                    fieldMapping.put("ming_cheng_", "ReagentName");
+                    fieldMapping.put("bao_zhuang_gui_ge", "Spec");
+                    fieldMapping.put("dan_wei_", "Unit");
+                    fieldMapping.put("chang_jia_", "Manufacturer");
+                    fieldMapping.put("gong_ying_shang_", "Supplyer");
+
+                    for (Map.Entry<String, String> entry : fieldMapping.entrySet()) {
+                        String ibpsField = entry.getKey();
+                        String lisField = entry.getValue();
+                        String ibpsValue = safeTrim(matchedIbpsReagent.get(ibpsField));
+                        String lisValue = safeTrim(lisReagent.get(lisField));
+
+                        if (!Objects.equals(ibpsValue, lisValue)) {
+                            updateData.put(ibpsField, lisValue);
+                            hasChanged = true;
+                        }
+                    }
+
+                    if (hasChanged) {
+                        updateData.put("id_", matchedIbpsReagent.get("id_")); // 带上主键ID用于 WHERE 条件
+                        needUpdateIbpsReagents.add(updateData);
                     }
-                    //ibpsRepository.save(pingjiaId,resultValue,numerator,denominator,DataDetail,IsQualified);
                 }
+
             } else {
-                log.info("no result to save:zhiliangzhibiao:{},bianzhishijian:{}",zhiliangzhibia,bianzhishijian);
+                // --- 情况二:IBPS 中不存在,准备新增 ---
+                Map<String, Object> insertData = new HashMap<>();
+                // 以编码的值当 id_
+                insertData.put("id_", lisCode);
+                insertData.put("bian_ma_", lisCode);
+                insertData.put("ming_cheng_", safeTrim(lisReagent.get("ReagentName")));
+                insertData.put("bao_zhuang_gui_ge", safeTrim(lisReagent.get("Spec")));
+                insertData.put("dan_wei_", safeTrim(lisReagent.get("Unit")));
+                insertData.put("chang_jia_", safeTrim(lisReagent.get("Manufacturer")));
+                insertData.put("gong_ying_shang_", safeTrim(lisReagent.get("Supplyer")));
+                insertData.put("ji_lu_lei_xing_", "定量");
+
+                needInsertIbpsReagents.add(insertData);
             }
         }
+
+        // 6. 批量新增和更新
+        String tableName = "t_sjhcjcsjpz";
+
+        // 执行新增 (saveType = "1")
+        if (!needInsertIbpsReagents.isEmpty()) {
+            log.info("共发现 " + needInsertIbpsReagents.size() + " 条新试剂需要新增。");
+            String insertResult = ibpsRepository.saveToTable(needInsertIbpsReagents, tableName, "1");
+            if ("success".equals(insertResult)) {
+                log.info("IBPS 试剂新增成功!");
+            } else {
+                log.info("IBPS 试剂新增失败:" + insertResult);
+            }
+        }
+
+        // 执行更新 (saveType = "2")
+        if (!needUpdateIbpsReagents.isEmpty()) {
+            log.info("共发现 " + needUpdateIbpsReagents.size() + " 条试剂信息需要同步更新。");
+            String updateResult = ibpsRepository.saveToTable(needUpdateIbpsReagents, tableName, "2");
+            if ("success".equals(updateResult)) {
+                log.info("IBPS 试剂信息更新成功!");
+            } else {
+                log.info("IBPS 试剂信息更新失败:" + updateResult);
+            }
+        }
+
+        if (needInsertIbpsReagents.isEmpty() && needUpdateIbpsReagents.isEmpty()) {
+            log.info("IBPS 试剂信息与试剂系统一致,无需任何操作。");
+        }
+    }
+
+    /**
+     * 辅助方法:安全地将 Object 转为 Trim 后的 String,处理 null 和空格问题
+     */
+    private String safeTrim(Object obj) {
+        if (obj == null) {
+            return "";
+        }
+        return obj.toString().trim();
+    }
+
+    public Timestamp getCurTime(String formartterStr){
+        LocalDateTime currentDateTime = LocalDateTime.now();
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(formartterStr);
+        String formattedDateTime = currentDateTime.format(formatter);
+        Timestamp currentTimestamp = Timestamp.valueOf(formattedDateTime);
+        return currentTimestamp;
+    }
+
+    public void lisTest(){
+        lisViewRepository.LisTest();
     }
 }

+ 13 - 5
GetDataByView/src/main/java/com/jyxt/getdatabyview/ValueEvaluator.java

@@ -3,6 +3,11 @@ package com.jyxt.getdatabyview;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 public class ValueEvaluator {
 
     private static final Logger log = LoggerFactory.getLogger(GetDataByViewApplication.class);
@@ -53,9 +58,12 @@ public class ValueEvaluator {
         return result ? "Y" : "N";
     }
 
-//    public static void main(String[] args) {
-//        // 示例测试
-//        System.out.println(evaluateValue("98", ">@98.98@%")); // Y
-//
-//    }
+    public static void main(String[] args) {
+        // 示例测试
+        //System.out.println(evaluateValue("98", ">@98.98@%")); // Y
+//        List<String> retVal = new ArrayList<>();
+//        retVal.add("1");
+//        retVal.add("2");
+//        System.out.print(String.join(",", retVal));
+    }
 }

+ 67 - 14
GetDataByView/src/main/java/com/jyxt/getdatabyview/view/repository/IBPSRepository.java

@@ -12,10 +12,7 @@ import java.sql.PreparedStatement;
 import java.sql.SQLException;
 import java.sql.Timestamp;
 import java.sql.Types;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 
@@ -32,14 +29,15 @@ public class IBPSRepository {
 
     public static List<Map<String, Object>> userList = new ArrayList<>();
     public static List<Map<String, Object>> posiList = new ArrayList<>();
+    public static List<Map<String, Object>> reagentList = new ArrayList<>();
 
-    public List<Map<String, Object>> qryExistData(){
-        List<Map<String, Object>> existList = null;
-//        String sqlQry = "SELECT * FROM t_fjbbjlb WHERE bian_zhi_shi_jian >= DATE_SUB(NOW(), INTERVAL 24 HOUR)";
-        String sqlQry = "SELECT * FROM t_fjbbjlb";
+    public List<Map<String, Object>> getRagentInfo(){
+        List<Map<String, Object>> retList = new ArrayList<Map<String, Object>>();
+        Map<String, Object> retMap = new HashMap<>();
+        String sqlQry = "SELECT id_,ming_cheng_,bao_zhuang_gui_ge,dan_wei_,chang_jia_,bian_ma_,gong_ying_shang_ FROM t_sjhcjcsjpz where bian_ma_ is not null ";
         log.info("excute sql:"+sqlQry);
-        existList = jdbcTemplate.queryForList(sqlQry);
-        return existList;
+        List<Map<String, Object>> results = jdbcTemplate.queryForList(sqlQry);
+        return results;
     }
 
 
@@ -202,6 +200,8 @@ public class IBPSRepository {
         userList = jdbcTemplate.queryForList(sqlUser);
         String sqlPosi = "select * from ibps_party_position";
         posiList = jdbcTemplate.queryForList(sqlPosi);
+        String sqlReagent = "SELECT id_,ming_cheng_,bao_zhuang_gui_ge,dan_wei_,chang_jia_,bian_ma_,gong_ying_shang_,yi_qi_she_bei_,she_bei_bian_hao_ FROM t_sjhcjcsjpz where bian_ma_ is not null ";
+        reagentList = jdbcTemplate.queryForList(sqlReagent);
     }
 
     /**
@@ -215,7 +215,7 @@ public class IBPSRepository {
             if (map.get("name_").toString().equals(userName)) {
                 String userId = (String) map.get("id_");
                 String positionId = String.valueOf(map.get("positions_")).split(",")[0];
-                String positionName = (String) getPosiByID(positionId);
+                String positionName = (String) getPosiByField(positionId,"id_","name_");
                 if (!positionName.equals("-1")) {
                     retVal = userId+"@"+positionId+"@"+positionName;
                 }else{
@@ -231,16 +231,69 @@ public class IBPSRepository {
         return retVal;
     }
 
-    public String getPosiByID(String positionId){
+    public String getPosiByField(String fieldStr, String inField, String outField){
         String retVal = "-1";
         for (Map<String, Object> map : posiList) {
-            if (map.get("id_").toString().equals(positionId)) {
-                retVal = map.get("name_").toString();
+            if (fieldStr.equals(String.valueOf(map.get(inField)))) {
+                retVal = map.get(outField).toString();
                 break;
             }
         }
         return retVal;
     }
 
+    public String getReagentByField(String fieldStr, String inField, String outField){
+        String retVal = "-1";
+        for (Map<String, Object> map : reagentList) {
+            if (fieldStr.equals(String.valueOf(map.get(inField)))) {
+                retVal = map.get(outField).toString();
+                break;
+            }
+        }
+        return retVal;
+    }
+
+
+    public List<String> getPushList(String GroupCode) {
+        List<String> retVal = new ArrayList<>();
+        // 建议将初始值设为 null,语义更明确
+        String posID = null;
+
+        // 遍历位置列表
+        for (Map<String, Object> map : posiList) {
+            // 1. 使用 String.valueOf 安全转换,防止 map.get 返回 null 导致 .toString() 报错
+            String desc = String.valueOf(map.get("DESC_"));
+            // 2. 使用 Objects.equals 安全比较,防止 GroupCode 本身为 null
+            if (Objects.equals(GroupCode, desc)) {
+                // 同样安全获取 id_
+                posID = String.valueOf(map.get("id_"));
+                break;
+            }
+        }
+
+        // 3. 安全判断 posID 是否有效(不为 null 且不为空字符串,也不等于字符串 "null")
+        if (posID != null && !posID.isEmpty() && !"null".equals(posID)) {
+            for (Map<String, Object> map : userList) {
+                // 4. 安全获取 positions_ 并判断包含关系
+                String positions = String.valueOf(map.get("positions_"));
+                if (positions != null && !"null".equals(positions) && positions.contains(posID)) {
+                    retVal.add(String.valueOf(map.get("id_")));
+                }
+            }
+        }
+        return retVal;
+    }
+
+    public Map<String, String> getOldReagent(String reagentCode) {
+        String sqlQry = "select shi_ji_xin_pi_hao, xin_you_xiao_qi_ from t_sjhcjlb where shi_ji_bian_ma_ = ? order by create_time_ desc limit 1";
+        List<Map<String, Object>> subReagentList = jdbcTemplate.queryForList(sqlQry, reagentCode);
+        Map<String, String> retVal = new HashMap<>();
+        if (subReagentList != null && !subReagentList.isEmpty()) {
+            Map<String, Object> dbRow = subReagentList.get(0);
+            retVal.put("oldBatchNumber", dbRow.get("shi_ji_xin_pi_hao") == null ? "" : dbRow.get("shi_ji_xin_pi_hao").toString());
+            retVal.put("oldExpiredDate", dbRow.get("xin_you_xiao_qi_") == null ? "" : dbRow.get("xin_you_xiao_qi_").toString());
+        }
+        return retVal;
+    }
 
 }

+ 53 - 305
GetDataByView/src/main/java/com/jyxt/getdatabyview/view/repository/LISViewRepository.java

@@ -25,325 +25,73 @@ public class LISViewRepository {
     @Autowired
     private JdbcTemplate jdbcTemplate;
 
-    @Value("${fetch.QryDailySql}")
-    private String QryDailySql;
 
-    /**
-     * 查询V_JT_QCMonthReport视图的数据,并将结果存储到Map中。
-     *
-     * @return 包含V_JT_QCMonthReport视图数据的Map,其中键为字段名,值为字段值的字符串表示。
-     */
-    public List<Map<String, Object>> query(String LISTable) {
+    public List<Map<String, Object>> getBasicReagent() {
         List<Map<String, Object>> retList = new ArrayList<Map<String, Object>>();
         Map<String, Object> retMap = new HashMap<>();
-        String sqlQry = "SELECT * FROM "+LISTable+" WHERE DATE(CreateTime) = CURDATE() - INTERVAL 1 DAY";
-
+        String sqlQry = "SELECT * FROM v_mate_dict_Reagent where is_stop='0'";
+        log.info("excute sql:"+sqlQry);
         try {
             List<Map<String, Object>> results = jdbcTemplate.queryForList(sqlQry);
-            for (Map<String, Object> result : results) {
-                for (Map.Entry<String, Object> entry : result.entrySet()) {
-                    retMap.put(entry.getKey(), entry.getValue());
-                }
-                retList.add(retMap);
-            }
+//            for (Map<String, Object> result : results) {
+//                for (Map.Entry<String, Object> entry : result.entrySet()) {
+//                    retMap.put(entry.getKey(), entry.getValue());
+//                }
+//                retList.add(retMap);
+//            }
+            retList = results;
         } catch (DataAccessException e) {
-            log.error("Error querying "+LISTable+" view", e);
+            log.error("Error query lis ReagentInfo view", e);
         }
         return retList;
     }
 
+    public List<Map<String, Object>> getReagentLotVerification() {
+        List<Map<String, Object>> retList = new ArrayList<Map<String, Object>>();
+        /*
+        Map<String, Object> retMap = new HashMap<>();
+        retMap.put("ReagentName", "(国J)α-羟丁酸脱氢酶(HBDH)测定试剂盒(速率法)");
+        retMap.put("ReagentNumber", "04010110420");
+        retMap.put("NewBatchNumber", "555");
+        retMap.put("ExpiredDate", "2029-12-30");
+        retMap.put("GroupCode", "lj");
+        retMap.put("GroupName", "临检");
+        retList.add(retMap);
+        return retList;
+        */
+        Map<String, Object> retMap = new HashMap<>();
+        String sqlQry = "SELECT * FROM v_mate_whr_Reagent \n" +
+                "WHERE confDate >= to_char(CURRENT_DATE - 1, 'YYYY-MM-DD') \n" +
+                "  AND confDate < to_char(CURRENT_DATE, 'YYYY-MM-DD') and inStoreName='医学检验科库房'";
+        log.info("excute sql:"+sqlQry);
+        try {
+            List<Map<String, Object>> results = jdbcTemplate.queryForList(sqlQry);
+//            for (Map<String, Object> result : results) {
+//                for (Map.Entry<String, Object> entry : result.entrySet()) {
+//                    retMap.put(entry.getKey(), entry.getValue());
+//                }
+//                retList.add(retMap);
+//            }
+            retList = results;
+        } catch (DataAccessException e) {
+            log.error("Error query lis ReagentLotVerification view", e);
+        }
+        return retList;
 
+    }
 
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-//        qualityIndicatorList.add("总标本不合格率");                //0
-//        qualityIndicatorList.add("抗凝标本凝集率");                //1
-//        qualityIndicatorList.add("标本类型错误率");               //2
-//        qualityIndicatorList.add("标本容器错误率");                //3
-//        qualityIndicatorList.add("标本溶血率");                   //4
-//        qualityIndicatorList.add("标本采集量错误率");              //5
-//        qualityIndicatorList.add("急诊常规实验室内TAT中位数");      //6
-//        qualityIndicatorList.add("急诊生化免疫实验室内TAT中位数");   //7
-//        qualityIndicatorList.add("急诊凝血实验室内TAT中位数");      //8
-//        qualityIndicatorList.add("急诊血常规检验前周转时间中位数");   //9
-//        qualityIndicatorList.add("急诊血常规实验室内周转时间中位数"); //10
-//        qualityIndicatorList.add("常规检验报告发放TAT时间符合率");   //11
-//        qualityIndicatorList.add("检验报告不正确率");              //12
-//        qualityIndicatorList.add("危急值通报率");                 //13
-//        qualityIndicatorList.add("危急值通报及时率");              //14
-//        qualityIndicatorList.add("标本合格率");                   //15
-//        qualityIndicatorList.add("TAT时间合格率");                //16
-//        qualityIndicatorList.add("报告准确率");                   //17
-//        qualityIndicatorList.add("危急值通报符合率");              //18
-
-    public String query(Integer QIIndex,String dateRange) {
-        String StartDate = dateRange.substring(0,10)+" 00:00:00";
-        String EndDate = dateRange.substring(11)+" 23:59:59";
-//        System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
-
-        if (QIIndex != null) {
-            //总标本不合格率
-            if (QIIndex == 0) {
-                //System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
-                String sqlQry = "SELECT CASE WHEN AllCount = 0 THEN -1 ELSE CAST((RejectCount * 1.0/AllCount)*100 AS DECIMAL(20,4)) END AS ResultValue,RejectCount as Numerator,AllCount as Denominator FROM" +
-                        "(SELECT (SELECT COUNT(*) FROM v_jt_reject_sample WHERE RejectTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS RejectCount," +
-                        "(SELECT COUNT(*) FROM v_jt_lisrequest WHERE RegisterTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS AllCount FROM DUAL) Counts";
-                log.info("excute sql:"+sqlQry);
-                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
-                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
-                //System.out.println(lvList.get(0).getResultValue());
-                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getNumerator()+"^"+lvList.get(0).getDenominator();
-            }
-
-            //抗凝标本凝集率
-            if (QIIndex == 1) {
-                //System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
-                String sqlQry = "SELECT CASE WHEN AllCount = 0 THEN -1 ELSE CAST((RejectCount*1.0/AllCount)*100 AS DECIMAL(20,4)) END AS ResultValue,RejectCount as Numerator,AllCount as Denominator FROM (" +
-                        "SELECT (SELECT COUNT(*) FROM v_jt_reject_sample WHERE REJECTREASONCODE='02' and RejectTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS RejectCount," +
-                        "(SELECT COUNT(*) FROM v_jt_lisrequest WHERE sampletypeid='00' and RegisterTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS AllCount FROM DUAL) Counts";
-                log.info("excute sql:"+sqlQry);
-                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
-                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
-                //System.out.println(lvList.get(0).getResultValue());
-                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getNumerator()+"^"+lvList.get(0).getDenominator();
-            }
-
-            //标本类型错误率
-            if (QIIndex == 2) {
-                //System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
-                String sqlQry = "SELECT CASE WHEN AllCount = 0 THEN -1 ELSE CAST((RejectCount * 1.0/AllCount)*100 AS DECIMAL(20,4)) END AS ResultValue,RejectCount as Numerator,AllCount as Denominator FROM (" +
-                        "SELECT (SELECT COUNT(*) FROM v_jt_reject_sample WHERE REJECTREASONCODE='2' and RejectTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS RejectCount," +
-                        "(SELECT COUNT(*) FROM v_jt_lisrequest WHERE RegisterTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS AllCount FROM DUAL) Counts";
-                log.info("excute sql:"+sqlQry);
-                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
-                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
-                //System.out.println(lvList.get(0).getResultValue());
-                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getNumerator()+"^"+lvList.get(0).getDenominator();
-            }
-
-            //标本容器错误率
-            if (QIIndex == 3) {
-                //System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
-                String sqlQry = "SELECT CASE WHEN AllCount = 0 THEN -1 ELSE CAST((RejectCount * 1.0 / AllCount)*100 AS DECIMAL(20,4)) END AS ResultValue,RejectCount as Numerator,AllCount as Denominator FROM (" +
-                        "SELECT (SELECT COUNT(*) FROM v_jt_reject_sample WHERE REJECTREASONCODE='20' and RejectTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS RejectCount," +
-                        "(SELECT COUNT(*) FROM v_jt_lisrequest WHERE RegisterTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS AllCount FROM DUAL) Counts";
-                log.info("excute sql:"+sqlQry);
-                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
-                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
-                //System.out.println(lvList.get(0).getResultValue());
-                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getNumerator()+"^"+lvList.get(0).getDenominator();
-            }
-
-            //标本溶血率
-            if (QIIndex == 4) {
-                //System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
-                String sqlQry = "SELECT CASE WHEN AllCount = 0 THEN -1 ELSE CAST((RejectCount * 1.0 / AllCount)*100 AS DECIMAL(20,4)) END AS ResultValue,RejectCount as Numerator,AllCount as Denominator FROM (" +
-                        "SELECT (SELECT COUNT(*) FROM v_jt_reject_sample WHERE REJECTREASONCODE='01' and RejectTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS RejectCount," +
-                        "(SELECT COUNT(*) FROM v_jt_lisrequest WHERE RegisterTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS AllCount FROM DUAL) Counts";
-                log.info("excute sql:"+sqlQry);
-                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
-                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
-                //System.out.println(lvList.get(0).getResultValue());
-                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getNumerator()+"^"+lvList.get(0).getDenominator();
-            }
-
-            //标本采集量错误率
-            if (QIIndex == 5) {
-                //System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
-                String sqlQry = "SELECT CASE WHEN AllCount = 0 THEN -1 ELSE CAST((RejectCount * 1.0 / AllCount)*100 AS DECIMAL(20,4)) END AS ResultValue,RejectCount as Numerator,AllCount as Denominator FROM (" +
-                        "SELECT (SELECT COUNT(*) FROM v_jt_reject_sample WHERE REJECTREASONCODE in ('03','5') and RejectTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS RejectCount," +
-                        "(SELECT COUNT(*) FROM v_jt_lisrequest WHERE RegisterTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS AllCount FROM DUAL) Counts";
-                log.info("excute sql:"+sqlQry);
-                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
-                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
-                //System.out.println(lvList.get(0).getResultValue());
-                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getNumerator()+"^"+lvList.get(0).getDenominator();
-            }
-
-            //急诊常规实验室内TAT中位数
-            if (QIIndex == 6) {
-                //System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
-                String sqlQry = "SELECT MEDIAN(c.INTAT) AS RESULTVALUE, MAX(d.TOTAL_COUNT) AS Total FROM  V_JT_TAT c INNER JOIN (SELECT  b.SAMPLEID,COUNT(*) OVER() AS TOTAL_COUNT FROM V_JT_LISREQUEST a INNER JOIN V_JT_LISREPORT b ON a.SAMPLEID = b.SAMPLEID " +
-                        "WHERE b.INSTRUMENTGROUPCODE IN ('CG_BloodLAS','CG_UristLAS3','CG_XD6001','USF3000','CG_FA280S','CG_BC5390','CG_FA280S2') AND a.RegisterTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) d ON c.SAMPLEID = d.SAMPLEID";
-                log.info("excute sql:"+sqlQry);
-                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
-                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
-                //System.out.println(lvList.get(0).getResultValue());
-                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getTotal();
-            }
-
-            //急诊生化免疫实验室内TAT中位数
-            if (QIIndex == 7) {
-                //System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
-                String sqlQry = "SELECT MEDIAN(c.INTAT) AS RESULTVALUE, MAX(d.TOTAL_COUNT) AS Total FROM  V_JT_TAT c INNER JOIN (SELECT  b.SAMPLEID,COUNT(*) OVER() AS TOTAL_COUNT FROM V_JT_LISREQUEST a INNER JOIN V_JT_LISREPORT b ON a.SAMPLEID = b.SAMPLEID " +
-                        "WHERE b.INSTRUMENTGROUPCODE='Abbott_IM_LAS_1' AND a.RegisterTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) d ON c.SAMPLEID = d.SAMPLEID";
-                log.info("excute sql:"+sqlQry);
-                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
-                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
-                //System.out.println(lvList.get(0).getResultValue());
-                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getTotal();
-            }
-
-            //急诊凝血实验室内TAT中位数
-            if (QIIndex == 8) {
-                //System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
-                String sqlQry = "SELECT MEDIAN(c.INTAT) AS RESULTVALUE, MAX(d.TOTAL_COUNT) AS Total FROM  V_JT_TAT c INNER JOIN (SELECT  b.SAMPLEID,COUNT(*) OVER() AS TOTAL_COUNT FROM V_JT_LISREQUEST a INNER JOIN V_JT_LISREPORT b ON a.SAMPLEID = b.SAMPLEID " +
-                        "WHERE b.INSTRUMENTGROUPCODE='CG_StagoCompact' AND a.RegisterTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) d ON c.SAMPLEID = d.SAMPLEID";
-                log.info("excute sql:"+sqlQry);
-                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
-                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
-                //System.out.println(lvList.get(0).getResultValue());
-                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getTotal();
-            }
-
-            //急诊血常规检验前周转时间中位数
-            if (QIIndex == 9) {
-                //System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
-                String sqlQry = "SELECT MEDIAN(c.PRETAT) AS RESULTVALUE, MAX(d.TOTAL_COUNT) AS Total FROM  V_JT_TAT c INNER JOIN (SELECT  b.SAMPLEID,COUNT(*) OVER() AS TOTAL_COUNT FROM V_JT_LISREQUEST a INNER JOIN V_JT_LISREPORT b ON a.SAMPLEID = b.SAMPLEID " +
-                        "WHERE b.INSTRUMENTGROUPCODE in ('CG_BloodLAS','CG_BC5390') AND a.RegisterTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) d ON c.SAMPLEID = d.SAMPLEID";
-                log.info("excute sql:"+sqlQry);
-                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
-                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
-                //System.out.println(lvList.get(0).getResultValue());
-                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getTotal();
-            }
-
-            //急诊血常规实验室内周转时间中位数
-            if (QIIndex == 10) {
-                //System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
-                String sqlQry = "SELECT MEDIAN(c.INTAT) AS RESULTVALUE, MAX(d.TOTAL_COUNT) AS Total FROM  V_JT_TAT c INNER JOIN (SELECT  b.SAMPLEID,COUNT(*) OVER() AS TOTAL_COUNT FROM V_JT_LISREQUEST a INNER JOIN V_JT_LISREPORT b ON a.SAMPLEID = b.SAMPLEID " +
-                        "WHERE b.INSTRUMENTGROUPCODE in ('CG_BloodLAS','CG_BC5390') AND a.RegisterTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) d ON c.SAMPLEID = d.SAMPLEID";
-                log.info("excute sql:"+sqlQry);
-                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
-                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
-                //System.out.println(lvList.get(0).getResultValue());
-                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getTotal();
-            }
-
-            //常规检验报告发放TAT时间符合率
-
-            //检验报告不正确率+
-            if (QIIndex == 12) {
-//                System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
-                String sqlQry = "SELECT CASE WHEN AllCount = 0 THEN -1 ELSE CAST((CancelCount * 1.0 / AllCount)*100 AS DECIMAL(20,4)) END AS ResultValue,CancelCount as Numerator,AllCount as Denominator FROM (" +
-                        "SELECT (SELECT COUNT(*) FROM V_JT_LISCANCELREPORT WHERE GROUPID in ('30','06','05','00','31','07') and CANCELAUDITREASON like '%不正确%' and CANCELAUDITTIME BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS CancelCount," +
-                        "(SELECT COUNT(*) FROM v_jt_lisreport WHERE GROUPID in ('30','06','05','00','31','07') and AUDITTIME BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS AllCount FROM DUAL) Counts";
-                log.info("excute sql:"+sqlQry);
-                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
-                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
-                //System.out.println(lvList.get(0).getResultValue());
-                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getNumerator()+"^"+lvList.get(0).getDenominator();
-            }
-
-            //危急值通报率
-            if (QIIndex == 13) {
-//                System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
-                //String sqlQry = "select count(*) as ResultValue from v_jt_lisrequest where SampleTime between ? and ?";
-//                String sqlQry = "SELECT ROUND((COUNT(CASE WHEN ReceiverFlag = '1' THEN 1 END)/COUNT(*))*100,2) AS ResultValue FROM V_JT_CRITICAL where BUILDCRISISTIME between TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')";
-                String sqlQry = "SELECT ROUND((COUNT(CASE WHEN ReceiverFlag = '1' THEN 1 END)/COUNT(*))*100, 2) AS ResultValue, COUNT(CASE WHEN ReceiverFlag = '1' THEN 1 END) AS Numerator,COUNT(*) AS Denominator FROM " +
-                        "V_JT_CRITICAL WHERE BUILDCRISISTIME BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')";
-
-                log.info("excute sql:"+sqlQry);
-                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
-                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
-                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getNumerator()+"^"+lvList.get(0).getDenominator();
-            }
-
-            //危急值通报及时率
-            if (QIIndex == 14) {
-//                System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
-                //String sqlQry = "select count(*) as ResultValue from v_jt_lisrequest where SampleTime between ? and ?";
-                String sqlQry = "SELECT ROUND((COUNT(CASE WHEN AccordFlag = '1' THEN 1 END)/COUNT(*))*100, 2) AS ResultValue, COUNT(CASE WHEN AccordFlag = '1' THEN 1 END) AS Numerator,COUNT(*) AS Denominator FROM " +
-                        "V_JT_CRITICAL WHERE BUILDCRISISTIME BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')";
-                log.info("excute sql:"+sqlQry);
-                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
-                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
-                //System.out.println(lvList.get(0).getResultValue());
-                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getNumerator()+"^"+lvList.get(0).getDenominator();
-            }
-
-            //标本合格率
-            if (QIIndex == 15) {
-                //System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
-                String sqlQry = "SELECT CASE WHEN AllCount = 0 THEN -1 ELSE CAST((RejectCount * 1.0/AllCount)*100 AS DECIMAL(20,4)) END AS ResultValue,RejectCount as Numerator,AllCount as Denominator FROM " +
-                        "(SELECT (SELECT COUNT(*) FROM v_jt_reject_sample WHERE RejectTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS RejectCount," +
-                        "(SELECT COUNT(*) FROM v_jt_lisrequest WHERE RegisterTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS AllCount FROM DUAL) Counts";
-                log.info("excute sql:"+sqlQry);
-                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
-                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
-                //System.out.println(lvList.get(0).getResultValue());
-                // 提取三个部分的字符串值
-                String resultValueStr = lvList.get(0).getResultValue();
-                String denominatorStr = lvList.get(0).getDenominator();
-                String numeratorStr = lvList.get(0).getNumerator();
-
-                // 将分母和分子转换为整数进行计算(假设为整数类型)
-                int denominator = Integer.parseInt(denominatorStr);
-                int numerator = Integer.parseInt(numeratorStr);
-                int newNumeratorValue = denominator - numerator;
-                float resultValue = 100-Float.parseFloat(resultValueStr);
-
-                // 构造新的字符串
-                return String.join("^", String.valueOf(resultValue), String.valueOf(newNumeratorValue), denominatorStr);
-            }
-
-            //报告准确率
-            if (QIIndex == 17) {
-                //System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
-                String sqlQry = "SELECT CASE WHEN AllCount = 0 THEN -1 ELSE CAST((CancelCount * 1.0/AllCount)*100 AS DECIMAL(20,4)) END AS ResultValue,CancelCount as Numerator,AllCount as Denominator FROM (" +
-                        "SELECT (SELECT COUNT(*) FROM V_JT_LISCANCELREPORT WHERE CANCELAUDITTIME BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS CancelCount," +
-                        "(SELECT COUNT(*) FROM v_jt_lisreport WHERE AUDITTIME BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS AllCount FROM DUAL) Counts";
-                log.info("excute sql:"+sqlQry);
-                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
-                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
-                //System.out.println(lvList.get(0).getResultValue());
-                // 提取三个部分的字符串值
-                String resultValueStr = lvList.get(0).getResultValue();
-                String denominatorStr = lvList.get(0).getDenominator();
-                String numeratorStr = lvList.get(0).getNumerator();
-
-                // 将分母和分子转换为整数进行计算(假设为整数类型)
-                int denominator = Integer.parseInt(denominatorStr);
-                int numerator = Integer.parseInt(numeratorStr);
-                int newNumeratorValue = denominator - numerator;
-                float resultValue = 100-Float.parseFloat(resultValueStr);
-
-                // 构造新的字符串
-                return String.join("^", String.valueOf(resultValue), String.valueOf(newNumeratorValue), denominatorStr);
-            }
-
-            //危急值通报符合率
-            if (QIIndex == 18) {
-//                System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
-                //String sqlQry = "select count(*) as ResultValue from v_jt_lisrequest where SampleTime between ? and ?";
-                String sqlQry = "SELECT ROUND((COUNT(CASE WHEN AccordFlag = '1' THEN 1 END)/COUNT(*))*100, 2) AS ResultValue, COUNT(CASE WHEN AccordFlag = '1' THEN 1 END) AS Numerator,COUNT(*) AS Denominator FROM " +
-                        "V_JT_CRITICAL WHERE BUILDCRISISTIME BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')";
-                log.info("excute sql:"+sqlQry);
-                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
-                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
-                //System.out.println(lvList.get(0).getResultValue());
-                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getNumerator()+"^"+lvList.get(0).getDenominator();
-            }
+    public void LisTest(){
+        log.info("in Test Mode...");
+        List<Map<String, Object>> BasicReagentList = getBasicReagent();
+        for (Map<String, Object> reagent : BasicReagentList) {
+            log.info("reagent:"+reagent);
+        }
+        List<Map<String, Object>> ReagentLotVerificationList = getReagentLotVerification();
+        for (Map<String, Object> reagentLot : ReagentLotVerificationList) {
+            log.info("reagentLot:"+reagentLot);
         }
-        return "";
+        log.info("Test Mode finished!");
     }
 
     public String query2(Integer QIIndex,String dateRange) {

+ 8 - 9
GetDataByView/src/main/resources/application.properties

@@ -1,15 +1,14 @@
 spring.application.name=GetDataByView
-spring.datasource.jdbc-url=jdbc:oracle:thin:@192.168.15.212:1521/SYHIS
-spring.datasource.username=JYXT
-spring.datasource.password=Jy#6688xt
-spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
-spring.second-datasource.jdbc-url = jdbc:mysql://localhost:3306/klims-ibps3?characterEncoding=utf8&useSSL=false
+spring.datasource.jdbc-url=jdbc:kingbase8://10.12.89.127:54321/oesdb2?currentSchema=dbo
+spring.datasource.username=jintong
+spring.datasource.password=jintong123
+spring.datasource.driver-class-name=com.kingbase8.Driver
+spring.second-datasource.jdbc-url = jdbc:mysql://192.168.2.219:3306/klims-ibps3?characterEncoding=utf8&useSSL=false
 spring.second-datasource.username = root
-spring.second-datasource.password = test001
+spring.second-datasource.password = test1994
 spring.second-datasource.driver-class-name = com.mysql.cj.jdbc.Driver
-fetch.QryDailySql=select * from tablename where CreateTime=curdate()
-table.match=V_JT_QCMonthReport|t_dlxmsnzkyfx@V_JT_QCTestCodeReport|t_dlxmsnzkyfxzb@V_JT_TestCodeRerunRecord|t_fjbbjlb
 # level:TRACE < DEBUG < INFO < WARN < ERROR < FATAL
 logging.level.root=INFO
 #1 or 0,1 means only qry,0 means Insert
-config.insertMode=1
+config.insertMode=0
+updateReagentCode=2