فهرست منبع

1.前端调用接口成功失败都记录日志
2.解决室内质控月分析不显示设备名称
3.增加接口,调用后更新保存标本百分比
4.调整标本保存与废弃查询逻辑

huangws 6 ماه پیش
والد
کامیت
6dca37bfc5

+ 61 - 2
GetDataByRESTful/src/main/java/com/jyxt/getdatabyrestful/controller/LISController.java

@@ -1,10 +1,14 @@
 package com.jyxt.getdatabyrestful.controller;
 
+import com.jyxt.getdatabyrestful.service.IBPSService;
 import com.jyxt.getdatabyrestful.service.LISService;
+import com.jyxt.getdatabyrestful.service.impl.IBPSServiceImpl;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.http.HttpStatus;
@@ -17,6 +21,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+
 @RestController
 @CrossOrigin(origins = "*") // 允许所有来源
 @RequestMapping("/SampleProcess") // 基础路径
@@ -30,6 +35,11 @@ public class LISController {
     @Autowired
     LISService lisService;
 
+    @Autowired
+    IBPSService ibpsService;
+
+    private static final Logger log = LoggerFactory.getLogger(LISController.class);
+
     // 示例:GET接口
     @GetMapping("/test")
     @Operation(summary = "示例接口", description = "这是一个示例GET接口,点击右侧'try it out'测试接口能否正常调用")
@@ -49,16 +59,19 @@ public class LISController {
             if (configData == null || configData.isEmpty()) {
                 response.put("state", 404);
                 response.put("message", "未找到配置信息");
+                log.info("failed!:未找到配置信息");
                 return ResponseEntity.status(HttpStatus.NOT_FOUND).body(response);
             }
 
             response.put("state", 200);
             response.put("message", "成功获取配置");
             response.put("data", configData);
+            log.info("success!:成功获取配置");
             return ResponseEntity.ok(response);
         } catch (Exception e) {
             response.put("state", 500);
             response.put("message", "服务器内部错误: " + e.getMessage());
+            log.info("failed!:服务器内部错误"+ e.getMessage());
             return ResponseEntity.internalServerError().body(response);
         }
     }
@@ -75,6 +88,7 @@ public class LISController {
         if (inputList == null || inputList.isEmpty()) {
             response.put("state", 400);
             response.put("message", "请求参数不能为空");
+            log.info("failed!:请求参数不能为空");
             return ResponseEntity.badRequest().body(response);
         }
 
@@ -83,10 +97,12 @@ public class LISController {
             response.put("state", 200);
             response.put("message", "成功");
             response.put("data", data);
+            log.info("success!:成功");
             return ResponseEntity.ok(response);
         } catch (Exception e) {
             response.put("state", 500);
             response.put("message", "服务器内部错误");
+            log.info("failed!:服务器内部错误"+ e.getMessage());
             return ResponseEntity.internalServerError().body(response);
         }
     }
@@ -165,12 +181,19 @@ public class LISController {
         try {
             int result = lisService.SaveSample(inputList);
             response.put("state", result == 0 ? 200 : 500);
-            response.put("message", result == 0 ? "保存成功" : "保存失败");
+            if(result == 0){
+                response.put("message", "保存成功");
+                log.info("success!:保存成功");
+            } else {
+                response.put("message", "保存失败");
+                log.info("failed!:保存失败");
+            }
             response.put("data", result);
             return ResponseEntity.ok(response);
         } catch (Exception e) {
             response.put("state", 500);
             response.put("message", "服务器内部错误");
+            log.info("failed!:服务器内部错误" + e.getMessage());
             return ResponseEntity.internalServerError().body(response);
         }
     }
