MessageExtendService.java 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859
  1. package com.qxgmat.service.extend;
  2. import com.alipay.api.domain.TransOrderDetail;
  3. import com.nuliji.tools.Transform;
  4. import com.nuliji.tools.exception.ParameterException;
  5. import com.qxgmat.data.constants.enums.*;
  6. import com.qxgmat.data.constants.enums.module.FeedbackModule;
  7. import com.qxgmat.data.constants.enums.module.ProductType;
  8. import com.qxgmat.data.constants.enums.status.AnswerStatus;
  9. import com.qxgmat.data.constants.enums.trade.RecordSource;
  10. import com.qxgmat.data.constants.enums.user.AskTarget;
  11. import com.qxgmat.data.constants.enums.user.DataType;
  12. import com.qxgmat.data.constants.enums.user.FeedbackTarget;
  13. import com.qxgmat.data.dao.entity.*;
  14. import com.qxgmat.help.MailHelp;
  15. import com.qxgmat.help.SmsHelp;
  16. import com.qxgmat.help.WechatHelp;
  17. import com.qxgmat.service.inline.*;
  18. import org.apache.logging.log4j.util.Strings;
  19. import org.springframework.beans.factory.annotation.Value;
  20. import org.springframework.stereotype.Service;
  21. import sun.plugin2.message.Message;
  22. import javax.annotation.Resource;
  23. import java.text.SimpleDateFormat;
  24. import java.util.*;
  25. import java.util.stream.Collectors;
  26. @Service
  27. public class MessageExtendService {
  28. @Resource
  29. private MailHelp mailHelp;
  30. @Resource
  31. private WechatHelp wechatHelp;
  32. @Resource
  33. private SmsHelp smsHelp;
  34. @Resource
  35. private UserMessageService userMessageService;
  36. @Resource
  37. private MessageTemplateService messageTemplateService;
  38. @Resource
  39. private CourseService courseService;
  40. @Resource
  41. private CourseNoService courseNoService;
  42. @Resource
  43. private CoursePackageService coursePackageService;
  44. @Resource
  45. private QuestionNoService questionNoService;
  46. @Resource
  47. private CourseDataService courseDataService;
  48. @Resource
  49. private ToolsService toolsService;
  50. @Value("${url.pc}")
  51. private String pcUrl;
  52. @Value("${url.h5}")
  53. private String h5Url;
  54. @Value("${info.wechat}")
  55. private String wechat;
  56. private void send(User user, MessageCategory category, Map<String, String>params, Integer relationId){
  57. List<MessageTemplate> templateList = messageTemplateService.listByCategory(category);
  58. for(MessageTemplate template : templateList){
  59. MessageMethod messageMethod = MessageMethod.ValueOf(template.getMessageMethod());
  60. String title = replaceBody(template.getTitle(), params);
  61. String content = replaceBody(template.getContent(), params);
  62. switch(messageMethod){
  63. case EMAIL:
  64. if(params.containsKey("link")){
  65. params.put("linkHtml", makeLink(params.get("link"), params.getOrDefault("linkTitle", category.linkTitle), relationId));
  66. }else if(category.link != null ){
  67. params.put("linkHtml", makeLink(category.link, category.linkTitle, relationId));
  68. }
  69. if (params.containsKey("linkSecond")){
  70. params.put("linkSecondHtml", makeLink(params.get("linkSecond"), params.getOrDefault("linkTitle", category.linkSecondTitle), relationId));
  71. }else if(category.linkSecond != null){
  72. params.put("linkSecondHtml", makeLink(category.linkSecond, category.linkSecondTitle, relationId));
  73. }
  74. sendEmail(params.getOrDefault("emails", user.getEmail()), title, content, params.get("attachment"), params.get("attachments"));
  75. break;
  76. case INSIDE:
  77. sendInside(user.getId(), title, content, relationId, params.getOrDefault("link", template.getLink()), params.getOrDefault("linkTitle", null), category);
  78. break;
  79. case WECHAT:
  80. sendWechat(user.getWechatOpenidWechat(), category, params);
  81. break;
  82. case SMS:
  83. sendSms(user.getArea(), user.getMobile(), category, params);
  84. break;
  85. default:
  86. throw new ParameterException("消息发送方式错误");
  87. }
  88. messageTemplateService.accumulation(template.getId(), 1);
  89. }
  90. }
  91. private UserMessage sendInside(Integer userId, String title, String content, Integer relationId, String link, String linkTitle, MessageCategory category){
  92. // 根据模版创建
  93. return userMessageService.add(UserMessage.builder()
  94. .userId(userId)
  95. .title(title)
  96. .content(content)
  97. .relationId(relationId)
  98. .link(link)
  99. .linkTitle(linkTitle)
  100. .type(MessageType.FromCategory(category).key)
  101. .isRead(0)
  102. .build());
  103. }
  104. private void sendEmail(String emails, String title, String body, String attachment, String attachments){
  105. if (attachment != null){
  106. mailHelp.sendAttachMail(emails, title, body, attachment);
  107. }else if(attachments != null){
  108. mailHelp.sendAttachMail(emails, title, body, Arrays.stream(attachments.split(";")).collect(Collectors.toList()));
  109. }
  110. mailHelp.sendBaseMail(emails, title, body);
  111. }
  112. private void sendWechat(String openId, MessageCategory category, Map<String, String> params){
  113. wechatHelp.sendMessage(openId, category, params);
  114. }
  115. private void sendSms(String area, String mobile, MessageCategory category, Map<String, String> params){
  116. String[] template;
  117. Map<String, String> smsParams = new HashMap<>();
  118. switch(category){
  119. case LOGIN_ABNORMAL:
  120. template = smsHelp.ABNORMAL_TEMPLATE;
  121. // time: yyyy年MM月dd日hh:mm:ss
  122. smsParams.put("time", params.get("time"));
  123. break;
  124. case TEXTBOOK_LIBRARY:
  125. template = smsHelp.LIBRARY_TEMPLATE;
  126. // 最新换库时间是%zx_date%日
  127. // 上次换库时间是%sc_date%日
  128. // 间隔%jgts%天,库长%kcts%天
  129. // 获取机经: %jjdz%
  130. // 也可搜索微信订阅号“%dyh%”查阅机经。
  131. smsParams.put("zx_date", params.get("date"));
  132. smsParams.put("sc_date", params.get("prevDate"));
  133. smsParams.put("jgts", params.get("period"));
  134. smsParams.put("kcts", params.get("days"));
  135. smsParams.put("dyh", wechat);
  136. smsParams.put("jjdz", pcUrl+"/textbook");
  137. break;
  138. case COURSE_USE_EXPIRE:
  139. template = smsHelp.COURSE_USE_EXPIRE_TEMPLATE;
  140. // yhnc: 用户昵称
  141. // %kcmc%: 课程名称
  142. // %date%: 格式为:yyyy年MM月dd日
  143. smsParams.put("date", params.get("expireDate"));
  144. smsParams.put("yhnc", params.get("nickname"));
  145. smsParams.put("kcmc", params.get("title"));
  146. break;
  147. case COURSE_OPEN_EXPIRE:
  148. case TEXTBOOK_OPEN_EXPIRE:
  149. case QX_CAT_OPEN_EXPIRE:
  150. template = smsHelp.EXPIRE_TEMPLATE;
  151. // yhnc: 用户昵称
  152. // %date%: 格式为:yyyy年MM月dd日
  153. // wktfw: 未开通的服务名称
  154. smsParams.put("date", params.get("expireDate"));
  155. smsParams.put("yhnc", params.get("nickname"));
  156. smsParams.put("wktfw", params.get("title"));
  157. break;
  158. default:
  159. // 其余没有模版id,不发送
  160. return;
  161. }
  162. smsHelp.send(area, mobile, template, smsParams);
  163. }
  164. public void refreshMessage(List<UserMessage> messageList){
  165. for(UserMessage message : messageList){
  166. if (message.getLink() != null && message.getLink() != null) continue;
  167. MessageCategory category = MessageCategory.ValueOf(message.getMessageCategory());
  168. if(category.emailLink) continue;
  169. if (category.link != null){
  170. message.setLink(replaceLink(category.link, "id", message.getRelationId()));
  171. message.setLinkTitle(category.linkTitle);
  172. }
  173. if (category.linkSecond != null){
  174. message.setLinkSecond(replaceLink(category.linkSecond, "id", message.getRelationId()));
  175. message.setLinkSecondTitle(category.linkSecondTitle);
  176. }
  177. }
  178. }
  179. public void sendCustom(User user, MessageTemplate template, Map<String, String>params){
  180. params.put("nickname", user.getNickname());
  181. MessageMethod messageMethod = MessageMethod.ValueOf(template.getMessageMethod());
  182. String title = replaceBody(template.getTitle(), params);
  183. String content = replaceBody(template.getContent(), params);
  184. switch(messageMethod){
  185. case EMAIL:
  186. sendEmail(user.getEmail(), title, content, null, null);
  187. break;
  188. case INSIDE:
  189. sendInside(user.getId(), title, content, 0, template.getLink(), null, MessageCategory.CUSTOM);
  190. break;
  191. default:
  192. throw new ParameterException("消息发送方式错误");
  193. }
  194. }
  195. /**
  196. * 发送邀请邮件
  197. * @param emails
  198. */
  199. public void sendInviteEmail(User user, String[] emails, String code){
  200. Map<String, String> map = new HashMap<>();
  201. map.put("emails", Strings.join(Arrays.stream(emails).collect(Collectors.toList()), ';'));
  202. map.put("code", code);
  203. map.put("nickname", user.getNickname());
  204. map.put("url", pcUrl+"/id/"+code);
  205. send(user, MessageCategory.INVITED, map, user.getId());
  206. }
  207. /**
  208. * 邀请成功通知
  209. * @param user
  210. */
  211. public void sendInviteSuccess(User user, UserOrderRecord record){
  212. Map<String, String> map = new HashMap<>();
  213. map.put("nickname", user.getNickname());
  214. map.put("number", String.valueOf(user.getInviteNumber()));
  215. map.put("useExpireDays", String.valueOf(record.getUseExpireDays()));
  216. map.put("expireTime", getTime(record.getUseEndTime()));
  217. send(user, MessageCategory.INVITED_SUCCESS, map, record.getId());
  218. }
  219. /**
  220. * 实名认证
  221. * @param user
  222. */
  223. public void sendReal(User user, UserOrderRecord record){
  224. Map<String, String> map = new HashMap<>();
  225. map.put("nickname", user.getNickname());
  226. map.put("useExpireDays", String.valueOf(record.getUseExpireDays()));
  227. map.put("expireTime", getTime(record.getUseEndTime()));
  228. send(user, MessageCategory.REAL, map, record.getId());
  229. }
  230. /**
  231. * 完善备考
  232. * @param user
  233. */
  234. public void sendPrepare(User user, UserOrderRecord record){
  235. Map<String, String> map = new HashMap<>();
  236. map.put("nickname", user.getNickname());
  237. map.put("useExpireDays", String.valueOf(record.getUseExpireDays()));
  238. map.put("expireTime", getTime(record.getUseEndTime()));
  239. send(user, MessageCategory.PREPARE, map, record.getId());
  240. }
  241. /**
  242. * 发送机经换库
  243. */
  244. public void sendTextbookLibrary(User user, TextbookLibrary latest, TextbookLibrary second){
  245. Map<String, String> map = new HashMap<>();
  246. int days =(int)(latest.getStartDate().getTime() - second.getStartDate().getTime()) / 86400000;
  247. map.put("date", getDate(latest.getStartDate()));
  248. map.put("prevDate", getDate(second.getStartDate()));
  249. map.put("period", String.valueOf(days-1));
  250. map.put("days", String.valueOf(days));
  251. send(user, MessageCategory.TEXTBOOK_LIBRARY, map, 0);
  252. }
  253. /**
  254. * 发送机经更新
  255. */
  256. public void sendTextbookUpdate(User user, TextbookLibrary textbookLibrary, Boolean subscribe){
  257. Map<String, String> map = new HashMap<>();
  258. Integer version = textbookLibrary.getQuantVersion();
  259. if (textbookLibrary.getIrVersion() > version){
  260. version = textbookLibrary.getIrVersion();
  261. }
  262. if (textbookLibrary.getRcVersion() >version){
  263. version = textbookLibrary.getRcVersion();
  264. }
  265. map.put("email", user.getEmail());
  266. map.put("version", String.valueOf(version));
  267. map.put("quantVersion", String.valueOf(textbookLibrary.getQuantVersion()));
  268. map.put("quantDescription", String.valueOf(textbookLibrary.getQuantDescription()));
  269. map.put("irVersion", String.valueOf(textbookLibrary.getIrVersion()));
  270. map.put("irDescription", String.valueOf(textbookLibrary.getIrDescription()));
  271. map.put("rcVersion", String.valueOf(textbookLibrary.getRcVersion()));
  272. map.put("rcDescription", String.valueOf(textbookLibrary.getRcDescription()));
  273. if (subscribe){
  274. map.put("attachments", String.format("%s;%s;%s", textbookLibrary.getQuant(), textbookLibrary.getIr(), textbookLibrary.getRc()));
  275. send(user, MessageCategory.TEXTBOOK_UPDATE_SUBSCRIBE, map, 0);
  276. }else{
  277. send(user, MessageCategory.TEXTBOOK_UPDATE, map, 0);
  278. }
  279. }
  280. /**
  281. * 发送登录异常
  282. */
  283. public void sendLoginAbnormal(User user, UserAbnormal userAbnormal){
  284. Map<String, String> map = new HashMap<>();
  285. map.put("nickname", user.getNickname());
  286. map.put("ip", userAbnormal.getLoginIp());
  287. map.put("city", userAbnormal.getLoginCity());
  288. map.put("time", getTime(userAbnormal.getCreateTime()));
  289. send(user, MessageCategory.LOGIN_ABNORMAL, map, userAbnormal.getId());
  290. }
  291. /**
  292. * 发送预习作业到期通知:6小时,去除夜间12-7点
  293. * 课程名称:{courseTitle}
  294. * 作业名称:{assignTitle}
  295. */
  296. public void sendPreviewNotice(User user, Course course, PreviewAssign previewAssign){
  297. Map<String, String> map = new HashMap<>();
  298. map.put("courseTitle", course.getTitle());
  299. map.put("title", previewAssign.getTitle());
  300. send(user, MessageCategory.PREVIEW_NOTICE, map, previewAssign.getId());
  301. }
  302. /**
  303. * 购买成功提醒
  304. * 购买服务,课程名:{title}
  305. * 支付金额:{money}
  306. * 开通有效期:{expireTime}
  307. */
  308. public void sendPayed(User user, UserOrder userOrder, List<UserOrderRecord> recordList){
  309. Map<String, String> map = new HashMap<>();
  310. List<UserOrderRecord> pList = recordList.stream().filter((checkout)-> checkout.getParentId() == 0).collect(Collectors.toList());
  311. map.put("number", String.valueOf(pList.size()));
  312. if(userOrder.getProductTypes().size() == 1){
  313. String productType = userOrder.getProductTypes().getString(1);
  314. UserOrderRecord one = pList.get(0);
  315. switch(ProductType.ValueOf(productType)){
  316. case SERVICE:
  317. ServiceKey key = ServiceKey.ValueOf(one.getService());
  318. map.put("title", key.title);
  319. map.put("expireDays", String.valueOf(one.getExpireDays()));
  320. map.put("useExpireDays", String.valueOf(one.getUseExpireDays()));
  321. switch(key){
  322. case VIP:
  323. send(user, MessageCategory.VIP_PAY, map, one.getId());
  324. break;
  325. case TEXTBOOK:
  326. send(user, MessageCategory.TEXTBOOK_PAY, map, one.getId());
  327. break;
  328. case QX_CAT:
  329. send(user, MessageCategory.QX_CAT_PAY, map, one.getId());
  330. break;
  331. default:
  332. return;
  333. }
  334. break;
  335. case DATA:
  336. CourseData data = courseDataService.get(one.getProductId());
  337. map.put("title", data.getTitle());
  338. if (pList.size() > 1){
  339. Collection dataIds = Transform.getIds(pList, UserOrderRecord.class, "productId");
  340. List<CourseData> courseDataList = courseDataService.select(dataIds);
  341. List<String> dataTitle = new ArrayList<>();
  342. for(CourseData c: courseDataList){
  343. dataTitle.add(c.getTitle());
  344. }
  345. map.put("titleJoin", String.join("”,“", dataTitle));
  346. send(user, MessageCategory.DATA_PAY_MULTI, map, userOrder.getId());
  347. }else{
  348. send(user, MessageCategory.DATA_PAY, map, userOrder.getId());
  349. }
  350. break;
  351. case COURSE:
  352. Course course = courseService.get(one.getProductId());
  353. map.put("title", course.getTitle());
  354. if (pList.size() > 1){
  355. Collection courseIds = Transform.getIds(pList, UserOrderRecord.class, "productId");
  356. List<Course> courseList = courseService.select(courseIds);
  357. List<String> courseTitle = new ArrayList<>();
  358. for(Course c: courseList){
  359. courseTitle.add(c.getTitle());
  360. }
  361. map.put("titleJoin", String.join("”,“", courseTitle));
  362. send(user, MessageCategory.COURSE_PAY_MULTI, map, userOrder.getId());
  363. }else{
  364. map.put("expireDays", String.valueOf(one.getExpireDays()));
  365. map.put("useExpireDays", String.valueOf(one.getUseExpireDays()));
  366. send(user, MessageCategory.COURSE_PAY, map, userOrder.getId());
  367. }
  368. break;
  369. case COURSE_PACKAGE:
  370. CoursePackage coursePackage = coursePackageService.get(one.getProductId());
  371. List<Course> courseList = courseService.select(coursePackage.getCourseIds());
  372. List<String> courseTitle = new ArrayList<>();
  373. for(Course c: courseList){
  374. courseTitle.add(c.getTitle());
  375. }
  376. map.put("titleJoin", String.join("”,“", courseTitle));
  377. map.put("number", String.valueOf(courseList.size()));
  378. map.put("title", courseList.get(0).getTitle());
  379. send(user, MessageCategory.COURSE_PAY_MULTI, map, userOrder.getId());
  380. break;
  381. default:
  382. return;
  383. }
  384. }else{
  385. List<String> titles = new ArrayList<>();
  386. List<UserOrderRecord> prService = recordList.stream().filter((row)-> row.getProductType().equals(ProductType.SERVICE.key)).collect(Collectors.toList());
  387. for(UserOrderRecord r : prService){
  388. ServiceKey key = ServiceKey.ValueOf(r.getService());
  389. titles.add(key.title);
  390. }
  391. // 绑定套餐
  392. List<UserOrderRecord> prPackage = recordList.stream().filter((row)-> row.getProductType().equals(ProductType.COURSE_PACKAGE.key)).collect(Collectors.toList());
  393. Collection packageIds = Transform.getIds(prPackage, UserOrderRecord.class, "productId");
  394. List<CoursePackage> coursePackageList = coursePackageService.select(packageIds);
  395. List<Integer> courseExtendIds = new ArrayList<>();
  396. Map coursePackageMap = Transform.getMap(coursePackageList, CoursePackage.class, "id");
  397. for(UserOrderRecord r : prPackage){
  398. if (!coursePackageMap.containsKey(r.getProductId())) continue;
  399. CoursePackage coursePackage = (CoursePackage) coursePackageMap.get(r.getProductId());
  400. courseExtendIds.addAll(Arrays.stream(coursePackage.getCourseIds()).collect(Collectors.toList()));
  401. }
  402. List<Course> courseExtendList = courseService.select(courseExtendIds);
  403. Map courseExtendMap = Transform.getMap(courseExtendList, Course.class, "id");
  404. for(UserOrderRecord r: prPackage){
  405. if (!coursePackageMap.containsKey(r.getProductId())) continue;
  406. CoursePackage coursePackage = (CoursePackage) coursePackageMap.get(r.getProductId());
  407. for(Integer courseId : coursePackage.getCourseIds()){
  408. if (!courseExtendMap.containsKey(courseId)) continue;
  409. Course course = (Course) courseExtendMap.get(courseId);
  410. titles.add(course.getTitle());
  411. }
  412. }
  413. // 绑定资料
  414. List<UserOrderRecord> prData = recordList.stream().filter((row)-> row.getProductType().equals(ProductType.DATA.key)).collect(Collectors.toList());
  415. Collection dataIds = Transform.getIds(prData, UserOrderRecord.class, "productId");
  416. List<CourseData> courseDataList = courseDataService.select(dataIds);
  417. Map courseDataMap = Transform.getMap(courseDataList, CourseData.class, "id");
  418. for(UserOrderRecord r: prData){
  419. if (courseDataMap.containsKey(r.getProductId())) continue;
  420. CourseData courseData = (CourseData) courseDataMap.get(r.getProductId());
  421. titles.add(courseData.getTitle());
  422. }
  423. // 绑定课程
  424. List<UserOrderRecord> prCourse = recordList.stream().filter((row)-> row.getProductType().equals(ProductType.COURSE.key)).collect(Collectors.toList());
  425. Collection courseIds = Transform.getIds(prCourse, UserOrderRecord.class, "productId");
  426. List<Course> courseList = courseService.select(courseIds);
  427. Map courseMap = Transform.getMap(courseList, Course.class, "id");
  428. for(UserOrderRecord r: prCourse){
  429. if (courseMap.containsKey(r.getProductId())) continue;
  430. Course course = (Course) courseMap.get(r.getProductId());
  431. titles.add(course.getTitle());
  432. }
  433. map.put("number", String.valueOf(titles.size()));
  434. map.put("title", titles.get(0));
  435. map.put("titleJoin", String.join("”,“", titles));
  436. send(user, MessageCategory.PAY_MULTI, map, userOrder.getId());
  437. }
  438. // 赠品
  439. List<UserOrderRecord> gifts = recordList.stream().filter((checkout)-> checkout.getSource().equals(RecordSource.GIFT_COURSE.key)).collect(Collectors.toList());
  440. for(UserOrderRecord gift: gifts){
  441. Map<String, String> giftMap = new HashMap<>();
  442. ServiceKey key = ServiceKey.ValueOf(gift.getService());
  443. map.put("title", key.title);
  444. // 获取赠品链接
  445. switch(key){
  446. case QX_CAT:
  447. map.put("link", MessageCategory.QX_CAT_PAY.link);
  448. map.put("linkTitle", MessageCategory.QX_CAT_PAY.linkTitle);
  449. break;
  450. case TEXTBOOK:
  451. map.put("link", MessageCategory.TEXTBOOK_PAY.link);
  452. map.put("linkTitle", MessageCategory.TEXTBOOK_PAY.linkTitle);
  453. break;
  454. }
  455. send(user, MessageCategory.COURSE_GIFT, giftMap, gift.getId());
  456. }
  457. }
  458. /**
  459. * 开通到期提醒
  460. * @param user
  461. * @param record
  462. * @param days
  463. */
  464. public void sendOpenExpire(User user, UserOrderRecord record, Integer days){
  465. Map<String, String> map = new HashMap<>();
  466. map.put("days", String.valueOf(days));
  467. map.put("expireDate", getDate(record.getEndTime()));
  468. map.put("nickname", user.getNickname());
  469. switch(ProductType.ValueOf(record.getProductType())){
  470. case SERVICE:
  471. ServiceKey key = ServiceKey.ValueOf(record.getService());
  472. map.put("title", key.title);
  473. switch(key){
  474. case TEXTBOOK:
  475. send(user, MessageCategory.TEXTBOOK_OPEN_EXPIRE, map, record.getId());
  476. break;
  477. case QX_CAT:
  478. send(user, MessageCategory.QX_CAT_OPEN_EXPIRE, map, record.getId());
  479. break;
  480. default:
  481. return;
  482. }
  483. break;
  484. case COURSE:
  485. Course course = courseService.get(record.getProductId());
  486. map.put("title", course.getTitle());
  487. send(user, MessageCategory.COURSE_OPEN_EXPIRE, map, record.getId());
  488. break;
  489. default:
  490. return;
  491. }
  492. }
  493. /**
  494. * 使用到期提醒
  495. * @param user
  496. * @param record
  497. * @param days
  498. */
  499. public void sendUseExpire(User user, UserOrderRecord record, Integer days){
  500. Map<String, String> map = new HashMap<>();
  501. map.put("days", String.valueOf(days));
  502. map.put("expireDate", getDate(record.getUseEndTime()));
  503. map.put("nickname", user.getNickname());
  504. switch(ProductType.ValueOf(record.getProductType())){
  505. case SERVICE:
  506. ServiceKey key = ServiceKey.ValueOf(record.getService());
  507. map.put("title", key.title);
  508. switch(key){
  509. case VIP:
  510. send(user, MessageCategory.VIP_USE_EXPIRE, map, record.getId());
  511. break;
  512. case TEXTBOOK:
  513. send(user, MessageCategory.TEXTBOOK_USE_EXPIRE, map, record.getId());
  514. break;
  515. case QX_CAT:
  516. send(user, MessageCategory.QX_CAT_USE_EXPIRE, map, record.getId());
  517. break;
  518. default:
  519. return;
  520. }
  521. break;
  522. case COURSE:
  523. Course course = courseService.get(record.getProductId());
  524. map.put("title", course.getTitle());
  525. send(user, MessageCategory.COURSE_USE_EXPIRE, map, record.getId());
  526. break;
  527. default:
  528. return;
  529. }
  530. }
  531. /**
  532. * 发送资料更新
  533. * 资料名称:{title}
  534. * 更新时间:{updateTime}
  535. */
  536. public void sendDataUpdate(User user, CourseData data, CourseDataHistory history, Boolean subscribe){
  537. Map<String, String> map = new HashMap<>();
  538. map.put("title", data.getTitle());
  539. map.put("nickname", user.getNickname());
  540. map.put("email", user.getEmail());
  541. map.put("version", history.getVersion());
  542. map.put("description", String.format("位置:%s, 原内容:%s, 更改为:%s", history.getPosition(), history.getOriginContent(), history.getContent()));
  543. switch(DataType.ValueOf(data.getDataType())){
  544. case PAPER:
  545. send(user, MessageCategory.DATA_UPDATE_PAPER, map, data.getId());
  546. break;
  547. case ELECTRON:
  548. if (subscribe){
  549. map.put("attachment", data.getResource());
  550. send(user, MessageCategory.DATA_UPDATE_SUBSCRIBE, map, data.getId());
  551. }else{
  552. send(user, MessageCategory.DATA_UPDATE_BASE, map, data.getId());
  553. }
  554. break;
  555. }
  556. }
  557. /**
  558. * 提问回复
  559. * 提问简介:{content}
  560. * 提问时间:{askTime}
  561. * 提问状态:{status}, 精选、隐藏
  562. */
  563. public void sendAskQuestion(User user,UserAskQuestion userAskQuestion){
  564. // 非学员
  565. if (user.getIsCourse() == 0) return;
  566. Map<String, String> map = new HashMap<>();
  567. map.put("content", userAskQuestion.getContent());
  568. map.put("date", getDate(userAskQuestion.getCreateTime()));
  569. QuestionNo questionNo = questionNoService.get(userAskQuestion.getQuestionNoId());
  570. map.put("title", questionNo.getTitle());
  571. switch(AnswerStatus.ValueOf(userAskQuestion.getAnswerStatus())){
  572. case ANSWER:
  573. if(userAskQuestion.getShowStatus() > 0){
  574. // 替换内容较多
  575. String link = replaceLink(MessageCategory.ASK_QUESTION_SPECIAL.link, "id", userAskQuestion.getId());
  576. link = replaceLink(link, "questionNoId", userAskQuestion.getQuestionNoId());
  577. map.put("link", link);
  578. map.put("linkTitle", MessageCategory.ASK_QUESTION_SPECIAL.linkTitle);
  579. send(user, MessageCategory.ASK_QUESTION_SPECIAL, map, userAskQuestion.getId());
  580. }else{
  581. send(user, MessageCategory.ASK_QUESTION_HANDLE, map, userAskQuestion.getId());
  582. }
  583. break;
  584. case IGNORE:
  585. send(user, MessageCategory.ASK_QUESTION_IGNORE, map, userAskQuestion.getId());
  586. break;
  587. default:
  588. }
  589. }
  590. /**
  591. * 提问回复
  592. * 提问简介:{content}
  593. * 提问时间:{askTime}
  594. * 提问状态:{status}, 精选、隐藏
  595. */
  596. public void sendAskCourse(User user, UserAskCourse userAskCourse){
  597. // 非学员
  598. if (user.getIsCourse() == 0) return;
  599. Map<String, String> map = new HashMap<>();
  600. map.put("content", userAskCourse.getContent());
  601. map.put("date", getDate(userAskCourse.getCreateTime()));
  602. Course course = courseService.get(userAskCourse.getCourseId());
  603. map.put("title", course.getTitle());
  604. CourseNo courseNo = courseNoService.get(userAskCourse.getCourseNoId());
  605. map.put("no", String.valueOf(courseNo.getNo()));
  606. switch(AnswerStatus.ValueOf(userAskCourse.getAnswerStatus())){
  607. case ANSWER:
  608. if(userAskCourse.getShowStatus() > 0){
  609. // 替换内容较多
  610. String link = replaceLink(MessageCategory.ASK_COURSE_SPECIAL.link, "id", userAskCourse.getId());
  611. link = replaceLink(link, "courseId", userAskCourse.getCourseId());
  612. link = replaceLink(link, "courseNoId", userAskCourse.getCourseNoId());
  613. map.put("link", link);
  614. map.put("linkTitle", MessageCategory.ASK_COURSE_SPECIAL.linkTitle);
  615. send(user, MessageCategory.ASK_COURSE_SPECIAL, map, userAskCourse.getId());
  616. }else{
  617. send(user, MessageCategory.ASK_COURSE_HANDLE, map, userAskCourse.getId());
  618. }
  619. break;
  620. case IGNORE:
  621. send(user, MessageCategory.ASK_COURSE_IGNORE, map, userAskCourse.getId());
  622. break;
  623. default:
  624. }
  625. }
  626. /**
  627. * 咨询回复:{answer}
  628. * 咨询板块:{channel}
  629. * 咨询简介:{content}
  630. */
  631. public void sendFaqCallback(User user, Faq faq){
  632. Map<String, String> map = new HashMap<>();
  633. map.put("answer", faq.getAnswer());
  634. map.put("content", faq.getContent());
  635. String channel = "";
  636. switch(faq.getChannel()){
  637. case "course-video":
  638. channel="在线课程";
  639. break;
  640. case "course-vs":
  641. channel = "1v1课程";
  642. break;
  643. case "course-package":
  644. channel = "课程套餐";
  645. break;
  646. case "course_data":
  647. channel = "资料";
  648. break;
  649. case "getready":
  650. channel = "GetReady";
  651. break;
  652. case "examination-cat":
  653. channel = "模考Cat";
  654. break;
  655. case "examination-base":
  656. channel = "模考";
  657. break;
  658. case "textbook":
  659. channel = "数学机经";
  660. break;
  661. case "library":
  662. channel = "换库表";
  663. break;
  664. case "course-index":
  665. channel = "课堂";
  666. break;
  667. case "course-video_index":
  668. channel= "在线课程";
  669. break;
  670. case "course-vs_index":
  671. channel = "1v1课程";
  672. break;
  673. case "course-package_index":
  674. channel="课程套餐";
  675. break;
  676. }
  677. map.put("channel", channel);
  678. switch(AnswerStatus.ValueOf(faq.getAnswerStatus())){
  679. case ANSWER:
  680. send(user, MessageCategory.FAQ_HANDLE, map, faq.getId());
  681. break;
  682. case IGNORE:
  683. send(user, MessageCategory.FAQ_IGNORE, map, faq.getId());
  684. break;
  685. default:
  686. }
  687. }
  688. /**
  689. * 纠错对象:{object}
  690. * 错误内容:{content}
  691. * 应更正:{correct}
  692. * 处理结果:{status}
  693. */
  694. public void sendFeedbackError(User user, UserFeedbackError feedbackError, UserOrderRecord record){
  695. Map<String, String> map = new HashMap<>();
  696. map.put("time", getTime(feedbackError.getCreateTime()));
  697. map.put("content", feedbackError.getContent());
  698. map.put("title", feedbackError.getTitle());
  699. if (feedbackError.getModule().equals(FeedbackModule.DATA.key)){
  700. String[] p = feedbackError.getPosition().split(",");
  701. map.put("position", String.format("第%s页第%s行", p[0], p[1]));
  702. }else{
  703. map.put("position", AskTarget.ValueOf(feedbackError.getPosition()).title);
  704. }
  705. map.put("originContent", feedbackError.getOriginContent());
  706. if (record != null){
  707. map.put("useExpireDays", String.valueOf(record.getUseExpireDays()));
  708. }
  709. switch(AnswerStatus.ValueOf(feedbackError.getStatus())){
  710. case ANSWER:
  711. send(user, MessageCategory.FEEDBACK_ERROR_HANDLE, map, feedbackError.getId());
  712. break;
  713. case IGNORE:
  714. send(user, MessageCategory.FEEDBACK_ERROR_IGNORE, map, feedbackError.getId());
  715. break;
  716. case NOHANDLE:
  717. send(user, MessageCategory.FEEDBACK_ERROR_NOHANDLE, map, feedbackError.getId());
  718. break;
  719. default:
  720. }
  721. }
  722. /**
  723. * 纠错对象:{object}
  724. * 错误内容:{content}
  725. * 应更正:{correct}
  726. * 处理结果:{status}
  727. */
  728. public void sendTextbookFeedback(User user, UserTextbookFeedback textbookFeedback, UserOrderRecord record){
  729. Map<String, String> map = new HashMap<>();
  730. map.put("time", getTime(textbookFeedback.getCreateTime()));
  731. map.put("content", textbookFeedback.getContent());
  732. map.put("subject", QuestionSubject.ValueOf(textbookFeedback.getQuestionSubject()).title);
  733. map.put("no", String.valueOf(textbookFeedback.getNo()));
  734. FeedbackTarget target = FeedbackTarget.ValueOf(textbookFeedback.getTarget());
  735. map.put("target", target.title);
  736. map.put("result", target.result);
  737. map.put("handle", target.handle);
  738. if (record != null){
  739. map.put("useExpireDays", String.valueOf(record.getUseExpireDays()));
  740. }
  741. switch(AnswerStatus.ValueOf(textbookFeedback.getStatus())){
  742. case ANSWER:
  743. send(user, MessageCategory.TEXTBOOK_FEEDBACK_HANDLE, map, textbookFeedback.getId());
  744. break;
  745. case IGNORE:
  746. send(user, MessageCategory.TEXTBOOK_FEEDBACK_IGNORE, map, textbookFeedback.getId());
  747. break;
  748. case NOHANDLE:
  749. send(user, MessageCategory.TEXTBOOK_FEEDBACK_NOHANDLE, map, textbookFeedback.getId());
  750. break;
  751. default:
  752. }
  753. }
  754. /**
  755. * 注册成功通知
  756. * @param user
  757. */
  758. public void sendRegister(User user){
  759. Map<String, String> map = new HashMap<>();
  760. map.put("mobile", user.getMobile());
  761. map.put("email", user.getEmail());
  762. send(user, MessageCategory.REGISTER, map, 0);
  763. }
  764. /**
  765. * 邮箱变更
  766. * @param user
  767. */
  768. public void sendEmailChange(User user, String newEmail){
  769. if(user.getEmail() != null && !user.getEmail().isEmpty()){
  770. Map<String, String> unbindMap = new HashMap<>();
  771. unbindMap.put("nickname", user.getNickname());
  772. unbindMap.put("emails", user.getEmail());
  773. String[] emails = newEmail.split("@");
  774. emails[0] = "****"+emails[0].substring(emails[0].length() - 3);
  775. unbindMap.put("email", String.join("@", emails));
  776. send(user, MessageCategory.EMAIL_UNNBIND, unbindMap, 0);
  777. }
  778. Map<String, String> changeMap = new HashMap<>();
  779. changeMap.put("nickname", user.getNickname());
  780. changeMap.put("emails", newEmail);
  781. send(user, MessageCategory.EMAIL_CHANGE, changeMap, 0);
  782. }
  783. private String replaceBody(String body, Map<String, String> params){
  784. if (body == null) return body;
  785. for(String key :params.keySet()){
  786. body = body.replaceAll("\\{"+key+"}", params.getOrDefault(key, ""));
  787. }
  788. return body;
  789. }
  790. private String replaceLink(String link, String p, Integer relationId){
  791. return link.replace("\\{"+p+"}", String.valueOf(relationId));
  792. }
  793. private String makeLink(String link, String linkTitle, Integer relationId){
  794. return String.format("<a href=\"%s\" target=\"_blank\">%s</a>", pcUrl + replaceLink(link, "id",relationId), linkTitle);
  795. }
  796. private String getDate(Date date){
  797. SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
  798. return sdf.format(date);
  799. }
  800. private String getTime(Date time){
  801. SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
  802. return sdf.format(time);
  803. }
  804. }