TemplateCommonServiceImpl.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. package com.cyksj.service.template.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.date.DateTime;
  4. import cn.hutool.core.date.DateUtil;
  5. import cn.hutool.core.util.StrUtil;
  6. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  7. import com.cyksj.common.EnvCommonService;
  8. import com.cyksj.common.constant.Constant;
  9. import com.cyksj.common.constant.TemplateEnum;
  10. import com.cyksj.common.util.Jsons;
  11. import com.cyksj.common.util.StringUtil;
  12. import com.cyksj.config.WeChatConfig;
  13. import com.cyksj.mapper.GoodsDonMapper;
  14. import com.cyksj.mapper.GoodsDonSkuMapper;
  15. import com.cyksj.mapper.OrderDonTransportMapper;
  16. import com.cyksj.mapper.UserMapper;
  17. import com.cyksj.mapper.gzh.UserGzhRelationMapper;
  18. import com.cyksj.model.dto.WxMpTemplateData;
  19. import com.cyksj.model.dto.WxMpTemplateMessage;
  20. import com.cyksj.model.entity.*;
  21. import com.cyksj.model.manage.request.ReqSetLogisticsPost;
  22. import com.cyksj.model.manage.views.GroupsRelationView;
  23. import com.cyksj.model.views.WxAppTemplateView;
  24. import com.cyksj.service.sms.SmsService;
  25. import com.cyksj.service.template.TemplateCommonService;
  26. import com.cyksj.service.user.UserSysMsgNotifyService;
  27. import com.cyksj.service.wechat.WeChatService;
  28. import com.ejlchina.searcher.BeanSearcher;
  29. import com.ejlchina.searcher.util.MapBuilder;
  30. import com.ejlchina.searcher.util.MapUtils;
  31. import lombok.RequiredArgsConstructor;
  32. import lombok.extern.slf4j.Slf4j;
  33. import org.springframework.stereotype.Service;
  34. import java.math.BigDecimal;
  35. import java.util.List;
  36. /*
  37. *项目名: netflix
  38. *文件名: TemplateCommonServiceImpl
  39. *创建者: JavaZou
  40. *创建时间:2023/1/11 9:59
  41. */
  42. @Service
  43. @RequiredArgsConstructor
  44. @Slf4j
  45. public class TemplateCommonServiceImpl implements TemplateCommonService {
  46. private final EnvCommonService envCommonService;
  47. private final WeChatService weChatService;
  48. private final BeanSearcher beanSearcher;
  49. private final UserGzhRelationMapper userGzhRelationMapper;
  50. private final WeChatConfig weChatConfig;
  51. private final UserMapper userMapper;
  52. private final GoodsDonMapper goodsDonMapper;
  53. private final OrderDonTransportMapper transportMapper;
  54. private final GoodsDonSkuMapper goodsDonSkuMapper;
  55. private final SmsService smsService;
  56. private final UserSysMsgNotifyService userSysMsgNotifyService;
  57. public void newOderSendMsgByType(OrderDon order, GoodsDon goodsDon, User user, String toPeople, Boolean isCustomer) throws Exception {
  58. if (!EnvCommonService.active.equals(envCommonService.getEnv())) {
  59. String openId = toPeople;
  60. if (StrUtil.isNotBlank(openId)) {
  61. WxAppTemplateView wxAppTemplateView = null;
  62. if (isCustomer) {
  63. wxAppTemplateView = this.getCustomerTemplateView(TemplateEnum.NEW_ORDER_TEMPLATE.getDesc());
  64. } else {
  65. wxAppTemplateView = this.getWxAppByUserId(openId, TemplateEnum.NEW_ORDER_TEMPLATE.getDesc());
  66. }
  67. if (wxAppTemplateView != null) {
  68. WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
  69. .setToUser(openId)
  70. .setTemplateId(wxAppTemplateView.getTemplateId())
  71. //TODO
  72. .setUrl(" ");
  73. WxMpTemplateMessage.TemplateData data = templateMessage.getData();
  74. data.setFirst(new WxMpTemplateData("新订单通知!"));
  75. data.setKeyword1(new WxMpTemplateData(order.getOrderNo()));
  76. data.setKeyword2(new WxMpTemplateData(String.format("%s服务", goodsDon.getTitle())));
  77. data.setKeyword3(new WxMpTemplateData(order.getMoney().divide(BigDecimal.valueOf(100)).toString()));
  78. data.setRemark(new WxMpTemplateData(goodsDon.getType() == 1 && goodsDon.getSecondType() == 1 ? "需要联系客服邀请才可使用,请联系客服" : "点击查看详情"));
  79. weChatService.sendTemplateMessage(weChatService.getAccessToken(wxAppTemplateView.getAppId()), Jsons.toJson(templateMessage));
  80. }
  81. }
  82. }
  83. }
  84. @Override
  85. public WxAppTemplateView getWxAppByUserId(String openId, String templateMark) {
  86. UserGzhRelation userGzhRelation = userGzhRelationMapper.selectOne(Wrappers.lambdaQuery(UserGzhRelation.class)
  87. .eq(UserGzhRelation::getOpenId, openId).last("limit 1"));
  88. MapBuilder builder = MapUtils.builder()
  89. .field(WxAppTemplateView::getRemark, templateMark);
  90. if (userGzhRelation == null) {
  91. builder.field(WxAppTemplateView::getAppId, weChatConfig.getAppid());
  92. } else {
  93. builder.field(WxAppTemplateView::getWxAppId, userGzhRelation.getWxAppId());
  94. }
  95. String type;
  96. if (EnvCommonService.active.equals(envCommonService.getEnv())) {
  97. type = EnvCommonService.active;
  98. } else {
  99. type = EnvCommonService.active_prd;
  100. }
  101. builder.field(WxAppTemplateView::getType, type);
  102. WxAppTemplateView wxAppTemplateView = beanSearcher.searchFirst(WxAppTemplateView.class, builder.build());
  103. return wxAppTemplateView;
  104. }
  105. public WxAppTemplateView getCustomerTemplateView(String templateMark) {
  106. WxAppTemplateView wxAppTemplateView = beanSearcher.searchFirst(WxAppTemplateView.class, MapUtils.builder()
  107. .field(WxAppTemplateView::getRemark, templateMark)
  108. .field(WxAppTemplateView::getAppId, weChatConfig.getAppid())
  109. .field(WxAppTemplateView::getType, EnvCommonService.active_prd).build());
  110. return wxAppTemplateView;
  111. }
  112. @Override
  113. public void sendWxGzhQrCodeSuccessMsg(User user) throws Exception {
  114. if (!EnvCommonService.active.equals(envCommonService.getEnv())) {
  115. String openId = user.getOpenId();
  116. if (StrUtil.isNotBlank(openId)) {
  117. WxAppTemplateView wxAppTemplateView = this.getWxAppByUserId(openId, TemplateEnum.WX_GZH_QR_CODE_LOGIN.getDesc());
  118. if (wxAppTemplateView != null) {
  119. String url = String.format("%sauth/weChat?url=%s", envCommonService.getHost(), envCommonService.getDomain());
  120. WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
  121. .setToUser(openId)
  122. .setTemplateId(wxAppTemplateView.getTemplateId())
  123. .setUrl(url);
  124. WxMpTemplateMessage.TemplateData data = templateMessage.getData();
  125. data.setTime3(new WxMpTemplateData(DateUtil.format(DateTime.now(), "yyyy-MM-dd HH:mm:ss")));
  126. data.setThing17(new WxMpTemplateData(user.getNickname()));
  127. weChatService.sendTemplateMessage(weChatService.getAccessToken(wxAppTemplateView.getAppId()), Jsons.toJson(templateMessage));
  128. }
  129. }
  130. }
  131. }
  132. @Override
  133. public void sendTransportMsgNotify(OrderDon orderDon, ReqSetLogisticsPost reqSetLogisticsPost, Boolean isReceiveAll) throws Exception {
  134. if (!EnvCommonService.active.equals(envCommonService.getEnv())) {
  135. Long userId = orderDon.getUserId();
  136. User user = userMapper.selectById(userId);
  137. if (user != null && StrUtil.isNotBlank(user.getOpenId())) {
  138. String openId = orderDon.getOpenId();
  139. WxAppTemplateView wxAppTemplateView = this.getWxAppByUserId(openId, TemplateEnum.ORDER_TRANSPORT_TEMPLATE.getDesc());
  140. if (wxAppTemplateView != null) {
  141. String url = String.format("%s%s", envCommonService.getDomain(), "order");
  142. WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
  143. .setToUser(openId)
  144. .setTemplateId(wxAppTemplateView.getTemplateId())
  145. .setUrl(url);
  146. String msg = isReceiveAll ? "家庭套餐特权已生效,可在我的车票中查看" : "存在待领取权益,点击查看详情";
  147. GoodsDon goodsDon = goodsDonMapper.selectById(orderDon.getGoodsId());
  148. OrderDonTransport transport = transportMapper.selectOne(Wrappers.lambdaQuery(OrderDonTransport.class).eq(OrderDonTransport::getOrderId, reqSetLogisticsPost.getOrderId()).last("limit 1"));
  149. WxMpTemplateMessage.TemplateData data = templateMessage.getData();
  150. data.setFirst(new WxMpTemplateData("订单发货通知"));
  151. data.setKeyword1(new WxMpTemplateData(orderDon.getOrderNo()));
  152. data.setKeyword2(new WxMpTemplateData(goodsDon.getTitle()));
  153. data.setKeyword3(new WxMpTemplateData(reqSetLogisticsPost.getCodeCn()));
  154. data.setKeyword4(new WxMpTemplateData(reqSetLogisticsPost.getTrackingNumber()));
  155. data.setKeyword5(new WxMpTemplateData(String.format("%s%s%s%s", transport.getProvince(), transport.getCity(), transport.getDistrict(), transport.getAddress())));
  156. data.setRemark(new WxMpTemplateData(String.format("可复制运单编号查询物流信息\n%s", msg)));
  157. weChatService.sendTemplateMessage(weChatService.getAccessToken(wxAppTemplateView.getAppId()), Jsons.toJson(templateMessage));
  158. }
  159. }
  160. }
  161. }
  162. @Override
  163. public void emptySendMsgNotify(OrderDon orderDon, String toPeople) throws Exception {
  164. if (!EnvCommonService.active.equals(envCommonService.getEnv())) {
  165. String openId = toPeople;
  166. WxAppTemplateView wxAppTemplateView = this.getCustomerTemplateView(TemplateEnum.EMPTY_TEMPLATE.getDesc());
  167. if (wxAppTemplateView != null) {
  168. User u = userMapper.selectById(orderDon.getUserId());
  169. WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
  170. .setToUser(openId)
  171. .setTemplateId(wxAppTemplateView.getTemplateId())
  172. //TODO
  173. .setUrl(" ");
  174. GoodsDon goodsDon = goodsDonMapper.selectById(orderDon.getGoodsId());
  175. GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(orderDon.getSkuId());
  176. WxMpTemplateMessage.TemplateData data = templateMessage.getData();
  177. data.setFirst(new WxMpTemplateData("空车位通知!"));
  178. data.setKeyword1(new WxMpTemplateData(orderDon.getOrderNo()));
  179. data.setKeyword2(new WxMpTemplateData(String.format("%s,%s", goodsDon.getTitle(), goodsDonSku.getSpecVal())));
  180. data.setKeyword3(new WxMpTemplateData((u == null ? " " : u.getNickname())));
  181. data.setKeyword4(new WxMpTemplateData(orderDon.getMoney().divide(BigDecimal.valueOf(100)).toString()));
  182. data.setKeyword5(new WxMpTemplateData(DateUtil.format(orderDon.getCreatedTime(), "yyyy-MM-dd HH:mm:ss")));
  183. data.setRemark(new WxMpTemplateData("请尽快关联账号信息"));
  184. weChatService.sendTemplateMessage(weChatService.getAccessToken(wxAppTemplateView.getAppId()), Jsons.toJson(templateMessage));
  185. }
  186. }
  187. }
  188. @Override
  189. public void sendAccountTemplateMsg(Account account) throws Exception {
  190. boolean isPrd = envCommonService.isPrdEnv();
  191. List<GroupsRelationView> relations = beanSearcher.searchList(GroupsRelationView.class, MapUtils.builder()
  192. .field(GroupsRelationView::getAccountId, account.getId())
  193. .field(GroupsRelationView::getStatus, "validity")
  194. .build());
  195. if (CollUtil.isEmpty(relations)) {
  196. return;
  197. }
  198. GoodsDon goodsDon = goodsDonMapper.selectById(account.getGoodsId());
  199. String title = goodsDon != null ? goodsDon.getTitle() : "车票";
  200. DateTime now = DateTime.now();
  201. log.info("开始发送账号修改密码模板消息,大小:{}", relations.size());
  202. Long skuId = relations.get(0).getSkuId();
  203. userSysMsgNotifyService.recordUserAccountUpdateSysMsg(account.getGoodsId(), skuId, relations, account.getAccount(), goodsDon.getTitle());
  204. for (GroupsRelationView relation : relations) {
  205. if (relation.getExpiryTime() == null) {
  206. continue;
  207. }
  208. //账号有效期小于5天的人,不发账号替换/改密码短信提醒
  209. if (now.after(DateUtil.offsetDay(relation.getExpiryTime(), -5))) {
  210. continue;
  211. }
  212. //去掉GPT过滤平台
  213. if (Constant.CHANGE_ACCOUNT_PWD_FILTER_GIDS.get(1) == account.getGoodsId()) {
  214. continue;
  215. }
  216. if (relation.getUserId() != 0 && relation.getYhsId() == 0 && isPrd) {
  217. String msg = String.format(Constant.CHANGE_GROUPS_TRIPS_ACCOUNT, title, account.getAccount());
  218. smsService.sendSmsToRelationUser(relation.getUserId(), msg);
  219. }
  220. }
  221. }
  222. @Override
  223. public void sendUpdateAccountMsgNotify(GroupsRelationView relation) throws Exception {
  224. if (!EnvCommonService.active.equals(envCommonService.getEnv())) {
  225. sendUpdateAccountMsg(relation);
  226. }
  227. }
  228. @Override
  229. public Boolean sendUserSubscribeAlertMsg(User user, String msg, Long goodsId) {
  230. if (!EnvCommonService.active.equals(envCommonService.getEnv())) {
  231. String openId = user.getOpenId();
  232. if (StrUtil.isNotBlank(openId)) {
  233. WxAppTemplateView wxAppTemplateView = this.getWxAppByUserId(openId, TemplateEnum.GOODS_SUBSCRIBE_ALERT.getDesc());
  234. if (wxAppTemplateView != null) {
  235. String url = String.format("%sauth/weChat?url=%s", envCommonService.getHost(), envCommonService.getDomain() + "?gid=" + goodsId);
  236. WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
  237. .setToUser(openId)
  238. .setTemplateId(wxAppTemplateView.getTemplateId())
  239. .setUrl(url);
  240. WxMpTemplateMessage.TemplateData data = templateMessage.getData();
  241. data.setTime3(new WxMpTemplateData(DateUtil.format(DateTime.now(), "yyyy-MM-dd HH:mm:ss")));
  242. data.setThing17(new WxMpTemplateData(user.getNickname()));
  243. try {
  244. weChatService.sendTemplateMessage(weChatService.getAccessToken(wxAppTemplateView.getAppId()), Jsons.toJson(templateMessage));
  245. return true;
  246. } catch (Exception e) {
  247. log.error("发送商品订阅模板失败");
  248. }
  249. }
  250. }
  251. }
  252. return false;
  253. }
  254. public void sendUpdateAccountMsg(GroupsRelationView relation) throws Exception {
  255. String url = String.format("%sauth/weChat?url=%syinhe/web/ticket", envCommonService.getHost(), envCommonService.getDomain());
  256. User user = userMapper.selectById(relation.getUserId());
  257. if (user != null && StrUtil.isNotBlank(user.getOpenId())) {
  258. String openId = user.getOpenId();
  259. WxAppTemplateView wxAppTemplateView = this.getWxAppByUserId(openId, TemplateEnum.PLAT_ACCOUNT_UPDATE_TEMPLATE.getDesc());
  260. if (wxAppTemplateView != null) {
  261. WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
  262. .setToUser(openId)
  263. .setTemplateId(wxAppTemplateView.getTemplateId())
  264. .setUrl(url);
  265. WxMpTemplateMessage.TemplateData data = templateMessage.getData();
  266. data.setFirst(new WxMpTemplateData(String.format("%s账号%s密码更改提醒", relation.getTitle(), relation.getTripsAccount())));
  267. data.setKeyword1(new WxMpTemplateData(relation.getTripsPassword()));
  268. data.setKeyword2(new WxMpTemplateData(DateTime.now().toString("YYYY-MM-mm HH:mm:ss")));
  269. data.setRemark(new WxMpTemplateData("您的账号密码已经更新,请到我的车票查看,长期用户请选择拼车/年付。\n" +
  270. "如您不是在公众号购买,请在浏览器登录查看我的车票"));
  271. try {
  272. weChatService.sendTemplateMessage(weChatService.getAccessToken(wxAppTemplateView.getAppId()), Jsons.toJson(templateMessage));
  273. } catch (Exception e) {
  274. log.info("发送用户:{}车票账号修改密码模板消息错误,errorMsg:{}", user.getId(), StringUtil.getErrorText(e));
  275. }
  276. }
  277. }
  278. }
  279. }