package com.example.utils.synczd;
|
|
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.json.JSONArray;
|
import cn.hutool.json.JSONObject;
|
import cn.hutool.json.JSONUtil;
|
import com.example.config.ConfigValue;
|
import com.example.domain.HisSyncDict;
|
import com.example.mapper.HisSyncDictMapper;
|
import com.example.service.HisSyncDictService;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.stereotype.Component;
|
|
import java.io.BufferedReader;
|
import java.io.IOException;
|
import java.io.InputStreamReader;
|
import java.io.OutputStreamWriter;
|
import java.net.HttpURLConnection;
|
import java.net.URL;
|
import java.net.URLEncoder;
|
import java.sql.*;
|
import java.text.SimpleDateFormat;
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Map;
|
|
/**
|
* @Company: 西安路泰科技有限公司
|
* @Author: zhaowenxuan
|
* @Date: 2025/1/2 21:57
|
*/
|
@Slf4j
|
@Component
|
public class DictionaryUtilGanSuPingLiangXianRenMinYy {
|
@Autowired
|
private HisSyncDictService hisSyncDictService;
|
@Autowired
|
private ConfigValue configValue;
|
@Autowired
|
private HisSyncDictMapper hisSyncDictMapper;
|
|
private static String BASE_API_URL = "";
|
private static String USER = "";
|
private static String PASSWORD = "";
|
private static String URL = "";
|
private static String NAME = "";
|
@Value("${config.path}")
|
public void setConfigPath(String configPath) {
|
NAME = configValue.getConfigValue("GanSu_PingLiang_XianRenMen.name");
|
URL = "jdbc:mysql://" + configValue.getConfigValue("GanSu_PingLiang_XianRenMen.ip") + ":" + configValue.getConfigValue("GanSu_PingLiang_XianRenMen.prot") + "/" + NAME +
|
"?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8";
|
USER = configValue.getConfigValue("GanSu_PingLiang_XianRenMen.username");
|
PASSWORD = configValue.getConfigValue("GanSu_PingLiang_XianRenMen.password");
|
String apiUrl = configValue.getConfigValue("GanSu_PingLiang_XianRenMen.his_api_url");
|
String apiPort = configValue.getConfigValue("GanSu_PingLiang_XianRenMen.his_api_port");
|
BASE_API_URL = apiUrl+":"+apiPort+configValue.getConfigValue("GanSu_PingLiang_XianRenMen.hisapiappend");
|
}
|
|
|
// 分页每次1000条
|
static {
|
try {
|
Class.forName("com.mysql.cj.jdbc.Driver");
|
} catch (Exception e) {
|
System.out.println("静态代码块异常 ->"+e.getMessage());
|
}
|
}
|
|
/**
|
* 进行同步
|
*/
|
public void exec(List<HisSyncDict> hisSyncDicts){
|
log.info("开始执行同步");
|
Connection connection = getConnection();
|
if (connection == null)
|
return;
|
for (HisSyncDict hisSyncDict : hisSyncDicts) {
|
hisSyncDict.setDictName(hisSyncDict.getHospId()+"_"+hisSyncDict.getDictName());
|
extracted(NAME, connection, hisSyncDict);
|
}
|
try {
|
connection.close();
|
} catch (SQLException ignored) { }
|
hisSyncDictMapper.proSyncCommonDict();
|
log.info("执行同步完毕");
|
}
|
|
private void extracted(String name, Connection connection, HisSyncDict hisSyncDict) {
|
String method = hisSyncDict.getDictName();
|
log.info("开始请求代码 ->{}", method);
|
String tabName = "ltkj_" + method.toLowerCase();
|
JSONObject object = JSONUtil.createObj();
|
log.info("请求接口 ->{}, 请求参数 ->{}", BASE_API_URL+hisSyncDict.getUrl(), object);
|
JSONObject entries = execRequest(object.toString(),hisSyncDict);
|
log.info("请求返回 ->{}", entries.toString());
|
if ("1".equals(entries.getStr("code"))) {
|
Object returnData = entries.get("data");
|
if (returnData instanceof JSONObject){
|
JSONObject response = entries.getJSONObject("data");
|
try {
|
dropTable(tabName, connection);
|
} catch (SQLException e) {
|
log.error("删除表异常 ->{}", e.getMessage());
|
}
|
editDataBase(connection, tabName, response, name);
|
}else {
|
JSONArray response = entries.getJSONArray("data");
|
try {
|
dropTable(tabName, connection);
|
List<JSONObject> list = JSONUtil.toList(response, JSONObject.class);
|
for (JSONObject jsonObject : list) {
|
editDataBase(connection, tabName, jsonObject, name);
|
}
|
} catch (SQLException e) {
|
log.error("删除表异常 ->{}", e.getMessage());
|
}
|
}
|
}
|
}
|
|
/**
|
* 针对于分页接口 创建表、插入数据
|
*
|
* @param connection
|
* @param tabName
|
* @param response
|
* @return
|
*/
|
private int LimitInsertData(Connection connection, String tabName, JSONObject response,String name,Integer page) {
|
JSONArray jsonArray = response.getJSONArray("list");
|
JSONObject entries = (JSONObject) jsonArray.get(0);
|
int maxPage;
|
// 行数 数据返回的第几行
|
Integer rowNumber = response.getInt("RowNumber");
|
// 总条数
|
Integer totalCount = response.getInt("totalRows");
|
Integer pageCount = response.getInt("pageCount");
|
maxPage = (totalCount + 100 - 1) / 100;
|
log.info("请求返回总条数 ->{},当前页 ->{},总页数 ->{}",totalCount,page,maxPage);
|
jsonArray.forEach(obj -> {
|
editDataBase(connection, tabName, (JSONObject) obj,name);
|
});
|
return pageCount;
|
}
|
|
/**
|
* 操作数据库
|
*
|
* @param connection
|
* @param tabName
|
* @param obj
|
*/
|
private void editDataBase(Connection connection, String tabName, JSONObject obj,String name) {
|
try {
|
if (!tabIsExists(connection, tabName,name)) {
|
// 创建表
|
creatTable(obj, tabName, connection);
|
}
|
} catch (SQLException throwables) {
|
log.error("创建表异常");
|
log.error(throwables.getSQLState());
|
log.error(throwables.getMessage());
|
}
|
// 对比字段 并插入数据
|
try {
|
operationTable(obj, tabName, connection);
|
} catch (SQLException e) {
|
log.error("对比字段插入数据异常");
|
log.error(e.getSQLState());
|
log.error(e.getMessage());
|
e.printStackTrace();
|
}
|
}
|
|
/**
|
* 执行post请求
|
*
|
* @param params 请求参数 例如: param1=val1¶m2=val2
|
* @return 请求返回的json转换后的JSONObject对象
|
*/
|
private JSONObject execRequest(String params,HisSyncDict hisSyncDict) {
|
java.net.URL url = null;
|
HttpURLConnection connection = null;
|
OutputStreamWriter writer = null;
|
BufferedReader reader = null;
|
StringBuilder response = new StringBuilder();
|
try {
|
url = new URL(BASE_API_URL+hisSyncDict.getUrl());
|
connection = (HttpURLConnection) url.openConnection();
|
connection.setRequestMethod("POST");
|
connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
|
log.info("请求接口 ->{}", hisSyncDict.getUrl());
|
connection.setDoOutput(true);
|
StringBuilder postData = new StringBuilder();
|
JSONObject jsonObject = JSONUtil.parseObj(params);
|
for (String key : jsonObject.keySet()) {
|
if (postData.length() > 0) {
|
postData.append("&");
|
}
|
String encode = URLEncoder.encode(key, "UTF-8");
|
String encode1 = URLEncoder.encode(String.valueOf(jsonObject.get(key)), "UTF-8");
|
postData.append(encode).append("=").append(encode1);
|
}
|
|
writer = new OutputStreamWriter(connection.getOutputStream());
|
writer.write(postData.toString());
|
writer.flush();
|
reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
|
String line;
|
while ((line = reader.readLine()) != null) {
|
response.append(line);
|
}
|
return JSONUtil.parseObj(response);
|
} catch (IOException e) {
|
e.printStackTrace();
|
} finally {
|
if (connection != null) {
|
connection.disconnect();
|
}
|
}
|
return null;
|
}
|
|
public Connection getConnection() {
|
try {
|
log.info("数据库信息 ->{},{},{}",USER,PASSWORD,URL);
|
return DriverManager.getConnection(URL,USER,PASSWORD);
|
} catch (Exception throwables) {
|
log.error("获取sql连接失败");
|
throwables.printStackTrace();
|
}
|
return null;
|
}
|
|
/**
|
* 表是否存在
|
*
|
* @param connection
|
* @param tableName
|
* @return
|
* @throws SQLException
|
*/
|
private Boolean tabIsExists(Connection connection, String tableName,String name) throws SQLException {
|
String tabSql = "SELECT table_name FROM information_schema.tables WHERE table_schema = ? AND table_name = ?";
|
PreparedStatement statement = connection.prepareStatement(tabSql);
|
statement.setString(1, name);
|
statement.setString(2, tableName);
|
// log.info("判断表是否存在 sql-> {}", statement.toString());
|
ResultSet resultSet = statement.executeQuery();
|
boolean next = resultSet.next();
|
statement.close();
|
return next;
|
}
|
|
/**
|
* 操作表
|
*
|
* @param tabName
|
* @param connection
|
* @throws SQLException
|
*/
|
private void operationTable(JSONObject jsonObject, String tabName, Connection connection) throws SQLException {
|
List<String> columns = getColumns(tabName, connection);
|
// log.info("当前表字段为 ->{}", columns);
|
ArrayList<String> responseColums = new ArrayList<>();
|
for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
|
String key = entry.getKey().trim().toLowerCase();
|
responseColums.add(key);
|
}
|
// log.info("请求返回的字段为 ->{}", responseColums);
|
responseColums.removeAll(columns);
|
// log.info("需要增加的字段 ->{}",responseColums);
|
if (!responseColums.isEmpty()) {
|
// 需要增加字段 并插入数据
|
for (String colum : responseColums) {
|
String sql = "alter table " + tabName + " add column " + colum + " VARCHAR(200) null";
|
// log.info("修改字段 ->{}",sql.toString());
|
Statement statement = connection.createStatement();
|
statement.executeUpdate(sql);
|
statement.close();
|
}
|
insertData(tabName, connection, jsonObject);
|
} else {
|
insertData(tabName, connection, jsonObject);
|
}
|
}
|
|
/**
|
* 插入数据
|
*
|
* @param tabName
|
* @param connection
|
* @param jsonObject
|
* @throws SQLException
|
*/
|
private void insertData(String tabName, Connection connection, JSONObject jsonObject) throws SQLException {
|
// 插入数据前 先查询数据是否存在
|
StringBuilder insertSqlBuilder = new StringBuilder();
|
StringBuilder valueBuilder = new StringBuilder();
|
insertSqlBuilder.append("insert into ").append(tabName).append(" (");
|
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+", "").replace("\\","");
|
insertSqlBuilder.append(key).append(", ");
|
valueBuilder.append("'").append(val.replaceAll("'","‘")).append("', ");
|
}
|
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 statement = connection.createStatement();
|
log.info("插入数据 sql-> {}", insertSqlBuilder.toString());
|
statement.execute(insertSqlBuilder.toString());
|
statement.close();
|
}
|
|
/**
|
* 获取表的列
|
*
|
* @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 resultDataIndex1 返回数据中的第一个参数
|
* @param tabName
|
* @param connection
|
* @throws SQLException
|
*/
|
private void creatTable(JSONObject resultDataIndex1, String tabName, Connection connection) throws SQLException {
|
StringBuilder sql = new StringBuilder("CREATE TABLE " + tabName + " (");
|
for (Map.Entry<String, Object> entry : resultDataIndex1.entrySet()) {
|
String key = entry.getKey().trim().toLowerCase();
|
sql.append(key).append(" VARCHAR(200) null,");
|
}
|
sql.append("insert_time").append(" VARCHAR(100) null,");
|
sql = new StringBuilder(sql.substring(0, sql.length() - 1));
|
sql.append(");");
|
log.info("创建表格 -> {}",sql.toString());
|
Statement statement = connection.createStatement();
|
statement.execute(sql.toString());
|
}
|
|
/**
|
* 删除表
|
* @param tabName
|
* @param connection
|
* @throws SQLException
|
*/
|
private void dropTable(String tabName,Connection connection) throws SQLException {
|
String sql = "DROP TABLE IF EXISTS " + tabName;
|
Statement statement = connection.createStatement();
|
statement.executeUpdate(sql);
|
statement.close();
|
}
|
}
|