ソースを参照

fix
新增新公众号消息模板并兼容多公众号消息模板推送

zoujiajian 3 年 前
コミット
baeff203a4

+ 4 - 0
netflix-dao/src/main/java/com/cyksj/model/manage/views/GroupsRelationView.java

@@ -35,6 +35,10 @@ public class GroupsRelationView {
     @JsonIgnore
     private String tripsAccount;
 
+    @DbField("a.password")
+    @JsonIgnore
+    private String tripsPassword;
+
     @DbField("g.id")
     private Long goodsId;
 

+ 2 - 2
netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java

@@ -261,7 +261,7 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 				try {
 					if (StrUtil.isNotEmpty(user.getOpenId())) {
 						log.info("用户{}兑换车位成功,发送新订单模板消息", user.getId());
-						templateCommonService.newOderSendMsgByType(orderDon, goodsDon, sku, user, user.getOpenId(), false);
+						templateCommonService.newOderSendMsgByType(orderDon, goodsDon, user, user.getOpenId(), false);
 					}
 				} catch (Exception e) {
 					log.info("用户{}兑换车位成功,发送消息失败:{}", user.getId(), e);
@@ -275,7 +275,7 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 				List<CustomerService> customerServices = customerServiceMapper.selectList(null);
 				for (CustomerService customerService : customerServices) {
 					log.info("向客服{}发送用户兑换码兑换车票消息通知..", customerService.getNickName());
-					templateCommonService.newOderSendMsgByType(orderDon, goodsDon, sku, user, customerService.getOpenId(), true);
+					templateCommonService.newOderSendMsgByType(orderDon, goodsDon, user, customerService.getOpenId(), true);
 				}
 			} catch (Exception e) {
 				log.error("向客服发送用户{}兑换码兑换车票成功,发送消息失败:{}", user.getId(), e);

+ 4 - 5
netflix-service/src/main/java/com/cyksj/service/mange/impl/SpotifySendMsgServiceImpl.java

@@ -1,6 +1,7 @@
 package com.cyksj.service.mange.impl;
 
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
 import com.cyksj.common.EnvCommonService;
 import com.cyksj.common.constant.TemplateEnum;
 import com.cyksj.common.util.Jsons;
@@ -19,7 +20,6 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.PostConstruct;
-import java.util.Optional;
 
 /*
  *项目名: netflix
@@ -57,13 +57,12 @@ public class SpotifySendMsgServiceImpl implements SpotifySendMsgService {
 			SpotifyUnLimitRecord unLimitRecord = spotifyUnLimitRecordMapper.selectById(record.getId());
 			if (unLimitRecord != null && !unLimitRecord.getIsSend()) {
 				User user = userMapper.selectById(unLimitRecord.getUserId());
-				if (user != null) {
-					Long userId = user.getId();
+				if (user != null && StrUtil.isNotBlank(user.getOpenId())) {
 					String openId = user.getOpenId();
-					WxAppTemplateView wxAppTemplateView = templateCommonService.getWxAppByUserId(userId, TemplateEnum.SPOTIFY_ACCOUNT_UN_LIMIT_SUCCESS_TEMPLATE.getDesc());
+					WxAppTemplateView wxAppTemplateView = templateCommonService.getWxAppByUserId(openId, TemplateEnum.SPOTIFY_ACCOUNT_UN_LIMIT_SUCCESS_TEMPLATE.getDesc());
 					if (wxAppTemplateView != null) {
 						WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
-								.setToUser(Optional.ofNullable(wxAppTemplateView.getOpenId()).orElse(openId))
+								.setToUser(openId)
 								.setTemplateId(wxAppTemplateView.getTemplateId())
 								.setUrl(spotifyUnLimitSuccessUrl);
 						WxMpTemplateMessage.TemplateData data = templateMessage.getData();

+ 2 - 2
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -1583,7 +1583,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			THREAD_POOL_TASK_EXECUTOR.execute(() -> {
 				try {
 					//发送至用户消息
-					templateCommonService.newOderSendMsgByType(order, goodsDon, sku, user, user.getOpenId(), false);
+					templateCommonService.newOderSendMsgByType(order, goodsDon, user, user.getOpenId(), false);
 				} catch (Exception e) {
 					log.error("向用户发送新订单{}通知消息失败:{}", order.getOrderNo(), e);
 				}
@@ -1595,7 +1595,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				List<CustomerService> customerServices = customerServiceMapper.selectList(null);
 				for (CustomerService customerService : customerServices) {
 					log.info("向客服{}发送新订单消息通知..", customerService.getNickName());
-					templateCommonService.newOderSendMsgByType(order, goodsDon, sku, user, customerService.getOpenId(), true);
+					templateCommonService.newOderSendMsgByType(order, goodsDon, user, customerService.getOpenId(), true);
 				}
 			} catch (Exception e) {
 				log.error("向客服发送新订单{}通知消息失败:{}", order.getOrderNo(), e);

+ 13 - 12
netflix-service/src/main/java/com/cyksj/service/register/impl/SpotifyServiceImpl.java

@@ -316,19 +316,20 @@ public class SpotifyServiceImpl implements SpotifyService {
 
     private void spotifyTemplateMsg(RegisterOrderDon registerOrderDon, String url, Boolean isSuccess) throws Exception {
         if (!EnvCommonService.active.equals(envCommonService.getEnv())) {
-            Long userId = registerOrderDon.getUserId();
             String openId = registerOrderDon.getOpenId();
-            WxAppTemplateView wxAppTemplateView = templateCommonService.getWxAppByUserId(userId, TemplateEnum.SPOTIFY_TEMPLATE.getDesc());
-            if (wxAppTemplateView != null) {
-                WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
-                        .setToUser(Optional.ofNullable(wxAppTemplateView.getOpenId()).orElse(openId))
-                        .setTemplateId(wxAppTemplateView.getTemplateId())
-                        .setUrl(url);
-                WxMpTemplateMessage.TemplateData data = templateMessage.getData();
-                data.setFirst(new WxMpTemplateData(isSuccess ? "Spotify账号已注册成功" : "Spotify账号注册失败,请修改后重新提交"));
-                data.setKeyword1(new WxMpTemplateData(registerOrderDon.getPhone()));
-                data.setKeyword2(new WxMpTemplateData(DateUtil.format(registerOrderDon.getCreatedTime(), "yyyy-MM-dd HH:mm:ss")));
-                weChatService.sendTemplateMessage(weChatService.getAccessToken(wxAppTemplateView.getAppId()), Jsons.toJson(templateMessage));
+            if (StrUtil.isNotBlank(openId)) {
+                WxAppTemplateView wxAppTemplateView = templateCommonService.getWxAppByUserId(openId, TemplateEnum.SPOTIFY_TEMPLATE.getDesc());
+                if (wxAppTemplateView != null) {
+                    WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
+                            .setToUser(openId)
+                            .setTemplateId(wxAppTemplateView.getTemplateId())
+                            .setUrl(url);
+                    WxMpTemplateMessage.TemplateData data = templateMessage.getData();
+                    data.setFirst(new WxMpTemplateData(isSuccess ? "Spotify账号已注册成功" : "Spotify账号注册失败,请修改后重新提交"));
+                    data.setKeyword1(new WxMpTemplateData(registerOrderDon.getPhone()));
+                    data.setKeyword2(new WxMpTemplateData(DateUtil.format(registerOrderDon.getCreatedTime(), "yyyy-MM-dd HH:mm:ss")));
+                    weChatService.sendTemplateMessage(weChatService.getAccessToken(wxAppTemplateView.getAppId()), Jsons.toJson(templateMessage));
+                }
             }
         }
     }

+ 2 - 2
netflix-service/src/main/java/com/cyksj/service/template/TemplateCommonService.java

@@ -15,7 +15,7 @@ public interface TemplateCommonService {
 	/**
 	 * 发送新订单模板消息
 	 */
-	void newOderSendMsgByType(OrderDon order, GoodsDon goodsDon, GoodsDonSku sku, User user, String toPeople, Boolean isCustomer) throws Exception;
+	void newOderSendMsgByType(OrderDon order, GoodsDon goodsDon, User user, String toPeople, Boolean isCustomer) throws Exception;
 
 	/**
 	 * 公众号扫描登录成功模板消息
@@ -25,7 +25,7 @@ public interface TemplateCommonService {
 	/**
 	 * 获取发送模板消息的公众号
 	 */
-	WxAppTemplateView getWxAppByUserId(Long userId, String templateMark);
+	WxAppTemplateView getWxAppByUserId(String openId, String templateMark);
 
 	/**
 	 * 发货通知模板消息

+ 51 - 63
netflix-service/src/main/java/com/cyksj/service/template/impl/TemplateCommonServiceImpl.java

@@ -2,10 +2,10 @@ package com.cyksj.service.template.impl;
 
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.EnvCommonService;
 import com.cyksj.common.constant.TemplateEnum;
-import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.config.WeChatConfig;
 import com.cyksj.mapper.GoodsDonMapper;
@@ -31,7 +31,6 @@ import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.util.List;
-import java.util.Optional;
 
 /*
  *项目名: netflix
@@ -61,19 +60,18 @@ public class TemplateCommonServiceImpl implements TemplateCommonService {
 
 	private final GoodsDonSkuMapper goodsDonSkuMapper;
 
-	public void newOderSendMsgByType(OrderDon order, GoodsDon goodsDon, GoodsDonSku sku, User user, String toPeople, Boolean isCustomer) throws Exception {
+	public void newOderSendMsgByType(OrderDon order, GoodsDon goodsDon, User user, String toPeople, Boolean isCustomer) throws Exception {
 		if (!EnvCommonService.active.equals(envCommonService.getEnv())) {
-			Long userId = order.getUserId();
 			String openId = toPeople;
 			WxAppTemplateView wxAppTemplateView = null;
 			if (isCustomer) {
 				wxAppTemplateView = this.getCustomerTemplateView(TemplateEnum.NEW_ORDER_TEMPLATE.getDesc());
 			} else {
-				wxAppTemplateView = this.getWxAppByUserId(userId, TemplateEnum.NEW_ORDER_TEMPLATE.getDesc());
+				wxAppTemplateView = this.getWxAppByUserId(openId, TemplateEnum.NEW_ORDER_TEMPLATE.getDesc());
 			}
 			if (wxAppTemplateView != null) {
 				WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
-						.setToUser(Optional.ofNullable(wxAppTemplateView.getOpenId()).orElse(openId))
+						.setToUser(openId)
 						.setTemplateId(wxAppTemplateView.getTemplateId())
 						//TODO
 						.setUrl(" ");
@@ -81,9 +79,7 @@ public class TemplateCommonServiceImpl implements TemplateCommonService {
 				data.setFirst(new WxMpTemplateData("新订单通知!"));
 				data.setKeyword1(new WxMpTemplateData(order.getOrderNo()));
 				data.setKeyword2(new WxMpTemplateData(String.format("%s服务", goodsDon.getTitle())));
-				data.setKeyword3(new WxMpTemplateData(user == null ? "推广未登录用户" : user.getNickname()));
-				data.setKeyword4(new WxMpTemplateData(order.getMoney().divide(BigDecimal.valueOf(100)).toString()));
-				data.setKeyword5(new WxMpTemplateData(DateUtil.format(order.getCreatedTime(), "yyyy-MM-dd HH:mm:ss")));
+				data.setKeyword3(new WxMpTemplateData(order.getMoney().divide(BigDecimal.valueOf(100)).toString()));
 				data.setRemark(new WxMpTemplateData(goodsDon.getType() == 1 && goodsDon.getSecondType() == 1 ? "需要联系客服邀请才可使用,请联系客服" : "点击查看详情"));
 				weChatService.sendTemplateMessage(weChatService.getAccessToken(wxAppTemplateView.getAppId()), Jsons.toJson(templateMessage));
 			}
@@ -91,11 +87,11 @@ public class TemplateCommonServiceImpl implements TemplateCommonService {
 	}
 
 	@Override
-	public WxAppTemplateView getWxAppByUserId(Long userId, String templateMark) {
+	public WxAppTemplateView getWxAppByUserId(String openId, String templateMark) {
 		UserGzhRelation userGzhRelation = null;
 		if (!TemplateEnum.WX_GZH_QR_CODE_LOGIN.getDesc().equals(templateMark)) {
 			userGzhRelation = userGzhRelationMapper.selectOne(Wrappers.lambdaQuery(UserGzhRelation.class)
-					.eq(UserGzhRelation::getUserId, userId).orderByAsc(UserGzhRelation::getWxAppId).last("limit 1"));
+					.eq(UserGzhRelation::getOpenId, openId).last("limit 1"));
 		}
 		MapBuilder builder = MapUtils.builder()
 				.field(WxAppTemplateView::getRemark, templateMark);
@@ -112,10 +108,6 @@ public class TemplateCommonServiceImpl implements TemplateCommonService {
 		}
 		builder.field(WxAppTemplateView::getType, type);
 		WxAppTemplateView wxAppTemplateView = beanSearcher.searchFirst(WxAppTemplateView.class, builder.build());
-		if (userGzhRelation != null) {
-			final String openId = userGzhRelation.getOpenId();
-			Optional.ofNullable(wxAppTemplateView).ifPresent((templateView) -> templateView.setOpenId(openId));
-		}
 		return wxAppTemplateView;
 	}
 
@@ -130,21 +122,22 @@ public class TemplateCommonServiceImpl implements TemplateCommonService {
 	@Override
 	public void sendWxGzhQrCodeSuccessMsg(User user) throws Exception {
 		if (!EnvCommonService.active.equals(envCommonService.getEnv())) {
-			Long userId = user.getId();
 			String openId = user.getOpenId();
-			WxAppTemplateView wxAppTemplateView = this.getWxAppByUserId(userId, TemplateEnum.WX_GZH_QR_CODE_LOGIN.getDesc());
-			if (wxAppTemplateView != null) {
-				String url = String.format("%sauth/weChat?url=%s", envCommonService.getHost(), envCommonService.getDomain() + "yinhe/web/");
-				WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
-						.setToUser(Optional.ofNullable(wxAppTemplateView.getOpenId()).orElse(openId))
-						.setTemplateId(wxAppTemplateView.getTemplateId())
-						.setUrl(url);
-				WxMpTemplateMessage.TemplateData data = templateMessage.getData();
-				data.setFirst(new WxMpTemplateData("您已登录成功"));
-				data.setKeyword1(new WxMpTemplateData("银河录像局"));
-				data.setKeyword2(new WxMpTemplateData(DateUtil.format(DateTime.now(), "yyyy-MM-dd HH:mm:ss")));
-				data.setRemark(new WxMpTemplateData("欢迎使用银河录像局"));
-				weChatService.sendTemplateMessage(weChatService.getAccessToken(), Jsons.toJson(templateMessage));
+			if (StrUtil.isNotBlank(openId)) {
+				WxAppTemplateView wxAppTemplateView = this.getWxAppByUserId(openId, TemplateEnum.WX_GZH_QR_CODE_LOGIN.getDesc());
+				if (wxAppTemplateView != null) {
+					String url = String.format("%sauth/weChat?url=%s", envCommonService.getHost(), envCommonService.getDomain() + "yinhe/web/");
+					WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
+							.setToUser(openId)
+							.setTemplateId(wxAppTemplateView.getTemplateId())
+							.setUrl(url);
+					WxMpTemplateMessage.TemplateData data = templateMessage.getData();
+					data.setFirst(new WxMpTemplateData("您已登录成功"));
+					data.setKeyword1(new WxMpTemplateData("银河录像局"));
+					data.setKeyword2(new WxMpTemplateData(DateUtil.format(DateTime.now(), "yyyy-MM-dd HH:mm:ss")));
+					data.setRemark(new WxMpTemplateData("欢迎使用银河录像局"));
+					weChatService.sendTemplateMessage(weChatService.getAccessToken(), Jsons.toJson(templateMessage));
+				}
 			}
 		}
 	}
@@ -153,33 +146,29 @@ public class TemplateCommonServiceImpl implements TemplateCommonService {
 	public void sendTransportMsgNotify(OrderDon orderDon, ReqSetLogisticsPost reqSetLogisticsPost, Boolean isReceiveAll) throws Exception {
 		if (!EnvCommonService.active.equals(envCommonService.getEnv())) {
 			Long userId = orderDon.getUserId();
-			WxAppTemplateView wxAppTemplateView = this.getWxAppByUserId(userId, TemplateEnum.ORDER_TRANSPORT_TEMPLATE.getDesc());
-			if (wxAppTemplateView != null) {
+			User user = userMapper.selectById(userId);
+			if (user != null && StrUtil.isNotBlank(user.getOpenId())) {
 				String openId = orderDon.getOpenId();
-				if (openId == null) {
-					User u = userMapper.selectById(orderDon.getUserId());
-					if (u == null) {
-						throw BusinessRuntimeException.getInstance("用户不存在");
-					}
-					openId = u.getOpenId();
+				WxAppTemplateView wxAppTemplateView = this.getWxAppByUserId(openId, TemplateEnum.ORDER_TRANSPORT_TEMPLATE.getDesc());
+				if (wxAppTemplateView != null) {
+					String url = String.format("%s%s", envCommonService.getDomain(), "order");
+					WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
+							.setToUser(openId)
+							.setTemplateId(wxAppTemplateView.getTemplateId())
+							.setUrl(url);
+					String msg = isReceiveAll ? "家庭套餐特权已生效,可在我的车票中查看" : "存在待领取权益,点击查看详情";
+					GoodsDon goodsDon = goodsDonMapper.selectById(orderDon.getGoodsId());
+					OrderDonTransport transport = transportMapper.selectOne(Wrappers.lambdaQuery(OrderDonTransport.class).eq(OrderDonTransport::getOrderId, reqSetLogisticsPost.getOrderId()).last("limit 1"));
+					WxMpTemplateMessage.TemplateData data = templateMessage.getData();
+					data.setFirst(new WxMpTemplateData("订单发货通知"));
+					data.setKeyword1(new WxMpTemplateData(orderDon.getOrderNo()));
+					data.setKeyword2(new WxMpTemplateData(goodsDon.getTitle()));
+					data.setKeyword3(new WxMpTemplateData(reqSetLogisticsPost.getCodeCn()));
+					data.setKeyword4(new WxMpTemplateData(reqSetLogisticsPost.getTrackingNumber()));
+					data.setKeyword5(new WxMpTemplateData(String.format("%s%s%s%s", transport.getProvince(), transport.getCity(), transport.getDistrict(), transport.getAddress())));
+					data.setRemark(new WxMpTemplateData(String.format("可复制运单编号查询物流信息\n%s", msg)));
+					weChatService.sendTemplateMessage(weChatService.getAccessToken(wxAppTemplateView.getAppId()), Jsons.toJson(templateMessage));
 				}
-				String url = String.format("%s%s", envCommonService.getDomain(), "order");
-				WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
-						.setToUser(Optional.ofNullable(wxAppTemplateView.getOpenId()).orElse(openId))
-						.setTemplateId(wxAppTemplateView.getTemplateId())
-						.setUrl(url);
-				String msg = isReceiveAll ? "家庭套餐特权已生效,可在我的车票中查看" : "存在待领取权益,点击查看详情";
-				GoodsDon goodsDon = goodsDonMapper.selectById(orderDon.getGoodsId());
-				OrderDonTransport transport = transportMapper.selectOne(Wrappers.lambdaQuery(OrderDonTransport.class).eq(OrderDonTransport::getOrderId, reqSetLogisticsPost.getOrderId()).last("limit 1"));
-				WxMpTemplateMessage.TemplateData data = templateMessage.getData();
-				data.setFirst(new WxMpTemplateData("订单发货通知"));
-				data.setKeyword1(new WxMpTemplateData(orderDon.getOrderNo()));
-				data.setKeyword2(new WxMpTemplateData(goodsDon.getTitle()));
-				data.setKeyword3(new WxMpTemplateData(reqSetLogisticsPost.getCodeCn()));
-				data.setKeyword4(new WxMpTemplateData(reqSetLogisticsPost.getTrackingNumber()));
-				data.setKeyword5(new WxMpTemplateData(String.format("%s%s%s%s", transport.getProvince(), transport.getCity(), transport.getDistrict(), transport.getAddress())));
-				data.setRemark(new WxMpTemplateData(String.format("可复制运单编号查询物流信息\n%s", msg)));
-				weChatService.sendTemplateMessage(weChatService.getAccessToken(wxAppTemplateView.getAppId()), Jsons.toJson(templateMessage));
 			}
 		}
 	}
@@ -234,19 +223,18 @@ public class TemplateCommonServiceImpl implements TemplateCommonService {
 
 	public void sendUpdateAccountMsg(GroupsRelationView relation) throws Exception {
 		String url = String.format("%sauth/weChat?url=%syinhe/web/ticket", envCommonService.getHost(), envCommonService.getDomain());
-		Long userId = relation.getUserId();
-		WxAppTemplateView wxAppTemplateView = this.getWxAppByUserId(userId, TemplateEnum.PLAT_ACCOUNT_UPDATE_TEMPLATE.getDesc());
-		if (wxAppTemplateView != null) {
-			User user = userMapper.selectById(relation.getUserId());
-			if (user != null) {
-				String openId = user.getOpenId();
+		User user = userMapper.selectById(relation.getUserId());
+		if (user != null && StrUtil.isNotBlank(user.getOpenId())) {
+			String openId = user.getOpenId();
+			WxAppTemplateView wxAppTemplateView = this.getWxAppByUserId(openId, TemplateEnum.PLAT_ACCOUNT_UPDATE_TEMPLATE.getDesc());
+			if (wxAppTemplateView != null) {
 				WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
-						.setToUser(Optional.ofNullable(wxAppTemplateView.getOpenId()).orElse(openId))
+						.setToUser(openId)
 						.setTemplateId(wxAppTemplateView.getTemplateId())
 						.setUrl(url);
 				WxMpTemplateMessage.TemplateData data = templateMessage.getData();
-				data.setFirst(new WxMpTemplateData(String.format("%s账号密码更改提醒", relation.getTitle())));
-				data.setKeyword1(new WxMpTemplateData(relation.getTripsAccount()));
+				data.setFirst(new WxMpTemplateData(String.format("%s账号%s密码更改提醒", relation.getTitle(), relation.getTripsAccount())));
+				data.setKeyword1(new WxMpTemplateData(relation.getTripsPassword()));
 				data.setKeyword2(new WxMpTemplateData(DateTime.now().toString("YYYY-MM-mm HH:mm:ss")));
 				data.setRemark(new WxMpTemplateData("您的账号密码已经更新,请到我的车票查看,长期用户请选择拼车/年付。\n" +
 						"如您不是在公众号购买,请在浏览器登录查看我的车票"));

+ 32 - 28
netflix-service/src/main/java/com/cyksj/task/Scheduler.java

@@ -3,7 +3,9 @@ package com.cyksj.task;
 import cn.hutool.core.date.DateField;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.EnvCommonService;
 import com.cyksj.common.constant.TemplateEnum;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.dto.RedisKey;
@@ -81,6 +83,8 @@ public class Scheduler {
 
         private final CmsAccountService cmsAccountService;
 
+        private final EnvCommonService envCommonService;
+
 
     /**
      * 每5分钟清理过期账号
@@ -103,35 +107,35 @@ public class Scheduler {
         List<GroupsRelation> groupsRelations = groupsRelationMapper.selectList(Wrappers.lambdaQuery(GroupsRelation.class).le(GroupsRelation::getExpiryTime, time));
         for (GroupsRelation relation : groupsRelations) {
             User user = userMapper.selectById(relation.getUserId());
-            Long userId = user.getId();
-            WxAppTemplateView wxAppTemplateView = templateCommonService.getWxAppByUserId(userId, TemplateEnum.EXPIRY_TEMPLATE.getDesc());
-            if (wxAppTemplateView != null) {
+            if (user != null && StrUtil.isNotBlank(user.getOpenId())) {
                 String openId = user.getOpenId();
-                WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
-                        .setToUser(Optional.ofNullable(wxAppTemplateView.getOpenId()).orElse(openId))
-                        .setTemplateId(wxAppTemplateView.getTemplateId())
-                        .setUrl(" ");
-
-                /**
-                 * 您的账号即将到期
-                 * 账号名称:Netflix账号
-                 * 平台:Netflix
-                 * 失效日期:5天后
-                 * 异常原因:账号即将到期
-                 * 请尽快续费,以免影响使用
-                 */
-                GroupsTrips groupsTrips = groupsMapper.selectById(relation.getGroupsId());
-                GoodsDonSku donSku = skuMapper.selectById(groupsTrips.getSkuId());
-                GoodsDon goodsDon = donMapper.selectById(donSku.getGoodsId());
-                WxMpTemplateMessage.TemplateData data = templateMessage.getData();
-                data.setFirst(new WxMpTemplateData("您的账号即将到期"));
-                data.setKeyword1(new WxMpTemplateData(goodsDon.getTitle()));
-                data.setKeyword2(new WxMpTemplateData(goodsDon.getTitle()));
-                data.setKeyword3(new WxMpTemplateData(DateUtil.format(relation.getExpiryTime(), "yyyy-MM-dd HH:mm:ss")));
-                data.setKeyword4(new WxMpTemplateData("账号即将到期"));
-                data.setRemark(new WxMpTemplateData("请尽快续费,以免影响使用"));
-                log.info("发送账号即将到期消息至用户:{}", user.getId());
-                weChatService.sendTemplateMessage(weChatService.getAccessToken(wxAppTemplateView.getAppId()), Jsons.toJson(templateMessage));
+                WxAppTemplateView wxAppTemplateView = templateCommonService.getWxAppByUserId(openId, TemplateEnum.EXPIRY_TEMPLATE.getDesc());
+                if (wxAppTemplateView != null) {
+                    String url = String.format("%sauth/weChat?url=%syinhe/web/ticket", envCommonService.getHost(), envCommonService.getDomain());
+                    WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
+                            .setToUser(openId)
+                            .setTemplateId(wxAppTemplateView.getTemplateId())
+                            .setUrl(url);
+
+                    /**
+                     * 您的账号即将到期
+                     * 账号名称:Netflix账号
+                     * 平台:Netflix
+                     * 失效日期:5天后
+                     * 异常原因:账号即将到期
+                     * 请尽快续费,以免影响使用
+                     */
+                    GroupsTrips groupsTrips = groupsMapper.selectById(relation.getGroupsId());
+                    GoodsDonSku donSku = skuMapper.selectById(groupsTrips.getSkuId());
+                    GoodsDon goodsDon = donMapper.selectById(donSku.getGoodsId());
+                    WxMpTemplateMessage.TemplateData data = templateMessage.getData();
+                    data.setFirst(new WxMpTemplateData("您的账号即将到期"));
+                    data.setKeyword1(new WxMpTemplateData(goodsDon.getTitle()));
+                    data.setKeyword2(new WxMpTemplateData(DateUtil.format(relation.getExpiryTime(), "yyyy-MM-dd HH:mm:ss")));
+                    data.setRemark(new WxMpTemplateData("请尽快续费,以免影响使用"));
+                    log.info("发送账号即将到期消息至用户:{}", user.getId());
+                    weChatService.sendTemplateMessage(weChatService.getAccessToken(wxAppTemplateView.getAppId()), Jsons.toJson(templateMessage));
+            }
 
 //                List<Account> accounts = accountMapper.selectList(Wrappers.lambdaQuery(Account.class).le(Account::getExpiryTime, time));
 //                List<CustomerService> customerServices = customerServiceMapper.selectList(null);