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.*;
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;
/**
*
* 活动管理 服务实现类
*
*
* @author mitao
* @since 2026-02-03
*/
@Slf4j
@Service
public class XpActicityServiceImpl extends ServiceImpl implements IXpActicityService {
@Resource
private IXpActicityStrategyService strategyService;
@Resource
private IXpActicityUserService userService;
@Resource
private XpOrderClient xpOrderClient;
@Resource
private IXpActicityStrategyService xpActicityStrategyService;
@Resource
private IXpActicityService xpActicityService;
@Resource
private IXpActicityUserService xpActicityUserService;
@Resource
private IXpWhitelistService xpWhitelistService;
@Resource
private IXpActicityCouponService xpActicityCouponService;
@Resource
private IXpCouponService xpCouponService;
@Resource
private XpAppUserCouponClient xpAppUserCouponClient;
@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()
);
@Override
public PageInfo pageList(XpActivityPageListQuery query) {
PageInfo pageInfo = new PageInfo<>(query.getPageNum(),query.getPageSize());
List list = this.baseMapper.pageList(pageInfo,query);
pageInfo.setRecords(list);
return pageInfo;
}
@Override
public List findListToIds(String acticityName){
LambdaQueryWrapper query = new LambdaQueryWrapper<>();
query.select(XpActivity::getId);
query.eq(XpActivity::getDeleted, 0);
query.like(XpActivity::getActicityName, acticityName);
return listObjs(query, Object::toString);
}
@Override
public List activiting(Long uid) {
//获取当前用户可参与的活动
List actitctiyIds = new ArrayList<>();
//全部用户
List list = userService.list(new QueryWrapper().eq("is_deleted", 0).eq("user_type", 1));
actitctiyIds.addAll(list.stream().map(XpActicityUser::getActitcityId).collect(Collectors.toList()));
//判断用户类型 2=老用户,3=新用户,4=流失用户
Integer userType = xpOrderClient.determineUserType(uid).getData();
list = userService.list(new QueryWrapper().eq("is_deleted", 0).eq("user_type", userType));
actitctiyIds.addAll(list.stream().map(XpActicityUser::getActitcityId).collect(Collectors.toList()));
//指定用户
list = userService.list(new QueryWrapper().eq("is_deleted", 0).eq("user_type", 5)
.last(" and JSON_CONTAINS(user_list, '" + uid + "', '$')"));
actitctiyIds.addAll(list.stream().map(XpActicityUser::getActitcityId).collect(Collectors.toList()));
List one = this.list(new QueryWrapper().eq("status", 2).eq("is_deleted", 0)
.eq("mini_program_notification", 1).in(!actitctiyIds.isEmpty(), "id", actitctiyIds)
.last(" and now() between start_time and end_time"));
return one;
}
@Override
public void save(XpActivityDto dto) {
XpActivity activity = new XpActivity();
BeanUtils.copyBeanProp(activity, dto);
activity.setActicityType(dto.getActivityType());
activity.setAggregateLimit(dto.getEnableTotalLimit() ? 1 : 0);
activity.setLimitation(dto.getTotalLimit());
activity.setCoverImage(dto.getImg());
activity.setRemarks(dto.getRichText());
save(activity);
List strategy = dto.getStrategy();
List activityUser = dto.getActivityUser();
for (XpActicityStrategy xpActicityStrategy : strategy) {
xpActicityStrategy.setActitcityId(activity.getId().intValue());
xpActicityStrategy.setDeleted(false);
strategyService.save(xpActicityStrategy);
List couponIds = xpActicityStrategy.getCouponIds();
for (Long couponId : couponIds) {
XpActicityCoupon xpActicityCoupon = new XpActicityCoupon();
xpActicityCoupon.setActicityStrategyId(xpActicityStrategy.getId().longValue());
xpActicityCoupon.setCouponId(couponId);
xpActicityCoupon.setActivityId(activity.getId());
xpActicityCouponService.save(xpActicityCoupon);
}
}
Map strategyMap = strategy.stream().collect(Collectors.toMap(
XpActicityStrategy::getName,
Function.identity()
));
for (XpActicityUser xpActicityUser : activityUser) {
xpActicityUser.setActitcityId(activity.getId().intValue());
xpActicityUser.setActitcityStrategeId(strategyMap.get(xpActicityUser.getStrategyName()).getId());
userService.save(xpActicityUser);
}
//执行修改活动状态
updateStatus(activity.getId());
}
@Override
public XpActivityDto detail(Long id) {
XpActivity byId = getById(id);
XpActivityDto ret = new XpActivityDto();
BeanUtils.copyBeanProp(ret, byId);
ret.setActicityType(byId.getActicityType());
ret.setEnableTotalLimit(byId.getAggregateLimit() == 1);
ret.setTotalLimit(byId.getLimitation());
ret.setImg(byId.getCoverImage());
ret.setRichText(byId.getRemarks());
ret.setStrategy(strategyService.listByActicityId(id));
ret.setActivityUser(userService.listByActicityId(id));
return ret;
}
/**
* 获取悬浮弹窗活动数据
* @param uid
* @return
*/
@Override
public XpActivity getFloatActicity(Long uid) {
//获取当前用户可参与的活动
List actitctiyIds = new ArrayList<>();
//全部用户
List list = userService.list(new QueryWrapper().eq("is_deleted", 0).eq("user_type", 1));
actitctiyIds.addAll(list.stream().map(XpActicityUser::getActitcityId).collect(Collectors.toList()));
//判断用户类型 2=老用户,3=新用户,4=流失用户
Integer userType = xpOrderClient.determineUserType(uid).getData();
list = userService.list(new QueryWrapper().eq("is_deleted", 0).eq("user_type", userType));
actitctiyIds.addAll(list.stream().map(XpActicityUser::getActitcityId).collect(Collectors.toList()));
//指定用户
list = userService.list(new QueryWrapper().eq("is_deleted", 0).eq("user_type", 5)
.last(" and JSON_CONTAINS(user_list, '" + uid + "', '$')"));
actitctiyIds.addAll(list.stream().map(XpActicityUser::getActitcityId).collect(Collectors.toList()));
XpActivity one = this.getOne(new QueryWrapper().eq("status", 2).eq("is_deleted", 0)
.eq("enable_float_window", 1).in(!actitctiyIds.isEmpty(), "id", actitctiyIds)
.last(" and now() between start_time and end_time order by float_window_priority desc limit 1"));
return one;
}
public void updateStatus(Long activityId) {
XpActivity xpActivity = xpActicityService.getById(activityId);
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);
//发放优惠券-发放一次的优惠券
List list1 = xpActicityStrategyService.list(new QueryWrapper().eq("actitcity_id", xpActivity.getId())
.eq("distribution_rules", 2));
for (XpActicityStrategy xpActicityStrategy : list1) {
pushCoupon(xpActivity, xpActicityStrategy);
}
}
xpActicityService.updateById(xpActivity);
}
@Override
public void updateStatus() {
List list = xpActicityService.list(new QueryWrapper().in("status", Arrays.asList(1, 2)).eq("is_deleted", 0));
for (XpActivity xpActivity : list) {
Integer status = xpActivity.getStatus();
//生效的活动修改状态和发放一次优惠券
if(1 == status && LocalDateTime.now().isAfter(xpActivity.getStartTime()) && LocalDateTime.now().isBefore(xpActivity.getEndTime())){
xpActivity.setStatus(2);
//发放优惠券-发放一次的优惠券
List list1 = xpActicityStrategyService.list(new QueryWrapper().eq("actitcity_id", xpActivity.getId())
.eq("distribution_rules", 2));
for (XpActicityStrategy xpActicityStrategy : list1) {
pushCoupon(xpActivity, xpActicityStrategy);
}
}
//到期的活动修改状态为已结束
if(2 == status & LocalDateTime.now().isAfter(xpActivity.getEndTime())){
xpActivity.setStatus(3);
}
xpActicityService.updateById(xpActivity);
}
}
/**
* 发放优惠券
* @param xpActivity
* @param xpActicityStrategy
*/
public void pushCoupon(XpActivity xpActivity, XpActicityStrategy xpActicityStrategy){
log.info("发放优惠券:{}", JSON.toJSONString(xpActivity));
List acticityCoupons = xpActicityCouponService.list(new QueryWrapper().eq("acticity_strategy_id", xpActicityStrategy.getId()));
List xpCoupons = xpCouponService.listByIds(acticityCoupons.stream().map(XpActicityCoupon::getCouponId).collect(Collectors.toList()));
//总发放数量
Integer distributionsTotal = xpActicityStrategy.getDistributionsTotal();
//没人限量数量
Integer limitNumber = xpActicityStrategy.getLimitNumber();
List list2 = xpActicityUserService.list(new QueryWrapper().eq("actitcity_stratege_id", xpActicityStrategy.getId()));
for (XpActicityUser xpActicityUser : list2) {
Integer userType = xpActicityUser.getUserType();
//全部白名单用户
if(1 == userType){
log.info("全部白名单用户发送");
List list3 = xpWhitelistService.list(new QueryWrapper().eq("is_deleted", 0).eq("status", 1));
List xpAppUserCoupons = new ArrayList<>();
for (XpWhitelist xpWhitelist : list3) {
for (XpActicityCoupon acticityCoupon : acticityCoupons) {
XpCoupon xpCoupon = xpCoupons.stream().filter(s -> s.getId().equals(acticityCoupon.getCouponId())).findFirst().orElse(null);
if(null != xpCoupon){
for (Integer i = 0; i < limitNumber; i++) {
XpAppUserCoupon xpAppUserCoupon = new XpAppUserCoupon();
xpAppUserCoupon.setFullMoney(xpCoupon.getConditionalAmount());
xpAppUserCoupon.setMoney(xpCoupon.getAmount());
Integer effectiveRules = xpActicityStrategy.getEffectiveRules();
// 领取后生效
if(1 == effectiveRules){
xpAppUserCoupon.setEffectiveTime(LocalDateTime.now());
}
// 指定日期生效
if(2 == effectiveRules){
String format = xpActicityStrategy.getEffectiveDays().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
xpAppUserCoupon.setEffectiveTime(LocalDateTime.parse(format + " 23:59:59", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
Integer expireRules = xpActicityStrategy.getExpireRules();
//次日0点失效
if(1 == expireRules){
LocalDateTime now = LocalDateTime.now();
LocalDateTime localDateTime = now.plusDays(1);
LocalDateTime localDateTime1 = localDateTime.withHour(0).withMinute(0).withSecond(0);
xpAppUserCoupon.setExpirationTime(localDateTime1);
}
//指定有效天数
if(2 == expireRules){
LocalDateTime now = LocalDateTime.now();
xpAppUserCoupon.setExpirationTime(now.plusDays(xpActicityStrategy.getExpireDays()));
}
//指定日期失效
if(3 == expireRules){
String format = xpActicityStrategy.getExpireDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
LocalDateTime localDateTime = LocalDateTime.parse(format + " 23:59:59", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
xpAppUserCoupon.setExpirationTime(localDateTime);
}
xpAppUserCoupon.setCouponId(acticityCoupon.getCouponId());
xpAppUserCoupon.setAppUserId(xpWhitelist.getAppUserId());
xpAppUserCoupon.setStatus(1);
xpAppUserCoupon.setActivityId(xpActivity.getId());
xpAppUserCoupon.setCouponName(xpCoupon.getCouponName());
xpAppUserCoupon.setDeleted(false);
xpAppUserCoupon.setCreateTime(LocalDateTime.now());
xpAppUserCoupon.setUpdateTime(LocalDateTime.now());
xpAppUserCoupon.setPhone(xpWhitelist.getAccount());
xpAppUserCoupon.setTimeJson(JSON.toJSONString(xpActicityStrategy.getUsagePeriod()));
xpAppUserCoupons.add(xpAppUserCoupon);
if(null == distributionsTotal){
continue;
}
distributionsTotal--;
if(distributionsTotal <= 0){
break;
}
}
}
}
if(null == distributionsTotal){
continue;
}
if(distributionsTotal <= 0){
break;
}
}
if(!xpAppUserCoupons.isEmpty()){
AppUserCouponSaveBatchVo vo = new AppUserCouponSaveBatchVo();
vo.setXpAppUserCoupons(xpAppUserCoupons);
xpAppUserCouponClient.saveBatch(vo);
//发送到账提醒消息
pushMessage(xpActivity, xpAppUserCoupons);
}
if(null == distributionsTotal){
continue;
}
if(distributionsTotal <= 0){
break;
}
}
//老用户
if(2 == userType || 3 == userType || 4 == userType){
List longList = xpOrderClient.getUserTypeIdList(userType).getData();
log.info("特定用户群体发送 {}", JSON.toJSONString(longList));
List xpAppUserCoupons = new ArrayList<>();
for (Long userId : longList) {
UcUserInfo baseUserByUid = userResourcesClient.getBaseUserByUid(userId.toString());
for (XpActicityCoupon acticityCoupon : acticityCoupons) {
XpCoupon xpCoupon = xpCoupons.stream().filter(s -> s.getId().equals(acticityCoupon.getCouponId())).findFirst().orElse(null);
if(null != xpCoupon){
for (Integer i = 0; i < limitNumber; i++) {
XpAppUserCoupon xpAppUserCoupon = new XpAppUserCoupon();
xpAppUserCoupon.setFullMoney(xpCoupon.getConditionalAmount());
xpAppUserCoupon.setMoney(xpCoupon.getAmount());
Integer expireRules = xpActicityStrategy.getExpireRules();
//次日0点失效
if(1 == expireRules){
LocalDateTime now = LocalDateTime.now();
LocalDateTime localDateTime = now.plusDays(1);
LocalDateTime localDateTime1 = localDateTime.withHour(0).withMinute(0).withSecond(0);
xpAppUserCoupon.setExpirationTime(localDateTime1);
}
//指定有效天数
if(2 == expireRules){
LocalDateTime now = LocalDateTime.now();
xpAppUserCoupon.setExpirationTime(now.plusDays(xpActicityStrategy.getExpireDays()));
}
//指定日期失效
if(3 == expireRules){
String format = xpActicityStrategy.getExpireDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
LocalDateTime localDateTime = LocalDateTime.parse(format + " 23:59:59", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
xpAppUserCoupon.setExpirationTime(localDateTime);
}
xpAppUserCoupon.setCouponId(acticityCoupon.getCouponId());
xpAppUserCoupon.setAppUserId(userId);
xpAppUserCoupon.setStatus(1);
xpAppUserCoupon.setActivityId(xpActivity.getId());
xpAppUserCoupon.setCouponName(xpCoupon.getCouponName());
xpAppUserCoupon.setDeleted(false);
xpAppUserCoupon.setCreateTime(LocalDateTime.now());
xpAppUserCoupon.setUpdateTime(LocalDateTime.now());
xpAppUserCoupon.setPhone(baseUserByUid.getMobile());
xpAppUserCoupon.setTimeJson(JSON.toJSONString(xpActicityStrategy.getUsagePeriod()));
xpAppUserCoupons.add(xpAppUserCoupon);
if(null == distributionsTotal){
continue;
}
distributionsTotal--;
if(distributionsTotal <= 0){
break;
}
}
}
if(null == distributionsTotal){
continue;
}
if(distributionsTotal <= 0){
break;
}
}
}
if(!xpAppUserCoupons.isEmpty()){
AppUserCouponSaveBatchVo vo = new AppUserCouponSaveBatchVo();
vo.setXpAppUserCoupons(xpAppUserCoupons);
xpAppUserCouponClient.saveBatch(vo);
//发送到账提醒消息
pushMessage(xpActivity, xpAppUserCoupons);
}
if(null == distributionsTotal){
continue;
}
if(distributionsTotal <= 0){
break;
}
}
//指定用户
if(5 == userType){
List userList = xpActicityUser.getUserList();
log.info("指定用户发送 {}", JSON.toJSONString(userList));
List xpAppUserCoupons = new ArrayList<>();
for (Integer userId : userList) {
XpWhitelist xpWhitelist = xpWhitelistService.getById(userId);
if(null == xpWhitelist){
continue;
}
for (XpActicityCoupon acticityCoupon : acticityCoupons) {
XpCoupon xpCoupon = xpCoupons.stream().filter(s -> s.getId().equals(acticityCoupon.getCouponId())).findFirst().orElse(null);
if(null != xpCoupon){
for (Integer i = 0; i < limitNumber; i++) {
XpAppUserCoupon xpAppUserCoupon = new XpAppUserCoupon();
xpAppUserCoupon.setFullMoney(xpCoupon.getConditionalAmount());
xpAppUserCoupon.setMoney(xpCoupon.getAmount());
Integer expireRules = xpActicityStrategy.getExpireRules();
//次日0点失效
if(1 == expireRules){
LocalDateTime now = LocalDateTime.now();
LocalDateTime localDateTime = now.plusDays(1);
LocalDateTime localDateTime1 = localDateTime.withHour(0).withMinute(0).withSecond(0);
xpAppUserCoupon.setExpirationTime(localDateTime1);
}
//指定有效天数
if(2 == expireRules){
LocalDateTime now = LocalDateTime.now();
xpAppUserCoupon.setExpirationTime(now.plusDays(xpActicityStrategy.getExpireDays()));
}
//指定日期失效
if(3 == expireRules){
String format = xpActicityStrategy.getExpireDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
LocalDateTime localDateTime = LocalDateTime.parse(format + " 23:59:59", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
xpAppUserCoupon.setExpirationTime(localDateTime);
}
xpAppUserCoupon.setCouponId(acticityCoupon.getCouponId());
xpAppUserCoupon.setAppUserId(xpWhitelist.getAppUserId());
xpAppUserCoupon.setStatus(1);
xpAppUserCoupon.setActivityId(xpActivity.getId());
xpAppUserCoupon.setCouponName(xpCoupon.getCouponName());
xpAppUserCoupon.setDeleted(false);
xpAppUserCoupon.setCreateTime(LocalDateTime.now());
xpAppUserCoupon.setUpdateTime(LocalDateTime.now());
xpAppUserCoupon.setPhone(xpWhitelist.getAccount());
xpAppUserCoupon.setTimeJson(JSON.toJSONString(xpActicityStrategy.getUsagePeriod()));
xpAppUserCoupons.add(xpAppUserCoupon);
if(null == distributionsTotal){
continue;
}
distributionsTotal--;
if(distributionsTotal <= 0){
break;
}
}
}
if(null == distributionsTotal){
continue;
}
if(distributionsTotal <= 0){
break;
}
}
if(null == distributionsTotal){
continue;
}
if(distributionsTotal <= 0){
break;
}
}
if(!xpAppUserCoupons.isEmpty()){
AppUserCouponSaveBatchVo vo = new AppUserCouponSaveBatchVo();
vo.setXpAppUserCoupons(xpAppUserCoupons);
xpAppUserCouponClient.saveBatch(vo);
//发送到账提醒消息
pushMessage(xpActivity, xpAppUserCoupons);
}
}
}
}
/**
* 推送提醒消息
* @param xpActivity
* @param list
*/
private void pushMessage(XpActivity xpActivity, List list) {
pushWxCouponMessage(xpActivity, list);
pushSmsCouponMessage(xpActivity, list);
}
/**
* 微信通知
*/
private void pushWxCouponMessage(XpActivity xpActivity, List 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 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("短信发送失败");
}
}
});
}
}
}