提交 0c8b4392 authored 作者: 吕本才's avatar 吕本才

feat(activity): 完善临时活动任务打卡逻辑

上级 c772b9ef
...@@ -20,6 +20,13 @@ public class TemporaryActivityTaskWrapperDto { ...@@ -20,6 +20,13 @@ public class TemporaryActivityTaskWrapperDto {
* temporary_info表id * temporary_info表id
*/ */
private Integer temporaryId; private Integer temporaryId;
private Long clockId;
private Integer reportId;
private Integer planId;
/** /**
* 任务类型 * 任务类型
*/ */
......
package com.wangxiaolu.promotion.service.activity.temporary.impl; package com.wangxiaolu.promotion.service.activity.temporary.impl;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import com.alibaba.fastjson2.JSON;
import com.wangxiaolu.promotion.utils.WechatAccessTokenUtil; import com.wangxiaolu.promotion.utils.WechatAccessTokenUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -62,11 +63,13 @@ public class SubscribeMessageService { ...@@ -62,11 +63,13 @@ public class SubscribeMessageService {
// 发送POST请求 // 发送POST请求
String response = restTemplate.postForObject(url, requestBody, String.class); String response = restTemplate.postForObject(url, requestBody, String.class);
log.info("发送微信通知,url:{},requestBody:{},response:{}",url, JSON.toJSONString(requestBody),response);
JSONObject json = new JSONObject(response); JSONObject json = new JSONObject(response);
log.info("微信返回数据:{} ",json.toString());
int errcode = json.getInt("errcode"); int errcode = json.getInt("errcode");
return errcode == 0; // 0表示成功 return errcode == 0; // 0表示成功
} catch (Exception e) { } catch (Exception e) {
log.error("发送订阅通知失败", e); log.error("发送微信订阅通知失败", e);
return false; return false;
} }
} }
......
package com.wangxiaolu.promotion.service.activity.temporary.impl; package com.wangxiaolu.promotion.service.activity.temporary.impl;
import cn.hutool.core.date.CalendarUtil;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
...@@ -26,6 +27,7 @@ import org.springframework.util.CollectionUtils; ...@@ -26,6 +27,7 @@ import org.springframework.util.CollectionUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.time.LocalTime; import java.time.LocalTime;
import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
...@@ -58,6 +60,7 @@ public class TemporaryActivityTaskClockServiceImpl extends ServiceImpl<Temporary ...@@ -58,6 +60,7 @@ public class TemporaryActivityTaskClockServiceImpl extends ServiceImpl<Temporary
// 查询是否已有数据 // 查询是否已有数据
TemporaryActivityTaskWrapperDto wrapper = new TemporaryActivityTaskWrapperDto(); TemporaryActivityTaskWrapperDto wrapper = new TemporaryActivityTaskWrapperDto();
wrapper.setTemporaryId(dto.getTemporaryId()) wrapper.setTemporaryId(dto.getTemporaryId())
.setClockId(dto.getId())
.setTaskType(ActivityPhotoType.RANDOM_TASK.getType()) .setTaskType(ActivityPhotoType.RANDOM_TASK.getType())
.setIsDelete(FlagType.NO.getType()); .setIsDelete(FlagType.NO.getType());
TemporaryActivityTaskClockDO taskClockDO1 = temporaryActivityTaskClockDao.selectOne(wrapper); TemporaryActivityTaskClockDO taskClockDO1 = temporaryActivityTaskClockDao.selectOne(wrapper);
...@@ -72,16 +75,17 @@ public class TemporaryActivityTaskClockServiceImpl extends ServiceImpl<Temporary ...@@ -72,16 +75,17 @@ public class TemporaryActivityTaskClockServiceImpl extends ServiceImpl<Temporary
// 生成 // 生成
TemporaryActivityTaskClockDO taskClockDO = new TemporaryActivityTaskClockDO(); TemporaryActivityTaskClockDO taskClockDO = new TemporaryActivityTaskClockDO();
taskClockDO.setClockId(dto.getId()) taskClockDO.setClockId(dto.getId())
.setTemporaryId(dto.getTemporaryId())
.setTemporaryName(dto.getTemporaryName()) .setTemporaryName(dto.getTemporaryName())
.setReportedId(dto.getReportedId()) .setReportedId(dto.getReportedId())
.setPlanId(dto.getPlanId()) .setPlanId(dto.getPlanId())
.setClockTime(null) .setClockTime(null)
.setTaskType(ActivityPhotoType.RANDOM_TASK.getType()) .setTaskType(ActivityPhotoType.RANDOM_TASK.getType())
.setSubscribeTime(randomDate)
.setTaskStatus(ActivityClockTaskStatus.TO_BE_START.getType()) .setTaskStatus(ActivityClockTaskStatus.TO_BE_START.getType())
.setRequiredlockTime(randomDate) .setRequiredlockTime(randomDate)
.setActivityPatternId(dto.getActivityPatternId()) .setActivityPatternId(dto.getActivityPatternId())
.setActivityPattern(dto.getActivityPattern()) .setActivityPattern(dto.getActivityPattern())
.setCreateDate(DateUtil.today())
.setIsDelete(FlagType.NO.getType()); .setIsDelete(FlagType.NO.getType());
temporaryActivityTaskClockDao.save(taskClockDO); temporaryActivityTaskClockDao.save(taskClockDO);
...@@ -97,6 +101,7 @@ public class TemporaryActivityTaskClockServiceImpl extends ServiceImpl<Temporary ...@@ -97,6 +101,7 @@ public class TemporaryActivityTaskClockServiceImpl extends ServiceImpl<Temporary
// 查询是否已有数据 // 查询是否已有数据
TemporaryActivityTaskWrapperDto wrapper = new TemporaryActivityTaskWrapperDto(); TemporaryActivityTaskWrapperDto wrapper = new TemporaryActivityTaskWrapperDto();
wrapper.setTemporaryId(dto.getTemporaryId()) wrapper.setTemporaryId(dto.getTemporaryId())
.setClockId(dto.getId())
.setTaskType(ActivityPhotoType.POS_PHOTO.getType()) .setTaskType(ActivityPhotoType.POS_PHOTO.getType())
.setIsDelete(FlagType.NO.getType()); .setIsDelete(FlagType.NO.getType());
TemporaryActivityTaskClockDO taskClockDO1 = temporaryActivityTaskClockDao.selectOne(wrapper); TemporaryActivityTaskClockDO taskClockDO1 = temporaryActivityTaskClockDao.selectOne(wrapper);
...@@ -106,6 +111,7 @@ public class TemporaryActivityTaskClockServiceImpl extends ServiceImpl<Temporary ...@@ -106,6 +111,7 @@ public class TemporaryActivityTaskClockServiceImpl extends ServiceImpl<Temporary
// 生成 // 生成
TemporaryActivityTaskClockDO taskClockDO = new TemporaryActivityTaskClockDO(); TemporaryActivityTaskClockDO taskClockDO = new TemporaryActivityTaskClockDO();
taskClockDO.setClockId(dto.getId()) taskClockDO.setClockId(dto.getId())
.setTemporaryId(dto.getTemporaryId())
.setTemporaryName(dto.getTemporaryName()) .setTemporaryName(dto.getTemporaryName())
.setReportedId(dto.getReportedId()) .setReportedId(dto.getReportedId())
.setPlanId(dto.getPlanId()) .setPlanId(dto.getPlanId())
...@@ -115,7 +121,8 @@ public class TemporaryActivityTaskClockServiceImpl extends ServiceImpl<Temporary ...@@ -115,7 +121,8 @@ public class TemporaryActivityTaskClockServiceImpl extends ServiceImpl<Temporary
.setRequiredlockTime(null) .setRequiredlockTime(null)
.setActivityPatternId(dto.getActivityPatternId()) .setActivityPatternId(dto.getActivityPatternId())
.setActivityPattern(dto.getActivityPattern()) .setActivityPattern(dto.getActivityPattern())
.setIsDelete(1); .setCreateDate(DateUtil.today())
.setIsDelete(FlagType.NO.getType());
temporaryActivityTaskClockDao.save(taskClockDO); temporaryActivityTaskClockDao.save(taskClockDO);
} }
...@@ -147,8 +154,9 @@ public class TemporaryActivityTaskClockServiceImpl extends ServiceImpl<Temporary ...@@ -147,8 +154,9 @@ public class TemporaryActivityTaskClockServiceImpl extends ServiceImpl<Temporary
if (ActivityPhotoType.RANDOM_TASK.getType() == clockVo.getTaskType()) { if (ActivityPhotoType.RANDOM_TASK.getType() == clockVo.getTaskType()) {
// 检查当前时间是否在打卡要求的时间内 // 检查当前时间是否在打卡要求的时间内
Date requiredLockTime = taskClockDO.getRequiredlockTime(); Date requiredLockTime = taskClockDO.getRequiredlockTime();
DateTime latestRequiredLockTime = DateUtil.offsetMinute(requiredLockTime, 15); // 计算15分钟以后得时间
if (new Date().before(requiredLockTime) || new Date().after(latestRequiredLockTime)) { Date latestRequiredLockTime = DateUtil.offsetMinute(requiredLockTime, 15).toJdkDate();
if (new Date().compareTo(requiredLockTime) < 0 || new Date().compareTo(latestRequiredLockTime) > 0) {
throw new IllegalArgumentException("当前时间不在打卡要求的时间内"); throw new IllegalArgumentException("当前时间不在打卡要求的时间内");
} }
} }
......
...@@ -143,7 +143,7 @@ public class TemporaryActivityTaskClockSocketHandler extends TextWebSocketHandle ...@@ -143,7 +143,7 @@ public class TemporaryActivityTaskClockSocketHandler extends TextWebSocketHandle
try { try {
session.sendMessage(new TextMessage(message)); session.sendMessage(new TextMessage(message));
} catch (IOException e) { } catch (IOException e) {
log.error("用户[" + userId + "]发送消息失败:" + message); log.error("用户[" + userId + "]发送字符消息失败:" + message);
return 0; return 0;
} }
return 1; return 1;
...@@ -151,11 +151,16 @@ public class TemporaryActivityTaskClockSocketHandler extends TextWebSocketHandle ...@@ -151,11 +151,16 @@ public class TemporaryActivityTaskClockSocketHandler extends TextWebSocketHandle
return 0; return 0;
} }
public Integer sendToUser(String userId, MessageBean messageBean) throws IOException { public Integer sendToUser(String userId, MessageBean messageBean) {
WebSocketSession session = sessions.get(userId); WebSocketSession session = sessions.get(userId);
if (session != null && session.isOpen()) { if (session != null && session.isOpen()) {
String jsonMessage = objectMapper.writeValueAsString(messageBean); try {
session.sendMessage(new TextMessage(jsonMessage)); String jsonMessage = objectMapper.writeValueAsString(messageBean);
session.sendMessage(new TextMessage(jsonMessage));
} catch (IOException e) {
log.error("用户[" + userId + "]发送Bean消息失败:" + userId);
return 0;
}
return 1; return 1;
} }
return 0; return 0;
......
...@@ -4,9 +4,11 @@ package com.wangxiaolu.promotion.xxljobtask; ...@@ -4,9 +4,11 @@ package com.wangxiaolu.promotion.xxljobtask;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.wangxiaolu.promotion.common.enums.FlagType;
import com.wangxiaolu.promotion.domain.activity.mapper.entity.TemporaryActivityTaskClockDO; import com.wangxiaolu.promotion.domain.activity.mapper.entity.TemporaryActivityTaskClockDO;
import com.wangxiaolu.promotion.enums.activity.ActivityClockTaskStatus; import com.wangxiaolu.promotion.enums.activity.ActivityClockTaskStatus;
import com.wangxiaolu.promotion.enums.activity.ActivityPhotoType; import com.wangxiaolu.promotion.enums.activity.ActivityPhotoType;
import com.wangxiaolu.promotion.enums.activity.TemActApproveStatus;
import com.wangxiaolu.promotion.enums.activity.TemporaryActivityTaskClockMessageType; import com.wangxiaolu.promotion.enums.activity.TemporaryActivityTaskClockMessageType;
import com.wangxiaolu.promotion.pojo.user.dto.WxTemporaryInfoDto; import com.wangxiaolu.promotion.pojo.user.dto.WxTemporaryInfoDto;
import com.wangxiaolu.promotion.service.activity.manage.ActivityTypeQueryService; import com.wangxiaolu.promotion.service.activity.manage.ActivityTypeQueryService;
...@@ -52,35 +54,42 @@ public class ActivityStautsHandler { ...@@ -52,35 +54,42 @@ public class ActivityStautsHandler {
@XxlJob("sendSubscribeMessage") @XxlJob("sendSubscribeMessage")
public void sendSubscribeMessage() { public void sendSubscribeMessage() {
DateTime undoDateTime = DateUtil.offsetMinute(new Date(), -15);
// 查询 超过15分钟的,但是状态还是1的 状态改成未完成
List<TemporaryActivityTaskClockDO> undoList = taskClockService.list(new LambdaQueryWrapper<TemporaryActivityTaskClockDO>()
.eq(TemporaryActivityTaskClockDO::getTaskStatus, ActivityClockTaskStatus.STARTING.getType())
.eq(TemporaryActivityTaskClockDO::getTaskType, ActivityPhotoType.RANDOM_TASK.getType())
.eq(TemporaryActivityTaskClockDO::getIsDelete, FlagType.NO.getType())
.eq(TemporaryActivityTaskClockDO::getIsSendSubscribe, FlagType.NO.getType())
// 小于等于
.le(TemporaryActivityTaskClockDO::getRequiredlockTime, undoDateTime));
for (TemporaryActivityTaskClockDO taskClockDO : undoList){
taskClockDO.setIsSendSubscribe(FlagType.NO.getType());
taskClockDO.setTaskStatus(ActivityClockTaskStatus.UNCOMPLETED.getType());
taskClockService.updateById(taskClockDO);
}
DateTime latestDateTime = DateUtil.offsetMinute(new Date(), 15); DateTime latestDateTime = DateUtil.offsetMinute(new Date(), 15);
// 1. 查询订单信息和用户订阅记录
// 待开始的 ->进行中
List<TemporaryActivityTaskClockDO> list = taskClockService.list(new LambdaQueryWrapper<TemporaryActivityTaskClockDO>() List<TemporaryActivityTaskClockDO> list = taskClockService.list(new LambdaQueryWrapper<TemporaryActivityTaskClockDO>()
.eq(TemporaryActivityTaskClockDO::getTaskStatus, ActivityClockTaskStatus.TO_BE_START.getType()) .eq(TemporaryActivityTaskClockDO::getTaskStatus, ActivityClockTaskStatus.TO_BE_START.getType())
.eq(TemporaryActivityTaskClockDO::getTaskType, ActivityPhotoType.RANDOM_TASK.getType()) .eq(TemporaryActivityTaskClockDO::getTaskType, ActivityPhotoType.RANDOM_TASK.getType())
// .le(TemporaryActivityTaskClockDO::getRequiredlockTime, dateTime) .eq(TemporaryActivityTaskClockDO::getIsDelete, FlagType.NO.getType())
// .ge(TemporaryActivityTaskClockDO::getRequiredlockTime, new Date()) .eq(TemporaryActivityTaskClockDO::getIsSendSubscribe, FlagType.NO.getType())
); .le(TemporaryActivityTaskClockDO::getRequiredlockTime, latestDateTime)
.ge(TemporaryActivityTaskClockDO::getRequiredlockTime, new Date())
);
for (TemporaryActivityTaskClockDO taskClockDO : list) { for (TemporaryActivityTaskClockDO taskClockDO : list) {
// if (taskClockDO.getSubscribeStatus() != 1) { // 发送websocket 通知用户
// 发送websocket 通知用户 MessageBean msgBean = new MessageBean();
try { msgBean.setMsgType(TemporaryActivityTaskClockMessageType.RANDOM_TASK_START.getType());
MessageBean msgBean = new MessageBean(); msgBean.setData(taskClockDO);
msgBean.setMsgType(TemporaryActivityTaskClockMessageType.RANDOM_TASK_START.getType()); taskClockSocketHandler.sendToUser(taskClockDO.getTemporaryId().toString(), msgBean);
msgBean.setData(taskClockDO); log.info("发送websocket信息,用户id:{}", taskClockDO.getTemporaryId());
taskClockSocketHandler.sendToUser(taskClockDO.getTemporaryId().toString(), msgBean);
log.info("用户{}未订阅活动打卡通知", taskClockDO.getTemporaryName());
taskClockDO.setIsSendSubscribe(1);
taskClockDO.setSubscribeTime(new Date());
// taskClockService.updateById(taskClockDO);
} catch (IOException e) {
// 添加异常处理
log.error("发送Websocket订阅通知失败", e);
throw new RuntimeException(e);
}
// continue;
// }
// 2. 构建模板数据(根据小程序订阅模板的字段定义) // 2. 构建模板数据(根据小程序订阅模板的字段定义)
Map<String, String> data = new HashMap<>(); Map<String, String> data = new HashMap<>();
...@@ -105,13 +114,14 @@ public class ActivityStautsHandler { ...@@ -105,13 +114,14 @@ public class ActivityStautsHandler {
RANDOM_TASK_URL, RANDOM_TASK_URL,
data data
); );
log.info("促销员微信订阅通知发送结果:{},openid:{}", success, openid);
if (success) { if (success) {
log.info("促销员{}订阅通知发送成功", taskClockDO.getTemporaryName());
taskClockDO.setSubscribeTime(new Date()); taskClockDO.setSubscribeTime(new Date());
taskClockDO.setIsSendSubscribe(FlagType.YES.getType());
} }
// 修改状态 待开始 -> 进行中 // 修改状态 待开始 -> 进行中
taskClockDO.setTaskStatus(ActivityClockTaskStatus.STARTING.getType()); taskClockDO.setSubscribeStatus(ActivityClockTaskStatus.STARTING.getType());
taskClockService.updateById(taskClockDO); taskClockService.updateById(taskClockDO);
} }
...@@ -119,5 +129,4 @@ public class ActivityStautsHandler { ...@@ -119,5 +129,4 @@ public class ActivityStautsHandler {
} }
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论