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

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

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