|
|
@@ -0,0 +1,166 @@
|
|
|
+package com.cyksj.service.goods.impl;
|
|
|
+
|
|
|
+import cn.hutool.core.date.DateTime;
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import com.cyksj.common.constant.Constant;
|
|
|
+import com.cyksj.common.util.StringUtil;
|
|
|
+import com.cyksj.dto.RedisKey;
|
|
|
+import com.cyksj.mapper.GoodsDonMapper;
|
|
|
+import com.cyksj.mapper.GoodsDonSkuMapper;
|
|
|
+import com.cyksj.mapper.UserMapper;
|
|
|
+import com.cyksj.mapper.UserSubscribeAlertGoodsRecordMapper;
|
|
|
+import com.cyksj.mapper.market.task.UserBindDetailMapper;
|
|
|
+import com.cyksj.model.entity.*;
|
|
|
+import com.cyksj.redis.RedisService;
|
|
|
+import com.cyksj.service.goods.GoodsSubscribeAlertService;
|
|
|
+import com.cyksj.service.mail.MailService;
|
|
|
+import com.cyksj.service.sms.SmsService;
|
|
|
+import com.cyksj.service.template.TemplateCommonService;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 项目名: yhlxj11111111
|
|
|
+ * 文件名: GoodsSubscribeAlertServiceImpl
|
|
|
+ * 创建者: JavaZou
|
|
|
+ * 创建时间:2026/1/6 15:35
|
|
|
+ */
|
|
|
+@RequiredArgsConstructor
|
|
|
+@Service
|
|
|
+@Slf4j
|
|
|
+public class GoodsSubscribeAlertServiceImpl implements GoodsSubscribeAlertService {
|
|
|
+ private final UserSubscribeAlertGoodsRecordMapper userSubscribeAlertGoodsRecordMapper;
|
|
|
+
|
|
|
+ private final UserMapper userMapper;
|
|
|
+
|
|
|
+ private final GoodsDonMapper goodsDonMapper;
|
|
|
+
|
|
|
+ private final TemplateCommonService templateCommonService;
|
|
|
+
|
|
|
+ private final SmsService smsService;
|
|
|
+
|
|
|
+ private final MailService mailService;
|
|
|
+
|
|
|
+ private final GoodsDonSkuMapper skuMapper;
|
|
|
+
|
|
|
+ private final RedisService redisService;
|
|
|
+
|
|
|
+ private final UserBindDetailMapper userBindDetailMapper;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void alertBeforeSubscribeByGoodsId(Long goodsId) {
|
|
|
+ DateTime now = DateTime.now();
|
|
|
+ List<UserSubscribeAlertGoodsRecord> userSubscribeAlertGoodsRecords = userSubscribeAlertGoodsRecordMapper.selectList(Wrappers.lambdaQuery(UserSubscribeAlertGoodsRecord.class)
|
|
|
+ .eq(UserSubscribeAlertGoodsRecord::getGoodsId, goodsId)
|
|
|
+ .eq(UserSubscribeAlertGoodsRecord::getStatus, Boolean.FALSE)
|
|
|
+ .le(UserSubscribeAlertGoodsRecord::getCreatedTime, now));
|
|
|
+ if (userSubscribeAlertGoodsRecords.isEmpty()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ String key = RedisKey.GOODS_SUBSCRIBE_ALERT_KEY + goodsId;
|
|
|
+ if (!redisService.setNx(key, goodsId, 60L * 30)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ GoodsDon goodsDon = goodsDonMapper.selectById(goodsId);
|
|
|
+ for (UserSubscribeAlertGoodsRecord userSubscribeAlertGoodsRecord : userSubscribeAlertGoodsRecords) {
|
|
|
+ userSubscribeAlertGoodsRecord.setStatus(Boolean.TRUE);
|
|
|
+ userSubscribeAlertGoodsRecordMapper.updateById(userSubscribeAlertGoodsRecord);
|
|
|
+
|
|
|
+ Long userId = userSubscribeAlertGoodsRecord.getUserId();
|
|
|
+ User user = userMapper.selectById(userId);
|
|
|
+// //微信用户
|
|
|
+// if (StrUtil.isNotBlank(user.getUnionid())) {
|
|
|
+// //发送微信通知模板
|
|
|
+// Boolean success = templateCommonService.sendUserSubscribeAlertMsg(user, String.format(Constant.GOODS_SUBSCRIBE_ALERT_WX_MSG, goodsDon.getTitle()), goodsId);
|
|
|
+// if (!success) {
|
|
|
+// //失败后发送手机
|
|
|
+// sendPhoneNotifySubscribe(goodsDon.getTitle(), goodsId, userId);
|
|
|
+// }
|
|
|
+// continue;
|
|
|
+// }
|
|
|
+ //首先用发手机号
|
|
|
+ Boolean success = sendPhoneNotifySubscribe(goodsDon.getTitle(), goodsId, userId);
|
|
|
+ if (!success) {
|
|
|
+ //失败 并且是邮箱用户
|
|
|
+ if (StrUtil.isNotBlank(user.getEmail())) {
|
|
|
+ //邮箱用户
|
|
|
+ String msg = String.format(Constant.GOODS_SUBSCRIBE_ALERT_EMAIL_MSG, goodsDon.getTitle(), goodsDon.getId());
|
|
|
+ mailService.sendGoodsSubscribeAlertEmail(msg, user.getEmail());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } finally {
|
|
|
+ if (redisService.hasKey(key)) {
|
|
|
+ redisService.del(key);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void alertBeforeSubscribeBySkuId(Long skuId) {
|
|
|
+ DateTime now = DateTime.now();
|
|
|
+ List<UserSubscribeAlertGoodsRecord> userSubscribeAlertGoodsRecords = userSubscribeAlertGoodsRecordMapper.selectList(Wrappers.lambdaQuery(UserSubscribeAlertGoodsRecord.class)
|
|
|
+ .eq(UserSubscribeAlertGoodsRecord::getSkuId, skuId)
|
|
|
+ .eq(UserSubscribeAlertGoodsRecord::getStatus, Boolean.FALSE)
|
|
|
+ .le(UserSubscribeAlertGoodsRecord::getCreatedTime, now));
|
|
|
+ if (userSubscribeAlertGoodsRecords.isEmpty()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ GoodsDonSku sku = skuMapper.selectById(skuId);
|
|
|
+ GoodsDon goodsDon = goodsDonMapper.selectById(sku.getGoodsId());
|
|
|
+ String key = RedisKey.GOODS_SUBSCRIBE_ALERT_KEY + goodsDon.getId() + ":" + skuId;
|
|
|
+ if (!redisService.setNx(key, skuId, 60L * 30)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ String title = goodsDon.getTitle() + sku.getSpecVal();
|
|
|
+ for (UserSubscribeAlertGoodsRecord userSubscribeAlertGoodsRecord : userSubscribeAlertGoodsRecords) {
|
|
|
+ userSubscribeAlertGoodsRecord.setStatus(Boolean.TRUE);
|
|
|
+ userSubscribeAlertGoodsRecordMapper.updateById(userSubscribeAlertGoodsRecord);
|
|
|
+
|
|
|
+ Long userId = userSubscribeAlertGoodsRecord.getUserId();
|
|
|
+ User user = userMapper.selectById(userId);
|
|
|
+// //微信用户
|
|
|
+// if (StrUtil.isNotBlank(user.getUnionid())) {
|
|
|
+// //发送微信通知模板
|
|
|
+// Boolean success = templateCommonService.sendUserSubscribeAlertMsg(user, String.format(Constant.GOODS_SUBSCRIBE_ALERT_WX_MSG, title), goodsDon.getId());
|
|
|
+// if (!success) {
|
|
|
+// //未成功 查看其他绑定信息
|
|
|
+// sendPhoneNotifySubscribe(title, goodsDon.getId(), userId);
|
|
|
+// }
|
|
|
+// continue;
|
|
|
+// }
|
|
|
+ //首先用发手机号
|
|
|
+ Boolean success = sendPhoneNotifySubscribe(title, goodsDon.getId(), userId);
|
|
|
+ if (!success) {
|
|
|
+ //失败 并且是邮箱用户
|
|
|
+ if (StrUtil.isNotBlank(user.getEmail())) {
|
|
|
+ //邮箱用户
|
|
|
+ String msg = String.format(Constant.GOODS_SUBSCRIBE_ALERT_EMAIL_MSG, title, goodsDon.getId());
|
|
|
+ mailService.sendGoodsSubscribeAlertEmail(msg, user.getEmail());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } finally {
|
|
|
+ if (redisService.hasKey(key)) {
|
|
|
+ redisService.del(key);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public Boolean sendPhoneNotifySubscribe(String title, Long goodsId, Long userId) {
|
|
|
+ String msg = String.format(Constant.GOODS_SUBSCRIBE_ALERT_MSG, title, goodsId);
|
|
|
+ try {
|
|
|
+ smsService.sendSmsToRelationUser(userId, msg);
|
|
|
+ return true;
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("发送商品订阅通知短信失败:{}", StringUtil.getErrorText(e));
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+}
|