SQLThread.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. package com.yihu.ehr.thread;
  2. import com.yihu.ehr.config.SysConfig;
  3. import com.yihu.ehr.config.ThreadConfig;
  4. import com.yihu.ehr.dbhelper.jdbc.DBHelper;
  5. import com.yihu.ehr.util.HttpsClientUtil;
  6. import com.yihu.ehr.util.log.LogUtil;
  7. import net.sf.json.JSONObject;
  8. import org.apache.http.NameValuePair;
  9. import org.apache.http.message.BasicNameValuePair;
  10. import org.springframework.util.StringUtils;
  11. import java.util.ArrayList;
  12. import java.util.List;
  13. import java.util.UUID;
  14. /**
  15. * Created by chenweida on 2016/2/27.
  16. */
  17. public class SQLThread implements Runnable {
  18. private String orgCode = "";
  19. private String systemCode = "";
  20. private int sleepTime = 60 * 1000;//睡眠时间
  21. private String fillMiningResponString;//补采的返回数据
  22. private String hisResponString;//his的返回数据
  23. private DBHelper db = new DBHelper();
  24. private DBHelper localdb = null;
  25. private String token;
  26. private boolean flag = true;
  27. @Override
  28. public void run() {
  29. while (ThreadManage.sqlIsRunning) {
  30. try {
  31. token = HttpsClientUtil.getToken();
  32. LogUtil.info("-----------sql线程开始启动------------token:" + token);
  33. if (!StringUtils.isEmpty(token)) {
  34. //初始化参数
  35. initParam();
  36. //执行补采操作
  37. LogUtil.info("-----------开始执行补采任务判断------------");
  38. fillMining();
  39. LogUtil.info("-----------结束执行补采任务判断------------");
  40. //执行his穿透
  41. LogUtil.info("-----------开始执行his穿透任务判断------------");
  42. hisPenetration();
  43. LogUtil.info("-----------结束执行his穿透任务判断------------");
  44. //休眠
  45. }
  46. } catch (Exception e) {
  47. LogUtil.info("-----------sql线程执行失败-----------:" + e.getMessage());
  48. } finally {
  49. try {
  50. sleep();
  51. } catch (Exception e) {
  52. e.printStackTrace();
  53. }
  54. }
  55. }
  56. }
  57. private void initParam() {
  58. if (StringUtils.isEmpty(orgCode) || StringUtils.isEmpty(systemCode)) {
  59. try {
  60. List<org.json.JSONObject> listORG = db.query("select * from system_param where param_key='ORG_CODE'");
  61. List<org.json.JSONObject> listSYSTEM = db.query("select * from system_param where param_key='SYSTEM_CODE'");
  62. if (listORG != null && listORG.size() > 0) {
  63. orgCode = listORG.get(0).getString("param_value");
  64. }
  65. if (listSYSTEM != null && listSYSTEM.size() > 0) {
  66. systemCode = listSYSTEM.get(0).getString("param_value");
  67. } else {
  68. String sql = "insert into system_param (id,param_key,param_value) values " +
  69. "('" + UUID.randomUUID() + "'," +
  70. " 'SYSTEM_CODE' ," +
  71. " '" + ThreadConfig.SYSTEM_CODE + "'" +
  72. ")";
  73. db.execute(sql);
  74. }
  75. } catch (Exception e) {
  76. LogUtil.error("初始化参数失败:" + e.getMessage());
  77. }
  78. }
  79. LogUtil.info("初始化参数成功orgCode:" + orgCode + "---systemCode:" + systemCode);
  80. }
  81. /**
  82. * his穿透
  83. */
  84. private void hisPenetration() {
  85. //判断是否有his穿透的SQL
  86. if (hasHisPenetration()) {
  87. //判断jsonObject是不是有效的
  88. if (!StringUtils.isEmpty(hisResponString)) {
  89. JSONObject jo = JSONObject.fromObject(hisResponString);
  90. try {
  91. //得到id
  92. String id = (String) jo.get("id");
  93. //得到sql
  94. String sql = (String) jo.get("sql");
  95. //执行sql返回结果
  96. String resultObj = excuteSQL(sql.replace("[", "").replace("]", ""));
  97. //保存结果的到总支撑
  98. save(id, resultObj);
  99. } catch (Exception e) {
  100. LogUtil.error("hql穿透返回结果解析失败:" + jo.toString());
  101. }
  102. }
  103. }
  104. }
  105. /**
  106. * 保存结果的到总支撑
  107. *
  108. * @param id
  109. * @param resultObj
  110. */
  111. private void save(String id, String resultObj) {
  112. try {
  113. // Map<String, Object> params = new HashMap<String, Object>();
  114. // params.put("id", id);
  115. //params.put("result", resultObj);
  116. //params.put("status", 1);
  117. // HttpClientUtil.doPost(ThreadConfig.getURL(ThreadConfig.SQL_THREAD_CHANGEHISPENETRATIONSTATUS), params, ThreadConfig.SERVICE_USERNAME, ThreadConfig.SERVICE_PASSWORD);
  118. List<NameValuePair> formParams = new ArrayList<NameValuePair>();
  119. formParams.add(new BasicNameValuePair("id", id));
  120. if (flag) {
  121. formParams.add(new BasicNameValuePair("message", "执行失败"));
  122. } else {
  123. formParams.add(new BasicNameValuePair("message", "执行成功"));
  124. }
  125. formParams.add(new BasicNameValuePair("result", resultObj));
  126. formParams.add(new BasicNameValuePair("access_token", token));
  127. formParams.add(new BasicNameValuePair("status", "1"));
  128. hisResponString = HttpsClientUtil.post(ThreadConfig.SERVICE_URL + ThreadConfig.SQL_THREAD_CHANGEHISPENETRATIONSTATUS, formParams, ThreadConfig.SERVICE_USERNAME, ThreadConfig.SERVICE_PASSWORD);
  129. LogUtil.info("保存结果成功 " + hisResponString + ":ID=" + id);
  130. } catch (Exception e) {
  131. LogUtil.error("保存结果失败:ID=" + id + e.getMessage());
  132. }
  133. }
  134. /**
  135. * 执行sql返回结果
  136. *
  137. * @param sql
  138. * @return
  139. */
  140. private String excuteSQL(String sql) {
  141. if (localdb == null) {
  142. synchronized (SQLThread.class) {
  143. //初始化数据库连接池
  144. LogUtil.info("初始化数据库连接池:");
  145. List<org.json.JSONObject> list = db.query("select * from system_datasource where id='1'");
  146. if (list != null && list.size() > 0) {
  147. org.json.JSONObject jo = list.get(0);
  148. LogUtil.info("得到数据源:" + (String) jo.get("config"));
  149. localdb = new DBHelper((String) jo.get("id"), (String) jo.get("config"));
  150. LogUtil.info("初始化数据源成功:" + localdb);
  151. }
  152. }
  153. }
  154. try {
  155. List<org.json.JSONObject> locallist = localdb.query(sql);
  156. LogUtil.info("执行语句得到数据数目:" + locallist.size());
  157. flag = true;
  158. return locallist.toString();
  159. } catch (Exception e) {
  160. flag = false;
  161. LogUtil.error("执行语句失败:" + e.getMessage());
  162. return "";
  163. }
  164. }
  165. /**
  166. * 判断是否有his穿透的语句
  167. *
  168. * @return
  169. */
  170. private boolean hasHisPenetration() {
  171. try {
  172. // Map<String, Object> params = new HashMap<String, Object>();
  173. // params.put("systemCode", systemCode);
  174. //params.put("orgCode", orgCode);
  175. //得到执行的hisSql语句 {id:xxx,sql:xxx}
  176. //hisResponString = HttpClientUtil.doPost(ThreadConfig.getURL(ThreadConfig.SQL_THREAD_HISPENETRATION), params, ThreadConfig.SERVICE_USERNAME, ThreadConfig.SERVICE_PASSWORD);
  177. //hisResponString = "{\"id\":\"aaaa\",\"sql\":\"select * from HDSA00_01 t where t.patient_id = '10126751'\"}";
  178. List<NameValuePair> formParams = new ArrayList<NameValuePair>();
  179. formParams.add(new BasicNameValuePair("systemCode", systemCode));
  180. formParams.add(new BasicNameValuePair("orgCode", orgCode));
  181. formParams.add(new BasicNameValuePair("access_token", token));
  182. String path = ThreadConfig.SERVICE_URL + ThreadConfig.SQL_THREAD_HISPENETRATION;
  183. hisResponString = HttpsClientUtil.post(path, formParams, ThreadConfig.SERVICE_USERNAME, ThreadConfig.SERVICE_PASSWORD);
  184. LogUtil.info("得到要执行的his穿透任务:" + hisResponString);
  185. if (!StringUtils.isEmpty(hisResponString)) {
  186. return true;
  187. } else {
  188. return false;
  189. }
  190. } catch (Exception e) {
  191. e.printStackTrace();
  192. LogUtil.error("没有要执行的his穿透任务:" + e.getMessage());
  193. return false;
  194. }
  195. }
  196. /**
  197. * 补采
  198. */
  199. private void fillMining() {
  200. //判断是否补采
  201. if (hasFillning()) {
  202. //把数据插入到补采的表
  203. if (!StringUtils.isEmpty(fillMiningResponString)) {
  204. try {
  205. // {"startTime":"yyyyMMdd HH:mm:ss","endTime":"yyyyMMdd HH:mm:ss"}
  206. JSONObject jo = JSONObject.fromObject(fillMiningResponString);
  207. String id = (String) jo.get("id");
  208. String startTime = (String) jo.get("startTime");
  209. String endtime = (String) jo.get("endTime");
  210. String sql = "insert into crawler_supply (id,start_time,end_time,status,remote_id) values " +
  211. "('" + UUID.randomUUID() + "'," +
  212. "'" + startTime + "' ," +
  213. "'" + endtime + "'," +
  214. "'0','" + id + "'" +
  215. ")";
  216. db.execute(sql);
  217. LogUtil.info("-----------补采数据插入数据库sql:" + sql);
  218. LogUtil.info("-----------修改总平台的补采数据状态:");
  219. changeFillmining();
  220. } catch (Exception e) {
  221. e.printStackTrace();
  222. LogUtil.info("-----------补采数据插入数据库失败");
  223. }
  224. }
  225. }
  226. }
  227. /**
  228. * 判断是否补采
  229. *
  230. * @return
  231. */
  232. private boolean hasFillning() {
  233. try {
  234. // Map<String, Object> params = new HashMap<String, Object>();
  235. //params.put("systemCode", systemCode);
  236. //params.put("orgCode", orgCode);
  237. // fillMiningResponString = HttpClientUtil.doPost(ThreadConfig.getURL(ThreadConfig.SQL_THREAD_FILLMINING).trim(), params, ThreadConfig.SERVICE_USERNAME, ThreadConfig.SERVICE_PASSWORD);
  238. //fillMiningResponString = "{\"id\":\"111\",\"startTime\":\"2014-01-01 12:12:12\",\"endTime\":\"2014-01-01 12:12:12\"}";
  239. List<NameValuePair> formParams = new ArrayList<NameValuePair>();
  240. formParams.add(new BasicNameValuePair("systemCode", systemCode));
  241. formParams.add(new BasicNameValuePair("access_token", token));
  242. formParams.add(new BasicNameValuePair("orgCode", orgCode));
  243. fillMiningResponString = HttpsClientUtil.post(ThreadConfig.SERVICE_URL + ThreadConfig.SQL_THREAD_FILLMINING, formParams, ThreadConfig.SERVICE_USERNAME, ThreadConfig.SERVICE_PASSWORD);
  244. LogUtil.info("-----------返回的執行的補採任務:responString:" + fillMiningResponString);
  245. if (!StringUtils.isEmpty(fillMiningResponString)) {
  246. return true;
  247. } else {
  248. return false;
  249. }
  250. } catch (Exception e) {
  251. LogUtil.error("-----------沒有要執行的補採任務------------:" + e.getMessage());
  252. return false;
  253. }
  254. }
  255. /**
  256. * 休眠
  257. *
  258. * @throws Exception
  259. */
  260. private void sleep() throws Exception {
  261. LogUtil.info("SQL线程开始睡眠,睡眠时间(分钟):" + ThreadConfig.SQL_THREAD_SLEEP_TIME);
  262. Thread.sleep(sleepTime * ThreadConfig.SQL_THREAD_SLEEP_TIME);
  263. }
  264. /**
  265. * 得到补采的参数
  266. *
  267. * @return
  268. */
  269. public String changeFillmining() {
  270. String result = "";
  271. JSONObject jo = JSONObject.fromObject(fillMiningResponString);
  272. String id = (String) jo.get("id");
  273. try {
  274. // Map<String, Object> params = new HashMap<String, Object>();
  275. // params.put("systemCode", systemCode);
  276. // params.put("orgCode", orgCode);
  277. // params.put("id", id);
  278. // params.put("status", 2);
  279. // result = HttpClientUtil.doPost(ThreadConfig.getURL(ThreadConfig.SQL_THREAD_CHANGEFILLMININGSTATUS), params, ThreadConfig.SERVICE_USERNAME, ThreadConfig.SERVICE_PASSWORD);
  280. List<NameValuePair> formParams = new ArrayList<NameValuePair>();
  281. formParams.add(new BasicNameValuePair("message", "修改成功"));
  282. formParams.add(new BasicNameValuePair("id", id));
  283. formParams.add(new BasicNameValuePair("access_token", token));
  284. formParams.add(new BasicNameValuePair("status", "2"));
  285. fillMiningResponString = HttpsClientUtil.post(ThreadConfig.SERVICE_URL + ThreadConfig.SQL_THREAD_CHANGEFILLMININGSTATUS, formParams, ThreadConfig.SERVICE_USERNAME, ThreadConfig.SERVICE_PASSWORD);
  286. LogUtil.info("修改总平台补采数据状态为2成功:" + fillMiningResponString);
  287. } catch (Exception e) {
  288. LogUtil.error("得到补采的参数失败:" + e.getMessage());
  289. return "";
  290. }
  291. return result;
  292. }
  293. /**
  294. * 得到his穿透的语句
  295. *
  296. * @return
  297. */
  298. public String getHisSql() {
  299. String result = "";
  300. try {
  301. List<NameValuePair> formParams = new ArrayList<NameValuePair>();
  302. formParams.add(new BasicNameValuePair("systemCode", systemCode));
  303. formParams.add(new BasicNameValuePair("orgCode", orgCode));
  304. formParams.add(new BasicNameValuePair("access_token", token));
  305. result = HttpsClientUtil.post(SysConfig.getInstance().getPlatformUrl() + ThreadConfig.SQL_THREAD_FILLMINING, formParams, ThreadConfig.SERVICE_USERNAME, ThreadConfig.SERVICE_PASSWORD);
  306. LogUtil.info("得到需要执行的his穿透任务的语句成功:" + result);
  307. } catch (Exception e) {
  308. LogUtil.error("得到需要执行的his穿透任务的语句失败");
  309. }
  310. return result;
  311. }
  312. }