Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
P
promotion-service
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
promotion
promotion-service
Commits
0c8b4392
提交
0c8b4392
authored
11月 13, 2025
作者:
吕本才
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat(activity): 完善临时活动任务打卡逻辑
上级
c772b9ef
隐藏空白字符变更
内嵌
并排
正在显示
5 个修改的文件
包含
68 行增加
和
36 行删除
+68
-36
TemporaryActivityTaskWrapperDto.java
...n/activity/wrapperQo/TemporaryActivityTaskWrapperDto.java
+7
-0
SubscribeMessageService.java
...vice/activity/temporary/impl/SubscribeMessageService.java
+4
-1
TemporaryActivityTaskClockServiceImpl.java
...temporary/impl/TemporaryActivityTaskClockServiceImpl.java
+12
-4
TemporaryActivityTaskClockSocketHandler.java
...on/websocket/TemporaryActivityTaskClockSocketHandler.java
+9
-4
ActivityStautsHandler.java
...angxiaolu/promotion/xxljobtask/ActivityStautsHandler.java
+36
-27
没有找到文件。
src/main/java/com/wangxiaolu/promotion/domain/activity/wrapperQo/TemporaryActivityTaskWrapperDto.java
浏览文件 @
0c8b4392
...
...
@@ -20,6 +20,13 @@ public class TemporaryActivityTaskWrapperDto {
* temporary_info表id
*/
private
Integer
temporaryId
;
private
Long
clockId
;
private
Integer
reportId
;
private
Integer
planId
;
/**
* 任务类型
*/
...
...
src/main/java/com/wangxiaolu/promotion/service/activity/temporary/impl/SubscribeMessageService.java
浏览文件 @
0c8b4392
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
;
}
}
...
...
src/main/java/com/wangxiaolu/promotion/service/activity/temporary/impl/TemporaryActivityTaskClockServiceImpl.java
浏览文件 @
0c8b4392
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
(
"当前时间不在打卡要求的时间内"
);
}
}
...
...
src/main/java/com/wangxiaolu/promotion/websocket/TemporaryActivityTaskClockSocketHandler.java
浏览文件 @
0c8b4392
...
...
@@ -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
;
...
...
src/main/java/com/wangxiaolu/promotion/xxljobtask/ActivityStautsHandler.java
浏览文件 @
0c8b4392
...
...
@@ -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
.
set
Task
Status
(
ActivityClockTaskStatus
.
STARTING
.
getType
());
//
修改状态 待开始 -> 进行中
taskClockDO
.
set
Subscribe
Status
(
ActivityClockTaskStatus
.
STARTING
.
getType
());
taskClockService
.
updateById
(
taskClockDO
);
}
...
...
@@ -119,5 +129,4 @@ public class ActivityStautsHandler {
}
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论