@@ -196,14 +219,50 @@ public class LISController {
         try {
             int result = lisService.DestorySample(inputList);
             response.put("state", result == 0 ? 200 : 500);
-            response.put("message", result == 0 ? "保存成功" : "保存失败");
+            if(result == 0){
+                response.put("message", "保存成功");
+                log.info("success!:保存成功");
+            } else {
+                response.put("message", "保存失败");
+                log.info("failed!:保存失败");
+            }
             response.put("data", result);
             return ResponseEntity.ok(response);
         } catch (Exception e) {
             response.put("state", 500);
             response.put("message", "服务器内部错误");
+            log.info("failed!:服务器内部错误" + e.getMessage());
+            return ResponseEntity.internalServerError().body(response);
+        }
+    }
+
+    @GetMapping("/UpdateActualCount")
+    @Operation(summary = "更新保存标本百分比", description = "")
+    public ResponseEntity<Map<String, Object>> UpdateActualCount() {
+        Map<String, Object> response = new HashMap<>();
+//        response.put("state", 200);
+//        response.put("message", "更新成功");
+//        return ResponseEntity.ok(response);
+        try {
+            int retVal = ibpsService.UpdateActualCount();
+            if (retVal == 1) {
+                response.put("state", 200);
+                response.put("message", "更新成功");
+                log.info("success!:更新成功");
+                return ResponseEntity.ok(response);
+            } else {
+                response.put("state", 404);
+                response.put("message", "更新失败");
+                log.info("failed!:更新失败");
+                return ResponseEntity.status(HttpStatus.EXPECTATION_FAILED).body(response);
+            }
+        } catch (Exception e) {
+            response.put("state", 500);
+            response.put("message", "服务器内部错误: " + e.getMessage());
+            log.info("failed!:服务器内部错误" + e.getMessage());
             return ResponseEntity.internalServerError().body(response);
         }
     }
 
+
 }

+ 8 - 0
GetDataByRESTful/src/main/java/com/jyxt/getdatabyrestful/service/IBPSService.java

@@ -0,0 +1,8 @@
+package com.jyxt.getdatabyrestful.service;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IBPSService {
+    public int UpdateActualCount();
+}

+ 2 - 0
GetDataByRESTful/src/main/java/com/jyxt/getdatabyrestful/service/LISService.java

@@ -20,4 +20,6 @@ public interface LISService {
     public int SaveSample(List<Map<String, Object>> inputList);
 
     public int DestorySample(List<Map<String, Object>> inputList);
+
+    public List<Map<String, Object>> geteActualCountList(String qryDays);
 }

+ 155 - 0
GetDataByRESTful/src/main/java/com/jyxt/getdatabyrestful/service/impl/IBPSServiceImpl.java

