PushMsgTask.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. package com.yihu.wlyy.task;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.concurrent.LinkedBlockingQueue;
  5. import com.yihu.wlyy.util.SystemConf;
  6. import org.json.JSONArray;
  7. import org.json.JSONObject;
  8. import org.slf4j.Logger;
  9. import org.slf4j.LoggerFactory;
  10. import org.springframework.stereotype.Controller;
  11. import org.springframework.web.bind.annotation.RequestMapping;
  12. import org.springframework.web.bind.annotation.ResponseBody;
  13. import com.fasterxml.jackson.databind.ObjectMapper;
  14. import com.yihu.wlyy.entity.wechat.WechatTemplate;
  15. import com.yihu.wlyy.entity.wechat.WechatTemplateData;
  16. import com.yihu.wlyy.util.HttpUtil;
  17. @Controller
  18. @RequestMapping(value = "/pushMsgTask")
  19. public class PushMsgTask {
  20. private static Logger logger = LoggerFactory.getLogger(PushMsgTask.class);
  21. // 最大容量为50的数组堵塞队列
  22. private static LinkedBlockingQueue<JSONObject> queue = new LinkedBlockingQueue<JSONObject>();
  23. private static PushMsgTask instance;
  24. private static Object lock = new Object();
  25. public static PushMsgTask getInstance() {
  26. synchronized (lock) {
  27. if (instance == null) {
  28. instance = new PushMsgTask();
  29. instance.run();
  30. }
  31. }
  32. return instance;
  33. }
  34. @RequestMapping(value = "aa")
  35. @ResponseBody
  36. public String test() {
  37. return "1111";
  38. }
  39. /**
  40. * 添加一条推送消息
  41. * @param receiver 接收人
  42. * @param type 消息类型
  43. * @param title 消息标题
  44. * @param msg 消息内容
  45. * @param data 消息数据
  46. */
  47. public void put(String receiver, String type, String title, String msg, String data) {
  48. try {
  49. JSONObject json = new JSONObject();
  50. json.put("receiver", receiver);
  51. json.put("type", type);
  52. json.put("title", title);
  53. json.put("msg", msg);
  54. json.put("data", data);
  55. queue.put(json);
  56. } catch (Exception e) {
  57. logger.error("添加到消息队列失败!", e);
  58. e.printStackTrace();
  59. }
  60. }
  61. /**
  62. * 添加微信消息
  63. * @param type
  64. * @param data
  65. */
  66. public void putWxMsg(String access_token, int type, String openid, String name, JSONObject data) {
  67. try {
  68. JSONObject json = new JSONObject();
  69. json.put("wx", true);
  70. json.put("access_token", access_token);
  71. json.put("type", type);
  72. json.put("openid", openid);
  73. json.put("name", name);
  74. json.put("data", data);
  75. queue.put(json);
  76. } catch (Exception e) {
  77. logger.error("添加到微信消息列队列失败!", e);
  78. e.printStackTrace();
  79. }
  80. }
  81. public void put(JSONArray array) {
  82. if (array == null || array.length() == 0) {
  83. return;
  84. }
  85. for (int i = 0; i < array.length(); i++) {
  86. JSONObject json = array.getJSONObject(i);
  87. if (json == null) {
  88. continue;
  89. }
  90. try {
  91. queue.put(json);
  92. } catch (Exception e) {
  93. logger.error("批量添加到消息队列失败!", e);
  94. }
  95. }
  96. }
  97. private void run() {
  98. new Thread(new ConsumerTask()).start();
  99. }
  100. // 消费者
  101. class ConsumerTask implements Runnable {
  102. @Override
  103. public void run() {
  104. try {
  105. while (true) {
  106. // 如果queue为空,则当前线程会堵塞,直到有新数据加入
  107. JSONObject json = queue.take();
  108. boolean wx = json.has("wx") ? json.getBoolean("wx") : false;
  109. if (wx) {
  110. // 推送微信消息
  111. JSONObject data = json.has("data") ? json.getJSONObject("data") : null;
  112. if (data == null) {
  113. continue;
  114. }
  115. // 消息类型:1:签约成功 2:签约失败 3:咨询回复通知 4:健康指导提醒
  116. int type = json.has("type") ? json.getInt("type") : -1;
  117. if (type == -1) {
  118. continue;
  119. }
  120. String access_token = json.has("access_token") ? json.getString("access_token") : "";
  121. String openid = json.has("openid") ? json.getString("openid") : "";
  122. String name = json.has("name") ? json.getString("name") : "";
  123. // 发送消息到微信端
  124. sendWeixinMessage(access_token, type, openid, name, data);
  125. } else {
  126. // 推送平台消息
  127. String receiver = json.has("receiver") ? json.getString("receiver") : "";
  128. String type = json.has("type") ? json.getString("type") : "";
  129. String title = json.has("title") ? json.getString("title") : "";
  130. String msg = json.has("msg") ? json.getString("msg") : "";
  131. String data = json.has("data") ? json.getString("data") : "";
  132. boolean res = HttpUtil.pushMessage(receiver, type, title, msg, data);
  133. if (res) {
  134. logger.info("消息推送成功!");
  135. } else {
  136. logger.error("消息推送失败!");
  137. }
  138. }
  139. }
  140. } catch (Exception ex) {
  141. ex.printStackTrace();
  142. }
  143. }
  144. }
  145. // private static final String signSuccess = "0D2vYZVRzFz15p9Y_pkZ1DKutDq8UOsks79FXUKS0tA";
  146. // private static final String signFalied = "My2VNERjJt4NXR4Ibh42pdrP6B6ka8rQxZeWinQh99s";
  147. // private static final String consultNotice = "0mF_vHj-ILx8EH8DwzmAi7LqzjqYiU9IrSRRmziTZyc";
  148. // private static final String healthNotice = "uv31ES_VCmq3tBYtyGmEQvIwU_zh9LDhF3bFpbIUt5g";
  149. // private static final String termination = "C0tdXtA_8k-Cy4a1EkzQuI877vqaqAtRkc-e_Gsd7sk";
  150. // private static final String appointmentSuccess = "FY3Pqa66tHIE1Fv-irbFBPOh5cYP71fkOzfZKH4S-Fo";
  151. // private static final String appointmentCancel = "tldWEb9AN7p_RoHoD8ml0GxWW3V1V_mpEEhp2v6p56s";
  152. // private static final String url = "http://www.xmtyw.cn/wlyy/wx/html/";
  153. /**
  154. * 发送微信模板消息
  155. * @param type 1:签约成功 2:签约失败 3:咨询回复通知 4:健康指导提醒 5:解约申请通知 6:预约挂号成功通知 7:预约取消通知
  156. * @param json 当type==1||type==2时:{"first":"消息主题",”doctor":"医生code","doctorName":"医生名","date":"签约时间","content":"签约内容","remark":"消息备注"}
  157. * type==3时:{"first":"消息主题","consult":"医生咨询编号","consultcontent":"咨询内容","replycontent":"回复内容","doctorName":"医生名","remark":"消息备注"}
  158. * type==4时:{"first":"消息主题","date":"指导时间","orgName":"指导机构","doctorName":"指导医生名","content":"指导内容","remark":"消息备注"}
  159. * type==5时:{"first":"消息主题","date":"解约时间",”doctor":"医生code","doctorName":"医生名","orgName":"解约机构","remark":"消息备注"}
  160. * type==6时:{"first":"消息主题","date":"预约时间",”id":"预约ID","doctorName":"医生名","orgName":"预约医院","deptName":"预约科室","remark":"消息备注"}
  161. * type==7时:{"first":"消息主题","name":"就诊人名","date":"预约时间","doctorName":"医生名","orgName":"预约医院","remark":"消息备注"}
  162. * @return
  163. */
  164. private boolean sendWeixinMessage(String access_token, int type, String openid, String name, JSONObject json) {
  165. try {
  166. if (access_token != null) {
  167. String token_url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + access_token;
  168. String params = typeMsg(type, openid, name, json);
  169. if (params == "") {
  170. logger.error("参数错误!");
  171. return false;
  172. }
  173. String result = HttpUtil.sendPost(token_url, params);
  174. JSONObject jsonResult = new JSONObject(result);
  175. if (Integer.parseInt(jsonResult.get("errcode").toString()) == 0) {
  176. logger.info("微信信息推送成功!");
  177. return true;
  178. } else {
  179. logger.error("错误编码:" + jsonResult.get("errcode").toString() + " 错误提示:" + jsonResult.get("errmsg").toString());
  180. return false;
  181. }
  182. } else {
  183. logger.error("获取access_token失败!");
  184. return false;
  185. }
  186. } catch (Exception e) {
  187. e.printStackTrace();
  188. logger.error("微信信息推送失败!");
  189. return false;
  190. }
  191. }
  192. /**
  193. * 拼接参数
  194. * @param type
  195. * @return
  196. */
  197. public String typeMsg(int type, String openid, String name, JSONObject json) {
  198. try {
  199. String url = SystemConf.getInstance().getSystemProperties().getProperty("server_url") + "wx/html/";
  200. WechatTemplate temp = new WechatTemplate();
  201. temp.setTouser(openid);
  202. temp.setTopcolor("#000000");
  203. Map<String, WechatTemplateData> m = new HashMap<String, WechatTemplateData>();
  204. WechatTemplateData first = new WechatTemplateData();
  205. first.setColor("#000000");
  206. first.setValue(json.getString("first"));
  207. m.put("first", first);
  208. WechatTemplateData remark = new WechatTemplateData();
  209. remark.setColor("#000000");
  210. remark.setValue(json.getString("remark"));
  211. m.put("remark", remark);
  212. String temp_id = "";
  213. if (type == 3) {
  214. temp.setUrl(url + "yszx/html/consulting-doctor.html?openid=" + openid + "&consult=" + json.getString("consult"));
  215. temp_id = SystemConf.getInstance().getSystemProperties().getProperty("template_consult_notice");
  216. temp.setTemplate_id(temp_id);
  217. WechatTemplateData keyword1 = new WechatTemplateData();
  218. keyword1.setColor("#000000");
  219. keyword1.setValue(json.getString("consultcontent"));
  220. m.put("keyword1", keyword1);
  221. WechatTemplateData keyword2 = new WechatTemplateData();
  222. keyword2.setColor("#000000");
  223. keyword2.setValue(json.getString("replycontent"));
  224. m.put("keyword2", keyword2);
  225. WechatTemplateData keyword3 = new WechatTemplateData();
  226. keyword3.setColor("#000000");
  227. keyword3.setValue(json.getString("doctorName"));
  228. m.put("keyword3", keyword3);
  229. } else if (type == 1 || type == 2) {
  230. if (type == 1)
  231. temp_id = SystemConf.getInstance().getSystemProperties().getProperty("template_sign_success");
  232. else
  233. temp_id = SystemConf.getInstance().getSystemProperties().getProperty("template_sign_failed");
  234. temp.setUrl(url + "ssgg/html/doctor-homepage-new.html?openid=" + openid + "&state=" + json.getString("doctor"));
  235. temp.setTouser(openid);
  236. temp.setTopcolor("#000000");
  237. temp.setTemplate_id(temp_id);
  238. WechatTemplateData keyword1 = new WechatTemplateData();
  239. keyword1.setColor("#000000");
  240. keyword1.setValue(json.getString("doctorName"));
  241. m.put("keyword1", keyword1);
  242. WechatTemplateData keyword2 = new WechatTemplateData();
  243. keyword2.setColor("#000000");
  244. keyword2.setValue(name);
  245. m.put("keyword2", keyword2);
  246. WechatTemplateData keyword3 = new WechatTemplateData();
  247. keyword3.setColor("#000000");
  248. keyword3.setValue(json.getString("date"));
  249. m.put("keyword3", keyword3);
  250. WechatTemplateData keyword4 = new WechatTemplateData();
  251. keyword4.setColor("#000000");
  252. keyword4.setValue(json.getString("content"));
  253. m.put("keyword4", keyword4);
  254. } else if (type == 4) {
  255. temp.setUrl(url + "yszd/html/doctor-guidance.html?openid=" + openid);
  256. temp_id = SystemConf.getInstance().getSystemProperties().getProperty("template_health_notice");
  257. temp.setTemplate_id(temp_id);
  258. WechatTemplateData keyword1 = new WechatTemplateData();
  259. keyword1.setColor("#000000");
  260. keyword1.setValue(json.getString("date"));
  261. m.put("keyword1", keyword1);
  262. WechatTemplateData keyword2 = new WechatTemplateData();
  263. keyword2.setColor("#000000");
  264. keyword2.setValue(json.getString("orgName"));
  265. m.put("keyword2", keyword2);
  266. WechatTemplateData keyword3 = new WechatTemplateData();
  267. keyword3.setColor("#000000");
  268. keyword3.setValue(json.getString("doctorName"));
  269. m.put("keyword3", keyword3);
  270. WechatTemplateData keyword4 = new WechatTemplateData();
  271. keyword4.setColor("#000000");
  272. keyword4.setValue(name);
  273. m.put("keyword4", keyword4);
  274. WechatTemplateData keyword5 = new WechatTemplateData();
  275. keyword5.setColor("#000000");
  276. keyword5.setValue(json.getString("content"));
  277. m.put("keyword5", keyword5);
  278. } else if (type == 5) {
  279. temp.setUrl(url + "ssgg/html/doctor-homepage-new.html?openid=" + openid + "&state=" + json.getString("doctor"));
  280. temp_id = SystemConf.getInstance().getSystemProperties().getProperty("template_termination");
  281. temp.setTemplate_id(temp_id);
  282. WechatTemplateData keyword1 = new WechatTemplateData();
  283. keyword1.setColor("#000000");
  284. keyword1.setValue(json.getString("doctorName"));
  285. m.put("keyword1", keyword1);
  286. WechatTemplateData keyword2 = new WechatTemplateData();
  287. keyword2.setColor("#000000");
  288. keyword2.setValue(name);
  289. m.put("keyword2", keyword2);
  290. WechatTemplateData keyword3 = new WechatTemplateData();
  291. keyword3.setColor("#000000");
  292. keyword3.setValue(json.getString("orgName"));
  293. m.put("keyword3", keyword3);
  294. WechatTemplateData keyword4 = new WechatTemplateData();
  295. keyword4.setColor("#000000");
  296. keyword4.setValue(json.getString("date"));
  297. m.put("keyword4", keyword4);
  298. } else if (type == 6) {
  299. temp.setUrl(url + "wdyy/html/detail-appointment.html?openid=" + openid +"&id=" + json.getLong("id"));
  300. temp_id = SystemConf.getInstance().getSystemProperties().getProperty("template_appoint_success");
  301. temp.setTemplate_id(temp_id);
  302. WechatTemplateData keyword1 = new WechatTemplateData();
  303. keyword1.setColor("#000000");
  304. keyword1.setValue(json.getString("orgName"));
  305. m.put("hospitalname", keyword1);
  306. WechatTemplateData keyword2 = new WechatTemplateData();
  307. keyword2.setColor("#000000");
  308. keyword2.setValue(json.getString("deptName"));
  309. m.put("deptname", keyword2);
  310. WechatTemplateData keyword3 = new WechatTemplateData();
  311. keyword3.setColor("#000000");
  312. keyword3.setValue(json.getString("doctorName"));
  313. m.put("doctorname", keyword3);
  314. WechatTemplateData keyword4 = new WechatTemplateData();
  315. keyword4.setColor("#000000");
  316. keyword4.setValue(json.getString("date"));
  317. m.put("planstarttime", keyword4);
  318. } else if (type == 7) {
  319. temp.setUrl(url + "wdyy/html/my-appointment.html?openid=" + openid);
  320. temp_id = SystemConf.getInstance().getSystemProperties().getProperty("template_appoint_failed");
  321. temp.setTemplate_id(temp_id);
  322. WechatTemplateData keyword1 = new WechatTemplateData();
  323. keyword1.setColor("#000000");
  324. keyword1.setValue(json.getString("name"));
  325. m.put("keynote1", keyword1);
  326. WechatTemplateData keyword2 = new WechatTemplateData();
  327. keyword2.setColor("#000000");
  328. keyword2.setValue(json.getString("date"));
  329. m.put("keynote2", keyword2);
  330. WechatTemplateData keyword3 = new WechatTemplateData();
  331. keyword3.setColor("#000000");
  332. keyword3.setValue(json.getString("doctorName"));
  333. m.put("keynote3", keyword3);
  334. WechatTemplateData keyword4 = new WechatTemplateData();
  335. keyword4.setColor("#000000");
  336. keyword4.setValue(json.getString("orgName"));
  337. m.put("keynote4", keyword4);
  338. }
  339. temp.setData(m);
  340. ObjectMapper mapper = new ObjectMapper();
  341. String strJson = mapper.writeValueAsString(temp);
  342. return strJson;
  343. } catch (Exception e) {
  344. e.printStackTrace();
  345. return "";
  346. }
  347. }
  348. }