From c96fbe6b0aeb413a17c429133ee6d81d138144b9 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期二, 09 六月 2026 10:58:52 +0800
Subject: [PATCH] Merge branch '1.0' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi into 1.0

---
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityServiceImpl.java |  156 +++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 142 insertions(+), 14 deletions(-)

diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityServiceImpl.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityServiceImpl.java
index 8850942..54c5933 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityServiceImpl.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityServiceImpl.java
@@ -1,33 +1,49 @@
 package com.xiaopeng.operation.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.xiaopeng.api.dto.account.UcUserInfo;
+import com.xiaopeng.api.dto.operation.SmsDto;
 import com.xiaopeng.api.dto.operation.XpActivityDto;
 import com.xiaopeng.api.feignClient.account.UserResourcesClient;
 import com.xiaopeng.api.feignClient.account.XpAppUserCouponClient;
+import com.xiaopeng.api.feignClient.operation.SmsClient;
+import com.xiaopeng.api.feignClient.operation.XpCouponClient;
 import com.xiaopeng.api.feignClient.order.XpOrderClient;
+import com.xiaopeng.api.feignClient.pushMessage.SubscribeMessageClient;
 import com.xiaopeng.api.model.account.XpAppUserCoupon;
 import com.xiaopeng.api.model.operation.*;
 import com.xiaopeng.api.query.operation.XpActivityPageListQuery;
 import com.xiaopeng.api.vo.account.AppUserCouponSaveBatchVo;
+import com.xiaopeng.api.vo.operation.SmsVo;
+import com.xiaopeng.api.vo.pushMessage.SendCouponMessageVo;
+import com.xiaopeng.api.vo.pushMessage.SendSubscribeMessageVo;
+import com.xiaopeng.common.core.domain.R;
+import com.xiaopeng.common.core.enums.MessageTemplateEnum;
 import com.xiaopeng.common.core.utils.bean.BeanUtils;
 import com.xiaopeng.common.core.web.page.PageInfo;
 import com.xiaopeng.operation.mapper.XpActicityMapper;
 import com.xiaopeng.operation.service.*;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
 
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
+import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -75,6 +91,35 @@
 
     @Resource
     private UserResourcesClient userResourcesClient;
+
+    @Resource
+    private SubscribeMessageClient subscribeMessageClient;
+
+    @Resource
+    private XpCouponClient xpCouponClient;
+
+    @Resource
+    private SmsClient smsClient;
+
+    @Value("${sms.appid:1476153389173952512}")
+    private String sms_appid;
+
+    private static final ThreadPoolExecutor RETRY_EXECUTOR = new ThreadPoolExecutor(
+            4,
+            16,
+            60L, TimeUnit.SECONDS,
+            new LinkedBlockingQueue<>(512),
+            new ThreadFactory() {
+                private final AtomicInteger counter = new AtomicInteger(0);
+                @Override
+                public Thread newThread(Runnable r) {
+                    Thread t = new Thread(r, "route-push-retry-" + counter.incrementAndGet());
+                    t.setDaemon(true);
+                    return t;
+                }
+            },
+            new ThreadPoolExecutor.CallerRunsPolicy()
+    );
 
 
 
@@ -234,13 +279,6 @@
         List<XpActivity> list = xpActicityService.list(new QueryWrapper<XpActivity>().in("status", Arrays.asList(1, 2)).eq("is_deleted", 0));
         for (XpActivity xpActivity : list) {
             Integer status = xpActivity.getStatus();
-            //即将开始的活动推送socket给前端用户
-            if(1 == status && LocalDateTime.now().isBefore(xpActivity.getStartTime())){
-
-            }
-
-            //即将结束的活动推送给前端用户
-            
             //生效的活动修改状态和发放一次优惠券
             if(1 == status && LocalDateTime.now().isAfter(xpActivity.getStartTime()) && LocalDateTime.now().isBefore(xpActivity.getEndTime())){
                 xpActivity.setStatus(2);
@@ -250,7 +288,6 @@
                 for (XpActicityStrategy xpActicityStrategy : list1) {
                     pushCoupon(xpActivity, xpActicityStrategy);
                 }
-
             }
             //到期的活动修改状态为已结束
             if(2 == status & LocalDateTime.now().isAfter(xpActivity.getEndTime())){
@@ -355,8 +392,8 @@
                     AppUserCouponSaveBatchVo vo = new AppUserCouponSaveBatchVo();
                     vo.setXpAppUserCoupons(xpAppUserCoupons);
                     xpAppUserCouponClient.saveBatch(vo);
-
-                    log.info("全部白名单用户发送 {}", JSON.toJSONString(xpAppUserCoupons));
+                    //发送到账提醒消息
+                    pushMessage(xpActivity, xpAppUserCoupons);
                 }
                 if(null == distributionsTotal){
                     continue;
@@ -432,6 +469,8 @@
                     AppUserCouponSaveBatchVo vo = new AppUserCouponSaveBatchVo();
                     vo.setXpAppUserCoupons(xpAppUserCoupons);
                     xpAppUserCouponClient.saveBatch(vo);
+                    //发送到账提醒消息
+                    pushMessage(xpActivity, xpAppUserCoupons);
                 }
                 if(null == distributionsTotal){
                     continue;
@@ -518,8 +557,97 @@
                     AppUserCouponSaveBatchVo vo = new AppUserCouponSaveBatchVo();
                     vo.setXpAppUserCoupons(xpAppUserCoupons);
                     xpAppUserCouponClient.saveBatch(vo);
+                    //发送到账提醒消息
+                    pushMessage(xpActivity, xpAppUserCoupons);
                 }
             }
         }
     }
