package com.ltkj.web.controller.his;
|
|
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.json.JSONArray;
|
import cn.hutool.json.JSONObject;
|
import cn.hutool.json.JSONUtil;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.ltkj.common.core.domain.AjaxResult;
|
import com.ltkj.hosp.domain.HisApiConfig;
|
import com.ltkj.hosp.service.HisApiConfigService;
|
import com.ltkj.web.wxUtils.HttpClientUtils;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.io.FileInputStream;
|
import java.io.IOException;
|
import java.io.InputStreamReader;
|
import java.nio.charset.StandardCharsets;
|
import java.sql.*;
|
import java.text.SimpleDateFormat;
|
import java.util.*;
|
import java.util.Date;
|
import java.util.stream.Collectors;
|
|
/**
|
* @Company: 西安路泰科技有限公司
|
* @Author: zhaowenxuan
|
* @Date: 2024/5/31 14:38
|
*/
|
@Slf4j
|
@Component
|
public class HisApiGetMethodService {
|
// 数据库配置文件路径
|
private static final String CONFIG_PATH = "D:\\ltkjprojectconf\\config.properties";
|
// private static final String CONFIG_PATH = "/Users/chacca/开发相关/代码/ltkj_peis/ltkj-admin/src/main/resources/config.properties";
|
// 数据库名
|
private static String DB_NAME = "";
|
private static String HIS_URL = "";
|
private static String DATA_URL = "";
|
private static String DATA_USER ="";
|
private static String DATA_PASS = "";
|
@Autowired
|
private HisApiMethodService controller;
|
@Autowired
|
private HisApiConfigService hisApiConfigService;
|
|
static {
|
try {
|
Class.forName("com.mysql.cj.jdbc.Driver");
|
} catch (ClassNotFoundException e) {
|
e.printStackTrace();
|
}
|
try {
|
InputStreamReader reader = new InputStreamReader(new FileInputStream(CONFIG_PATH), StandardCharsets.UTF_8);
|
Properties props = new Properties();
|
props.load(reader);
|
String api_url = props.getProperty("his_api_url");
|
String port = props.getProperty("his_api_port");
|
DB_NAME = props.getProperty("name");
|
DATA_URL = "jdbc:mysql://" + props.getProperty("ip") + ":" + props.getProperty("prot") + "/" + DB_NAME +
|
"?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8";
|
DATA_USER = props.getProperty("username");
|
DATA_PASS = props.getProperty("password");
|
HIS_URL=api_url+":"+port;
|
} catch (IOException throwables) {
|
throwables.printStackTrace();
|
}
|
}
|
|
|
/**
|
* 获取数据
|
*
|
* @param type 接口代码
|
* @param params 请求参数
|
* @return
|
*/
|
@Transactional
|
public AjaxResult getHISData(String type, Map<String, Object> params) {
|
AjaxResult result = null;
|
// TODO 创建表 弄成数据库动态获取 接口地址、代码、是否分页、主键id、主键字段
|
// TODO 从2.4.2获取到数据 根据his_registration_id删除旧数据在插入新数据 下层业务均一样根据返回的JYBGID删除旧数据在插入新数据
|
switch (type) {
|
case "Getoutaccountrecord":
|
result = controller.Getoutaccountrecord(params);
|
// result.put("limit", true);
|
break;
|
case "Getoutpatientcostinfo":
|
result = controller.Getoutpatientcostinfo(params);
|
// result.put("limit", true);
|
break;
|
case "Getlaburgentinfo":
|
result = controller.Getlaburgentinfo(params);
|
// result.put("limit", false);
|
break;
|
case "Getlabgermdetailinfo":
|
result = controller.Getlabgermdetailinfo(params);
|
// result.put("limit", false);
|
break;
|
case "Getlabgermrepinfo":
|
result = controller.Getlabgermrepinfo(params);
|
// result.put("limit", false);
|
break;
|
case "Getlabreportinfo":
|
result = controller.Getlabreportinfo(params);
|
// result.put("limit", true);
|
break;
|
case "Getlabapplyinfo":
|
result = controller.Getlabapplyinfo(params);
|
// result.put("limit", false);
|
break;
|
case "Getexamurgentinfo":
|
result = controller.Getexamurgentinfo(params);
|
// result.put("limit", true);
|
break;
|
case "Getexamreportinfo":
|
result = controller.Getexamreportinfo(params);
|
// result.put("limit", true);
|
break;
|
case "Getexamapplyinfo":
|
result = controller.Getexamapplyinfo(params);
|
// result.put("limit", false);
|
break;
|
case "Getlabdetailinfo":
|
result = controller.Getlabdetailinfo(params);
|
// result.put("limit", false);
|
break;
|
}
|
String json = result.get("data").toString();
|
JSONObject response = JSONUtil.parseObj(json).getJSONObject("Response");
|
if (response.getStr("ResultCode").toString().equals("0")) {
|
AjaxResult ajaxResult = AjaxResult.success();
|
// if ((boolean) result.get("limit")) {
|
// ajaxResult = saveArray(json, type);
|
JSONArray resultData = response.getJSONArray("ResultData");
|
List<Map<String, String>> list = new ArrayList<>();
|
for (Object resultDatum : resultData) {
|
JSONObject object = (JSONObject) resultDatum;
|
ajaxResult = save(object, type,null);
|
Map<String, String> map = new HashMap<>();
|
for (String key : object.keySet()) {
|
String defaultVal = object.get(key).toString();
|
String val = defaultVal.trim().replaceAll("\\s+", "");
|
map.put(key, val);
|
}
|
list.add(map);
|
}
|
ajaxResult.put("data", list);
|
// } else {
|
// // 以集合返回
|
// JSONArray resultData = response.getJSONArray("ResultData");
|
// List<JSONObject> list = JSONUtil.toList(resultData, JSONObject.class);
|
// ArrayList<Map<String, String>> maps = new ArrayList<>();
|
// for (JSONObject data : list) {
|
// ajaxResult = save(data, type);
|
// HashMap<String, String> map1 = new HashMap<>();
|
// for (String key : data.keySet()) {
|
// String defaultVal = data.get(key).toString();
|
// String val = defaultVal.trim().replaceAll("\\s+", "");
|
// map1.put(key, val);
|
// }
|
// maps.add(map1);
|
// }
|
// ajaxResult.put("data", maps);
|
// }
|
return ajaxResult;
|
} else {
|
return AjaxResult.error().put("result", JSONUtil.parseObj(json));
|
}
|
}
|
|
@Transactional
|
public AjaxResult getHISDataNew(String type, Map<String, Object> params){
|
LambdaQueryWrapper<HisApiConfig> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
lambdaQueryWrapper.eq(HisApiConfig::getApiMethod, type);
|
HisApiConfig hisApiConfig = hisApiConfigService.getOne(lambdaQueryWrapper);
|
String responseJson = HttpClientUtils.sendPost(HIS_URL + hisApiConfig.getApiUrl(), params);
|
Integer isResponse = hisApiConfig.getIsResponse();
|
JSONObject response = null;
|
if (isResponse == 1) {
|
response = JSONUtil.parseObj(responseJson).getJSONObject("Response");
|
} else{
|
response = JSONUtil.parseObj(responseJson);
|
}
|
if (response.getStr(hisApiConfig.getResultCodeKey()).equals("0")) {
|
AjaxResult ajaxResult = AjaxResult.success();
|
JSONArray resultData = response.getJSONArray(hisApiConfig.getResultDataKey());
|
List<Map<String, String>> list = new ArrayList<>();
|
for (Object resultDatum : resultData) {
|
JSONObject object = (JSONObject) resultDatum;
|
ajaxResult = save(object, type,hisApiConfig);
|
Map<String, String> map = new HashMap<>();
|
for (String key : object.keySet()) {
|
String defaultVal = object.get(key).toString();
|
String val = defaultVal.trim().replaceAll("\\s+", "");
|
map.put(key, val);
|
}
|
list.add(map);
|
}
|
ajaxResult.put("data", list);
|
return ajaxResult;
|
} else {
|
return AjaxResult.error().put("result", JSONUtil.parseObj(responseJson));
|
}
|
}
|
|
/**
|
* ResultData为对象
|
* 根据his接口返回值 插入数据
|
* 如果没有表则创建表 接口增加了字段则为表增加字段
|
*
|
* @param code 接口代码
|
* @return 执行是否成功
|
*/
|
public AjaxResult save(JSONObject object, String code,HisApiConfig hisApiConfig) {
|
Connection connection = getConnection();
|
Boolean isExists = tabIsExists(connection, hisApiConfig.getTabName());
|
if (null == isExists)
|
return AjaxResult.error();
|
if (!isExists) {
|
try {
|
creatTable(object, hisApiConfig.getTabName(), connection);
|
} catch (SQLException e) {
|
e.printStackTrace();
|
return AjaxResult.error();
|
}
|
}
|
//插入数据
|
try {
|
operationTable(object,connection,hisApiConfig);
|
} catch (SQLException e) {
|
e.printStackTrace();
|
return AjaxResult.error();
|
}
|
try {
|
connection.close();
|
} catch (SQLException ignored) {
|
}
|
return AjaxResult.success();
|
}
|
|
/**
|
* ResultData为集合
|
* 根据his接口返回值 插入数据
|
* 如果没有表则创建表 接口增加了字段则为表增加字段
|
*
|
* @param code 接口代码
|
* @return 执行是否成功
|
*/
|
public AjaxResult saveArray(String json, String code) {
|
code = code.toLowerCase();
|
JSONObject jsonObject = JSONUtil.parseObj(json);
|
JSONObject response = jsonObject.getJSONObject("Response");
|
String tabName = "ltkj_" + code;
|
if (response.getStr("ResultCode").equals("0")) {
|
JSONArray resultData = response.getJSONArray("ResultData");
|
Connection connection = getConnection();
|
for (Object resultDatum : resultData) {
|
JSONObject object = (JSONObject) resultDatum;
|
Boolean isExists = tabIsExists(connection, tabName);
|
if (null == isExists)
|
return AjaxResult.error();
|
if (!isExists) {
|
try {
|
creatTable(object, tabName, connection);
|
} catch (SQLException throwables) {
|
throwables.printStackTrace();
|
return AjaxResult.error();
|
}
|
}
|
//插入数据
|
try {
|
operationTable(object,connection,null);
|
} catch (SQLException throwables) {
|
throwables.printStackTrace();
|
return AjaxResult.error();
|
}
|
}
|
try {
|
if (connection != null)
|
connection.close();
|
} catch (SQLException throwables) {
|
}
|
}
|
return AjaxResult.success();
|
}
|
|
/**
|
* 操作表
|
*
|
* @param connection
|
* @throws SQLException
|
*/
|
private void operationTable(JSONObject jsonObject, Connection connection,HisApiConfig hisApiConfig) throws SQLException {
|
List<String> columns = getColumns(hisApiConfig.getTabName(), connection);
|
ArrayList<String> responseColums = new ArrayList<>();
|
for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
|
String key = entry.getKey().trim().toLowerCase();
|
responseColums.add(key);
|
}
|
responseColums.removeAll(columns);
|
if (!responseColums.isEmpty()) {
|
for (String colum : responseColums) {
|
String sql = "alter table " + hisApiConfig.getTabName() + " add column " + colum + " VARCHAR(200) null";
|
Statement statement = connection.createStatement();
|
statement.executeUpdate(sql);
|
statement.close();
|
}
|
if (hisApiConfig == null)
|
insertData(hisApiConfig, connection, jsonObject);
|
else insertDataNew(connection, jsonObject,hisApiConfig);
|
} else {
|
if (hisApiConfig == null)
|
insertData(hisApiConfig, connection, jsonObject);
|
else insertDataNew(connection, jsonObject,hisApiConfig);
|
}
|
}
|
|
/**
|
* 插入数据
|
*
|
* @param hisApiConfig
|
* @param connection
|
* @param jsonObject
|
* @throws SQLException
|
*/
|
private void insertData(HisApiConfig hisApiConfig, Connection connection, JSONObject jsonObject) throws SQLException {
|
StringBuilder insertSqlBuilder = new StringBuilder();
|
StringBuilder valueBuilder = new StringBuilder();
|
StringBuilder selectSqlBuilder = new StringBuilder();
|
insertSqlBuilder.append("insert into ").append(hisApiConfig.getTabName()).append(" (");
|
selectSqlBuilder.append("select count(1) as count from ").append(hisApiConfig.getTabName()).append(" where ");
|
for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
|
String defaultVal = entry.getValue().toString();
|
String key = entry.getKey().trim().toLowerCase();
|
if (StrUtil.isBlank(defaultVal) || defaultVal.equals("null"))
|
continue;
|
String val = defaultVal.trim().replaceAll("\\s+", "");
|
insertSqlBuilder.append(key).append(", ");
|
valueBuilder.append("'").append(val).append("', ");
|
selectSqlBuilder.append(key).append(" = '").append(val).append("' and ");
|
// 判断数据是否大于字段创建值如果大于则增加超过阈值则使用text
|
String columnType = getColumnType(connection, hisApiConfig.getTabName(), key);
|
if (!"text".equalsIgnoreCase(columnType)){
|
int currentSize = getColumnSize(connection, hisApiConfig.getTabName(), key);
|
if (currentSize < val.length()){
|
if (val.length()>= 1000){
|
alterColumnTypeToText(connection, hisApiConfig.getTabName(), key);
|
}else {
|
int newSize = ((val.length() / 100) + 1) * 100;
|
alterColumnSize(connection, hisApiConfig.getTabName(), key, newSize);
|
}
|
}
|
}
|
}
|
selectSqlBuilder.delete(selectSqlBuilder.length() - 5, selectSqlBuilder.length());
|
Statement statement = connection.prepareStatement(selectSqlBuilder.toString());
|
ResultSet resultSet = statement.executeQuery(selectSqlBuilder.toString());
|
resultSet.next();
|
String string = resultSet.getString("count");
|
statement.close();
|
// 如果不为0 则这条数据存在 不进行插入
|
if (!"0".equals(string)) {
|
// log.info("数据存在不需要插入 {}", jsonObject);
|
return;
|
}
|
insertSqlBuilder.append("insert_time, ");
|
String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
|
valueBuilder.append("'").append(time).append("'").append(", ");
|
insertSqlBuilder.delete(insertSqlBuilder.length() - 2, insertSqlBuilder.length());
|
valueBuilder.delete(valueBuilder.length() - 2, valueBuilder.length());
|
insertSqlBuilder.append(") values (").append(valueBuilder).append(")");
|
// 插入数据
|
statement = connection.createStatement();
|
statement.execute(insertSqlBuilder.toString());
|
statement.close();
|
}
|
|
/**
|
* 插入数据
|
*
|
* @param connection
|
* @param jsonObject
|
* @throws SQLException
|
*/
|
private void insertDataNew(Connection connection, JSONObject jsonObject,HisApiConfig hisApiConfig) throws SQLException {
|
List<String> primaryKesList = Arrays.stream(hisApiConfig.getPrimaryKeys().split(",")).map(String::toLowerCase).collect(Collectors.toList());
|
StringBuilder deleteSqlBuilder = new StringBuilder();
|
StringBuilder insertSqlBuilder = new StringBuilder();
|
StringBuilder valueBuilder = new StringBuilder();
|
insertSqlBuilder.append("insert into ").append(hisApiConfig.getTabName()).append(" (");
|
deleteSqlBuilder.append("delete from ").append(hisApiConfig.getTabName()).append(" where ");
|
for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
|
String defaultVal = entry.getValue().toString();
|
String key = entry.getKey().trim().toLowerCase();
|
if (StrUtil.isBlank(defaultVal) || defaultVal.equals("null"))
|
continue;
|
String val = defaultVal.trim().replaceAll("\\s+", "");
|
if (primaryKesList.contains(key)) {
|
deleteSqlBuilder.append(key).append(" = '").append(val).append("' and ");
|
}
|
insertSqlBuilder.append(key).append(", ");
|
valueBuilder.append("'").append(val).append("', ");
|
// 判断数据是否大于字段创建值如果大于则增加超过阈值则使用text
|
String columnType = getColumnType(connection, hisApiConfig.getTabName(), key);
|
if (!"text".equalsIgnoreCase(columnType)){
|
int currentSize = getColumnSize(connection, hisApiConfig.getTabName(), key);
|
if (currentSize < val.length()){
|
if (val.length()>= 1000){
|
alterColumnTypeToText(connection, hisApiConfig.getTabName(), key);
|
}else {
|
int newSize = ((val.length() / 100) + 1) * 100;
|
alterColumnSize(connection, hisApiConfig.getTabName(), key, newSize);
|
}
|
}
|
}
|
}
|
deleteSqlBuilder.delete(deleteSqlBuilder.length() - 5, deleteSqlBuilder.length());
|
Statement statement = connection.prepareStatement(deleteSqlBuilder.toString());
|
// log.info("执行删除 ->{}",deleteSqlBuilder.toString());
|
int i = statement.executeUpdate(deleteSqlBuilder.toString());
|
// log.info("删除条数 ->{}",i);
|
statement.close();
|
insertSqlBuilder.append("insert_time, ");
|
String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
|
valueBuilder.append("'").append(time).append("'").append(", ");
|
insertSqlBuilder.delete(insertSqlBuilder.length() - 2, insertSqlBuilder.length());
|
valueBuilder.delete(valueBuilder.length() - 2, valueBuilder.length());
|
insertSqlBuilder.append(") values (").append(valueBuilder).append(")");
|
// log.info("执行插入 ->{}",insertSqlBuilder.toString());
|
// 插入数据
|
statement = connection.createStatement();
|
statement.execute(insertSqlBuilder.toString());
|
statement.close();
|
}
|
|
/**
|
* 获取列类型
|
* @param connection
|
* @param tableName
|
* @param columnName
|
* @return
|
* @throws SQLException
|
*/
|
private static String getColumnType(Connection connection, String tableName, String columnName) throws SQLException {
|
String query = "SELECT DATA_TYPE FROM information_schema.COLUMNS WHERE TABLE_NAME = ? AND COLUMN_NAME = ?";
|
try (PreparedStatement statement = connection.prepareStatement(query)) {
|
statement.setString(1, tableName);
|
statement.setString(2, columnName);
|
ResultSet resultSet = statement.executeQuery();
|
if (resultSet.next()) {
|
return resultSet.getString("DATA_TYPE");
|
}
|
}
|
return "";
|
}
|
|
/**
|
* 获取列长度
|
* @param connection
|
* @param tableName
|
* @param columnName
|
* @return
|
* @throws SQLException
|
*/
|
private static int getColumnSize(Connection connection, String tableName, String columnName) throws SQLException {
|
String query = "SELECT CHARACTER_MAXIMUM_LENGTH FROM information_schema.COLUMNS WHERE TABLE_NAME = ? AND COLUMN_NAME = ?";
|
try (PreparedStatement statement = connection.prepareStatement(query)) {
|
statement.setString(1, tableName);
|
statement.setString(2, columnName);
|
ResultSet resultSet = statement.executeQuery();
|
if (resultSet.next()) {
|
return resultSet.getInt("CHARACTER_MAXIMUM_LENGTH");
|
}
|
}
|
return 0;
|
}
|
|
/**
|
* 修改列长度
|
* @param connection
|
* @param tableName
|
* @param columnName
|
* @param newSize
|
* @throws SQLException
|
*/
|
private static void alterColumnSize(Connection connection, String tableName, String columnName, int newSize) throws SQLException {
|
String alterQuery = String.format("ALTER TABLE %s MODIFY %s VARCHAR(%d)", tableName, columnName, newSize);
|
try (Statement statement = connection.createStatement()) {
|
statement.executeUpdate(alterQuery);
|
}
|
}
|
|
/**
|
* 超过阈值则修改为text类型
|
* @param connection
|
* @param tableName
|
* @param columnName
|
* @throws SQLException
|
*/
|
private static void alterColumnTypeToText(Connection connection, String tableName, String columnName) throws SQLException {
|
String alterQuery = String.format("ALTER TABLE %s MODIFY %s TEXT", tableName, columnName);
|
try (Statement statement = connection.createStatement()) {
|
statement.executeUpdate(alterQuery);
|
}
|
}
|
|
/**
|
* 获取表的列
|
*
|
* @param tabName
|
* @param connection
|
* @return
|
* @throws SQLException
|
*/
|
private List<String> getColumns(String tabName, Connection connection) throws SQLException {
|
DatabaseMetaData metaData = connection.getMetaData();
|
ResultSet columns = metaData.getColumns(null, null, tabName, null);
|
ArrayList<String> tabColumns = new ArrayList<>();
|
while (columns.next()) {
|
String columnName = columns.getString("column_name");
|
tabColumns.add(columnName);
|
}
|
return tabColumns;
|
}
|
|
/**
|
* 创建表
|
*
|
* @param data
|
* @param tabName
|
* @param connection
|
* @throws SQLException
|
*/
|
private void creatTable(JSONObject data, String tabName, Connection connection) throws SQLException {
|
StringBuilder sql = new StringBuilder("CREATE TABLE " + tabName + " (");
|
for (Map.Entry<String, Object> entry : data.entrySet()) {
|
String key = entry.getKey().trim().toLowerCase();
|
sql.append(key).append(" VARCHAR(200) null,");
|
}
|
sql.append("insert_time").append(" VARCHAR(200) null,");
|
sql = new StringBuilder(sql.substring(0, sql.length() - 1));
|
sql.append(");");
|
Statement statement = connection.createStatement();
|
statement.execute(sql.toString());
|
}
|
|
/**
|
* 判断表是否存在
|
*
|
* @param connection
|
* @param tableName
|
* @return
|
*/
|
private Boolean tabIsExists(Connection connection, String tableName) {
|
String tabSql = "SELECT table_name FROM information_schema.tables WHERE table_schema = ? AND table_name = ?";
|
PreparedStatement statement = null;
|
try {
|
statement = connection.prepareStatement(tabSql);
|
statement.setString(1, DB_NAME);
|
statement.setString(2, tableName);
|
ResultSet resultSet = statement.executeQuery();
|
boolean next = resultSet.next();
|
statement.close();
|
return next;
|
} catch (SQLException throwables) {
|
throwables.printStackTrace();
|
}
|
return null;
|
}
|
|
/**
|
* 获取数据库连接
|
*
|
* @return
|
*/
|
private Connection getConnection() {
|
try {
|
return DriverManager.getConnection(DATA_URL, DATA_USER, DATA_PASS);
|
} catch (SQLException throwables) {
|
throwables.printStackTrace();
|
}
|
return null;
|
}
|
}
|