@@ -0,0 +1,155 @@
+package com.jyxt.getdatabyrestful.service.impl;
+
+import com.jyxt.getdatabyrestful.service.IBPSService;
+import com.jyxt.getdatabyrestful.service.LISService;
+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.jdbc.core.BatchPreparedStatementSetter;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Repository;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Repository
+public class IBPSServiceImpl implements IBPSService {
+
+    private static final Logger log = LoggerFactory.getLogger(IBPSServiceImpl.class);
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    @Autowired
+    LISService lisService;
+
+    @Value("${config.qryDays}")
+    private String qryDays;
+
+
+    public int UpdateActualCount() {
+        log.info("ready to update records");
+        int retVal = 1;
+        // 获取LIS实际保存数量
+        List<Map<String, Object>> actualList = lisService.geteActualCountList(qryDays);
+        // 查询系统中待弃置列表
+        List<Map<String, Object>> saveedList = geteSavedCountList();
+
+        // 创建用于更新的数据列表
+        List<Map<String, Object>> updateList = new ArrayList<>();
+
+        // 构建actualList的查找映射:日期+专业组 -> COUNT
+        Map<String, Integer> actualMap = new HashMap<>();
+        for (Map<String, Object> actualItem : actualList) {
+            String saveDate = (String) actualItem.get("SAVE_DATE");
+            String groupName = (String) actualItem.get("GROUPNAME");
+            String countStr = actualItem.get("COUNT").toString();
+
+            String key = saveDate + "_" + groupName;
+            try {
+                int count = Integer.parseInt(countStr);
+                actualMap.put(key, count);
+            } catch (NumberFormatException e) {
+                log.warn("LIS数据中COUNT字段格式错误: {}, 组别: {}", countStr, key);
+            }
+        }
+
+        // 遍历saveedList,匹配并计算百分比
+        for (Map<String, Object> savedItem : saveedList) {
+            String id = savedItem.get("id_").toString();
+            String saveDate = (String) savedItem.get("bao_cun_shi_jian_");
+            String groupName = (String) savedItem.get("qi_ta_");
+            String hejiStr = (String) savedItem.get("he_ji_");
+
+            String key = saveDate + "_" + groupName;
+
+            // 检查actualMap中是否存在对应的记录
+            if (actualMap.containsKey(key)) {
+                try {
+                    int heji = Integer.parseInt(hejiStr);
+                    int count = actualMap.get(key);
+
+                    // 计算百分比 (he_ji_/COUNT * 100)
+                    double percentage = 0.0;
+                    if (count > 0) {
+                        percentage = (double) heji / count * 100;
+                    }
+
+                    // 保留1位小数
+                    double roundedPercentage = Math.round(percentage * 10.0) / 10.0;
+                    if (roundedPercentage > 100.0) { //超过100%按100%显示
+                        roundedPercentage = 100.0;
+                    }
+
+                    // 构建更新数据
+                    Map<String, Object> updateData = new HashMap<>();
+                    updateData.put("id_", id);
+                    updateData.put("ying_bao_cun_shu_", String.valueOf(count));
+                    updateData.put("bao_cun_bai_fen_b", String.valueOf(roundedPercentage));
+
+                    updateList.add(updateData);
+
+                } catch (NumberFormatException e) {
+                    retVal = 0;
+                    log.warn("数据格式转换错误 - ID: {}, he_ji_: {}, 组别: {}", id, hejiStr, key);
+                }
+            }
+        }
+
+        // 执行批量更新
+        int updatedCount = batchUpdateRecords(updateList);
+        log.info("update {} records success!", updatedCount);
+
+        return retVal;
+    }
+
+    /**
+     * 批量更新记录
+     */
+    private int batchUpdateRecords(List<Map<String, Object>> updateList) {
+        if (updateList == null || updateList.isEmpty()) {
+            return 0;
+        }
+        log.info("start to update records...");
+        String updateSql = "UPDATE t_jyhypjlb SET ying_bao_cun_shu_ = ?, bao_cun_bai_fen_b = ? WHERE id_ = ?";
+
+        int[] updateCounts = jdbcTemplate.batchUpdate(updateSql, new BatchPreparedStatementSetter() {
+            @Override
+            public void setValues(PreparedStatement ps, int i) throws SQLException {
+                Map<String, Object> data = updateList.get(i);
+                ps.setString(1, (String) data.get("ying_bao_cun_shu_"));
+                ps.setString(2, (String) data.get("bao_cun_bai_fen_b"));
+                ps.setString(3, (String) data.get("id_"));
+            }
+            @Override
+            public int getBatchSize() {
+                return updateList.size();
+            }
+        });
+        // 计算实际更新的记录数
+        int totalUpdated = 0;
+        for (int count : updateCounts) {
+            if (count > 0) {
+                totalUpdated++;
+            }
+        }
+        return totalUpdated;
+    }
+
+    public List<Map<String, Object>> geteSavedCountList() {
+        String qryUndestoryList = "SELECT id_, " +
+                "CASE " +
+                "  WHEN bao_cun_shi_jian_ LIKE '____-__-__ %' THEN DATE_FORMAT(STR_TO_DATE(bao_cun_shi_jian_, '%Y-%m-%d %H:%i:%s'), '%Y%m%d') " +
+                "  WHEN bao_cun_shi_jian_ LIKE '____-__-__' THEN DATE_FORMAT(STR_TO_DATE(bao_cun_shi_jian_, '%Y-%m-%d'), '%Y%m%d') " +
+                "  ELSE bao_cun_shi_jian_ " +
+                "END AS bao_cun_shi_jian_, " +
+                "qi_ta_, he_ji_ " +
+                "FROM t_jyhypjlb WHERE shi_fou_guo_shen_='待弃置'";
+        log.info("execute sql: " + qryUndestoryList.toString());
+        return jdbcTemplate.queryForList(qryUndestoryList);
+    }
+}

