Commit fdd7f7f8 fdd7f7f82e49b2dbaaad7918d7e1de9907c9aa9c by xianghan

1.添加参加活动、首次消耗积分、完善用户信息任务

1 parent 9c602b84
......@@ -73,15 +73,18 @@ public class MemberServiceImpl implements MemberService {
@Transactional(readOnly = true)
public MemberSimpleDTO findSimpleById(Long id) {
Object memberSimpleRedis = this.redisUtils.get(RedisKeyConstants.cacheMemberSimpleById + "::" + id);
log.info("从redis中获取会员信息, 结果集 dealTask# memberSimpleRedis ==>> {} ", memberSimpleRedis);
if (Objects.nonNull(memberSimpleRedis)) {
return JSONObject.parseObject(JSON.toJSONString(memberSimpleRedis), MemberSimpleDTO.class);
}
MemberSimple memberSimple = this.memberSimpleRepository.findSimpleById(id).orElseGet(MemberSimple::new);
log.info("从数据库中获取会员信息, 结果集 dealTask# memberSimple ==>> {} ", memberSimple);
if (Objects.nonNull(memberSimple.getId())) {
MemberSimpleDTO memberSimpleDTO = new MemberSimpleDTO();
BeanUtils.copyProperties(memberSimple, memberSimpleDTO);
this.redisUtils.set(RedisKeyConstants.cacheMemberSimpleById + "::" + id, memberSimpleDTO);
boolean result = this.redisUtils.set(RedisKeyConstants.cacheMemberSimpleById + "::" + id, memberSimpleDTO);
log.info("将结果存入redis中, dealTask# memberSimpleDTO ==>> {} || 存入结果 ==>> {}", memberSimpleDTO, result);
}
return this.memberSimpleMapper.toDto(memberSimple);
}
......
......@@ -3,8 +3,12 @@ package com.topdraw.business.module.task.attribute.repository;
import com.topdraw.business.module.task.attribute.domain.TaskAttr;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
/**
* @author XiangHan
......@@ -13,4 +17,7 @@ import java.util.Optional;
public interface TaskAttrRepository extends JpaRepository<TaskAttr, Long>, JpaSpecificationExecutor<TaskAttr> {
Optional<TaskAttr> findByTaskId(Long taskId);
@Query(value = "SELECT * FROM `tr_task_attr` WHERE task_id IN(?1)", nativeQuery = true)
List<Map<String, Object>> findTasksByTaskIds(Set<Object> taskIds);
}
......
......@@ -3,6 +3,9 @@ package com.topdraw.business.module.task.attribute.service;
import com.topdraw.business.module.task.attribute.domain.TaskAttr;
import com.topdraw.business.module.task.attribute.service.dto.TaskAttrDTO;
import java.util.List;
import java.util.Set;
/**
* @author XiangHan
* @date 2022-01-13
......@@ -39,4 +42,6 @@ public interface TaskAttrService {
* @return
*/
TaskAttrDTO findByTaskId(Long taskId);
List<TaskAttrDTO> findTasksByTaskIds(Set<Object> id);
}
......
package com.topdraw.business.module.task.attribute.service.impl;
import com.alibaba.fastjson.JSON;
import com.topdraw.business.module.task.attribute.domain.TaskAttr;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.task.attribute.repository.TaskAttrRepository;
......@@ -12,6 +13,12 @@ import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author XiangHan
......@@ -64,5 +71,20 @@ public class TaskAttrServiceImpl implements TaskAttrService {
return this.taskAttrMapper.toDto(taskAttr);
}
@Override
public List<TaskAttrDTO> findTasksByTaskIds(Set<Object> taskIds) {
List<Map<String,Object>> maps = this.taskAttrRepository.findTasksByTaskIds(taskIds);
if (!CollectionUtils.isEmpty(maps)) {
List<TaskAttr> taskAttrs = new ArrayList<>();
for (Map<String, Object> map : maps) {
TaskAttr taskAttr = JSON.parseObject(JSON.toJSONString(map), TaskAttr.class);
taskAttrs.add(taskAttr);
}
return this.taskAttrMapper.toDto(taskAttrs);
}
return new ArrayList<>();
}
}
......
......@@ -15,6 +15,7 @@ import java.sql.Timestamp;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author XiangHan
......
......@@ -61,7 +61,7 @@ public class TaskBuilder {
task_.setDeleteMark(Objects.isNull(task.getDeleteMark()) ? 0 : task.getDeleteMark());
task_.setAttr(StringUtils.isBlank(task.getAttr()) ? null : task.getAttr());
// task_.setAttr(StringUtils.isBlank(task.getAttr()) ? null : task.getAttr());
return task_;
}
......
......@@ -8,6 +8,7 @@ import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
......@@ -25,9 +26,8 @@ public interface TaskRepository extends JpaRepository<Task, Long>, JpaSpecificat
Optional<Task> findByCode(String code);
@Query(value = "SELECT ta.*, attr.attr_str AS attr FROM tr_task ta LEFT JOIN tr_task_template tm ON ta.task_template_id = tm.id " +
" LEFT JOIN tr_task_attr attr ON attr.task_id = ta.id " +
@Query(value = "SELECT ta.* FROM tr_task ta LEFT JOIN tr_task_template tm ON ta.task_template_id = tm.id " +
" WHERE ta.`status` = 1 AND ta.valid_time <= now() and ta.expire_time >= now() AND ta.delete_mark = 0 AND " +
" tm.type = ?1 AND ta.`member_level` <= ?2 and ta.`member_vip` <= ?3", nativeQuery = true)
List<Task> findByEvent(Integer event, Integer level, Integer vip);
List<Map<String,Object>> findByEventAndLevelAndVip(Integer event, Integer level, Integer vip);
}
......
package com.topdraw.business.module.task.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.topdraw.business.module.task.attribute.service.TaskAttrService;
import com.topdraw.business.module.task.attribute.service.dto.TaskAttrDTO;
import com.topdraw.business.module.task.domain.Task;
import com.topdraw.business.module.task.repository.TaskRepository;
import com.topdraw.business.module.task.service.TaskService;
......@@ -17,7 +21,9 @@ import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* @author XiangHan
......@@ -29,6 +35,9 @@ import java.util.Objects;
public class TaskServiceImpl implements TaskService {
@Autowired
private TaskAttrService taskAttrService;
@Autowired
private TaskMapper taskMapper;
@Autowired
private TaskRepository taskRepository;
......@@ -80,11 +89,45 @@ public class TaskServiceImpl implements TaskService {
public List<Task> findByEventAndMemberLevelAndVip(Integer event, Integer level, Integer vip) {
try {
boolean b = this.redisUtils.hasKey(RedisKeyConstants.cacheTaskByEventAndMemberLevelAndVip + "::" + event + ":" + level + ":" + vip);
if (b) {
List<Object> tasksObjs = redisUtils.lGet(RedisKeyConstants.cacheTaskByEventAndMemberLevelAndVip + "::" + event + ":" + level + ":" + vip, 0, -1);
return JSONArray.parseArray(tasksObjs.get(0).toString(), Task.class);
}
List<Task> tasks = this.taskRepository.findByEvent(event, level, vip);
List<Map<String, Object>> maps = this.taskRepository.findByEventAndLevelAndVip(event, level, vip);
List<Task> tasks = new ArrayList<>();
if (CollectionUtils.isEmpty(maps)) {
return tasks;
}
List<TaskAttrDTO> taskAttrDTOS = this.taskAttrService.findTasksByTaskIds(maps.stream().map(t -> t.get("id")).collect(Collectors.toSet()));
if (!CollectionUtils.isEmpty(taskAttrDTOS)) {
for (Map<String, Object> map : maps) {
Task task = JSONObject.parseObject(JSON.toJSONString(map), Task.class);
List<String> taskAttrs = taskAttrDTOS.stream().filter(taskAttrDTO -> taskAttrDTO.getTaskId().equals(task.getId())).
map(TaskAttrDTO::getAttrStr).collect(Collectors.toList());
log.info("任务属性值, dealTask# taskAttrs ==>> {}", taskAttrs);
if (!CollectionUtils.isEmpty(taskAttrs)) {
task.setAttr(String.join(",", taskAttrs));
}
tasks.add(task);
}
} else {
for (Map<String, Object> map : maps) {
Task task = JSONObject.parseObject(JSON.toJSONString(map), Task.class);
tasks.add(task);
}
}
if (!CollectionUtils.isEmpty(tasks)) {
this.redisUtils.lSet(RedisKeyConstants.cacheTaskByEventAndMemberLevelAndVip + "::" + event + ":" + level + ":" + vip, tasks, 45 * 60);
}
......
......@@ -38,15 +38,8 @@ public class TaskOperationController {
@ApiOperation("事件处理")
@AnonymousAccess
public IResultInfo dealTask(@RequestBody @Validated TaskOperationQueryCriteria criteria) {
log.info("事件处理,开始,参数 ==>> {}", criteria);
long l = System.currentTimeMillis();
// 任务处理
ResultInfo resultInfo = this.taskOperationService.dealTask(criteria.getContent());
long l2 = System.currentTimeMillis();
log.info("事件处理,结束,总耗时 ==>> {}", (l2-l));
return resultInfo;
log.info("事件处理,参数 ==>> dealTask#==>>{}", criteria);
return this.taskOperationService.dealTask(criteria.getContent());
}
/**
......
package com.topdraw.business.process.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.coupon.service.CouponService;
......@@ -122,7 +123,7 @@ public class TaskOperationServiceImpl implements TaskOperationService {
*/
private void createTaskAttr(Task task) {
TaskAttr taskAttr = new TaskAttr();
taskAttr.setAttrStr(task.getAttr());
// taskAttr.setAttrStr(task.getAttr());
taskAttr.setTaskId(task.getId());
this.taskAttrService.create(taskAttr);
}
......@@ -148,14 +149,14 @@ public class TaskOperationServiceImpl implements TaskOperationService {
* @param task 任务
*/
private void updateTaskAttr(Task task) {
/* List<String> attr = task.getAttr();
TaskAttrDTO taskAttrDTO = this.taskAttrService.findByTaskId(task.getId());
if (Objects.nonNull(taskAttrDTO.getId())) {
TaskAttr taskAttr = new TaskAttr();
BeanUtils.copyProperties(taskAttrDTO, taskAttr);
taskAttr.setAttrStr(task.getAttr());
taskAttr.setAttrStr();
this.taskAttrService.update(taskAttr);
}
}*/
}
@Override
......@@ -209,7 +210,6 @@ public class TaskOperationServiceImpl implements TaskOperationService {
public ResultInfo dealTask(String content) {
DataSyncMsg dataSyncMsg = JSONUtil.parseMsg2Object(content, DataSyncMsg.class);
log.info("事件dataSyncMsg ==>> {}", dataSyncMsg);
if (StringUtils.isBlank(dataSyncMsg.getMsgData())) {
log.error("参数错误,事件消息体为空");
......@@ -231,7 +231,7 @@ public class TaskOperationServiceImpl implements TaskOperationService {
String platformAccount = platformAccountObj.toString();
UserTvSimpleDTO userTvDTO = this.userTvService.findSimpleByPlatformAccount(platformAccount);
log.info("查询大屏信息 ==>> {}", userTvDTO);
log.info("查询大屏信息, dealTask# ==>> {}", userTvDTO);
if (Objects.nonNull(userTvDTO)) {
......@@ -240,56 +240,53 @@ public class TaskOperationServiceImpl implements TaskOperationService {
String priorityMemberCode = userTvDTO.getPriorityMemberCode();
if (StringUtils.isNotBlank(priorityMemberCode)) {
// TODO 是否需要将code和id都进行缓存
memberDTO = this.memberService.findSimpleByCode(priorityMemberCode);
log.info("查询绑定的小屏的主会员信息, member ==>> {}", memberDTO);
log.info("查询绑定的小屏的主会员信息, dealTask# member ==>> {}", memberDTO);
} else if (Objects.nonNull(userTvDTO.getMemberId())) {
long l4 = System.currentTimeMillis();
memberDTO = this.memberService.findSimpleById(userTvDTO.getMemberId());
long l5 = System.currentTimeMillis();
log.info("查询大屏自身的会员信息, memberId ==>> {} , 总耗时 ==>> {}", userTvDTO.getMemberId(), (l5-l4));
log.info("查询大屏自身的会员信息, dealTask# memberId ==>> {}", userTvDTO.getMemberId());
}
} else {
memberDTO = this.memberService.findSimpleById(userTvDTO.getMemberId());
log.info("查询大屏会员信息 ==>> {}", memberDTO);
log.info("查询大屏会员信息, dealTask# memberDTO ==>> {}", memberDTO);
}
} else {
log.error("大屏账号不存在,请检查数据, platformAccount ==>> {}", platformAccount);
log.error("大屏账号不存在,请检查数据, dealTask# platformAccount ==>> {}", platformAccount);
return ResultInfo.failure("大屏账号不存在,请检查数据");
}
log.info("获取大屏会员信息 ==>> platformAccount ==>> {} || 会员信息 ==>> {}", platformAccount, memberDTO);
} else {
// 小屏侧传递的参数是memberId
memberDTO = this.memberService.findSimpleById(Long.valueOf(memberIdObj.toString()));
}
log.info("获取会员信息, dealTask# memberDTO ==>> {}", memberDTO);
if (Objects.isNull(memberDTO.getId())) {
log.error("会员信息不存在 ==>> {}", memberDTO);
log.error("会员信息不存在 ==>> dealTask# memberDTO ==>> {}", memberDTO);
return ResultInfo.failure("会员信息不存在");
}
// 检查黑名单状态 0:正常 1:黑名单
Long blackStatus = memberDTO.getBlackStatus();
if (Objects.nonNull(blackStatus) && blackStatus.equals(LocalConstants.BLACK_STATUS)) {
log.error("会员已被加入黑名单 ==>> {}", memberDTO);
log.error("会员已被加入黑名单, dealTask# ==>> {}", memberDTO);
return ResultInfo.forbidden("会员已被加入黑名单");
}
// 检索满足条件的任务 1.先检查redis中是否存在符合条件的任务 2.从redis中获取当前会员未完成的任务
List<Task> tasks = this.findValidTasksAndRefreshTaskProcess(memberDTO, dataSyncMsg.getEvent(), msgData);
log.info("当前用户可执行的任务详情 ==>> {}", tasks);
log.info("当前用户可执行的任务详情, dealTask# tasks ==>> [{}]", tasks);
if (CollectionUtils.isEmpty(tasks)) {
// 类型 1:登录;2:观影;3:参加活动;4:订购;5:优享会员;6:签到;7:完成设置;8:播放记录;
// 10:跨屏绑定;11:积分转移;30:积分兑换商品;98:系统操作;99:其他
log.warn("无可执行的任务");
return ResultInfo.failure("无可执行的任务");
}
if (!CollectionUtils.isEmpty(tasks)) {
// 5.权益区分(积分、权益、成长值)
Map<RightType,Object> tempRightsMap = this.distinguishRight(memberDTO, tasks, msgData, dataSyncMsg);
......@@ -299,7 +296,6 @@ public class TaskOperationServiceImpl implements TaskOperationService {
if (integer > 0) {
return ResultInfo.success(integer);
}
}
return ResultInfo.failure("任务处理失败");
......@@ -354,10 +350,8 @@ public class TaskOperationServiceImpl implements TaskOperationService {
private List<Task> findValidTasksAndRefreshTaskProcess(MemberSimpleDTO memberDTO, Integer event, JSONObject msgData) {
// 任务是否存在
long l = System.currentTimeMillis();
List<Task> tasks = this.taskService.findByEventAndMemberLevelAndVip(event, memberDTO.getLevel(), memberDTO.getVip());
long l1 = System.currentTimeMillis();
log.info("查询任务列表,任务详情 ==>> {}, 总耗时 ==>> {}",tasks, (l1-l));
log.info("查询任务列表, dealTask# tasks ==>> [{}]",tasks);
if (Objects.isNull(tasks) || CollectionUtils.isEmpty(tasks)) {
return Collections.singletonList(null);
}
......@@ -365,16 +359,35 @@ public class TaskOperationServiceImpl implements TaskOperationService {
// 获取当前会员所有任务的完成进度
Map<Object, Object> todayFinishTask =
this.trTaskProgressService.countTodayFinishTaskByMemberId(memberDTO.getId(), LocalDateTimeUtil.todayStart());
log.info("查询今天所有任务的完成进度, dealTask# todayFinishTask ==>> {}", todayFinishTask);
Map<Object, Object> finishTaskCount = this.trTaskProgressService.countTotalFinishTaskByMemberId(memberDTO.getId());
log.info("查询所有任务的完成次数, dealTask# finishTaskCount ==>> {}", finishTaskCount);
List<Task> tasksResult = new ArrayList<>();
// 检查当前会员针对这些任务的完成情况
for (Task task : tasks) {
/*// 校验用户分组
if (StringUtils.isNotBlank(task.getGroups()) && !task.getGroups().contains(memberDTO.getGroups())) {
log.warn("此用户分组不满足任务要求,任务分组 ==>> {} || 会员分组 ==>> {}",task.getGroups(), memberDTO.getGroups());
boolean result = false;
// 校验用户分组
if (StringUtils.isNotBlank(task.getGroups()) && !task.getGroups().contains("0")) {
String groups = memberDTO.getGroups();
log.info("会员分组信息, dealTask# groups ==>> {}", groups);
if (StringUtils.isNotBlank(groups)) {
String[] split = groups.split(",");
if (split.length > 0) {
for (String s : split) {
if (task.getGroups().contains(s)){
result = true;
break;
}
}
}
}
if (!result) {
log.warn("此用户分组不满足任务要求,任务分组 ==>> {} || 会员分组 ==>> {}", task.getGroups(), memberDTO.getGroups());
continue;
}*/
}
}
// 任务每日重置 0:不重置;1:重置
Integer taskDailyReset = task.getTaskDailyReset();
......@@ -415,10 +428,15 @@ public class TaskOperationServiceImpl implements TaskOperationService {
break;
// 参加活动
case TaskEventType.ACTIVITY:
if (this.doActivityEvent(msgData, task, memberDTO)) {
tasksResult.add(task);
}
break;
// 订购
case TaskEventType.ORDER:
if (this.doOrderEvent(msgData, task, memberDTO)) {
tasksResult.add(task);
}
break;
// 优享会员
case TaskEventType.MEMBER_PRIORITY:
......@@ -429,7 +447,7 @@ public class TaskOperationServiceImpl implements TaskOperationService {
tasksResult.add(task);
}
break;
// 完成设置
// 完善个人资料
case TaskEventType.COMPLETE_INFO:
if (this.doCompleteMemberInfoEvent(msgData, task, memberDTO)) {
tasksResult.add(task);
......@@ -475,6 +493,18 @@ public class TaskOperationServiceImpl implements TaskOperationService {
return tasksResult;
}
private boolean doOrderEvent(JSONObject msgData, Task task, MemberSimpleDTO memberDTO) {
Integer actionAmount = task.getActionAmount();
// 用户行为次数
// TODO 后续需要按照业务对用户行为数据进行修改
int completeCount = 1;
if (completeCount >= actionAmount) {
this.saveOrUpdateTaskProcess(null, memberDTO.getId(), task, completeCount, TASK_FINISH_STATUS);
return true;
}
return false;
}
private boolean doPointsExchangeGoodsEvent(JSONObject msgData, Task task, MemberSimpleDTO memberDTO) {
Integer actionAmount = task.getActionAmount();
// 用户行为次数
......@@ -529,6 +559,30 @@ public class TaskOperationServiceImpl implements TaskOperationService {
return false;
}
private boolean doActivityEvent(JSONObject msgData, Task task, MemberSimpleDTO memberDTO) {
Integer actionAmount = task.getActionAmount();
String attrStr = task.getAttr();
if (StringUtils.isBlank(attrStr)) {
int joinCount = 1;//msgData.getInteger("joinCount");
if (joinCount >= actionAmount) {
this.saveOrUpdateTaskProcess(null, memberDTO.getId(), task, joinCount, TASK_FINISH_STATUS);
return true;
}
}
Integer marketingActivityId = msgData.getInteger("marketingActivityId");
if (new ArrayList<>(Arrays.asList(attrStr.split(","))).contains(Integer.toString(marketingActivityId))) {
int joinCount = 1;//msgData.getInteger("joinCount");
if (joinCount >= actionAmount) {
this.saveOrUpdateTaskProcess(null, memberDTO.getId(), task, joinCount, TASK_FINISH_STATUS);
return true;
}
}
log.warn("未找到对应的活动,参数 marketingActivityId ==>> {} || 任务属性 ==>> {}", marketingActivityId, attrStr);
return false;
}
private boolean doSignEvent(JSONObject msgData, Task task, MemberSimpleDTO memberDTO) {
Integer actionAmount = task.getActionAmount();
// // 用户行为次数 签到天数
......@@ -554,6 +608,7 @@ public class TaskOperationServiceImpl implements TaskOperationService {
private boolean doLoginEvent(JSONObject msgData, Task task, MemberSimpleDTO memberDTO) {
Integer actionAmount = task.getActionAmount();
// 登录天数
int continueLogin = msgData.getInteger("CONTINUE_LOGIN");
if (continueLogin >= actionAmount) {
......
......@@ -164,7 +164,7 @@ public class UserOperationServiceImpl implements UserOperationService {
}
return null;
return userAppDTO;
}
@Override
......
......@@ -64,7 +64,7 @@
<!--监控sql日志输出 -->
<logger name="jdbc.sqlonly" level="INFO" additivity="false">
<logger name="jdbc.sqlonly" level="OFF" additivity="false">
<appender-ref ref="console" />
<appender-ref ref="info" />
</logger>
......
......@@ -155,7 +155,7 @@ public class TaskOperationControllerTest extends BaseTest {
task.setValidTime(TimestampUtil.now());
task.setPointsType(0);
task.setAttr("{\"value\":\"[1,2]\"}");
// task.setAttr("{\"value\":\"[1,2]\"}");
task.setTaskTemplateId(13L);
......@@ -169,7 +169,7 @@ public class TaskOperationControllerTest extends BaseTest {
Task task = new Task();
BeanUtils.copyProperties(taskDTO, task);
task.setName("testTask4455");
task.setAttr("{\"value\":\"[4,10]\"}");
// task.setAttr("{\"value\":\"[4,10]\"}");
this.taskOperationController.updateTask(task);
}
......