+
+
+    /**
+     * 推送提醒消息
+     * @param xpActivity
+     * @param list
+     */
+    private void pushMessage(XpActivity xpActivity, List<XpAppUserCoupon> list) {
+        pushWxCouponMessage(xpActivity, list);
+        pushSmsCouponMessage(xpActivity, list);
+    }
+
+
+    /**
+     * 微信通知
+     */
+    private void pushWxCouponMessage(XpActivity xpActivity, List<XpAppUserCoupon> list) {
+        log.info("开始执行优惠券到账微信提醒消息发送 {}", JSON.toJSONString(xpActivity));
+        //微信通知活动开始提醒(0=否,1=是)
+        Integer wechatReceivedReminder = xpActivity.getWechatReceivedReminder();
+        if(null != wechatReceivedReminder && 1 == wechatReceivedReminder){
+            RETRY_EXECUTOR.execute(() -> {
+                for (XpAppUserCoupon xpAppUserCoupon : list) {
+                    XpCoupon coupon = xpCouponClient.getCouponById(xpAppUserCoupon.getCouponId()).getData();
+                    SendSubscribeMessageVo vo = new SendSubscribeMessageVo();
+                    vo.setUserId(xpAppUserCoupon.getAppUserId());
+                    vo.setTemplateId(MessageTemplateEnum.C.getTemplateId());
+                    String json = MessageTemplateEnum.C.getRemarks();
+                    json = json.replace("活动名称", xpAppUserCoupon.getCouponName());
+                    json = json.replace("温馨提示", coupon.getCouponDescription());
+                    vo.setJson(json);
+                    R<?> r = subscribeMessageClient.sendSubscribeMessage(vo);
+                }
+            });
+        }
+    }
+
+
+    /**
+     * 短信通知
+     * @param xpActivity
+     */
+    private void pushSmsCouponMessage(XpActivity xpActivity, List<XpAppUserCoupon> list) {
+        log.info("开始执行优惠券短信提醒消息发送 {}", JSON.toJSONString(xpActivity));
+        Integer now = Integer.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("HHmm")));
+        if(StringUtils.hasLength(xpActivity.getSmsStartBlockingTime())){
+            String[] smsStartBlockingTime = xpActivity.getSmsStartBlockingTime().split(",");
+            String[] smsEndBlockingTime = xpActivity.getSmsEndBlockingTime().split(",");
+            for (int i = 0; i < smsStartBlockingTime.length; i++) {
+                Integer start = Integer.valueOf(smsStartBlockingTime[i].replace(":", ""));
+                Integer end = Integer.valueOf(smsEndBlockingTime[i].replace(":", ""));
+                if(start <= now && now <= end){
+                    log.info("当前时间在短信发送时间区间内,不发送短信");
+                    return;
+                }
+            }
+        }
+
+
+        //短信通知到账提醒(0=否,1=是)
+        Integer smsReceivedReminder = xpActivity.getSmsReceivedReminder();
+        if(null != smsReceivedReminder && 1 == smsReceivedReminder){
+            RETRY_EXECUTOR.execute(() -> {
+                for (XpAppUserCoupon xpAppUserCoupon : list) {
+                    UcUserInfo ucUserInfo = userResourcesClient.getBaseUserByUid(xpAppUserCoupon.getAppUserId().toString());
+                    if(null == ucUserInfo || !StringUtils.hasLength(ucUserInfo.getMobile())){
+                        log.info("用户信息不存在,跳过");
+                        continue;
+                    }
+                    XpCoupon coupon = xpCouponClient.getCouponById(xpAppUserCoupon.getCouponId()).getData();
+                    SmsVo vo = new SmsVo();
+                    vo.setAppId(sms_appid);
+                    vo.setPushType(1);
+                    vo.setReceivers(ucUserInfo.getMobile());
+                    vo.setTemplateCode("RTActivityStartTpl");
+                    vo.setAppPushConfigCode("RTActivityStartSms");
+                    vo.setParams(new HashMap<>());
+                    vo.getParams().put("name", xpAppUserCoupon.getCouponName());
+                    SmsDto smsDto = smsClient.pushSms(vo);
+                    if(null == smsDto || smsDto.getCode() != 200){
+                        log.info("短信发送失败");
+                    }
+                }
+            });
+        }
+    }
+
 }

--
Gitblit v1.7.1