+ 38 - 14
GetDataByRESTful/src/main/java/com/jyxt/getdatabyrestful/service/impl/LISServiceImpl.java

@@ -14,10 +14,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
 import java.sql.Types;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @Service
 public class LISServiceImpl implements LISService {
@@ -131,18 +128,17 @@ public class LISServiceImpl implements LISService {
 //                sql.append("STATE = '").append(stateValue).append("'");
 //            }
 
-            StringBuilder sql = new StringBuilder(
-                    "select ");
-            if (inputMap.get("STATE").equals("2")) {
-                sql.append(
-                        "STATE,SAVE_DATE,DESTROY_DATE,INSPECTION_ID,PATIENT_NAME,TEST_ORDER_NAME from v_jt_inspection_destroy where ");
-            } else {
-                sql.append(
-                        "STATE,SAVE_DATE,INSPECTION_ID,PATIENT_NAME,TEST_ORDER_NAME from v_jt_inspection_save where ");
+            StringBuilder sql = new StringBuilder("select ");
+            if (inputMap.get("STATE").equals("1")){
+                sql.append("STATE,SAVE_DATE,INSPECTION_ID,PATIENT_NAME,TEST_ORDER_NAME from v_jt_inspection_save where STATE=1 and ");
+            } else if (inputMap.get("STATE").equals("1,2")){
+                sql.append("STATE,SAVE_DATE,INSPECTION_ID,PATIENT_NAME,TEST_ORDER_NAME from v_jt_inspection_save where ");
+            } else if (inputMap.get("STATE").equals("2")){
+                sql.append("STATE,SAVE_DATE,DESTROY_DATE,INSPECTION_ID,PATIENT_NAME,TEST_ORDER_NAME from v_jt_inspection_destroy where STATE=2 and ");
+            } else if (inputMap.get("STATE").equals("2,4")){
+                sql.append("STATE,SAVE_DATE,DESTROY_DATE,INSPECTION_ID,PATIENT_NAME,TEST_ORDER_NAME from v_jt_inspection_destroy where ");
             }
 
-
-
             // 处理其他查询条件
             if (inputMap.containsKey("SAVE_DATE") && inputMap.get("SAVE_DATE") != null) {
                 sql.append("SAVE_DATE = '").append(inputMap.get("SAVE_DATE")).append("'");
@@ -437,4 +433,32 @@ public class LISServiceImpl implements LISService {
         }
         return ret;
     }
+
+    @Override
+    public List<Map<String, Object>> geteActualCountList(String qryDays) {
+        //获取LIS指定天数内的实际保存数
+        String QryActualSql = "select SAVE_DATE,GROUPNAME,count(*) as COUNT from v_jt_inspection_save where TO_DATE(SAVE_DATE, 'YYYYMMDD')>=TRUNC(SYSDATE)-"+Integer.valueOf(qryDays)+"  group by GROUPNAME,SAVE_DATE";
+        log.info("execute sql: " + QryActualSql.toString());
+        List<Map<String, Object>> actualList = jdbcTemplate.queryForList(QryActualSql);
+        return actualList;
+        //以下为测试数据
+        // 1. 创建最外层的List
+//        List<Map<String, Object>> list = new ArrayList<>();
+//        // 2. 创建内层Map
+//        Map<String, Object> map = new HashMap<>(); // 保持插入顺序
+//        // 3. 向Map中添加数据
+//        map.put("SAVE_DATE", "20250807");
+//        map.put("GROUPNAME", "茂源临检");
+//        map.put("COUNT", "100");
+//        list.add(map);
+//        Map<String, Object> map2 = new HashMap<>(); // 保持插入顺序
+//        // 3. 向Map中添加数据
+//        map2.put("SAVE_DATE", "20250807");
+//        map2.put("GROUPNAME", "茂源生化");
+//        map2.put("COUNT", "1980");
+//        list.add(map2);
+//        return list;
+    }
+
+
 }

+ 2 - 1
GetDataByRESTful/src/main/resources/application.properties

@@ -1,5 +1,5 @@
 spring.application.name=GetDataByRESTful
-#spring.datasource.jdbc-url = jdbc:mysql://demo2.local:3306/klims-ibps3?characterEncoding=utf8&useSSL=false
+#spring.datasource.jdbc-url = jdbc:mysql://localhost.local:3306/klims-ibps3?characterEncoding=utf8&useSSL=false
 spring.datasource.jdbc-url = jdbc:mysql://localhost:3306/klims-ibps3?characterEncoding=utf8&useSSL=false
 spring.datasource.username = root
 spring.datasource.password = test001
@@ -23,6 +23,7 @@ server.port=8090
 config.insertMode=0
 UrlAddr=http://coolaf.com/tool
 api.resources.path=/ibps/platform/v3/auth/resources/getDefaultResources
+config.qryDays=7
 #??????(1 enable,0 disable)
 #????,?????????????
 interface.SampleProcess=1

+ 6 - 2
GetDataByView/src/main/java/com/jyxt/getdatabyview/GetDataByViewApplication.java

@@ -25,7 +25,7 @@ public class GetDataByViewApplication implements CommandLineRunner{
     private LISViewRepository lisViewRepository;
 
     @Autowired
-    private IBPSRepository ipbpsRepository;
+    private IBPSRepository ibpsRepository;
 
     @Autowired
     private HandleData handleData;
@@ -43,13 +43,17 @@ public class GetDataByViewApplication implements CommandLineRunner{
     @Override
     public void run(String... args) throws Exception {
         log.info("<-------------new turn start...------------->");
-        ipbpsRepository.getBasicData();
+        ibpsRepository.getBasicData();
         for(String lisTable : lisTableList){
             List<Map<String, Object>> retList = lisViewRepository.query(lisTable);
             if(retList != null){
                 handleData.startHandleData(retList,lisTable);
             }
         }
+        //质量指标接口
+//         List<Map<String, Object>>qualityIndicatorList  = ibpsRepository.getUndoQualityIndicator();
+//        handleData.HandQIData(qualityIndicatorList);
+
         log.info("<-- -----------this turn finish...------------->");
         context.close(); // 直接关闭上下文
     }

+ 22 - 1
GetDataByView/src/main/java/com/jyxt/getdatabyview/HandleData.java

@@ -258,7 +258,7 @@ public class HandleData {
                 putIfNotNull(insertMap, "zhi_kong_chang_ji", entityMap, "QCMFG");
                 putIfNotNull(insertMap, "shi_kong_gui_ze_", entityMap, "QCRule");
                 putIfNotNull(insertMap, "shi_fou_he_ge_", entityMap, "PASS");
-                putIfNotNull(insertMap, "she_bei_ming_cheng_", entityMap, "DEVICENAME");
+                putIfNotNull(insertMap, "she_bei_ming_chen", entityMap, "DEVICENAME");
                 insertList.add(insertMap);
             }
 
@@ -302,4 +302,25 @@ public class HandleData {
         }
     }
 
+
+    public void HandQIData(List<Map<String, Object>>qualityIndicatorList){
+        // 创建用于存储更新数据的列表
+        List<Map<String, Object>> updateDataList = new ArrayList<>();
+        for (Map<String, Object> qualityIndicatorMap : qualityIndicatorList) {
+            log.info(qualityIndicatorMap.toString());
+            String DateRange = DateRangeUtil.getDateRange(qualityIndicatorMap.get("bian_zhi_shi_jian").toString());
+            String QryItem = qualityIndicatorMap.get("bei_zhu_").toString().split(":")[1];
+            String retVal = lisViewRepository.GetLISRes(DateRange, QryItem);
+            String id = qualityIndicatorMap.get("id_").toString();
+            String compareRes = ValueEvaluator.evaluateValue(retVal,qualityIndicatorMap.get("yuan_shi_shu_ju_").toString());
+            // 将数据添加到更新列表
+            Map<String, Object> updateData = new HashMap<>();
+            updateData.put("id", id);
+            updateData.put("retVal", retVal);
+            updateData.put("compareRes", compareRes);
+            updateDataList.add(updateData);
+        }
+        // 调用抽离的保存方法
+        ibpsRepository.updateQualityIndicatorData(updateDataList);
+    }
 }

+ 39 - 0
GetDataByView/src/main/java/com/jyxt/getdatabyview/view/repository/IBPSRepository.java

@@ -168,4 +168,43 @@ public class IBPSRepository {
         return retVal;
     }
 
+    public List<Map<String, Object>> getUndoQualityIndicator(){
+        List<Map<String, Object>> retList = new ArrayList<>();
+        String sqlStr = "select id_,bian_zhi_shi_jian,zhi_liang_zhi_bia,yuan_shi_shu_ju_,bei_zhu_ from t_zlzbpjzb where zhuang_tai_='待处理' and bei_zhu_ like 'LIS导入%'";
+        retList = jdbcTemplate.queryForList(sqlStr);
+        return retList;
+    }
+
+    public void updateQualityIndicatorData(List<Map<String, Object>> updateDataList){
+        if (updateDataList == null || updateDataList.isEmpty()) {
+            log.info("没有需要更新的数据");
+            return;
+        }
+
+        String sql = "UPDATE t_zlzbpjzb SET shi_ji_shu_zhi_ = ?, da_biao_qing_kuan = ?, zhuang_tai_ = ?, bei_zhu_ = ? WHERE id_ = ?";
+        log.info("Ready to update data into table t_zlzbpjzb");
+        try {
+            List<Object[]> batchArgs = new ArrayList<>();
+            for (Map<String, Object> data : updateDataList) {
+                Object[] args = new Object[] {
+                        data.get("retVal"),           // shi_ji_shu_zhi_
+                        data.get("compareRes"),       // da_biao_qing_kuan
+                        "已完成",                     // zhuang_tai_
+                        "LIS导入",                    // bei_zhu_
+                        data.get("id")               // id_
+                };
+                batchArgs.add(args);
+            }
+
+            int[] updateCounts = jdbcTemplate.batchUpdate(sql, batchArgs);
+            log.info("update {} records success!", updateCounts.length);
+
+        } catch (Exception e) {
+            log.error("更新质量指标数据时发生错误", e);
+            throw new RuntimeException("更新质量指标数据失败", e);
+        }
+
+    };
+
+
 }

+ 9 - 0
GetDataByView/src/main/java/com/jyxt/getdatabyview/view/repository/LISViewRepository.java

@@ -81,6 +81,15 @@ public class LISViewRepository {
         return retList;
     }
 
+    public String GetLISRes(String DateRange, String QryItem){
+        log.info("try to get LIS res:"+QryItem);
+        return "0.07";
+    }
+
+
+
+
+
     public List<Map<String, Object>> query2(String tableName) {
         List<Map<String, Object>> retList = new ArrayList<>();
         Map<String, Object> dataMap = new HashMap<>();

+ 14 - 0
out/production/thridParty/application.properties

@@ -0,0 +1,14 @@
+spring.application.name=GetDataByRESTful
+#spring.datasource.jdbc-url = jdbc:mysql://demo2.local:3306/klims-ibps3?characterEncoding=utf8&useSSL=false
+spring.datasource.jdbc-url = jdbc:mysql://192.168.2.201:3306/klims-ibps3?characterEncoding=utf8&useSSL=false
+spring.datasource.username = root
+spring.datasource.password = test001
+spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+logging.file.name=logs/GetDataByRESTful.log
+# level:TRACE < DEBUG < INFO < WARN < ERROR < FATAL
+logging.level.root=INFO
+#1 or 0,1 means only qry,0 means update
+config.qrymode=1
+UrlAddr=http://www.0531yun.com/
+loginKey=loginName=h241021fkj&password=h241021fkj
+api.resources.path=/ibps/platform/v3/auth/resources/getDefaultResources