|
@@ -3,21 +3,24 @@ package com.fs.store.service.impl;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.util.*;
|
|
|
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
import com.fs.common.core.domain.R;
|
|
|
import com.fs.common.utils.DateUtils;
|
|
|
-import com.fs.store.domain.FsCouponSchedule;
|
|
|
-import com.fs.store.domain.FsCouponScheduleLog;
|
|
|
+import com.fs.store.domain.*;
|
|
|
+import com.fs.store.dto.TemplateMessageSendRequestDTO;
|
|
|
import com.fs.store.enums.IcgProcessStatusEnum;
|
|
|
import com.fs.store.enums.IcgScheduleOperationTypeEnum;
|
|
|
-import com.fs.store.mapper.FsCouponScheduleLogMapper;
|
|
|
-import com.fs.store.mapper.FsCouponScheduleMapper;
|
|
|
+import com.fs.store.enums.MiniAppNotifyTaskStatusEnum;
|
|
|
+import com.fs.store.mapper.*;
|
|
|
import com.fs.store.param.FsStoreCouponReceiveParam;
|
|
|
import com.fs.store.service.IFsCouponScheduleService;
|
|
|
import com.fs.store.service.IFsStoreCouponIssueService;
|
|
|
+import com.github.pagehelper.util.StringUtil;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.collections4.CollectionUtils;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Propagation;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
@@ -29,7 +32,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|
|
* @date 2025-03-08
|
|
|
*/
|
|
|
@Slf4j
|
|
|
-@Service("fsCouponScheduleService")
|
|
|
+@Service
|
|
|
@RequiredArgsConstructor
|
|
|
public class FsCouponScheduleServiceImpl implements IFsCouponScheduleService
|
|
|
{
|
|
@@ -45,6 +48,36 @@ public class FsCouponScheduleServiceImpl implements IFsCouponScheduleService
|
|
|
* 优惠券发放计划日志表Mapper接口
|
|
|
*/
|
|
|
private final FsCouponScheduleLogMapper fsCouponScheduleLogMapper;
|
|
|
+ /**
|
|
|
+ * 优惠券表Mapper接口
|
|
|
+ */
|
|
|
+ private final FsStoreCouponMapper fsStoreCouponMapper;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 用户表Mapper接口
|
|
|
+ */
|
|
|
+ private final FsUserMapper fsUserMapper;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 优惠券发放计划日志表Mapper接口
|
|
|
+ */
|
|
|
+ private final FsMiniprogramSubNotifyTaskMapper fsMiniprogramSubNotifyTaskMapper;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 小程序消息通知任务名称
|
|
|
+ */
|
|
|
+ private final String WX_MINI_APP_NOTIFY_TASK_NAME = "优惠券发放";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 小程序消息通知模板ID
|
|
|
+ */
|
|
|
+ private final String WX_MINI_APP_NOTIFY_TEMPLATE_ID = "5ZSzz2nPmJo9EuenZa78mQPScoOMc84LnEfEpV0-i04";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 小程序消息通知跳转URL
|
|
|
+ */
|
|
|
+ private final String WX_MINI_APP_NOTIFY_GOTO_URL ="";
|
|
|
+
|
|
|
/**
|
|
|
* 查询定时发放优惠券队列
|
|
|
*
|
|
@@ -141,18 +174,20 @@ public class FsCouponScheduleServiceImpl implements IFsCouponScheduleService
|
|
|
public void issueCoupon() {
|
|
|
List<FsCouponSchedule> fsCouponSchedules = fsCouponScheduleMapper.selectPendingCouponList();
|
|
|
List<FsCouponScheduleLog> logList = new ArrayList<>();
|
|
|
+ List<FsMiniprogramSubNotifyTask> subNotifyTasks = new ArrayList<>();
|
|
|
+
|
|
|
for (FsCouponSchedule fsCouponSchedule : fsCouponSchedules) {
|
|
|
|
|
|
- FsCouponScheduleLog log = new FsCouponScheduleLog();
|
|
|
+ FsCouponScheduleLog scheduleLog = new FsCouponScheduleLog();
|
|
|
|
|
|
- log.setScheduleId(fsCouponSchedule.getId());
|
|
|
- log.setOrderId(fsCouponSchedule.getOrderId());
|
|
|
- log.setUserId(fsCouponSchedule.getUserId());
|
|
|
- log.setStatusBefore(fsCouponSchedule.getStatus());
|
|
|
- log.setSendTimeBefore(fsCouponSchedule.getSendTime());
|
|
|
- log.setRetryCountBefore(fsCouponSchedule.getRetryCount());
|
|
|
- log.setOperator("SYSTEM");
|
|
|
- log.setOperationTime(LocalDateTime.now());
|
|
|
+ scheduleLog.setScheduleId(fsCouponSchedule.getId());
|
|
|
+ scheduleLog.setOrderId(fsCouponSchedule.getOrderId());
|
|
|
+ scheduleLog.setUserId(fsCouponSchedule.getUserId());
|
|
|
+ scheduleLog.setStatusBefore(fsCouponSchedule.getStatus());
|
|
|
+ scheduleLog.setSendTimeBefore(fsCouponSchedule.getSendTime());
|
|
|
+ scheduleLog.setRetryCountBefore(fsCouponSchedule.getRetryCount());
|
|
|
+ scheduleLog.setOperator("SYSTEM");
|
|
|
+ scheduleLog.setOperationTime(LocalDateTime.now());
|
|
|
|
|
|
FsStoreCouponReceiveParam param = new FsStoreCouponReceiveParam();
|
|
|
Long userId = fsCouponSchedule.getUserId();
|
|
@@ -168,8 +203,8 @@ public class FsCouponScheduleServiceImpl implements IFsCouponScheduleService
|
|
|
fsCouponSchedule.setStatus(IcgProcessStatusEnum.FAILED.getCode());
|
|
|
fsCouponSchedule.setRetryCount(fsCouponSchedule.getRetryCount()+1);
|
|
|
|
|
|
- log.setStatusAfter(IcgProcessStatusEnum.FAILED.getCode());
|
|
|
- log.setErrorMessage(fsCouponSchedule.getErrorMessage());
|
|
|
+ scheduleLog.setStatusAfter(IcgProcessStatusEnum.FAILED.getCode());
|
|
|
+ scheduleLog.setErrorMessage(fsCouponSchedule.getErrorMessage());
|
|
|
|
|
|
operationTypeSet.add(IcgScheduleOperationTypeEnum.ERROR.getCode());
|
|
|
} else {
|
|
@@ -178,21 +213,85 @@ public class FsCouponScheduleServiceImpl implements IFsCouponScheduleService
|
|
|
fsCouponSchedule.setSendTime(fsCouponSchedule.getActualSendTime().plusMonths(1));
|
|
|
fsCouponSchedule.setCount(fsCouponSchedule.getCount()+1);
|
|
|
|
|
|
- log.setStatusAfter(IcgProcessStatusEnum.SUCCESS.getCode());
|
|
|
- log.setActualSendTime(fsCouponSchedule.getActualSendTime());
|
|
|
- log.setSendTimeAfter(fsCouponSchedule.getSendTime());
|
|
|
+ scheduleLog.setStatusAfter(IcgProcessStatusEnum.SUCCESS.getCode());
|
|
|
+ scheduleLog.setActualSendTime(fsCouponSchedule.getActualSendTime());
|
|
|
+ scheduleLog.setSendTimeAfter(fsCouponSchedule.getSendTime());
|
|
|
operationTypeSet.add(IcgScheduleOperationTypeEnum.NORMAL.getCode());
|
|
|
+
|
|
|
+
|
|
|
+ // 小程序消息通知
|
|
|
+ FsMiniprogramSubNotifyTask notifyTask = new FsMiniprogramSubNotifyTask();
|
|
|
+ notifyTask.setTaskName(WX_MINI_APP_NOTIFY_TASK_NAME);
|
|
|
+ notifyTask.setTemplateId(WX_MINI_APP_NOTIFY_TEMPLATE_ID);
|
|
|
+ FsUser fsUser = fsUserMapper.selectFsUserById(fsCouponSchedule.getUserId());
|
|
|
+ String maOpenId = fsUser.getMaOpenId();
|
|
|
+ notifyTask.setTouser(maOpenId);
|
|
|
+ notifyTask.setPage(WX_MINI_APP_NOTIFY_GOTO_URL);
|
|
|
+ notifyTask.setCreateTime(LocalDateTime.now());
|
|
|
+ // 状态等待执行
|
|
|
+ notifyTask.setStatus(MiniAppNotifyTaskStatusEnum.WAITING.getValue());
|
|
|
+ notifyTask.setRetryCount(0);
|
|
|
+ Map<String, TemplateMessageSendRequestDTO.TemplateDataValue> data = new HashMap<>();
|
|
|
+ // 获取优惠券名称
|
|
|
+ Set<Long> couponIds = fsCouponSchedule.getCouponId();
|
|
|
+ if(CollectionUtils.isEmpty(couponIds)){
|
|
|
+ log.info("当前优惠券没有被选择!已经跳过");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 优惠券id (有多张这里只取第一张)
|
|
|
+ Long couponId = couponIds.stream().findFirst().get();
|
|
|
+
|
|
|
+ TemplateMessageSendRequestDTO.TemplateDataValue couponName = new TemplateMessageSendRequestDTO.TemplateDataValue();
|
|
|
+ FsStoreCoupon fsStoreCoupon = fsStoreCouponMapper.selectFsStoreCouponById(couponId);
|
|
|
+ if(ObjectUtil.isNotNull(fsStoreCoupon)){
|
|
|
+ String couponNameById = fsStoreCoupon.getTitle();
|
|
|
+ if(StringUtil.isNotEmpty(couponNameById)){
|
|
|
+ couponName.setValue(couponNameById);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取优惠券时间范围
|
|
|
+ TemplateMessageSendRequestDTO.TemplateDataValue couponValidate = new TemplateMessageSendRequestDTO.TemplateDataValue();
|
|
|
+
|
|
|
+ FsStoreCouponIssue fsStoreCouponIssue = fsStoreCouponIssueService.selectFsStoreCouponIssueByCouponId(couponId);
|
|
|
+ if(ObjectUtil.isNotNull(fsStoreCouponIssue)){
|
|
|
+ String beginTime = fsStoreCouponIssue.getBeginTime();
|
|
|
+ String endTime = fsStoreCouponIssue.getEndTime();
|
|
|
+ if(StringUtil.isNotEmpty(beginTime) && StringUtil.isNotEmpty(endTime)){
|
|
|
+ couponValidate.setValue(beginTime + " ~ " + endTime);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 备注消息
|
|
|
+ TemplateMessageSendRequestDTO.TemplateDataValue couponMark = new TemplateMessageSendRequestDTO.TemplateDataValue();
|
|
|
+ couponMark.setValue("");
|
|
|
+
|
|
|
+ // 面值
|
|
|
+ TemplateMessageSendRequestDTO.TemplateDataValue couponPrice = new TemplateMessageSendRequestDTO.TemplateDataValue();
|
|
|
+ if(ObjectUtil.isNotNull(fsStoreCoupon)){
|
|
|
+ if(ObjectUtil.isNotNull(fsStoreCoupon.getCouponPrice())){
|
|
|
+ couponPrice.setValue(fsStoreCoupon.getCouponPrice().toPlainString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ data.put("thing1",couponName);
|
|
|
+ data.put("time2",couponValidate);
|
|
|
+ data.put("thing3",couponMark);
|
|
|
+ data.put("amount4",couponPrice);
|
|
|
+
|
|
|
+ notifyTask.setData(JSON.toJSONString(data));
|
|
|
+
|
|
|
+ subNotifyTasks.add(notifyTask);
|
|
|
}
|
|
|
fsCouponSchedule.setUpdateTime(new Date());
|
|
|
|
|
|
- log.setOperationType(String.join(",",operationTypeSet));
|
|
|
- logList.add(log);
|
|
|
+ scheduleLog.setOperationType(String.join(",",operationTypeSet));
|
|
|
+ logList.add(scheduleLog);
|
|
|
}
|
|
|
// 批量更新发放优惠券队列表
|
|
|
fsCouponScheduleMapper.updateBatchFsCouponSchedule(fsCouponSchedules);
|
|
|
// 批量添加执行日志
|
|
|
fsCouponScheduleLogMapper.batchInsert(logList);
|
|
|
// 批量进行微信公众号消息通知
|
|
|
-
|
|
|
+ fsMiniprogramSubNotifyTaskMapper.insertBatch(subNotifyTasks);
|
|
|
}
|
|
|
}
|