MessageServiceImpl.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. package com.uas.ps.message.service.impl;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.uas.account.entity.User;
  4. import com.uas.account.util.AccountUtils;
  5. import com.uas.account.util.FlexJsonUtil;
  6. import com.uas.ps.message.dao.AppDao;
  7. import com.uas.ps.message.dao.MessageDao;
  8. import com.uas.ps.message.domain.App;
  9. import com.uas.ps.message.domain.Message;
  10. import com.uas.ps.message.domain.SmsMessage;
  11. import com.uas.ps.message.exception.IllegalOperatorException;
  12. import com.uas.ps.message.exception.ParameterMissingException;
  13. import com.uas.ps.message.service.MessageService;
  14. import com.uas.ps.message.util.Constant;
  15. import com.uas.ps.message.util.ConsumeType;
  16. import com.uas.ps.message.util.FastjsonUtils;
  17. import com.uas.ps.message.util.SMSType;
  18. import com.uas.ps.message.util.SplitChar;
  19. import com.uas.ps.message.util.account.HttpUtil;
  20. import com.uas.ps.message.util.account.HttpUtil.ResponseWrap;
  21. import java.util.ArrayList;
  22. import java.util.Date;
  23. import java.util.HashMap;
  24. import java.util.HashSet;
  25. import java.util.List;
  26. import java.util.Map;
  27. import java.util.Set;
  28. import org.apache.log4j.Logger;
  29. import org.springframework.beans.factory.annotation.Autowired;
  30. import org.springframework.http.HttpHeaders;
  31. import org.springframework.http.MediaType;
  32. import org.springframework.stereotype.Service;
  33. import org.springframework.util.CollectionUtils;
  34. import org.springframework.util.StringUtils;
  35. import org.springframework.web.client.RestTemplate;
  36. /**
  37. * Created by wangyc on 2018/1/13.
  38. *
  39. * @version 2018/1/13 15:44 wangyc
  40. */
  41. @Service
  42. public class MessageServiceImpl implements MessageService {
  43. private final MessageDao messageDao;
  44. private final AppDao appDao;
  45. private static final Logger logger = Logger.getLogger(Logger.class);
  46. private RestTemplate restTemplate;
  47. private static final String EMAIL_REGEX = "\\w[-\\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\\.)+[A-Za-z]{2,14}";
  48. private static final String TEL_REGEXP = "^((\\(\\d{3}\\))|(\\d{3}\\-))?(13|15|18|17)\\d{9}$";
  49. private static final String PROD_URL = "http://113.105.74.140:8092/tigase/baiduPush";
  50. /**
  51. * 邮件服务主机地址
  52. */
  53. // @Value("#{sys.messageServiceIp ?: 'http://message.ubtob.com/'}")
  54. private static final String MAIL_CONSOLE_HOST = "http://message.ubtob.com/";
  55. /**
  56. * 发送邮件给单个人url
  57. */
  58. private static final String MAIL_SEND_URL = "mail/send";
  59. /**
  60. * 发送邮件给多个人 url
  61. */
  62. private static final String MAIL_SEND_MANY_URL = "mail/send/o2m";
  63. /**
  64. * 短信接口
  65. */
  66. private final String messageUrl = "http://message.ubtob.com/sms/send";
  67. @Autowired
  68. public MessageServiceImpl(MessageDao messageDao, AppDao appDao) {
  69. this.messageDao = messageDao;
  70. this.appDao = appDao;
  71. }
  72. @Override
  73. public List<Message> getMessages(String receiverUu, String receiverEnuu, String consumerApp) {
  74. List<Message> messages = new ArrayList<>();
  75. if (StringUtils.isEmpty(receiverUu) || StringUtils.isEmpty(receiverEnuu)) {
  76. throw new ParameterMissingException("接收人信息为空");
  77. }
  78. App consumerAppExists = appDao.findByName(consumerApp);
  79. if (consumerApp == null) {
  80. throw new IllegalOperatorException("接收应用不存在");
  81. }
  82. messages = messageDao.findByReceiverUuAndReceiverEnuuAndConsumerAppId(Long.valueOf(receiverUu),
  83. Long.valueOf(receiverEnuu), consumerAppExists.getId());
  84. return messages;
  85. }
  86. @Override
  87. public List<Message> saveMessages(String messages) {
  88. List<JSONObject> jsonObjects = FastjsonUtils.fromJsonArray(messages, JSONObject.class);
  89. List<Message> messageList = convertFromJsonObj(jsonObjects);
  90. return messageDao.save(messageList);
  91. }
  92. @Override
  93. public Map<String, Object> sendMessage(String consumerApp) {
  94. JSONObject consumer = FastjsonUtils.parseObject(consumerApp);
  95. Object consumerAppObj = consumer.get("consumerApp");
  96. if (consumerAppObj != null && !StringUtils.isEmpty(String.valueOf(consumerAppObj))) {
  97. App consumerAppExists = appDao.findByName(String.valueOf(consumerAppObj));
  98. if (consumerAppExists == null) {
  99. throw new IllegalOperatorException("接收应用不存在");
  100. }
  101. // 获取改应用应接收的未读、未发送的需要推送的消息
  102. List<Message> messages = messageDao.findByConsumerAppIdAndIsReadAndIsSentNeedToSend(consumerAppExists.getId(),
  103. Constant.NO, Constant.NO);
  104. Map<String, Object> resultMap = sendMessageByAPI(messages, consumerApp);
  105. resultMap.put("success", "success");
  106. return resultMap;
  107. } else {
  108. throw new ParameterMissingException("接收应用信息为空");
  109. }
  110. }
  111. /**
  112. * jsonObject转换为Message
  113. * @param jsonObjects jsonObjects
  114. * @return messages
  115. */
  116. private List<Message> convertFromJsonObj(List<JSONObject> jsonObjects) {
  117. List<Message> messages = new ArrayList<>();
  118. for (JSONObject jsonObject : jsonObjects) {
  119. Message message = new Message();
  120. // 消息内容
  121. Object content = jsonObject.get("content");
  122. if (StringUtils.isEmpty(content)) {
  123. throw new ParameterMissingException("消息内容为空");
  124. } else {
  125. message.setContent(String.valueOf(content));
  126. }
  127. // 发送人
  128. Object senderUu = jsonObject.get("senderUu");
  129. Object senderEnuu = jsonObject.get("senderEnuu");
  130. if (StringUtils.isEmpty(senderUu) || StringUtils.isEmpty(senderEnuu)) {
  131. throw new ParameterMissingException("发送人信息为空");
  132. } else {
  133. message.setSenderUu(Long.valueOf(String.valueOf(senderUu)));
  134. message.setSenderEnuu(Long.valueOf(String.valueOf(senderEnuu)));
  135. }
  136. // 接收人
  137. Object receiverUu = jsonObject.get("receiverUu");
  138. Object receiverEnuu = jsonObject.get("receiverEnuu");
  139. if (StringUtils.isEmpty(receiverUu) || StringUtils.isEmpty(receiverEnuu)) {
  140. throw new ParameterMissingException("接收人信息为空");
  141. } else {
  142. message.setReceiverUu(Long.valueOf(String.valueOf(receiverUu)));
  143. message.setReceiverEnuu(Long.valueOf(String.valueOf(receiverEnuu)));
  144. }
  145. // 发送应用
  146. Object producerApp = jsonObject.get("producerApp");
  147. if (StringUtils.isEmpty(producerApp)) {
  148. throw new ParameterMissingException("发送应用为空");
  149. } else {
  150. App app = appDao.findByName(String.valueOf(producerApp));
  151. if (app == null) {
  152. throw new IllegalOperatorException("发送应用不存在");
  153. }
  154. message.setProducerApp(app.getId());
  155. }
  156. // 接收应用
  157. Object consumerType = jsonObject.get("consumerType");
  158. if (StringUtils.isEmpty(consumerType)) {
  159. throw new ParameterMissingException("接收应用类型为空");
  160. } else {
  161. String type = String.valueOf(consumerType);
  162. // 消息接收类型为公共,即所有子应用共享
  163. if (ConsumeType.PUBLIC.equals(type)) {
  164. List<App> apps = appDao.findAll();
  165. message.setConsumerApp(new HashSet<>(apps));
  166. message.setConsumeType(type);
  167. } else {
  168. Object consumerApp = jsonObject.get("consumerApp");
  169. if (consumerApp == null) {
  170. throw new ParameterMissingException("接收应用为空");
  171. } else {
  172. // 取出通过逗号拼接的接收应用
  173. String[] consumers = String.valueOf(consumerApp).split(SplitChar.COMMA);
  174. if (consumers.length < 1) {
  175. throw new ParameterMissingException("接收应用为空");
  176. }
  177. Set<App> consumerApps = new HashSet<>();
  178. for (String consumer : consumers) {
  179. App app = appDao.findByName(consumer);
  180. if (app == null) {
  181. throw new IllegalOperatorException("接收应用不存在");
  182. }
  183. consumerApps.add(app);
  184. }
  185. message.setConsumerApp(consumerApps);
  186. message.setConsumeType(consumers.length > 1 ? ConsumeType.MULTI : ConsumeType.SINGLE);
  187. }
  188. }
  189. }
  190. // 消息类型(暂时未定)
  191. Object type = jsonObject.get("type");
  192. if (!StringUtils.isEmpty(type)) {
  193. message.setType(String.valueOf(type));
  194. }
  195. // 推送类型
  196. Object smsType = jsonObject.get("smsType");
  197. if (StringUtils.isEmpty(smsType)) {
  198. message.setSmsType(SMSType.DONT_SEND);
  199. } else {
  200. message.setSmsType(String.valueOf(smsType));
  201. }
  202. // 备注
  203. Object remark = jsonObject.get("remark");
  204. if (!StringUtils.isEmpty(remark)) {
  205. message.setRemark(String.valueOf(remark));
  206. }
  207. // 邮件模板
  208. Object mailTemplate = jsonObject.get("mailTemplate");
  209. if (!StringUtils.isEmpty(mailTemplate)) {
  210. message.setMailTemplate(String.valueOf(mailTemplate));
  211. }
  212. // 短信模板
  213. Object smTemplate = jsonObject.get("smTemplate");
  214. if (!StringUtils.isEmpty(mailTemplate)) {
  215. message.setSmTemplate(String.valueOf(smTemplate));
  216. }
  217. message.setIsRead(Constant.NO);
  218. message.setCreateTime(new Date());
  219. message.setIsSent(Constant.NO);
  220. messages.add(message);
  221. }
  222. return messages;
  223. }
  224. /**
  225. * 推送消息(调用邮件、短信、IM接口)
  226. * @param messages 消息
  227. * @param consumerApp 消费app
  228. * @return resultMap
  229. */
  230. private Map<String, Object> sendMessageByAPI(List<Message> messages, String consumerApp) {
  231. Map<String, Object> resultMap = new HashMap<>();
  232. if (!CollectionUtils.isEmpty(messages)) {
  233. for (Message message : messages) {
  234. try {
  235. User receiver = AccountUtils.getImUserByUserUU(message.getReceiverUu());
  236. // 发送邮件
  237. if (message.getSmsType().contains(SMSType.MAIL)) {
  238. sendMail(message, receiver);
  239. }
  240. // 发送短息
  241. if (message.getSmsType().contains(SMSType.SM)) {
  242. sendSM(message, receiver);
  243. }
  244. // 发送IM
  245. if (message.getSmsType().contains(SMSType.IM)) {
  246. sendIM(message, receiver, consumerApp);
  247. }
  248. message.setIsSent(Constant.YES);
  249. } catch (Exception e) {
  250. System.err.println(e.getMessage());
  251. }
  252. }
  253. messageDao.save(messages);
  254. }
  255. return resultMap;
  256. }
  257. /**
  258. * 发送邮件
  259. * @param message 消息
  260. * @param receiver 接收人
  261. */
  262. private void sendMail(Message message, User receiver) {
  263. if (message.getMailTemplate() != null && receiver.getSecondUID() != null) {
  264. HttpHeaders headers = new HttpHeaders();
  265. MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
  266. headers.setContentType(type);
  267. headers.add("Accept", MediaType.APPLICATION_JSON.toString());
  268. JSONObject object = new JSONObject();
  269. object.put("templateId", message.getMailTemplate());
  270. object.put("receiver", receiver.getSecondUID());
  271. object.put("params", message.getContent());
  272. // HttpEntity<String> formEntity = new HttpEntity<String>(, headers);
  273. try {
  274. ResponseWrap responseWrap = HttpUtil.doPost(MAIL_CONSOLE_HOST + MAIL_SEND_URL,
  275. FlexJsonUtil.toJson(object));
  276. } catch (Exception e) {
  277. e.printStackTrace();
  278. }
  279. }
  280. }
  281. /**
  282. * 发送短信
  283. * @param message 消息
  284. * @param receiver 接收人
  285. */
  286. private void sendSM(Message message, User receiver) {
  287. if (!StringUtils.isEmpty(message.getSmTemplate()) && !StringUtils.isEmpty(receiver.getUid())) {
  288. if (receiver.getUid() != null) {
  289. try {
  290. SmsMessage sms = new SmsMessage();
  291. List<Object> obj = new ArrayList<Object>();
  292. obj.add(receiver.getName());
  293. obj.add(receiver.getName());
  294. User sender = AccountUtils.getImUserByUserUU(message.getSenderUu());
  295. if (sender != null) {
  296. obj.add(sender.getName() + "("
  297. + sender.getName() + ")");
  298. sms.setParams(obj);
  299. sms.setReceiver(receiver.getUid());
  300. sms.setTemplateId(message.getSmTemplate());
  301. String response = com.uas.ps.message.util.HttpUtil.sendPost(messageUrl, FastjsonUtils.toJson(sms));
  302. logger.info("发送短信:" + response);
  303. }
  304. } catch (Exception e) {
  305. logger.info("发送短信异常:" + e.getMessage());
  306. e.printStackTrace();
  307. }
  308. }
  309. }
  310. }
  311. /**
  312. * 发送IM
  313. * @param message 消息
  314. * @param receiver 接收人
  315. * @param consumerApp 消费app
  316. */
  317. private void sendIM(Message message, User receiver, String consumerApp) {
  318. Map<String, Object> params = new HashMap<>();
  319. if (!StringUtils.isEmpty(receiver.getDialectUID())) {
  320. // TODO params.put("master", enterprise.getEnName()); // 账套 公司名称
  321. params.put("userid", receiver.getDialectUID()); // 推送目标用户
  322. // TODO String title = "";
  323. // params.put("title", message.getType()); // 推送标题
  324. params.put("content", message.getContent()); // 正文
  325. params.put("enUU", message.getReceiverEnuu()); // UU号
  326. params.put("url", ""); // 跳转链接地址
  327. // TODO
  328. params.put("platform", consumerApp); // 系统名称,ERP或
  329. try {
  330. ResponseWrap res = HttpUtil.doPost(PROD_URL, params);
  331. if (!res.isSuccess()) {
  332. throw new Exception(res.getContent());
  333. }
  334. } catch (Exception e) {
  335. e.printStackTrace();
  336. }
  337. }
  338. }
  339. }