路泰机电科技体检——数据平台后端
zhaowenxuan
2024-12-19 d3e9ae0b5f000e52bd54962644be8e9feec0df4a
20241219
2个文件已修改
2个文件已添加
452 ■■■■■ 已修改文件
config.properties 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/example/scheudleds/DictSync.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/example/service/shanxiqin/xian/MeiJiHisService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/example/utils/DictionaryUtilCommon.java 397 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
config.properties
New file
@@ -0,0 +1,47 @@
#101.42.27.146
ip = 192.168.1.99
prot = 3306
name = ltkjpeis10weinan
#name = ltkjpeis10weinan1212
username = root
password =Root_ltkj123
his_api_url=http://192.168.0.123
his_api_port=11004
hisenabled = true
hisip = localhost
hisprot = 1433
hisname = Testlg
hisusername = sa
hispassword =admin123
hisapiappend = /OAPI/
pacsenabled = false
pacsip = 192.168.1.99
pacsprot = 1521
pacsname = ORCL
pacsusername = ltemr
pacspassword = ltkjemr
lisenabled = true
lisip =  101.42.27.146
lisprot = 3306
lisname = ltkjpeis10weinan
lisusername = root
lispassword =Root_ltkj123
#101.42.27.146
redisIp = 192.168.1.99
redisIpDatabase =0
redisProt = 6379
redisPassword = 654321
jmurl = http://localhost:5011
hosp_service = ShanXi_Qin_XiAn_MeiJi
sjpt_open = false
src/main/java/com/example/scheudleds/DictSync.java
@@ -1,5 +1,7 @@
package com.example.scheudleds;
import cn.hutool.core.util.StrUtil;
import com.example.config.ConfigValue;
import com.example.utils.DictionaryUtil;
import com.example.utils.DictionaryUtilNew;
import lombok.extern.slf4j.Slf4j;
@@ -21,12 +23,16 @@
    private DictionaryUtil dictionaryUtil;
    @Autowired
    private DictionaryUtilNew dictionaryUtilNew;
    @Autowired
    private ConfigValue configValue;
    /**
     * 字典同步
     */
    @Scheduled(cron = "0 0 22 * * ? ")
    public void execDict(){
        String open = configValue.getConfigValue("sjpt_open");
        if (StrUtil.isNotBlank(open) && open.equals("false")) return;
        FileWriter fileWriter = null;
        try {
            fileWriter = new FileWriter("src/main/resources/log.log");
src/main/java/com/example/service/shanxiqin/xian/MeiJiHisService.java
@@ -38,7 +38,7 @@
    public MeiJiHisService(ApplicationContext applicationContext, ConfigValue configValue) {
        this.applicationContext = applicationContext;
        this.configValue = configValue;
        HIS_URL = configValue.getConfigValue("his_api_url") + ":" + configValue.getConfigValue("his_api_port") +"/OAPI/";
        HIS_URL = configValue.getConfigValue("his_api_url") + ":" + configValue.getConfigValue("his_api_port") + configValue.getConfigValue("hisapiappend");
    }
    @Autowired
src/main/java/com/example/utils/DictionaryUtilCommon.java
New file
@@ -0,0 +1,397 @@
package com.example.utils;
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.example.config.ConfigValue;
import com.example.domain.HisSyncDict;
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.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.*;
/**
 * 字典公共解析类
 * @Company: 西安路泰科技有限公司
 * @Author: zhaowenxuan
 * @Date: 2024/12/19 16:41
 */
@Slf4j
@Component
public class DictionaryUtilCommon {
    @Autowired
    private HisSyncDictService hisSyncDictService;
    @Autowired
    private ConfigValue configValue;
    private static String CONFIG_PATH;
    private static String BASE_API_URL = "";
    private static final int SIZE = 1000;
    private static String USER = "";
    private static String PASSWORD = "";
    private static String URL = "";
    private static String NAME = "";
    @Value("${config.path}")
    public void setConfigPath(String configPath) {
        CONFIG_PATH = configPath;
        NAME = configValue.getConfigValue("name");
        URL = "jdbc:mysql://" + configValue.getConfigValue("ip") + ":" + configValue.getConfigValue("prot") + "/" + NAME +
                "?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8";
        USER = configValue.getConfigValue("username");
        PASSWORD = configValue.getConfigValue("password");
        String apiUrl = configValue.getConfigValue("his_api_url");
        String apiPort = configValue.getConfigValue("his_api_port");
        BASE_API_URL = apiUrl+":"+apiPort+configValue.getConfigValue("hisapiappend");
    }
    /**
     * 暂时不做
     * 1.90 门诊明细计费及组合计费项目 MZJFZHMXXM
     *
     */
// 分页每次1000条
    static {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (Exception e) {
            System.out.println("静态代码块异常 ->"+e.getMessage());
        }
    }
    public static void main(String[] args) {
        DictionaryUtilNew util = new DictionaryUtilNew();
        util.exec1();
    }
    /**
     * 进行同步
     */
    public void exec1(){
        log.info("开始执行同步");
        Connection connection = getConnection();
        if (connection == null)
            return;
        List<HisSyncDict> hisSyncDicts = hisSyncDictService.list();
        for (HisSyncDict hisSyncDict : hisSyncDicts) {
            extracted(NAME, connection, hisSyncDict);
        }
        try {
            connection.close();
        } catch (SQLException ignored) { }
        log.info("执行同步完毕");
    }
    private void extracted(String name, Connection connection, HisSyncDict hisSyncDict) {
        String method = hisSyncDict.getDictName();
        log.info("开始请求代码 ->{}", method);
        String tabName = "ltkj_" + method.toLowerCase();
        boolean isLimit = false;
        int page = 1;
        int maxPage = 1;
        JSONObject object = JSONUtil.createObj();
        object.putOpt("method", method);
        if (hisSyncDict.getIsLimit() == 1) {
            isLimit = true;
            JSONObject input = object.getJSONObject("input");
            input.putOpt("pagecount", SIZE);
            input.putOpt("page", page);
        }
        log.info("请求接口 ->{}, 请求参数 ->{}", BASE_API_URL, object.toString());
        JSONObject entries = execRequest(object.toString());
//            log.info("请求返回 ->{}", entries.toString());
        JSONObject response = entries.getJSONObject("Response");
        if ("0".equals(response.getStr("ResultCode"))) {
            try {
                dropTable(tabName, connection);
            } catch (SQLException e) {
                log.error("删除表异常 ->{}", e.getMessage());
            }
            if (isLimit) {
                maxPage = LimitInsertData(connection, tabName, response, name, page);
                log.info("计算页码为 ->{}", maxPage);
                if (maxPage > 1) {
                    for (page = 2; page <= maxPage; page++) {
                        object.clear();
                        object.putOpt("method", method);
//                        object = addInputVal(object);
                        JSONObject input = object.getJSONObject("input");
                        input.putOpt("pagecount", SIZE);
                        input.putOpt("page", page);
                        log.info("请求接口 ->{}, 请求参数 ->{}", BASE_API_URL, object.toString());
                        entries = execRequest(object.toString());
//                            log.info("请求返回 ->{}", entries.toString());
                        response = entries.getJSONObject("Response");
                        if ("0".equals(response.getStr("ResultCode"))) {
                            LimitInsertData(connection, tabName, response, name, page);
                        } else {
                            log.error("{} 请求失败:{}", method, object.toString());
                        }
                    }
                }
            } else {
                JSONArray resultData = response.getJSONArray("ResultData");
                List<JSONObject> list = JSONUtil.toList(resultData, JSONObject.class);
                for (JSONObject jsonObject : list) {
                    editDataBase(connection, tabName, jsonObject, name);
                }
            }
        } else {
            log.error("{}请求失败 - 请求状态码不为0, 请求参数 ->{}, 请求返回 ->{}", method, object.toString(), response.toString());
        }
    }
    /**
     * 针对于分页接口 创建表、插入数据
     *
     * @param connection
     * @param tabName
     * @param response
     * @return
     */
    private int LimitInsertData(Connection connection, String tabName, JSONObject response,String name,Integer page) {
        JSONArray jsonArray = response.getJSONArray("ResultData");
        JSONObject entries = (JSONObject) jsonArray.get(0);
        int maxPage;
        // 行数 数据返回的第几行
        Integer rowNumber = entries.getInt("RowNumber");
        // 总条数
        Integer totalCount = entries.getInt("totalCount");
        maxPage = (totalCount + 1000 - 1) / 1000;
        log.info("请求返回总条数 ->{},当前页 ->{},总页数 ->{}",totalCount,page,maxPage);
        jsonArray.forEach(obj -> {
            editDataBase(connection, tabName, (JSONObject) obj,name);
        });
        return maxPage;
    }
    /**
     * 操作数据库
     *
     * @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());
        }
    }
    /**
     * 执行post请求
     *
     * @param params 请求参数 例如: param1=val1&param2=val2
     * @return 请求返回的json转换后的JSONObject对象
     */
    private JSONObject execRequest(String params) {
        URL url = null;
        HttpURLConnection connection = null;
        try {
            url = new URL(BASE_API_URL);
            connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Accept", "application/json");
            connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
            connection.setDoOutput(true);
            OutputStream stream = connection.getOutputStream();
            stream.write(params.getBytes(StandardCharsets.UTF_8));
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(),StandardCharsets.UTF_8));
            StringBuilder builder = new StringBuilder();
            String str;
            while ((str = reader.readLine()) != null) {
                builder.append(str);
            }
            return JSONUtil.parseObj(builder.toString());
        } 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();
    }
}