Commit 2ce05838 2ce05838bb721d6932daae8876c0ca9d0b0bac8e by xianghan

1.优化部分任务处理接口,修改接收任务事件模型

2.为任务处理添加缓存
1 parent f97bb099
Showing 46 changed files with 1092 additions and 1019 deletions
package com.topdraw.business.module.member.domain;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.topdraw.business.module.common.validated.UpdateGroup;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.sql.Timestamp;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_member")
public class MemberSimple implements Serializable {
/** 主键 */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
@NotNull(message = "id can't be null!!",groups = {UpdateGroup.class})
private Long id;
/** 标识 */
@Column(name = "code")
private String code;
/** 状态 0:不可用;1:可用 */
@Column(name = "`status`")
private Integer status;
/** 分组信息 */
@Column(name = "`groups`")
private String groups;
/** 是否会员 0:非会员;1:会员 */
@Column(name = "vip")
private Integer vip;
/** 会员等级(对应level表的level字段,非id) */
@Column(name = "`level`")
private Integer level;
/** iptv账号id */
@Column(name = "user_iptv_id")
private Long userIptvId;
/** 是否在黑名单 1:是;0否 */
@Column(name = "black_status")
private Long blackStatus;
public void copy(MemberSimple source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(false));
}
}
package com.topdraw.business.module.member.level.service.impl;
import com.topdraw.business.module.member.level.domain.MemberLevel;
import com.topdraw.config.RedisKeyConstants;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.member.level.repository.MemberLevelRepository;
import com.topdraw.business.module.member.level.service.MemberLevelService;
import com.topdraw.business.module.member.level.service.dto.MemberLevelDTO;
import com.topdraw.business.module.member.level.service.mapper.MemberLevelMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
......@@ -42,8 +44,9 @@ public class MemberLevelServiceImpl implements MemberLevelService {
}
@Override
@Cacheable(cacheNames = RedisKeyConstants.cacheMemberLevelByLevel, key = "#level", unless = "#result.size() == 0")
public List<MemberLevelDTO> findLevelAndStatus(Integer level, Integer status) {
return this.memberLevelMapper.toDto(this.memberLevelRepository.findByLevelAndStatus(level,status));
return this.memberLevelMapper.toDto(this.memberLevelRepository.findByLevelAndStatus(level, status));
}
}
......
package com.topdraw.business.module.member.repository;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.domain.MemberSimple;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
......
package com.topdraw.business.module.member.repository;
import com.topdraw.business.module.member.domain.MemberSimple;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import java.util.Optional;
/**
* @author XiangHan
* @date 2021-10-22
*/
public interface MemberSimpleRepository extends JpaRepository<MemberSimple, Long>, JpaSpecificationExecutor<MemberSimple> {
@Query(value = "SELECT `id`, `code`, `status`, `groups`, `vip`, `level`,`user_iptv_id`, `black_status` FROM `uc_member` WHERE `id` = ?1", nativeQuery = true)
Optional<MemberSimple> findSimpleById(Long id);
@Query(value = "SELECT `id`, `code`, `status`, `groups`, `vip`, `level`,`user_iptv_id`, `black_status` FROM `uc_member` WHERE `code` = ?1", nativeQuery = true)
Optional<MemberSimple> findSimpleByCode(String code);
}
......@@ -2,6 +2,8 @@ package com.topdraw.business.module.member.service;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.member.service.dto.MemberSimpleDTO;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
......@@ -26,6 +28,13 @@ public interface MemberService {
MemberDTO findById(Long id);
/**
*
* @param id
* @return
*/
MemberSimpleDTO findSimpleById(Long id);
/**
* 通过code查询会员
* @param code 会员编码
* @return MemberDTO
......@@ -33,6 +42,13 @@ public interface MemberService {
MemberDTO findByCode(String code);
/**
*
* @param code
* @return
*/
MemberSimpleDTO findSimpleByCode(String code);
/**
* 保存
* @param resources
* @return Long id
......
package com.topdraw.business.module.member.service.dto;
import lombok.Data;
import java.io.Serializable;
import java.sql.Timestamp;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class MemberSimpleDTO implements Serializable {
/** 主键 */
private Long id;
/** 标识 */
private String code;
/** 昵称 */
private String nickname;
/** 状态 0:不可用;1:可用 */
private Integer status;
/** 分组信息 */
private String groups;
/** 是否会员 0:非会员;1:会员 */
private Integer vip;
/** 会员等级(对应level表的level字段,非id) */
private Integer level;
/** iptv账号id */
private Long userIptvId;
/** 是否在黑名单 1:是;0否 */
private Long blackStatus;
}
......@@ -2,22 +2,26 @@ package com.topdraw.business.module.member.service.impl;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.domain.MemberBuilder;
import com.topdraw.business.module.member.domain.MemberSimple;
import com.topdraw.business.module.member.profile.domain.MemberProfile;
import com.topdraw.business.module.member.profile.domain.MemberProfileBuilder;
import com.topdraw.business.module.member.profile.service.MemberProfileService;
import com.topdraw.business.module.member.repository.MemberRepository;
import com.topdraw.business.module.member.repository.MemberSimpleRepository;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.member.service.dto.MemberSimpleDTO;
import com.topdraw.business.module.member.service.mapper.MemberMapper;
import com.topdraw.business.module.member.service.mapper.MemberSimpleMapper;
import com.topdraw.config.RedisKeyConstants;
import com.topdraw.exception.BadRequestException;
import com.topdraw.exception.GlobeExceptionMsg;
import com.topdraw.utils.RedisUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
......@@ -38,31 +42,51 @@ public class MemberServiceImpl implements MemberService {
@Autowired
private MemberRepository memberRepository;
@Autowired
private MemberSimpleRepository memberSimpleRepository;
@Autowired
private MemberProfileService memberProfileService;
@Autowired
private RedisUtils redisUtils;
private MemberSimpleMapper memberSimpleMapper;
@Override
@Transactional(readOnly = true)
public String findCodeById(Long id) {
MemberDTO memberDTO = this.findById(id);
return memberDTO.getCode();
}
@Override
@Transactional(readOnly = true)
@Cacheable(cacheNames = RedisKeyConstants.cacheMemberById, key = "#id")
public MemberDTO findById(Long id) {
Member member = this.memberRepository.findById(id).orElseGet(Member::new);
return this.memberMapper.toDto(member);
}
@Override
@CachePut(cacheNames = RedisKeyConstants.cacheMemberByCode, key = "#code")
@Transactional(readOnly = true)
@Cacheable(cacheNames = RedisKeyConstants.cacheMemberSimpleById, key = "#id", unless = "#result.id == null")
public MemberSimpleDTO findSimpleById(Long id) {
return this.memberSimpleMapper.toDto(this.memberSimpleRepository.findSimpleById(id).orElseGet(MemberSimple::new));
}
@Override
@Transactional(readOnly = true)
public MemberDTO findByCode(String code) {
Member member = this.memberRepository.findFirstByCode(code).orElseGet(Member::new);
return this.memberMapper.toDto(member);
}
@Override
@Transactional(readOnly = true)
@Cacheable(cacheNames = RedisKeyConstants.cacheMemberSimpleById, key = "#id", unless = "#result.id == null")
public MemberSimpleDTO findSimpleByCode(String code) {
return this.memberSimpleMapper.toDto(this.memberSimpleRepository.findSimpleByCode(code).orElseGet(MemberSimple::new));
}
@Override
@Transactional(readOnly = true)
public List<MemberDTO> findByUserIptvId(Long id) {
List<Member> memberList = this.memberRepository.findByUserIptvId(id);
return this.memberMapper.toDto(memberList);
......@@ -94,10 +118,10 @@ public class MemberServiceImpl implements MemberService {
@Override
@Transactional(rollbackFor = Exception.class)
@CachePut(cacheNames = RedisKeyConstants.cacheMemberByCode, key = "#code")
@CachePut(cacheNames = RedisKeyConstants.cacheMemberByCode, key = "#resource.code")
public MemberDTO doUpdateMemberExpAndLevel(Member resource) {
try {
this.redisUtils.doLock(RedisKeyConstants.updateCacheMemberById + resource.getId());
// this.redisUtils.doLock(RedisKeyConstants.updateCacheMemberById + resource.getId());
Integer count = this.memberRepository.updateExpAndLevel(resource);
if (Objects.nonNull(count) && count > 0) {
......@@ -107,7 +131,7 @@ public class MemberServiceImpl implements MemberService {
} catch (Exception e) {
log.info("修改会员优惠券,"+e.getMessage());
} finally {
this.redisUtils.doUnLock(RedisKeyConstants.updateCacheMemberById + resource.getId());
// this.redisUtils.doUnLock(RedisKeyConstants.updateCacheMemberById + resource.getId());
}
return this.memberMapper.toDto(resource);
......@@ -115,11 +139,11 @@ public class MemberServiceImpl implements MemberService {
@Override
@Transactional(rollbackFor = Exception.class)
@CachePut(cacheNames = RedisKeyConstants.cacheMemberByCode, key = "#code")
@CachePut(cacheNames = RedisKeyConstants.cacheMemberByCode, key = "#resource.code")
public MemberDTO doUpdateMemberCoupon(Member resource) {
log.info("修改会员优惠券 =>> {}", resource);
try {
this.redisUtils.doLock(RedisKeyConstants.updateCacheMemberById + resource.getId());
// this.redisUtils.doLock(RedisKeyConstants.updateCacheMemberById + resource.getId());
Integer count = this.memberRepository.doUpdateMemberCoupon(resource);
if (Objects.nonNull(count) && count > 0) {
......@@ -130,13 +154,14 @@ public class MemberServiceImpl implements MemberService {
} catch (Exception e) {
log.info("修改会员优惠券,"+e.getMessage());
} finally {
this.redisUtils.doUnLock(RedisKeyConstants.updateCacheMemberById + resource.getId());
// this.redisUtils.doUnLock(RedisKeyConstants.updateCacheMemberById + resource.getId());
}
return this.memberMapper.toDto(resource);
}
@Override
@Transactional(readOnly = true)
public MemberDTO findByPlatformAccount(String platformAccount) {
log.info("从数据库中检索大屏账号对应的会员, platformAccount ==>> {}", platformAccount);
Member member = this.memberRepository.findByPlatformAccount(platformAccount).orElseGet(Member::new);
......@@ -145,11 +170,11 @@ public class MemberServiceImpl implements MemberService {
@Override
@Transactional(rollbackFor = Exception.class)
@CachePut(cacheNames = RedisKeyConstants.cacheMemberByCode, key = "#code")
@CachePut(cacheNames = RedisKeyConstants.cacheMemberByCode, key = "#resource.code")
public MemberDTO doUpdateMemberVipAndVipExpireTime(Member resource) {
log.info("修改会员vip和vip过期时间 ==>> {}", resource);
try {
this.redisUtils.doLock(RedisKeyConstants.updateCacheMemberById + resource.getId());
// this.redisUtils.doLock(RedisKeyConstants.updateCacheMemberById + resource.getId());
Integer count = this.memberRepository.updateMemberVipAndVipExpireTime(resource);
if (Objects.nonNull(count) && count > 0) {
......@@ -160,7 +185,7 @@ public class MemberServiceImpl implements MemberService {
} catch (Exception e) {
log.info("修改会员vip和vip过期时间,"+e.getMessage());
} finally {
this.redisUtils.doUnLock(RedisKeyConstants.updateCacheMemberById + resource.getId());
// this.redisUtils.doUnLock(RedisKeyConstants.updateCacheMemberById + resource.getId());
}
return this.memberMapper.toDto(resource);
......@@ -168,11 +193,11 @@ public class MemberServiceImpl implements MemberService {
@Override
@Transactional(rollbackFor = Exception.class)
@CachePut(cacheNames = RedisKeyConstants.cacheMemberByCode, key = "#code")
@CachePut(cacheNames = RedisKeyConstants.cacheMemberByCode, key = "#resource.code")
public MemberDTO doUpdateMemberUserIptvIdAndBindIptvPlatformAndBindIptvTime(Member resource) {
log.info("修改会员绑定大屏信息 ==>> {}", resource);
try {
this.redisUtils.doLock(RedisKeyConstants.updateCacheMemberById + resource.getId());
// this.redisUtils.doLock(RedisKeyConstants.updateCacheMemberById + resource.getId());
Integer count = this.memberRepository.updateMemberUserIptvIdAndBindIptvPlatformAndBindIptvTime(resource);
if (Objects.nonNull(count) && count > 0) {
......@@ -183,7 +208,7 @@ public class MemberServiceImpl implements MemberService {
} catch (Exception e) {
log.info("修改会员绑定大屏信息,"+e.getMessage());
} finally {
this.redisUtils.doUnLock(RedisKeyConstants.updateCacheMemberById + resource.getId());
// this.redisUtils.doUnLock(RedisKeyConstants.updateCacheMemberById + resource.getId());
}
return this.memberMapper.toDto(resource);
......@@ -191,11 +216,11 @@ public class MemberServiceImpl implements MemberService {
@Override
@Transactional(rollbackFor = Exception.class)
@CachePut(cacheNames = RedisKeyConstants.cacheMemberByCode, key = "#code")
@CachePut(cacheNames = RedisKeyConstants.cacheMemberByCode, key = "#resource.code")
public MemberDTO doUpdateMemberAvatarUrlAndNicknameAndGender(Member resource) {
log.info("修改会员头像、昵称、性别 ==>> {}", resource);
try {
this.redisUtils.doLock(RedisKeyConstants.updateCacheMemberById + resource.getId());
// this.redisUtils.doLock(RedisKeyConstants.updateCacheMemberById + resource.getId());
Integer count = this.memberRepository.updateMemberAvatarUrlAndNicknameAndGender(resource);
if (Objects.nonNull(count) && count > 0) {
......@@ -206,7 +231,7 @@ public class MemberServiceImpl implements MemberService {
} catch (Exception e) {
log.info("修改会员头像、昵称、性别异常,"+e.getMessage());
} finally {
this.redisUtils.doUnLock(RedisKeyConstants.updateCacheMemberById + resource.getId());
// this.redisUtils.doUnLock(RedisKeyConstants.updateCacheMemberById + resource.getId());
}
return this.memberMapper.toDto(resource);
......@@ -232,11 +257,11 @@ public class MemberServiceImpl implements MemberService {
@Override
@Transactional(rollbackFor = Exception.class)
@CachePut(cacheNames = RedisKeyConstants.cacheMemberByCode, key = "#code")
@CachePut(cacheNames = RedisKeyConstants.cacheMemberByCode, key = "#resources.code")
public MemberDTO update(Member resources) {
log.info("修改会员信息 ==>> {}", resources);
try {
this.redisUtils.doLock(RedisKeyConstants.updateCacheMemberById + resources.getId());
// this.redisUtils.doLock(RedisKeyConstants.updateCacheMemberById + resources.getId());
MemberDTO memberDTO = this.checkMember(resources);
Member member = new Member();
......@@ -248,7 +273,7 @@ public class MemberServiceImpl implements MemberService {
} catch (Exception e) {
log.info(e.getMessage());
} finally {
this.redisUtils.doUnLock(RedisKeyConstants.updateCacheMemberById + resources.getId());
// this.redisUtils.doUnLock(RedisKeyConstants.updateCacheMemberById + resources.getId());
}
return this.memberMapper.toDto(resources);
......@@ -261,10 +286,10 @@ public class MemberServiceImpl implements MemberService {
@Override
@Transactional(rollbackFor = Exception.class)
@CachePut(cacheNames = RedisKeyConstants.cacheMemberByCode, key = "#code")
@CachePut(cacheNames = RedisKeyConstants.cacheMemberByCode, key = "#resources.code")
public MemberDTO doUpdateMemberPoints(Member resources) {
try {
this.redisUtils.doLock(RedisKeyConstants.updateCacheMemberById + resources.getId());
// this.redisUtils.doLock(RedisKeyConstants.updateCacheMemberById + resources.getId());
Integer count = this.memberRepository.updatePointAndDuePoint(resources);
if (Objects.nonNull(count) && count > 0) {
......@@ -275,7 +300,7 @@ public class MemberServiceImpl implements MemberService {
} catch (Exception e) {
log.info(e.getMessage());
} finally {
this.redisUtils.doUnLock(RedisKeyConstants.updateCacheMemberById + resources.getId());
// this.redisUtils.doUnLock(RedisKeyConstants.updateCacheMemberById + resources.getId());
}
return this.memberMapper.toDto(resources);
......
package com.topdraw.business.module.member.service.mapper;
import com.topdraw.base.BaseMapper;
import com.topdraw.business.module.member.domain.MemberSimple;
import com.topdraw.business.module.member.service.dto.MemberSimpleDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface MemberSimpleMapper extends BaseMapper<MemberSimpleDTO, MemberSimple> {
}
......@@ -101,5 +101,5 @@ public interface PointsAvailableService {
*
* @param pointsAvailable
*/
PointsAvailableDTO create4Custom(PointsAvailable pointsAvailable);
void create4Custom(PointsAvailable pointsAvailable);
}
......
......@@ -160,17 +160,8 @@ public class PointsAvailableServiceImpl implements PointsAvailableService {
}
@Override
public PointsAvailableDTO create4Custom(PointsAvailable resources) {
this.redisUtils.doLock("PointsAvailable::create::id"+resources.getMemberId().toString());
try {
PointsAvailable pointsAvailable = this.pointsAvailableRepository.save(resources);
return this.pointsAvailableMapper.toDto(pointsAvailable);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
this.redisUtils.doUnLock("PointsAvailable::create::id"+resources.getMemberId().toString());
}
public void create4Custom(PointsAvailable resources) {
this.pointsAvailableRepository.save(resources);
}
}
......
......@@ -27,6 +27,9 @@ import java.io.Serializable;
@NoArgsConstructor
public class TrTaskProgress implements Serializable {
@Transient
private String memberCode;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
......
......@@ -5,7 +5,10 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* @author XiangHan
......@@ -13,8 +16,17 @@ import java.util.List;
*/
public interface TrTaskProgressRepository extends JpaRepository<TrTaskProgress, Long>, JpaSpecificationExecutor<TrTaskProgress> {
@Query(value = "select id, member_id, task_id , current_action_amount , \n" +
" target_action_amount , `status` , completion_time,create_time,update_time from uc_tr_task_progress where member_id = ?1 \n" +
@Query(value = "select id, member_id, task_id, current_action_amount," +
" target_action_amount, `status`, completion_time, create_time, update_time from uc_tr_task_progress where member_id = ?1 " +
" and task_id = ?2 and Date(completion_time) = ?3 ",nativeQuery = true)
TrTaskProgress findByMemberIdAndTaskIdAndCompletionTime(Long memberId, Long taskId, String time1);
Optional<TrTaskProgress> findByMemberIdAndTaskIdAndCompletionTime(Long memberId, Long taskId, String time1);
Integer countByMemberIdAndTaskId(Long memberId, Long taskId);
@Query(value = "select `task_id` AS taskId, count(*) AS finishCount from uc_tr_task_progress where member_id = ?1 and `status` = 1 GROUP BY `task_id` ", nativeQuery = true)
List<Map<String, Object>> countFinishTaskGroupByMemberId(Long memberId);
@Query(value = "select `task_id` AS taskId, count(*) AS finishCount from uc_tr_task_progress where member_id = ?1 and Date(completion_time) = ?2 and `status` = 1 GROUP BY `task_id`", nativeQuery = true)
List<Map<String, Object>> countFinishTaskGroupByMemberIdAndToday(Long memberId, String todayStart);
}
......
......@@ -4,7 +4,9 @@ import com.topdraw.business.module.task.progress.domain.TrTaskProgress;
import com.topdraw.business.module.task.progress.service.dto.TrTaskProgressDTO;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -44,6 +46,28 @@ public interface TrTaskProgressService {
* @param time1
* @return
*/
TrTaskProgressDTO findByMemberIdAndTaskIdAndCompletionTime(Long memberId, Long taskId, String time1);
TrTaskProgress findByMemberIdAndTaskIdAndCompletionTime(Long memberId, Long taskId, String time1);
/**
*
* @param memberId
* @param taskId
* @return
*/
Integer countByMemberIdAndTaskId(Long memberId, Long taskId);
/**
*
* @param id
* @return
*/
Map<Object, Object> countTotalFinishTaskByMemberId(Long id);
/**
*
* @param id
* @param todayStart
* @return
*/
Map<Object, Object> countTodayFinishTaskByMemberId(Long id, String todayStart);
}
......
package com.topdraw.business.module.task.progress.service.impl;
import cn.hutool.core.map.MapUtil;
import com.topdraw.business.module.task.progress.domain.TrTaskProgress;
import com.topdraw.config.RedisKeyConstants;
import com.topdraw.utils.RedisUtils;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.task.progress.repository.TrTaskProgressRepository;
import com.topdraw.business.module.task.progress.service.TrTaskProgressService;
......@@ -16,9 +18,13 @@ 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.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @author XiangHan
......@@ -31,34 +37,30 @@ public class TrTaskProgressServiceImpl implements TrTaskProgressService {
@Autowired
private TrTaskProgressRepository trTaskProgressRepository;
@Autowired
private TrTaskProgressMapper trTaskProgressMapper;
@Autowired
private RedisUtils redisUtils;
@Override
public TrTaskProgressDTO findById(Long id) {
TrTaskProgress TrTaskProgress = this.trTaskProgressRepository.findById(id).orElseGet(TrTaskProgress::new);
ValidationUtil.isNull(TrTaskProgress.getId(),"TrTaskProgress","id",id);
return this.trTaskProgressMapper.toDto(TrTaskProgress);
}
@Override
@Transactional(rollbackFor = Exception.class)
@Cacheable(cacheNames = RedisKeyConstants.cacheTaskProcessByMemberId, key = "#resources.memberId+':'+#resources.taskId+':'+#date", unless = "#result == null ")
// @CachePut(cacheNames = RedisKeyConstants.cacheTaskProcessByMemberId, key = "#resources.memberId+':'+#resources.taskId+':'+#date", unless = "#result == null ")
public TrTaskProgress create(TrTaskProgress resources, String date) {
TrTaskProgress trTaskProgress = this.trTaskProgressRepository.save(resources);
return trTaskProgress;
return this.trTaskProgressRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
@Cacheable(cacheNames = RedisKeyConstants.cacheTaskProcessByMemberId, key = "#resources.memberId+':'+#resources.taskId+':'+#date", unless = "#result == null ")
// @CachePut(cacheNames = RedisKeyConstants.cacheTaskProcessByMemberId, key = "#resources.memberId+':'+#resources.taskId+':'+#date", unless = "#result == null ")
public TrTaskProgress update(TrTaskProgress resources, String date) {
TrTaskProgress trTaskProgress = this.trTaskProgressRepository.findById(resources.getId()).orElseGet(TrTaskProgress::new);
ValidationUtil.isNull( trTaskProgress.getId(),"TrTaskProgress","id",resources.getId());
trTaskProgress.copy(resources);
TrTaskProgress save = this.trTaskProgressRepository.save(trTaskProgress);
return save;
return this.trTaskProgressRepository.save(resources);
}
@Override
......@@ -71,12 +73,68 @@ public class TrTaskProgressServiceImpl implements TrTaskProgressService {
}
@Override
@Cacheable(cacheNames = RedisKeyConstants.cacheTaskProcessByMemberId, key = "#memberId+':'+#taskId+':'+#time1", unless = "#result == null")
public TrTaskProgressDTO findByMemberIdAndTaskIdAndCompletionTime(Long memberId, Long taskId, String time1) {
// @Cacheable(cacheNames = RedisKeyConstants.cacheTaskProcessByMemberId, key = "#memberId+':'+#taskId+':'+#time1", unless = "#result.id == null")
public TrTaskProgress findByMemberIdAndTaskIdAndCompletionTime(Long memberId, Long taskId, String time1) {
log.info("从数据库查询当前会员今天是否完成了此任务, memberId ==>> {} || taskId ==>> {}", memberId, taskId);
return this.trTaskProgressMapper.toDto(this.trTaskProgressRepository.findByMemberIdAndTaskIdAndCompletionTime(memberId,taskId,time1));
return this.trTaskProgressRepository.findByMemberIdAndTaskIdAndCompletionTime(memberId, taskId, time1).orElseGet(TrTaskProgress::new);
}
@Override
public Integer countByMemberIdAndTaskId(Long memberId, Long taskId) {
return this.trTaskProgressRepository.countByMemberIdAndTaskId(memberId, taskId);
}
@Override
public Map<Object, Object> countTotalFinishTaskByMemberId(Long memberId) {
Map<Object, Object> hmget = this.redisUtils.hmget(RedisKeyConstants.cacheTotalFinishTaskCount + "::" + memberId);
if (Objects.isNull(hmget)) {
List<Map<String, Object>> maps = this.trTaskProgressRepository.countFinishTaskGroupByMemberId(memberId);
if (!CollectionUtils.isEmpty(maps)) {
Map<Object, Object> finishTasks = new HashMap<>();
for (Map<String, Object> map : maps) {
Object taskId = map.get("taskId");
if (Objects.isNull(taskId)) {
continue;
}
finishTasks.put(Long.valueOf(taskId.toString()), Integer.valueOf(map.get("finishCount").toString()));
// 总记录一直存储
this.redisUtils.hmset(RedisKeyConstants.cacheTotalFinishTaskCount + "::" + memberId, finishTasks);
}
return finishTasks;
}
}
return hmget;
}
@Override
public Map<Object, Object> countTodayFinishTaskByMemberId(Long memberId, String todayStart) {
Map<Object, Object> hmget = this.redisUtils.hmget(RedisKeyConstants.cacheTodayFinishTaskCount + "::" + memberId + ":" + todayStart);
if (Objects.isNull(hmget)) {
List<Map<String, Object>> maps = this.trTaskProgressRepository.countFinishTaskGroupByMemberIdAndToday(memberId, todayStart);
if (!CollectionUtils.isEmpty(maps)){
Map<Object, Object> finishTasks = new HashMap<>();
for (Map<String, Object> map : maps) {
Object taskId = map.get("taskId");
if (Objects.isNull(taskId)) {
continue;
}
finishTasks.put(Long.valueOf(taskId.toString()), Integer.valueOf(map.get("finishCount").toString()));
// 单天的记录只存储一天
this.redisUtils.hmset(RedisKeyConstants.cacheTodayFinishTaskCount + "::" + memberId + ":" + LocalDate.now(), finishTasks, 24*60*60);
}
return finishTasks;
}
}
return hmget;
}
}
......
......@@ -28,6 +28,6 @@ public interface TaskRepository extends JpaRepository<Task, Long>, JpaSpecificat
@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 " +
" WHERE ta.`status` = 1 AND ta.valid_time <= now() and ta.expire_time >= now() AND ta.delete_mark = 0 AND " +
" tm.type = ?1 ", nativeQuery = true)
List<Task> findByEvent(Integer event);
" tm.type = ?1 AND ta.`member_level` <= ?2 and ta.`member_vip` <= ?3", nativeQuery = true)
List<Task> findByEvent(Integer event, Integer level, Integer vip);
}
......
package com.topdraw.business.module.task.service;
import com.topdraw.business.module.member.service.dto.MemberSimpleDTO;
import com.topdraw.business.module.task.domain.Task;
import com.topdraw.business.module.task.progress.service.dto.TrTaskProgressDTO;
import com.topdraw.business.module.task.service.dto.TaskDTO;
......@@ -63,6 +64,6 @@ public interface TaskService {
* @param event
* @return
*/
List<Task> findByEvent(Integer event);
List<Task> findByEventAndMemberLevelAndVip(Integer event, Integer level, Integer vip);
}
......
package com.topdraw.business.module.task.service.impl;
import com.topdraw.business.module.member.service.dto.MemberSimpleDTO;
import com.topdraw.business.module.task.domain.Task;
import com.topdraw.business.module.task.repository.TaskRepository;
import com.topdraw.business.module.task.service.TaskService;
import com.topdraw.business.module.task.service.dto.TaskDTO;
import com.topdraw.business.module.task.service.mapper.TaskMapper;
import com.topdraw.config.RedisKeyConstants;
import com.topdraw.utils.RedisUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
......@@ -30,6 +33,8 @@ public class TaskServiceImpl implements TaskService {
private TaskMapper taskMapper;
@Autowired
private TaskRepository taskRepository;
@Autowired
private RedisUtils redisUtils;
@Override
public TaskDTO findById(Long id) {
......@@ -72,9 +77,10 @@ public class TaskServiceImpl implements TaskService {
}
@Override
@Cacheable(value = RedisKeyConstants.cacheTaskByEvent, key = "#event" , unless = "#result.size() == 0")
public List<Task> findByEvent(Integer event) {
log.info("从数据库查询事件列表 ==>> {}", event);
return Objects.nonNull(event) ? this.taskRepository.findByEvent(event) : new ArrayList<>();
@Cacheable(cacheNames = RedisKeyConstants.cacheTaskByEventAndMemberLevelAndVip, key = "#event+':'+#level+':'+#vip",
unless = "#result.size() == 0")
public List<Task> findByEventAndMemberLevelAndVip(Integer event, Integer level, Integer vip) {
List<Task> tasks = this.taskRepository.findByEvent(event, level, vip);
return Objects.nonNull(event) ? tasks : new ArrayList<>();
}
}
......
package com.topdraw.business.module.user.iptv.domain;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.topdraw.business.module.common.domain.AsyncMqModule;
import com.topdraw.business.module.common.validated.CreateGroup;
import com.topdraw.business.module.common.validated.UpdateGroup;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.sql.Timestamp;
/**
* @author XiangHan
* @date 2021-12-16
*/
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_user_tv")
public class UserTvSimple extends AsyncMqModule implements Serializable {
/** ID */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
/** 会员id */
@Column(name = "member_id")
private Long memberId;
/** 原vis_user_id */
@Column(name = "vis_user_id")
private Long visUserId;
/** 绑定的小屏账户会员编码 */
@Column(name = "priority_member_code")
private String priorityMemberCode;
public void copy(UserTvSimple source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(false));
}
}
package com.topdraw.business.module.user.iptv.repository;
import com.topdraw.business.module.user.iptv.domain.UserTv;
import com.topdraw.business.module.user.iptv.service.dto.UserTvSimpleDTO;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
......
package com.topdraw.business.module.user.iptv.repository;
import com.topdraw.business.module.user.iptv.domain.UserTvSimple;
import com.topdraw.business.module.user.iptv.service.dto.UserTvSimpleDTO;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
/**
* @author XiangHan
* @date 2021-12-16
*/
public interface UserTvSimpleRepository extends JpaRepository<UserTvSimple, Long>, JpaSpecificationExecutor<UserTvSimple> {
@Query(value = "SELECT `id`, `vis_user_id` , `member_id` , " +
" `priority_member_code` FROM `uc_user_tv` WHERE `platform_account` = ?1", nativeQuery = true)
UserTvSimple findSimpleByPlatformAccount(String platformAccount);
}
......@@ -3,6 +3,7 @@ package com.topdraw.business.module.user.iptv.service;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.user.iptv.domain.UserTv;
import com.topdraw.business.module.user.iptv.service.dto.UserTvDTO;
import com.topdraw.business.module.user.iptv.service.dto.UserTvSimpleDTO;
/**
* @author XiangHan
......@@ -51,6 +52,13 @@ public interface UserTvService {
/**
*
* @param platformAccount
* @return
*/
UserTvSimpleDTO findSimpleByPlatformAccount(String platformAccount);
/**
*
* @param memberCode
* @return
*/
......
package com.topdraw.business.module.user.iptv.service.dto;
import lombok.Data;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2021-12-16
*/
@Data
public class UserTvSimpleDTO implements Serializable {
private Long visUserId;
/** 绑定的小屏账户会员编码 */
private String priorityMemberCode;
/** 会员id */
private Long memberId;
private String platformAccount;
}
package com.topdraw.business.module.user.iptv.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.user.iptv.domain.UserTv;
import com.topdraw.business.process.service.impl.UserOperationServiceImpl;
import com.topdraw.business.module.user.iptv.domain.UserTvSimple;
import com.topdraw.business.module.user.iptv.repository.UserTvSimpleRepository;
import com.topdraw.business.module.user.iptv.service.dto.UserTvSimpleDTO;
import com.topdraw.business.module.user.iptv.service.mapper.UserTvSimpleMapper;
import com.topdraw.config.RedisKeyConstants;
import com.topdraw.exception.EntityNotFoundException;
import com.topdraw.exception.GlobeExceptionMsg;
import com.topdraw.utils.RedisUtils;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.user.iptv.repository.UserTvRepository;
import com.topdraw.business.module.user.iptv.service.UserTvService;
......@@ -16,6 +21,7 @@ import com.topdraw.business.module.user.iptv.service.mapper.UserTvMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
......@@ -25,6 +31,8 @@ import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.util.Assert;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
......@@ -41,9 +49,16 @@ public class UserTvServiceImpl implements UserTvService {
@Autowired
private UserTvMapper userTvMapper;
@Autowired
private UserTvSimpleMapper userTvSimpleMapper;
@Autowired
private MemberService memberService;
@Autowired
private UserTvRepository userTvRepository;
@Autowired
private UserTvSimpleRepository userTvSimpleRepository;
@Autowired
private RedisUtils redisUtils;
@AsyncMqSend
public void asyncUpdateUserTvVisUserId(UserTvDTO userTvDTO) {}
......@@ -57,6 +72,7 @@ public class UserTvServiceImpl implements UserTvService {
* @return
*/
@Override
@Transactional(readOnly = true)
public MemberDTO findMemberByPlatformAccount(String platformAccount){
// 大屏账户
UserTvDTO userTvDTO = this.findByPlatformAccount(platformAccount);
......@@ -119,6 +135,7 @@ public class UserTvServiceImpl implements UserTvService {
}
@Override
@Transactional(readOnly = true)
public UserTvDTO findById(Long id) {
UserTv UserTv = this.userTvRepository.findById(id).orElseGet(UserTv::new);
ValidationUtil.isNull(UserTv.getId(),"UserTv","id",id);
......@@ -169,18 +186,39 @@ public class UserTvServiceImpl implements UserTvService {
}
@Override
@Cacheable(cacheNames = RedisKeyConstants.cacheUserTvByPlatformAccount, key = "#platformAccount")
@Cacheable(cacheNames = RedisKeyConstants.cacheUserTvByPlatformAccount, key = "#platformAccount", unless = "#result.id == null")
@Transactional(readOnly = true)
public UserTvDTO findByPlatformAccount(String platformAccount) {
log.info("从数据库通过大屏账号检索大屏账号信息");
Optional<UserTv> userTv = this.userTvRepository.findByPlatformAccount(platformAccount);
if (userTv.isPresent()) {
ValidationUtil.isNull( userTv.get().getId(),"UserTv","id",userTv.get().getId());
return this.userTvMapper.toDto(userTv.get());
UserTv userTv = this.userTvRepository.findByPlatformAccount(platformAccount).orElseGet(UserTv::new);
return this.userTvMapper.toDto(userTv);
}
@Override
// @Cacheable(cacheNames = RedisKeyConstants.cacheUserTvByPlatformAccount, key = "#platformAccount")
public UserTvSimpleDTO findSimpleByPlatformAccount(String platformAccount) {
Object userTvSimpleObj = this.redisUtils.get(RedisKeyConstants.cacheVisUserByPlatformAccount + "::" + platformAccount);
if (Objects.nonNull(userTvSimpleObj)) {
Map<String, Object> map = (Map<String, Object>)userTvSimpleObj;
UserTvSimpleDTO userTvSimpleDTO = new UserTvSimpleDTO();
userTvSimpleDTO.setPlatformAccount(map.get("platformAccount").toString());
userTvSimpleDTO.setMemberId(Long.valueOf(map.get("memberId").toString()));
userTvSimpleDTO.setPriorityMemberCode(map.get("priorityMemberCode") == null ? "" : map.get("priorityMemberCode").toString());
return userTvSimpleDTO;
}
UserTvSimple userTvSimple = this.userTvSimpleRepository.findSimpleByPlatformAccount(platformAccount);
if (Objects.nonNull(userTvSimple)) {
HashMap hashMap = JSONObject.parseObject(userTvSimple.toString(), HashMap.class);
this.redisUtils.set(RedisKeyConstants.cacheVisUserByPlatformAccount + "::" + platformAccount, hashMap);
return this.userTvSimpleMapper.toDto(userTvSimple);
}
return null;
}
@Override
@Transactional(readOnly = true)
public UserTvDTO findByPriorityMemberCode(String memberCode) {
Optional<UserTv> userTv = this.userTvRepository.findByPriorityMemberCode(memberCode);
if (userTv.isPresent()) {
......@@ -191,6 +229,7 @@ public class UserTvServiceImpl implements UserTvService {
}
@Override
@Transactional(readOnly = true)
public UserTvDTO findByMemberId(Long memberId) {
Optional<UserTv> userTv = this.userTvRepository.findByMemberId(memberId);
if (userTv.isPresent()) {
......@@ -201,6 +240,7 @@ public class UserTvServiceImpl implements UserTvService {
}
@Override
@Transactional(readOnly = true)
public boolean checkPriorityMemberByMemberIdOrMemberCode(Long memberId, String memberCode) {
// 检查会员是否存在
this.checkMember(memberId, memberCode);
......
package com.topdraw.business.module.user.iptv.service.mapper;
import com.topdraw.base.BaseMapper;
import com.topdraw.business.module.user.iptv.domain.UserTv;
import com.topdraw.business.module.user.iptv.domain.UserTvSimple;
import com.topdraw.business.module.user.iptv.service.dto.UserTvSimpleDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
/**
* @author XiangHan
* @date 2021-12-16
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface UserTvSimpleMapper extends BaseMapper<UserTvSimpleDTO, UserTvSimple> {
}
......@@ -35,6 +35,9 @@ public class TempRights {
@Transient
protected String memberCode;
@Transient
protected Integer memberLevel;
/** 账号id */
@Transient
protected Long userId;
......
......@@ -51,7 +51,7 @@ public class TaskOperationController {
/**
* 新增任务
*
*uc_tr_task_progress
* @param task 消息
*/
@PostMapping(value = "/createTask")
......
......@@ -473,8 +473,12 @@ public class UserOperationController {
@ApiOperation("保存大屏账户同时创建会员信息")
@AnonymousAccess
public ResultInfo createTvUserAndMember(@Validated(value = {CreateGroup.class}) @RequestBody UserTv resources) {
log.info("UserOperationController ==> createUserAndCreateMember ==>> param ==> [{}]",resources);
log.info("UserOperationController ==> createTvUserAndMember ==>> param ==> [{}]",resources);
String platformAccount = resources.getPlatformAccount();
if (StringUtils.isBlank(platformAccount)) {
log.error("保存大屏账户同时创建会员信息异常,参数错误,大屏账号不存在");
return ResultInfo.failure("参数错误,大屏账号不存在");
}
UserTvDTO result = this.userOperationService.createTvUserAndMember(resources);
return ResultInfo.success(result);
}
......
package com.topdraw.business.process.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/6/22 14:05
* @version: :
* @modified By:
* @since : modified in 2022/6/22 14:05
*/
@Service
@Slf4j
public class AsyncTaskService {
}
......@@ -23,5 +23,5 @@ public interface RightsOperationService {
* 任务完成自动发放权益
* @param tempRightsMap
*/
void grantRights(Map<RightType, Object> tempRightsMap);
Integer grantRights(Map<RightType, Object> tempRightsMap);
}
......
......@@ -19,6 +19,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
......@@ -43,6 +44,9 @@ public class CouponOperationServiceImpl implements CouponOperationService {
MemberService memberService;
@Autowired
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
@Autowired
private RedisUtils redisUtils;
// 过期阀值(默认一个月)
......@@ -137,7 +141,9 @@ public class CouponOperationServiceImpl implements CouponOperationService {
member.setUpdateTime(TimestampUtil.now());
this.memberOperationService.doUpdateMemberCoupon(member);
/*this.threadPoolTaskExecutor.submit(() -> {
((CouponOperationServiceImpl) AopContext.currentProxy()).asyncMemberCoupon(member);
});*/
}
private MemberDTO findMemberByMemberId(Long memberId) {
......
......@@ -20,6 +20,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
......@@ -43,6 +44,9 @@ public class ExpOperationServiceImpl implements ExpOperationService {
MemberService memberService;
@Autowired
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
@Autowired
private RedisUtils redisUtils;
@AsyncMqSend
......@@ -80,21 +84,27 @@ public class ExpOperationServiceImpl implements ExpOperationService {
this.redisUtils.doLock(RedisKeyConstants.updateCacheExpByMemberId + tempExp.getMemberId());
// 原始经验值
long l = System.currentTimeMillis();
long originExp = this.getExpByMemberId(tempExp);
log.info("----获取会员当前原始经验值 ==>> {}", originExp);
long l1 = System.currentTimeMillis();
log.info("----获取会员当前原始经验值 ==>> {}, 总耗时 -->> {}", originExp, (l1-l));
// 总经验值
// TODO
long totalExp = this.calculateTotalExp(originExp, tempExp);
log.info("----计算总经验值 ==>> {}", totalExp);
// 2.更新成长值与等级
log.info("----更新会员经验值与对应等级 ==>> {}", totalExp);
long l2 = System.currentTimeMillis();
this.refreshMemberExpAndLevel(tempExp, totalExp);
long l3 = System.currentTimeMillis();
log.info("----更新会员经验值与对应等级 ==>> {}, 总耗时 ==>> {}", totalExp, (l3-l2));
log.info("----保存经验值历史 ");
long l4 = System.currentTimeMillis();
this.doInsertExpDetail(tempExp, originExp, totalExp);
long l5 = System.currentTimeMillis();
log.info("----保存经验值历史 -->> 总耗时 -->> {}", (l5-l4));
} catch (Exception e) {
log.error("成长值发放失败,"+e.getMessage());
log.error("成长值发放失败,{}",e.getMessage());
} finally {
this.redisUtils.doUnLock(RedisKeyConstants.updateCacheExpByMemberId + tempExp.getMemberId());
}
......@@ -112,8 +122,8 @@ public class ExpOperationServiceImpl implements ExpOperationService {
*/
private long getExpByMemberId(TempExp tempExp) {
Long memberId = tempExp.getMemberId();
MemberDTO memberDTO = this.memberOperationService.findById(memberId);
if (Objects.nonNull(memberDTO)) {
MemberDTO memberDTO = this.memberService.findById(memberId);
if (Objects.nonNull(memberDTO.getId())) {
Long exp = memberDTO.getExp();
return Objects.isNull(exp) ? 0L : exp;
}
......@@ -127,13 +137,13 @@ public class ExpOperationServiceImpl implements ExpOperationService {
*/
private void refreshMemberExpAndLevel(TempExp tempExp,long totalExp) {
Integer memberLevel = tempExp.getMemberLevel();
Long memberId = tempExp.getMemberId();
// 1.获取当前成长值
MemberDTO memberDTO = this.getMemberInfoByMemberId(memberId);
// 2.获取下一级需要的成长值
MemberLevelDTO memberLevelDTO = this.getNextLevelExp(memberDTO.getLevel() + 1, 1);
// TODO 需要缓存
MemberLevelDTO memberLevelDTO = this.getNextLevelExp(memberLevel + 1, 1);
// 4.成长值比较,判断是否升级
Integer level = this.compareExp(totalExp, memberLevelDTO,memberDTO);
Integer level = this.compareExp(totalExp, memberLevelDTO, memberLevel);
// 5.更新用户信息
this.updateMemberInfo(level, totalExp, memberId);
}
......@@ -154,8 +164,9 @@ public class ExpOperationServiceImpl implements ExpOperationService {
member.setLevel(level);
member.setUpdateTime(TimestampUtil.now());
this.memberOperationService.doUpdateMemberExpAndLevel(member);
/*this.threadPoolTaskExecutor.submit(() -> {
((ExpOperationServiceImpl) AopContext.currentProxy()).asyncMemberExpAndLevel(member);
});*/
}
private MemberDTO findMemberByMemberId(Long memberId) {
......@@ -163,7 +174,7 @@ public class ExpOperationServiceImpl implements ExpOperationService {
return memberDTO;
}
private Integer compareExp(long newExp, MemberLevelDTO memberLevelDTO,MemberDTO memberDTO) {
private Integer compareExp(long newExp, MemberLevelDTO memberLevelDTO, Integer oldMemberLevel) {
if (Objects.nonNull(memberLevelDTO)) {
Long nextLevelExp = memberLevelDTO.getExpValue();
if (Objects.nonNull(nextLevelExp) && nextLevelExp > 0)
......@@ -171,11 +182,11 @@ public class ExpOperationServiceImpl implements ExpOperationService {
return memberLevelDTO.getLevel();
}
}
return memberDTO.getLevel();
return oldMemberLevel;
}
private MemberLevelDTO getNextLevelExp(Integer i,Integer status) {
List<MemberLevelDTO> memberLevelDTOList = this.memberLevelService.findLevelAndStatus(i,status);
List<MemberLevelDTO> memberLevelDTOList = this.memberLevelService.findLevelAndStatus(i, status);
if (!CollectionUtils.isEmpty(memberLevelDTOList)) {
return memberLevelDTOList.get(0);
}
......@@ -217,8 +228,9 @@ public class ExpOperationServiceImpl implements ExpOperationService {
}
this.expDetailService.create(expDetail);
/*this.threadPoolTaskExecutor.submit(() -> {
((ExpOperationServiceImpl) AopContext.currentProxy()).asyncExpDetail(expDetail);
});*/
}
}
......
......@@ -52,22 +52,19 @@ import java.util.stream.Collectors;
public class PointsOperationServiceImpl implements PointsOperationService {
@Autowired
private PointsService pointsService;
@Autowired
private PointsDetailService pointsDetailService;
@Autowired
private PointsAvailableService pointsAvailableService;
@Autowired
private PointsDetailHistoryService pointsDetailHistoryService;
@Autowired
private MemberOperationService memberOperationService;
@Autowired
private MemberService memberService;
@Autowired
private RedisUtils redisUtils;
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
@Autowired
ThreadPoolTaskExecutor threadPoolTaskExecutor;
private RedisUtils redisUtils;
// 过期阈值 30天
private static final Integer EXPIRE_FACTOR = 30;
......@@ -200,6 +197,7 @@ public class PointsOperationServiceImpl implements PointsOperationService {
long currentPoints) {
// 兑换的积分
Long points = tempPoints.getPoints();
String memberCode = tempPoints.getMemberCode();
List<PointsAvailableDTO> pointsAvailableDTOS = customAvailablePointsMap.get(DELETE_AVAILABLE_POINTS);
......@@ -211,9 +209,9 @@ public class PointsOperationServiceImpl implements PointsOperationService {
BeanUtils.copyProperties(pointsAvailableDTO, _tempPoints);
BeanUtils.copyProperties(tempPoints, _tempPoints);
_tempPoints.setPoints(-(Math.abs(points)));
Long totalPoints = this.calculateTotalPoints(_tempPoints, currentPoints);
Long totalPoints = currentPoints + tempPoints.getPoints();
this.doInsertTrPointsDetail(memberId, _tempPoints, currentPoints, totalPoints);
this.doInsertTrPointsDetail(memberId, memberCode, _tempPoints, currentPoints, totalPoints);
}
}
......@@ -429,39 +427,47 @@ public class PointsOperationServiceImpl implements PointsOperationService {
*
* @param tempPoints 积分
*/
private void refresh(TempPoints tempPoints) {
Long memberId = tempPoints.getMemberId();
String memberCode = tempPoints.getMemberCode();
log.info("----------->> 会员id ===>>>>" + memberId);
try {
this.redisUtils.doLock(RedisKeyConstants.updateCachePointsByMemberId + memberId.toString());
// 1.可用总积分
long l = System.currentTimeMillis();
Long currentPoints = this.findAvailablePointsByMemberId(memberId);
log.info("----------->> 获取会员当前可用总积分 --->>>> {}", currentPoints);
long l1 = System.currentTimeMillis();
// log.info("查询大屏信息,总耗时 ==>> {}", (l1-l));
log.info("----------->> 获取会员当前可用总积分 --->>>> {}, 总耗时 ==>> {}", currentPoints, (l1-l));
// 2.计算总积分
Long totalPoints = this.calculateTotalPoints(tempPoints, currentPoints);
Long totalPoints = currentPoints + tempPoints.getPoints();
log.info("----------->> 总积分(可用总积分+获得的积分) --->>> {}", totalPoints);
// 3.添加积分明细
this.doInsertTrPointsDetail(memberId, tempPoints, currentPoints, totalPoints);
log.info("----------->> 添加积分明细 --->>> ");
long l2 = System.currentTimeMillis();
this.doInsertTrPointsDetail(memberId, memberCode, tempPoints, currentPoints, totalPoints);
long l3 = System.currentTimeMillis();
log.info("----------->> 添加积分明细 --->>> 总耗时 ==>> {}", (l3-l2));
// 4.添加可用积分
long l4 = System.currentTimeMillis();
this.doInsertTrPointsAvailable(tempPoints);
log.info("----------->> 添加可用积分 -->>> ");
long l5 = System.currentTimeMillis();
log.info("----------->> 添加可用积分 -->>> 总耗时 ==>> {}", (l5-l4));
// 5.即将过期的积分
// TODO 查询的时候再更新过期积分
long soonExpirePoints = this.getSoonExpirePoints(memberId, tempPoints);
log.info("----------->> 即将过期的积分 ------->>>>> {}", soonExpirePoints);
// 6.更新会员的总积分
log.info("----------->> 更新会员的总积分 ------->>>>> 总积分--->>> {}", totalPoints);
long l6 = System.currentTimeMillis();
this.freshMemberCurrentPoints(memberId, totalPoints, soonExpirePoints);
long l7 = System.currentTimeMillis();
log.info("----------->> 更新会员的总积分 ------->>>>> 总积分--->>> {} -->>总耗时 ==>> {}", totalPoints, (l7-l6));
} catch (Exception e) {
e.printStackTrace();
throw e;
log.error(" ==>> {}", e.getMessage());
} finally {
this.redisUtils.doUnLock(RedisKeyConstants.updateCachePointsByMemberId + memberId.toString());
}
......@@ -477,7 +483,7 @@ public class PointsOperationServiceImpl implements PointsOperationService {
// 获取的积分
Long rewardPoints = tempPoints.getPoints();
// 总积分
Long totalPoints = currentPoints + rewardPoints;
Long totalPoints = currentPoints + tempPoints.getPoints();
return totalPoints;
}
......@@ -514,7 +520,7 @@ public class PointsOperationServiceImpl implements PointsOperationService {
*/
private void freshMemberCurrentPoints(Long memberId, Long currentPoints, long duePoints) {
MemberDTO memberDTO = this.findMemberByMemberId(memberId);
MemberDTO memberDTO = this.memberService.findById(memberId);
Member member = new Member();
member.setId(memberDTO.getId());
......@@ -525,17 +531,14 @@ public class PointsOperationServiceImpl implements PointsOperationService {
try {
this.memberOperationService.doUpdateMemberPoints(member);
/*this.threadPoolTaskExecutor.submit(() -> {
((PointsOperationServiceImpl) AopContext.currentProxy()).asyncMemberPoint(member);
});*/
} catch (Exception e){
log.error("同步会员积分异常,"+e.getMessage());
}
}
private MemberDTO findMemberByMemberId(Long memberId) {
MemberDTO memberDTO = this.memberService.findById(memberId);
return memberDTO;
}
/**
* 更新可用积分表
* @param tempPoints
......@@ -554,8 +557,9 @@ public class PointsOperationServiceImpl implements PointsOperationService {
}
this.pointsAvailableService.create4Custom(pointsAvailable);
/*this.threadPoolTaskExecutor.submit(() -> {
((PointsOperationServiceImpl) AopContext.currentProxy()).asyncPointsAvailable(pointsAvailable);
});*/
}
/**
......@@ -564,15 +568,13 @@ public class PointsOperationServiceImpl implements PointsOperationService {
* @param tempPoints 积分
* @return Integer 总积分
*/
private void doInsertTrPointsDetail(Long memberId, TempPoints tempPoints, Long currentPoints, Long totalPoints){
MemberDTO memberDTO = this.memberService.findById(memberId);
private void doInsertTrPointsDetail(Long memberId, String memberCode, TempPoints tempPoints, Long currentPoints, Long totalPoints){
PointsDetail pointsDetail = new PointsDetail();
BeanUtils.copyProperties(tempPoints, pointsDetail);
pointsDetail.setId(null);
pointsDetail.setMemberId(memberId);
pointsDetail.setMemberCode(memberDTO.getCode());
pointsDetail.setMemberCode(memberCode);
pointsDetail.setCode(String.valueOf(IdWorker.generator()));
pointsDetail.setPoints(tempPoints.getPoints());
pointsDetail.setOriginalPoints(currentPoints);
......@@ -587,7 +589,9 @@ public class PointsOperationServiceImpl implements PointsOperationService {
// 保存积分流水
this.pointsDetailService.create4Custom(pointsDetail);
/*this.threadPoolTaskExecutor.submit(() -> {
((PointsOperationServiceImpl) AopContext.currentProxy()).asyncPointsDetail(pointsDetail);
});*/
}
}
......
......@@ -21,8 +21,12 @@ import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.sql.Timestamp;
import java.util.*;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
/**
* 权益处理
......@@ -71,20 +75,23 @@ public class RightsOperationServiceImpl implements RightsOperationService {
* @param tempRightsMap 权益类型
*/
@Override
public void grantRights(Map<RightType, Object> tempRightsMap) {
public Integer grantRights(Map<RightType, Object> tempRightsMap) {
this.threadPoolTaskExecutor.execute(()-> {
// 2.创建权益历史对象
List<RightsHistory> rightsList = this.getRightHistory(tempRightsMap);
if (!CollectionUtils.isEmpty(rightsList)) {
log.info("异步保存权益领取历史开始 ==>> [{}]", rightsList);
// log.info("异步保存权益领取历史开始 ==>> [{}]", rightsList);
long l = System.currentTimeMillis();
// 3.保存权益历史
this.doInsertTrRightHistory(rightsList);
long l1 = System.currentTimeMillis();
log.info("保存权益历史,总耗时 ==>> {}", l1-l);
}
});
// 1.权益下发
this.refresh(tempRightsMap);
return this.refresh(tempRightsMap);
}
/**
......@@ -141,28 +148,29 @@ public class RightsOperationServiceImpl implements RightsOperationService {
this.couponOperationService.grantCouponThroughTempCoupon(tempCouponList);
}
/**
* 权益发放
* @param tempRightsMap
*/
private void refresh(Map<RightType, Object> tempRightsMap) {
private Integer refresh(Map<RightType, Object> tempRightsMap) {
this.threadPoolTaskExecutor.execute(() -> {
// Future<?> submit = this.threadPoolTaskExecutor.submit(() -> {
List<TempPoints> tempPointsList = (List<TempPoints>) tempRightsMap.get(RightType.POINTS);
if (!CollectionUtils.isEmpty(tempPointsList)) {
log.info("发放积分开始 ==>> [{}]", tempPointsList);
// log.info("发放积分开始 ==>> [{}]", tempPointsList);
long l = System.currentTimeMillis();
// 积分
this.grantPoint(tempPointsList);
long l2 = System.currentTimeMillis();
log.info("发放积分结束,总耗时 ==>> {}", (l2 - l));
}
});
// });
this.threadPoolTaskExecutor.execute(()-> {
this.threadPoolTaskExecutor.submit(() -> {
List<TempExp> tempExpList = (List<TempExp>) tempRightsMap.get(RightType.EXP);
if (!CollectionUtils.isEmpty(tempExpList)) {
log.info("发放成长值开始 ==>> [{}]", tempExpList);
// log.info("发放成长值开始 ==>> [{}]", tempExpList);
long l = System.currentTimeMillis();
// 成长值
this.grantExp(tempExpList);
......@@ -171,25 +179,30 @@ public class RightsOperationServiceImpl implements RightsOperationService {
}
});
this.threadPoolTaskExecutor.execute(()-> {
List<TempCoupon> tempCouponList = (List<TempCoupon>) tempRightsMap.get(RightType.COUPON);
// this.threadPoolTaskExecutor.submit(() -> {
/*List<TempCoupon> tempCouponList = (List<TempCoupon>) tempRightsMap.get(RightType.COUPON);
if (!CollectionUtils.isEmpty(tempCouponList)) {
log.info("发放优惠券开始 ==>> [{}]", tempCouponList);
// log.info("发放优惠券开始 ==>> [{}]", tempCouponList);
long l = System.currentTimeMillis();
// 优惠券
this.grantCoupon(tempCouponList);
long l2 = System.currentTimeMillis();
log.info("发放优惠券结束,总耗时 ==>> {}", (l2 - l));
}
});
}*/
// });
// 其他权益
this.threadPoolTaskExecutor.execute(()-> {
log.info("发放其他权益开始 ==>> [{}]", tempRightsMap);
// Future<?> submit = this.threadPoolTaskExecutor.submit(() -> {
// log.info("发放其他权益开始 ==>> [{}]", tempRightsMap);
long l = System.currentTimeMillis();
this.grantOtherRight(tempRightsMap);
log.info("发放其他权益结束 ==>> [{}]", tempRightsMap);
});
long l2 = System.currentTimeMillis();
log.info("发放其他权益结束 ==>> 总耗时 ==>> {}", l-l2);
// });
return tempRightsMap.keySet().size();
}
private void grantOtherRight(Map<RightType, Object> tempRightsMap) {
......
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;
import com.topdraw.business.module.coupon.service.dto.CouponDTO;
import com.topdraw.business.module.member.group.service.MemberGroupService;
import com.topdraw.business.module.member.group.service.dto.MemberGroupDTO;
import com.topdraw.business.module.member.service.dto.MemberSimpleDTO;
import com.topdraw.business.module.rights.service.RightsService;
import com.topdraw.business.module.rights.service.dto.RightsDTO;
import com.topdraw.business.module.task.attribute.domain.TaskAttr;
......@@ -16,13 +14,12 @@ import com.topdraw.business.module.task.attribute.service.dto.TaskAttrDTO;
import com.topdraw.business.module.task.domain.TaskBuilder;
import com.topdraw.business.module.task.progress.domain.TrTaskProgress;
import com.topdraw.business.module.task.progress.service.TrTaskProgressService;
import com.topdraw.business.module.task.progress.service.dto.TrTaskProgressDTO;
import com.topdraw.business.module.task.service.dto.TaskDTO;
import com.topdraw.business.module.task.template.service.dto.TaskTemplateDTO;
import com.topdraw.business.module.user.iptv.domain.UserTv;
import com.topdraw.business.module.user.iptv.service.UserTvService;
import com.topdraw.business.module.user.iptv.service.dto.UserTvDTO;
import com.topdraw.business.process.domian.constant.TaskTemplateType;
import com.topdraw.business.module.user.iptv.service.dto.UserTvSimpleDTO;
import com.topdraw.business.module.rights.constant.RightType;
import com.topdraw.business.process.service.PointsOperationService;
import com.topdraw.business.process.service.RightsOperationService;
......@@ -31,7 +28,6 @@ import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.task.domain.Task;
import com.topdraw.business.module.task.service.TaskService;
import com.topdraw.business.module.task.template.domain.TaskTemplate;
import com.topdraw.business.module.task.template.service.TaskTemplateService;
import com.topdraw.business.process.domian.*;
import com.topdraw.business.process.service.UserOperationService;
......@@ -50,10 +46,8 @@ import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
......@@ -63,7 +57,6 @@ import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.TimeUnit;
import static java.util.stream.Collectors.toList;
/**
* 任务处理
......@@ -89,35 +82,21 @@ public class TaskOperationServiceImpl implements TaskOperationService {
@Autowired
private TaskAttrService taskAttrService;
@Autowired
private MemberGroupService memberGroupService;
@Autowired
private TaskTemplateService taskTemplateService;
@Autowired
private TrTaskProgressService trTaskProgressService;
@Autowired
private RightsOperationService rightsOperationService;
@Autowired
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
private RedisUtils redisUtils;
@Value("${uc.validPriorityMember}")
private int validPriorityMember;
private static final Integer TASK_FINISH_STATUS = 1;
private static final Integer TASK_UNFINISH_STATUS = 2;
private static final Integer POINTS_TYPE_RANDOM = 1;
private static final Integer POINTS_MIN = 1;
@AsyncMqSend
public void asyncCreateTask(Task task) {}
@AsyncMqSend
public void asyncUpdateTask(Task task) {}
@AsyncMqSend
public void asyncDeleteTask(Task task) {}
@Override
@CacheEvict(cacheNames = RedisKeyConstants.cacheTaskByEvent, key = "#task.event")
public TaskDTO createTask(Task task) {
......@@ -139,12 +118,12 @@ public class TaskOperationServiceImpl implements TaskOperationService {
/**
*
* @param task_
* @param task 任务
*/
private void createTaskAttr(Task task_) {
private void createTaskAttr(Task task) {
TaskAttr taskAttr = new TaskAttr();
taskAttr.setAttrStr(task_.getAttr());
taskAttr.setTaskId(task_.getId());
taskAttr.setAttrStr(task.getAttr());
taskAttr.setTaskId(task.getId());
this.taskAttrService.create(taskAttr);
}
......@@ -166,15 +145,15 @@ public class TaskOperationServiceImpl implements TaskOperationService {
/**
*
* @param task_
* @param task 任务
*/
private void updateTaskAttr(Task task_) {
private void updateTaskAttr(Task task) {
TaskAttrDTO taskAttrDTO = this.findTaskAttrByTaskId(task_.getId());
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(task.getAttr());
this.taskAttrService.update(taskAttr);
}
}
......@@ -223,8 +202,7 @@ public class TaskOperationServiceImpl implements TaskOperationService {
@Override
public TaskDTO findByCode(String code) {
TaskDTO taskDTO = this.taskService.findByCode(code);
return taskDTO;
return this.taskService.findByCode(code);
}
@Override
......@@ -232,54 +210,60 @@ public class TaskOperationServiceImpl implements TaskOperationService {
DataSyncMsg dataSyncMsg = JSONUtil.parseMsg2Object(content, DataSyncMsg.class);
log.info("事件dataSyncMsg ==>> {}", dataSyncMsg);
DataSyncMsg.MsgData msgData = JSON.parseObject(dataSyncMsg.getMsgData(), DataSyncMsg.MsgData.class);
log.info("事件消息体解析后msgData ==>> {}", msgData);
if (Objects.isNull(msgData)) {
if (StringUtils.isBlank(dataSyncMsg.getMsgData())) {
log.error("参数错误,事件消息体为空");
return ResultInfo.failure("参数错误,事件消息体为空");
}
// 小屏侧传递的参数是memberId
Long memberId = msgData.getMemberId();
// 大屏侧传递的参数是platformAccount
String platformAccount = msgData.getPlatformAccount();
JSONObject msgData = JSON.parseObject(dataSyncMsg.getMsgData(), JSONObject.class);
// 参数校验
if (Objects.isNull(memberId) && StringUtils.isBlank(platformAccount)) {
log.error("参数错误,memberId 和 platformAccount 都为null");
return ResultInfo.failure("参数错误");
Object memberIdObj = msgData.get("memberId");
Object platformAccountObj = msgData.get("platformAccount");
if (Objects.isNull(memberIdObj) && Objects.isNull(platformAccountObj)) {
log.error("参数错误,会员id和platformAccount都为空");
return ResultInfo.failure("参数错误,会员id和platformAccount都为空");
}
// 获取会员信息,小屏会员信息通过memberId进行检索,大屏会员信息通过platformAccount进行检索
// 大屏侧传递的参数是platformAccount
MemberSimpleDTO memberDTO = null;
if (Objects.nonNull(memberIdObj)) {
// 小屏侧传递的参数是memberId
memberDTO = this.memberService.findSimpleById(Long.valueOf(memberIdObj.toString()));
} else {
String platformAccount = platformAccountObj.toString();
long l = System.currentTimeMillis();
MemberDTO memberDTO = null;
if (Objects.nonNull(memberId)) {
UserTvSimpleDTO userTvDTO = this.userTvService.findSimpleByPlatformAccount(platformAccount);
long l1 = System.currentTimeMillis();
log.info("查询大屏信息,总耗时 ==>> {}", (l1-l));
memberDTO = this.memberService.findById(memberId);
log.info("获取小屏会员信息 ==>> memberId ==>> {} || 会员信息 ==>> {}",memberId, memberDTO);
if (Objects.nonNull(userTvDTO)) {
} else if (StringUtils.isNotBlank(platformAccount)) {
// 在查找任务之前对用户行为进行预处理
this.preFindTask(platformAccount, dataSyncMsg, msgData);
UserTvDTO userTvDTO = this.userTvService.findByPlatformAccount(platformAccount);
if (Objects.nonNull(userTvDTO.getId())) {
// 开启积分自动同步至小屏主会员
if (validPriorityMember == 0) {
String priorityMemberCode = userTvDTO.getPriorityMemberCode();
if (StringUtils.isNotBlank(priorityMemberCode)) {
// TODO 是否需要将code和id都进行缓存
memberDTO = this.memberService.findByCode(priorityMemberCode);
memberDTO = this.memberService.findSimpleByCode(priorityMemberCode);
log.info("查询绑定的小屏的主会员信息, member ==>> {}", memberDTO);
} else if (Objects.nonNull(userTvDTO.getMemberId())) {
memberDTO = this.memberService.findById(userTvDTO.getMemberId());
log.info("查询大屏自身的会员信息, member ==>> {}", memberDTO);
long l4 = System.currentTimeMillis();
memberDTO = this.memberService.findSimpleById(userTvDTO.getMemberId());
long l5 = System.currentTimeMillis();
log.info("查询大屏自身的会员信息, memberId ==>> {} , 总耗时 ==>> {}", userTvDTO.getMemberId(), (l5-l4));
}
} else {
memberDTO = this.memberService.findById(userTvDTO.getMemberId());
long l2 = System.currentTimeMillis();
memberDTO = this.memberService.findSimpleById(userTvDTO.getMemberId());
long l3 = System.currentTimeMillis();
log.info("查询大屏会员信息,总耗时 ==>> {}", (l3-l2));
}
} else {
......@@ -292,31 +276,30 @@ public class TaskOperationServiceImpl implements TaskOperationService {
}
if (Objects.isNull(memberDTO.getId())) {
log.error("会员信息不存在 ==>> {}" + memberDTO);
log.error("会员信息不存在 ==>> {}", memberDTO);
return ResultInfo.failure("会员信息不存在");
}
// 检查黑名单状态 0:正常 1:黑名单
Long blackStatus = memberDTO.getBlackStatus();
if (Objects.nonNull(blackStatus) && blackStatus.equals(LocalConstants.BLACK_STATUS)) {
log.error("会员已被加入黑名单 ==>> {}" + memberDTO);
log.error("会员已被加入黑名单 ==>> {}", memberDTO);
return ResultInfo.forbidden("会员已被加入黑名单");
}
// 检索满足条件的任务 1.先检查redis中是否存在符合条件的任务 2.从redis中获取当前会员未完成的任务
List<Task> tasks = this.findValidTasksAndRefreshTaskProcess(memberDTO, dataSyncMsg.getEvent(), msgData);
log.info("查询出来的任务列表 tasks ==>> [{}] ", tasks);
log.info("当前用户可执行的任务详情 ==>> {}", tasks);
if (CollectionUtils.isEmpty(tasks)) {
// 类型 1:登录;2:观影;3:参加活动;4:订购;5:优享会员;6:签到;7:完成设置;8:播放记录;
// 10:跨屏绑定;11:积分转移;30:积分兑换商品;98:系统操作;99:其他
log.warn("无可执行的任务, 请检查配置,任务模板类型 eventType ==>> {} || 消息体 ==>> msgData {}", dataSyncMsg.getEvent(), msgData);
return ResultInfo.failure("无可执行的任务");
}
if (!CollectionUtils.isEmpty(tasks)) {
// 5.权益区分(积分、权益、成长值)
Map<RightType,Object> tempRightsMap = this.distinguishRight(memberDTO, tasks, msgData, dataSyncMsg);
log.info("获取当前任务对应的权益 tempRightsMap ==>> {} ", tempRightsMap);
// log.info("获取当前任务对应的权益 tempRightsMap ==>> {} ", tempRightsMap);
// 6.风控检查 TODO
// boolean result = this.checkRiskManagement(memberId, tempRightsMap);
......@@ -324,20 +307,69 @@ public class TaskOperationServiceImpl implements TaskOperationService {
// if (result) throw new BadRequestException("发放失败,已达风控上限");
long l1 = System.currentTimeMillis();
log.info("各项检查总耗时 ==>> {}", (l1-l));
// long l1 = System.currentTimeMillis();
// log.info("各项检查总耗时 ==>> {}", (l1-l));
// 7.权益发放
log.info("下发开始 ==>> {}", tempRightsMap);
long l2 = System.currentTimeMillis();
this.grantRight(tempRightsMap);
long l3 = System.currentTimeMillis();
log.info("下发结束,总耗时 ==>> {}", (l3-l2));
// log.info("下发开始 ==>> {}", tempRightsMap);
// long l2 = System.currentTimeMillis();
Integer integer = this.grantRight(tempRightsMap);
// long l3 = System.currentTimeMillis();
// log.info("下发结束,总耗时 ==>> {}", (l3-l2));
if (integer > 0) {
return ResultInfo.success(integer);
}
}
return ResultInfo.failure("任务处理失败");
}
private void preFindTask(String platformAccount, DataSyncMsg dataSyncMsg, JSONObject msgData) {
switch (dataSyncMsg.getEvent()) {
case TaskEventType.PLAY:
this.calculateTotalPlayDuration(platformAccount, dataSyncMsg, msgData);
break;
}
}
private void calculateTotalPlayDuration(String platformAccount, DataSyncMsg dataSyncMsg, JSONObject msgData) {
String key = RedisKeyConstants.CACHE_PLATFROMACCOUNT_PLAYDURATION+"::"+platformAccount+"|"+dataSyncMsg.getTime().toLocalDate();
Map<Object, Object> hmget = this.redisUtils.hmget(key);
if (Objects.nonNull(hmget)) {
Object totalPlayDuration = hmget.get("total");
if (Objects.isNull(totalPlayDuration)) {
Map<Object, Object> map = new HashMap<>();
map.put("total", msgData.get("playDuration"));
// 存储时间36小时
this.redisUtils.hmset(key, map, 129600);
} else {
Map<Object, Object> map = new HashMap<>();
// 计算播放总时长 total = 播放总时长+当前播放时长
totalPlayDuration = Integer.parseInt(totalPlayDuration.toString()) + Integer.parseInt(msgData.get("playDuration").toString());
map.put("total", totalPlayDuration);
this.redisUtils.hmset(key, map);
msgData.put("playDuration", totalPlayDuration);
}
return ResultInfo.success();
}
//
}
/**
*
* @param id 主键
* @param memberId 会员id
* @param task 任务
* @param currentActionAmount 当前行为量
* @param status 完成状态
*/
private void saveOrUpdateTaskProcess(Long id,Long memberId, Task task, Integer currentActionAmount, Integer status) {
TrTaskProgress trTaskProgress = new TrTaskProgress();
trTaskProgress.setId(id);
......@@ -347,10 +379,25 @@ public class TaskOperationServiceImpl implements TaskOperationService {
trTaskProgress.setTaskId(task.getId());
trTaskProgress.setMemberId(memberId);
trTaskProgress.setTargetActionAmount(task.getActionAmount());
trTaskProgress.setUpdateTime(TimestampUtil.now());
// 更新任务完成情况
log.info("更新任务完成情况 ==>> {}", trTaskProgress);
this.doRefreshTrTaskProcess(trTaskProgress);
TrTaskProgress _trTaskProgress = this.trTaskProgressService.create(trTaskProgress, LocalDateTimeUtil.todayStart());
if (status.equals(TASK_FINISH_STATUS) && Objects.nonNull(_trTaskProgress)) {
Map<Object, Object> hmget = this.redisUtils.hmget(RedisKeyConstants.cacheTodayFinishTaskCount + "::" + memberId + ":" + LocalDate.now());
if (Objects.isNull(hmget)) {
Map<Object, Object> finishTasks = new HashMap<>();
finishTasks.put(task.getId(), 1);
// 单天的记录只存储一天
this.redisUtils.hmset(RedisKeyConstants.cacheTodayFinishTaskCount + "::" + memberId + ":" + LocalDate.now(), finishTasks, 24*60*60);
} else {
this.redisUtils.hincr(RedisKeyConstants.cacheTodayFinishTaskCount+"::"+memberId+":"+LocalDate.now(), task.getId().toString(), 1);
}
this.redisUtils.hincr(RedisKeyConstants.cacheTotalFinishTaskCount+"::"+memberId, task.getId().toString(), 1);
}
}
/**
......@@ -360,20 +407,21 @@ public class TaskOperationServiceImpl implements TaskOperationService {
* @param event 任务模板类型
* @return
*/
private List<Task> findValidTasksAndRefreshTaskProcess(MemberDTO memberDTO, Integer event, DataSyncMsg.MsgData msgData) {
private List<Task> findValidTasksAndRefreshTaskProcess(MemberSimpleDTO memberDTO, Integer event, JSONObject msgData) {
// 任务是否存在
List<Task> tasks = this.taskService.findByEvent(event);
long l = System.currentTimeMillis();
List<Task> tasks = this.taskService.findByEventAndMemberLevelAndVip(event, memberDTO.getLevel(), memberDTO.getVip());
long l1 = System.currentTimeMillis();
log.info("查询任务列表,任务详情 ==>> {}, 总耗时 ==>> {}",tasks, (l1-l));
if (Objects.isNull(tasks) || CollectionUtils.isEmpty(tasks)) {
return Collections.singletonList(null);
}
// 用户行为量
String param = msgData.getParam();
JSONObject paramJsonObject = null;
if (StringUtils.isNotBlank(param)) {
paramJsonObject = JSONObject.parseObject(param, JSONObject.class);
}
// 获取当前会员所有任务的完成进度
Map<Object, Object> todayFinishTask =
this.trTaskProgressService.countTodayFinishTaskByMemberId(memberDTO.getId(), LocalDateTimeUtil.todayStart());
Map<Object, Object> finishTaskCount = this.trTaskProgressService.countTotalFinishTaskByMemberId(memberDTO.getId());
List<Task> tasksResult = new ArrayList<>();
// 检查当前会员针对这些任务的完成情况
......@@ -383,157 +431,213 @@ public class TaskOperationServiceImpl implements TaskOperationService {
if (StringUtils.isNotBlank(task.getGroups()) && !task.getGroups().contains(memberDTO.getGroups())) {
log.warn("此用户分组不满足任务要求,任务分组 ==>> {} || 会员分组 ==>> {}",task.getGroups(), memberDTO.getGroups());
continue;
}
// 校验会员等级
if (Objects.nonNull(task.getMemberLevel()) && task.getMemberLevel() < memberDTO.getLevel()) {
log.warn("此用户等级不满足任务要求,任务要求会员等级 ==>> {} || 会员等级 ==>> {}",task.getMemberLevel(), memberDTO.getLevel());
}*/
// 任务每日重置 0:不重置;1:重置
Integer taskDailyReset = task.getTaskDailyReset();
// 任务重复类型,-1:不限次;1:单次;>1:多次
Integer taskRepeatType = task.getTaskRepeatType();
if (taskDailyReset.equals(0)) {
// 不重置,检查是否做过此任务
Object finishCount = finishTaskCount.get(task.getId());
if (!taskRepeatType.equals(-1) && Objects.nonNull(finishCount)) {
if (Long.parseLong(finishCount.toString()) >= taskRepeatType) {
continue;
}
// 校验会员vip
if (Objects.nonNull(task.getMemberVip()) && task.getMemberVip() < memberDTO.getVip()) {
log.warn("此用户vip不满足任务要求,任务要求会员vip ==>> {} || 会员vip ==>> {}",task.getMemberVip(), memberDTO.getVip());
continue;
}*/
}
TrTaskProgressDTO trTaskProgressDTO =
this.trTaskProgressService.findByMemberIdAndTaskIdAndCompletionTime(memberDTO.getId(), task.getId(), LocalDateTimeUtil.todayStart());
log.info("当前任务完成的情况,trTaskProgressDTO ==>> {}", trTaskProgressDTO);
} else {
// 任务未完成
if (Objects.isNull(trTaskProgressDTO) || !trTaskProgressDTO.getStatus().equals(TASK_FINISH_STATUS)) {
Object todayFinishCount = todayFinishTask.get(task.getId());
if (taskRepeatType > 1 && Objects.nonNull(todayFinishCount)) {
if (Long.parseLong(todayFinishCount.toString()) >= taskRepeatType) {
continue;
}
}
// 任务最低行为量
int actionAmount = task.getActionAmount();
// 任务属性
String attr = task.getAttr();
}
switch (event) {
// 开机、登录
case TaskEventType.LOGIN:
if (Objects.nonNull(paramJsonObject)) {
// 登录天数
int continueLogin = paramJsonObject.getInteger("CONTINUE_LOGIN");
if (continueLogin >= actionAmount) {
if (this.doLoginEvent(msgData, task, memberDTO)) {
tasksResult.add(task);
log.info("保存开机、登录任务进度");
this.saveOrUpdateTaskProcess(null, memberDTO.getId(), task, continueLogin, TASK_FINISH_STATUS);
}
}
break;
// 观影
case TaskEventType.VIEW:
if (Objects.nonNull(paramJsonObject)) {
// 观影总时长
int playDuration_ = paramJsonObject.getInteger("PLAYDURATION");
if (playDuration_ >= actionAmount) {
if (this.doViewEvent(msgData, task, memberDTO)) {
tasksResult.add(task);
log.info("保存观影任务进度");
this.saveOrUpdateTaskProcess(null, memberDTO.getId(), task, playDuration_, TASK_FINISH_STATUS);
}
}
break;
// 参加活动
case TaskEventType.ACTIVITY:
if (Objects.nonNull(paramJsonObject)) {
}
break;
// 订购
case TaskEventType.ORDER:
if (Objects.nonNull(paramJsonObject)) {
}
break;
// 优享会员
case TaskEventType.MEMBER_PRIORITY:
if (Objects.nonNull(paramJsonObject)) {
}
break;
// 签到
case TaskEventType.SIGN:
if (Objects.nonNull(paramJsonObject)) {
// 签到天数
int signDays = paramJsonObject.getInteger("SIGN");
if (signDays >= actionAmount) {
if (this.doSignEvent(msgData, task, memberDTO)) {
tasksResult.add(task);
log.info("保存签到天数任务进度");
this.saveOrUpdateTaskProcess(null, memberDTO.getId(), task, signDays, TASK_FINISH_STATUS);
}
}
break;
// 完成设置
case TaskEventType.COMPLETE_INFO:
if (Objects.nonNull(paramJsonObject)) {
// 完成设置次数
int completeCount = paramJsonObject.getInteger("COMPLETECOUNT");
if (completeCount >= actionAmount) {
if (this.doCompleteMemberInfoEvent(msgData, task, memberDTO)) {
tasksResult.add(task);
log.info("保存完成用户信息设置任务进度");
this.saveOrUpdateTaskProcess(null, memberDTO.getId(), task, completeCount, TASK_FINISH_STATUS);
}
}
break;
// 播放时长
case TaskEventType.PLAY:
// 用户播放总时长
if (Objects.nonNull(paramJsonObject)) {
int playDuration = paramJsonObject.getInteger("PLAYDURATION");
if (playDuration >= actionAmount) {
if (this.doPlayEvent(msgData, task, memberDTO)) {
tasksResult.add(task);
log.info("保存用户播放总时长任务进度");
threadPoolTaskExecutor.execute(() -> {
this.saveOrUpdateTaskProcess(null, memberDTO.getId(), task, playDuration, TASK_FINISH_STATUS);
});
}
}
break;
// 跨屏绑定
case TaskEventType.BINDING:
// 跨屏绑定次数
if (Objects.nonNull(paramJsonObject)) {
int bindCount = paramJsonObject.getInteger("BINDCOUNT");
if (bindCount >= actionAmount) {
if (this.doBindingEvent(msgData, task, memberDTO)) {
tasksResult.add(task);
log.info("保存跨屏绑定任务进度");
this.saveOrUpdateTaskProcess(null, memberDTO.getId(), task, bindCount, TASK_FINISH_STATUS);
}
}
break;
// 积分转移
case TaskEventType.POINTS_TRANS:
if (this.doPointsTransEvent(msgData, task, memberDTO)) {
tasksResult.add(task);
}
break;
// 积分兑换商品
case TaskEventType.POINTS_EXCHANGE_GOODS:
// 完成设置次数
if (Objects.nonNull(paramJsonObject)) {
int exchangeCount = paramJsonObject.getInteger("EXCHANGCOUNT");
if (exchangeCount >= actionAmount) {
if (this.doPointsExchangeGoodsEvent(msgData, task, memberDTO)) {
tasksResult.add(task);
log.info("保存积分兑换商品任务进度");
this.saveOrUpdateTaskProcess(null, memberDTO.getId(), task, exchangeCount, TASK_FINISH_STATUS);
}
}
break;
// 系统操作
// 其他
case TaskEventType.SYSTEM_OPERATE:
break;
default:
log.warn("没有找到对应的任务,findValidTasks");
log.info("没有找到对应的任务");
break;
}
}
return tasksResult;
}
private boolean doPointsExchangeGoodsEvent(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;
}
return tasksResult;
private boolean doPointsTransEvent(JSONObject msgData, Task task, MemberSimpleDTO memberDTO) {
Integer actionAmount = task.getActionAmount();
// 用户行为次数
// TODO 后续需要按照业务对用户行为数据进行修改
int completeCount = 1;
if (completeCount >= actionAmount) {
log.info("保存完成用户信息设置任务进度");
this.saveOrUpdateTaskProcess(null, memberDTO.getId(), task, completeCount, TASK_FINISH_STATUS);
return true;
}
return false;
}
private boolean doBindingEvent(JSONObject msgData, Task task, MemberSimpleDTO memberDTO) {
Integer actionAmount = task.getActionAmount();
// 用户行为次数
// TODO 后续需要按照业务对用户行为数据进行修改
int completeCount = 1;
if (completeCount >= actionAmount) {
log.info("保存完成用户信息设置任务进度");
this.saveOrUpdateTaskProcess(null, memberDTO.getId(), task, completeCount, TASK_FINISH_STATUS);
return true;
}
return false;
}
private boolean doCompleteMemberInfoEvent(JSONObject msgData, Task task, MemberSimpleDTO memberDTO) {
Integer actionAmount = task.getActionAmount();
// 用户行为次数
// TODO 后续需要按照业务对用户行为数据进行修改
int completeCount = 1;
if (completeCount >= actionAmount) {
log.info("保存完成用户信息设置任务进度");
this.saveOrUpdateTaskProcess(null, memberDTO.getId(), task, completeCount, TASK_FINISH_STATUS);
return true;
}
return false;
}
private boolean doSignEvent(JSONObject msgData, Task task, MemberSimpleDTO memberDTO) {
Integer actionAmount = task.getActionAmount();
// // 用户行为次数 签到天数
int signDays = msgData.getInteger("SIGN");
if (signDays >= actionAmount) {
this.saveOrUpdateTaskProcess(null, memberDTO.getId(), task, signDays, TASK_FINISH_STATUS);
return true;
}
return false;
}
private boolean doViewEvent(JSONObject msgData, Task task, MemberSimpleDTO memberDTO) {
Integer actionAmount = task.getActionAmount();
// 观影总时长
int playDuration_ = msgData.getInteger("playDuration");
if (playDuration_ >= actionAmount) {
this.saveOrUpdateTaskProcess(null, memberDTO.getId(), task, playDuration_, TASK_FINISH_STATUS);
return true;
}
return false;
}
private boolean doLoginEvent(JSONObject msgData, Task task, MemberSimpleDTO memberDTO) {
Integer actionAmount = task.getActionAmount();
// 登录天数
int continueLogin = msgData.getInteger("CONTINUE_LOGIN");
if (continueLogin >= actionAmount) {
this.saveOrUpdateTaskProcess(null, memberDTO.getId(), task, continueLogin, TASK_FINISH_STATUS);
return true;
}
return false;
}
/**
* 播放时长
* @param paramJsonObject
*/
private boolean doPlayEvent(JSONObject paramJsonObject, Task task, MemberSimpleDTO memberSimpleDTO) {
Integer actionAmount = task.getActionAmount();
int playDuration = paramJsonObject.getInteger("playDuration");
if (playDuration >= actionAmount) {
long l4 = System.currentTimeMillis();
this.saveOrUpdateTaskProcess(null, memberSimpleDTO.getId(), task, playDuration, TASK_FINISH_STATUS);
long l5 = System.currentTimeMillis();
log.info("保存任务进度信息,总耗时 ==>> {}", (l5-l4));
return true;
}
return false;
}
......@@ -549,26 +653,11 @@ public class TaskOperationServiceImpl implements TaskOperationService {
}
/**
* 任务完成情况
* @param resources 任务完成情况
*/
private void doRefreshTrTaskProcess(TrTaskProgress resources) {
String date = LocalDateTimeUtil.todayStart();
Long id = resources.getId();
if (Objects.nonNull(id)) {
resources.setUpdateTime(TimestampUtil.now());
this.trTaskProgressService.update(resources, date);
} else {
this.trTaskProgressService.create(resources, date);
}
}
/**
* 权益发放
* @param tempRightsMap 权益
*/
private void grantRight(Map<RightType,Object> tempRightsMap) {
this.rightsOperationService.grantRights(tempRightsMap);
private Integer grantRight(Map<RightType,Object> tempRightsMap) {
return this.rightsOperationService.grantRights(tempRightsMap);
}
/**
......@@ -577,7 +666,7 @@ public class TaskOperationServiceImpl implements TaskOperationService {
* @param taskList 任务列表
* @return Map<RightType,Object> 权益分类
*/
private Map<RightType,Object> distinguishRight(MemberDTO memberDTO, List<Task> taskList, DataSyncMsg.MsgData msgData, DataSyncMsg dataSyncMsg) {
private Map<RightType,Object> distinguishRight(MemberSimpleDTO memberDTO, List<Task> taskList, JSONObject msgData, DataSyncMsg dataSyncMsg) {
Map<RightType,Object> map = new HashMap<>();
......@@ -592,7 +681,7 @@ public class TaskOperationServiceImpl implements TaskOperationService {
map.put(RightType.POINTS, tempPoints);
// 成长值
this.getTempExp(memberDTO,msgData,task, dataSyncMsg, tempExps);
this.getTempExp(memberDTO, msgData, task, dataSyncMsg, tempExps);
if (!CollectionUtils.isEmpty(tempExps))
map.put(RightType.EXP, tempExps);
......@@ -652,7 +741,7 @@ public class TaskOperationServiceImpl implements TaskOperationService {
* @param map 权益分类
* @return
*/
private Map<RightType,Object> getTempRight(MemberDTO memberDTO, Task task, Map<RightType,Object> map) {
private Map<RightType,Object> getTempRight(MemberSimpleDTO memberDTO, Task task, Map<RightType,Object> map) {
// 优惠券
List<TempCoupon> tempCouponList = new ArrayList<>();
......@@ -701,16 +790,18 @@ public class TaskOperationServiceImpl implements TaskOperationService {
* @param tempCouponList
* @param rightsList
*/
private void getTempRightType(MemberDTO memberDTO , Long rightsId, Integer rightsAmount,Integer rightsSendStrategy,List<TempCoupon> tempCouponList,
private void getTempRightType(MemberSimpleDTO memberDTO , Long rightsId, Integer rightsAmount,Integer rightsSendStrategy,List<TempCoupon> tempCouponList,
List<TempRights> rightsList,Map<RightType,Object> map) {
Long memberId = memberDTO.getId();
String nickname = memberDTO.getNickname();
String memberCode = memberDTO.getCode();
// 权益详情
long l = System.currentTimeMillis();
RightsDTO rightsDTO = this.rightsService.findById(rightsId);
if (Objects.nonNull(rightsDTO)){
long l1 = System.currentTimeMillis();
log.info("查询权益信息,总耗时 ==>> {}", (l1-l));
if (Objects.nonNull(rightsDTO.getId())){
// 用以保存权益历史
TempRights tempRights = this.tmpRightsBuild(memberId,memberCode,rightsAmount,rightsDTO);
rightsList.add(tempRights);
......@@ -781,23 +872,24 @@ public class TaskOperationServiceImpl implements TaskOperationService {
* @param task
* @return
*/
private void getTempExp(MemberDTO memberDTO, DataSyncMsg.MsgData msgData, Task task, DataSyncMsg dataSyncMsg, List<TempExp> tempExps) {
private void getTempExp(MemberSimpleDTO memberDTO, JSONObject msgData, Task task, DataSyncMsg dataSyncMsg, List<TempExp> tempExps) {
Long rewardExp = task.getRewardExp();
if (Objects.nonNull(rewardExp) && rewardExp > 0L) {
TempExp tempExp = new TempExp();
tempExp.setMemberId(memberDTO.getId());
tempExp.setAppCode(msgData.getAppCode());
tempExp.setAppCode(msgData.getString("appCode"));
tempExp.setMemberCode(memberDTO.getCode());
tempExp.setItemId(msgData.getItemId());
tempExp.setAccountId(msgData.getAccountId());
tempExp.setMemberLevel(memberDTO.getLevel());
tempExp.setItemId(msgData.getLong("itemId"));
tempExp.setAccountId(msgData.getLong("accountId"));
tempExp.setRewardExp(task.getRewardExp());
tempExp.setDeviceType(dataSyncMsg.getDeviceType());
tempExp.setEvtType(dataSyncMsg.getEvent());
tempExp.setOrderId(msgData.getOrderId());
tempExp.setMediaId(msgData.getMediaId());
tempExp.setActivityId(msgData.getOrderId());
tempExp.setOrderId(msgData.getLong("orderId"));
tempExp.setMediaId(msgData.getLong("mediaId"));
tempExp.setActivityId(msgData.getLong("activityId"));
Integer rightsSendStrategy = task.getRightsSendStrategy();
tempExp.setRightsSendStrategy(Objects.isNull(rightsSendStrategy) ? 0 : rightsSendStrategy);
tempExps.add(tempExp);
......@@ -809,7 +901,7 @@ public class TaskOperationServiceImpl implements TaskOperationService {
* @param task
* @return
*/
private void getTempPoints(MemberDTO memberDTO, DataSyncMsg.MsgData msgData, Task task,
private void getTempPoints(MemberSimpleDTO memberDTO, JSONObject msgData, Task task,
DataSyncMsg dataSyncMsg, List<TempPoints> tempPoints) {
// 积分: 数值、过期时间、积分类型(定值、随机)、随机积分最大值
Long rewardPoints = task.getRewardPoints();
......@@ -829,16 +921,16 @@ public class TaskOperationServiceImpl implements TaskOperationService {
tempPoint.setRewardPointsExpireTime(rewardPointsExpireTime);
tempPoint.setMemberId(memberDTO.getId());
tempPoint.setMemberCode(memberDTO.getCode());
tempPoint.setAppCode(msgData.getAppCode());
tempPoint.setAppCode(msgData.getString("appCode"));
tempPoint.setPoints(rewardPoints);
tempPoint.setPointsType(pointsType);
tempPoint.setDeviceType(dataSyncMsg.getDeviceType());
tempPoint.setExpireTime(expireTime);
tempPoint.setOrderId(msgData.getOrderId());
tempPoint.setActivityId(msgData.getActivityId());
tempPoint.setMediaId(msgData.getMediaId());
tempPoint.setItemId(msgData.getItemId());
tempPoint.setAccountId(msgData.getAccountId());
tempPoint.setOrderId(msgData.getLong("orderId"));
tempPoint.setActivityId(msgData.getLong("activityId"));
tempPoint.setMediaId(msgData.getLong("mediaId"));
tempPoint.setItemId(msgData.getLong("itemId"));
tempPoint.setAccountId(msgData.getLong("accountId"));
tempPoint.setEvtType(dataSyncMsg.getEvent());
Integer rightsSendStrategy = task.getRightsSendStrategy();
tempPoint.setRightsSendStrategy(Objects.isNull(rightsSendStrategy) ? 0 : rightsSendStrategy);
......@@ -848,542 +940,14 @@ public class TaskOperationServiceImpl implements TaskOperationService {
}
/**
* 判断任务是否完成
* 完成的条件如下:->
* 1. status 当前任务的状态 0:失效;1:生效
* 2. valid_time 任务生效时间
* 3. expire_time 任务失效时间
* 1. task_repeat_type 任务重复类型,-1:不限次;1:单次;>1:多次
* 5. member_level 会员等级门槛(0表示无门槛)
* 6. member_vip 会员vip门槛(0表示没有门槛)
* 7. groups 能够获取该任务的用户分组,为空则都能获取 , 0
* 8. action_amount 行为量(完成此任务需要多少次相同行为的触发)
*
* @param taskList 任务列表
* @return boolean true:success false:fail
*/
//<taskId,boolean>
private boolean checkTaskCompletion(Long memberId , List<Task> taskList, Integer event, DataSyncMsg.MsgData msgData) {
if (!CollectionUtils.isEmpty(taskList)) {
// 会员信息
MemberDTO memberDTO = this.memberService.findById(memberId);
// 判断是否完成任务
CompareTaskCondition compareTaskCondition =(MemberDTO memberDTO1,List<Task> taskList1) -> {
List<Task> taskStream = taskList1.stream().filter(task1 ->
task1.getStatus() == 1 &&
(Objects.isNull(task1.getExpireTime()) || task1.getExpireTime().compareTo(TimestampUtil.now()) >= 0) &&
(Objects.isNull(task1.getValidTime()) || task1.getValidTime().compareTo(TimestampUtil.now()) <= 0) &&
(Objects.isNull(task1.getMemberLevel()) || task1.getMemberLevel() <= memberDTO1.getLevel()) &&
(Objects.isNull(task1.getMemberVip()) || task1.getMemberVip() <= memberDTO1.getVip())
).collect(toList());
// 没有满足条件的数据
if (!CollectionUtils.isEmpty(taskStream)) {
// 验证会员分组
boolean result1 = this.validatedMemberGroup(memberId,taskList);
log.info("验证会员分组结果,==>> {}, true:验证通过", result1);
if (!result1)
return false;
// 获取当前任务的完成情况
boolean result = this.checkAndRefreshTaskCompletion(memberId,taskList,event,msgData);
return result;
} else {
return false;
}
};
return compareTaskCondition.compareCondition(memberDTO,taskList);
}
return false;
}
/**
* 验证会员分组
* @param memberId
* @param taskList
* @return
*/
private boolean validatedMemberGroup(Long memberId,List<Task> taskList) {
List<MemberGroupDTO> groupDTO = this.findGroupByMemberId(memberId);
if (!CollectionUtils.isEmpty(groupDTO)) {
// 会员分组
List<String> list = new ArrayList<>();
for (MemberGroupDTO memberGroupDTO : groupDTO) {
String groupId = memberGroupDTO.getGroupId().toString();
list.add(groupId);
}
// 任务分组
List<String> strings = new ArrayList<>();
for (Task task : taskList) {
String groups = task.getGroups();
List<String> strings1 = UcStringUtils.parse2StrList(groups);
if (StringUtils.isEmpty(groups)) {
return true;
}
strings.addAll(strings1);
break;
}
// 如果任务分组为null或者空字符,则放过所有的会员
if (CollectionUtils.isEmpty(strings)) {
return true;
}
// 如果任务分组为0,则放过所有的分组
if (!CollectionUtils.isEmpty(strings) && (!CollectionUtils.isEmpty(list) && strings.contains("0")) ) {
return true;
}
if (!CollectionUtils.isEmpty(list)) {
// 只要会员分组满足任务分组之一就满足要求
if (list.size() > strings.size()) {
for (String s : list) {
boolean contains = strings.contains(s);
if (contains) {
return true;
}
}
}
}
if (!CollectionUtils.isEmpty(strings)) {
for (String s : strings) {
boolean contains = list.contains(s);
if (contains) {
return true;
}
}
}
} else {
return true;
}
return false;
}
/**
*
* @param memberId
* @return
*/
private List<MemberGroupDTO> findGroupByMemberId(Long memberId) {
return this.memberGroupService.findByMemberId(memberId);
}
/**
* 通过会员id获取分组
* @param memberId
* @return
*/
/*private List<GroupDTO> findGroupByMemberId(Long memberId) {
GroupQueryCriteria groupQueryCriteria = new GroupQueryCriteria();
groupQueryCriteria.setUserId(memberId);
List<GroupDTO> groupDTO = this.groupService.queryAll(groupQueryCriteria);
return groupDTO;
}*/
/**
* 检查并更新当前任务的完成情况
*
* 1.每天都能做,但要求总次数达到行为量
*
* @param memberId
* @param taskStream
* @return boolean false:失败 true:成功
*/
private boolean checkAndRefreshTaskCompletion(Long memberId , List<Task> taskStream, Integer event, DataSyncMsg.MsgData msgData) {
String time1 = LocalDateTimeUtil.todayStart();
for (Task task : taskStream) {
Long taskId = task.getId();
// 任务完成记录
List<TrTaskProgressDTO> trTaskProgressDTOS =
null;//this.trTaskProgressService.findByMemberIdAndTaskIdAndCompletionTime(memberId,taskId,time1);
Long id = null;
Integer currentActionAmount = null;
Timestamp completionTime = null;
Integer status = 0;
// 行为量(完成此任务需要多少次相同行为的触发)
Integer actionAmount = task.getActionAmount();
switch (event) {
// 播放记录
case 8:
if (!CollectionUtils.isEmpty(trTaskProgressDTOS)) {
TrTaskProgressDTO trTaskProgressDTO_0 = trTaskProgressDTOS.get(0);
id = trTaskProgressDTO_0.getId();
Integer status_0 = trTaskProgressDTO_0.getStatus();
Integer currentActionAmount_0 = trTaskProgressDTO_0.getCurrentActionAmount();
Timestamp completionTime_0 = trTaskProgressDTO_0.getCompletionTime();
log.info("当前任务完成情况,trTaskProgressDTO_0 ==>> {}", trTaskProgressDTO_0);
if (status_0 == 1 && currentActionAmount_0 != null && Objects.nonNull(completionTime_0)) {
log.info("任务已完成,返回false");
return false;
}
}
String param = msgData.getParam();
JSONObject jsonObject = JSON.parseObject(param);
Integer value = Integer.valueOf(jsonObject.get("playDuration").toString());
if (value >= actionAmount) {
currentActionAmount = value;
completionTime = TimestampUtil.now();
status = TASK_FINISH_STATUS;
}
break;
default:
// 行为量 1
if (actionAmount == 1) {
if (CollectionUtils.isEmpty(trTaskProgressDTOS)) {
currentActionAmount = 1;
completionTime = TimestampUtil.now();
status = TASK_FINISH_STATUS;
}
if (!CollectionUtils.isEmpty(trTaskProgressDTOS)) {
// 此任务做过,但未完成
TrTaskProgressDTO trTaskProgressDTO = trTaskProgressDTOS.get(0);
Long id_ = trTaskProgressDTO.getId();
Integer status_ = trTaskProgressDTO.getStatus();
Integer currentActionAmount_ = trTaskProgressDTO.getCurrentActionAmount();
Timestamp completionTime1 = trTaskProgressDTO.getCompletionTime();
// 任务已做,不成功
if (Objects.nonNull(status_) && status_ == 1 &&
Objects.nonNull(currentActionAmount_) && currentActionAmount_ == 1 &&
Objects.nonNull(completionTime1) &&
completionTime1.toLocalDateTime().toLocalDate().compareTo(LocalDate.now()) == 0) {
// 任务重复类型
Integer taskDailyReset = task.getTaskDailyReset();
if (taskDailyReset == -1) {
return true;
} else if (currentActionAmount_ < taskDailyReset){
return true;
}
return false;
// 未做,成功
} else {
id = id_;
currentActionAmount = 1;
completionTime = TimestampUtil.now();
status = TASK_FINISH_STATUS;
}
}
}
// 行为量非1
if (actionAmount != 1) {
if (!CollectionUtils.isEmpty(trTaskProgressDTOS)) {
// 此任务做过,但未完成
TrTaskProgressDTO trTaskProgressDTO = trTaskProgressDTOS.get(0);
Long id_ = trTaskProgressDTO.getId();
// 状态 0:未完成;1:已完成
Integer status_ = trTaskProgressDTO.getStatus();
Timestamp completionTime_ = trTaskProgressDTO.getCompletionTime();
Integer currentActionAmount_ = trTaskProgressDTO.getCurrentActionAmount();
// 行为量达到,完成
if (status_ != 1 && Objects.isNull(completionTime_) && actionAmount == currentActionAmount_+1) {
id = id_;
currentActionAmount = actionAmount;
completionTime = TimestampUtil.now();
status = TASK_FINISH_STATUS;
} else {
// 行为量未达到,未完成
id = id_;
currentActionAmount = currentActionAmount_+1;
}
}
// 未达到行为量,未完成
if (CollectionUtils.isEmpty(trTaskProgressDTOS)) {
currentActionAmount = 1;
status = TASK_UNFINISH_STATUS;
}
}
break;
}
TrTaskProgress trTaskProgress = new TrTaskProgress();
trTaskProgress.setId(id);
trTaskProgress.setCurrentActionAmount(currentActionAmount);
trTaskProgress.setCompletionTime(completionTime);
trTaskProgress.setStatus(status);
trTaskProgress.setTaskId(taskId);
trTaskProgress.setMemberId(memberId);
trTaskProgress.setTargetActionAmount(actionAmount);
// 更新任务完成情况
log.info("更新任务完成情况 ==>> {}", trTaskProgress);
this.doRefreshTrTaskProcess(trTaskProgress);
if (status == TASK_FINISH_STATUS) {
log.info("任务已完成, trTaskProgress ==>> {}", trTaskProgress);
return true;
}
return false;
}
return false;
}
/**
* 获取任务模板对应的任务列表
*
* @param taskTemplate 任务模板
* @return List<task> 任务列表
*/
@Deprecated
private List<Task> loadListTaskByTaskTemplate(TaskTemplate taskTemplate, DataSyncMsg dataSyncMsg) {
if (Objects.nonNull(taskTemplate)) {
Long taskTemplateId = taskTemplate.getId();
List<Task> taskList = this.taskService.findByTemplateId(taskTemplateId);
Integer type = taskTemplate.getType();
taskList = this.pickUpTask(taskList, dataSyncMsg, type);
return taskList;
}
return null;
}
/**
* 通过参数确定具体任务
* @param taskList
* @param dataSyncMsg
* @return
*/
private List<Task> pickUpTask(List<Task> taskList,DataSyncMsg dataSyncMsg,Integer type) {
List<Task> taskList1 = new ArrayList<>();
String msgData1 = null;//dataSyncMsg.getMsgData();
DataSyncMsg.MsgData msgData = JSON.parseObject(msgData1, DataSyncMsg.MsgData.class);
if (Objects.nonNull(msgData.getParam())) {
String param = msgData.getParam();
Map<String,String> jsonObjectMap = JSONObject.parseObject(param, Map.class);
Collection<String> values = jsonObjectMap.values();
for (Task task : taskList) {
Long taskId = task.getId();
TaskAttrDTO taskAttrDTO = this.findTaskAttrByTaskId(taskId);
if (Objects.isNull(taskAttrDTO.getId()))
continue;
String attrStr = taskAttrDTO.getAttrStr();
if (StringUtils.isNotBlank(attrStr)) {
JSONObject jsonObject = JSONObject.parseObject(attrStr);
JSONArray values_0 = jsonObject.getJSONArray("value");
switch (type) {
// 登录
case TaskTemplateType.TYPE_1:
Integer o1 = (Integer)values_0.get(0);
Integer o2 = (Integer)values_0.get(1);
List<Integer> list = Arrays.asList(o1, o2);
String s = values.toArray()[0].toString();
Integer i = Integer.valueOf(s);
boolean b = UcListUtils.compareIntegerList(i, list);
if (b)
taskList1.add(task);
break;
// 观影
case TaskTemplateType.TYPE_2:
Integer view0 = (Integer)values_0.get(0);
Integer view1 = (Integer)values_0.get(1);
List<Integer> view0List = Arrays.asList(view0, view1);
String view_0 = values.toArray()[0].toString();
Integer view0_ = Integer.valueOf(view_0);
boolean view = UcListUtils.compareIntegerList(view0_, view0List);
if (view)
taskList1.add(task);
break;
// 参加活动
case TaskTemplateType.TYPE_3:
/*String activityCode = values_0.get(0).toString();
String activityCode_ = values.toArray()[0].toString();
if (activityCode_.equalsIgnoreCase(activityCode)) {
taskList1.add(task);
}*/
if (values_0.containsAll(values))
taskList1.add(task);
break;
// 订购
case TaskTemplateType.TYPE_4:
if (values_0.containsAll(values))
taskList1.add(task);
break;
// 签到
case TaskTemplateType.TYPE_6:
Integer sign0 = (Integer)values_0.get(0);
Integer sign1 = (Integer)values_0.get(1);
List<Integer> signi0List = Arrays.asList(sign0, sign1);
String signs0 = values.toArray()[0].toString();
Integer signi0 = Integer.valueOf(signs0);
boolean signb0 = UcListUtils.compareIntegerList(signi0, signi0List);
if (signb0)
taskList1.add(task);
break;
// 播放记录
case TaskTemplateType.TYPE_8:
Integer play0 = (Integer)values_0.get(0);
Integer play1 = (Integer)values_0.get(1);
List<Integer> playList = Arrays.asList(play0, play1);
String s0 = values.toArray()[0].toString();
Integer i0 = Integer.valueOf(s0);
boolean b0 = UcListUtils.compareIntegerList(i0, playList);
if (b0)
taskList1.add(task);
break;
default:
break;
}
}
}
} else {
return taskList;
}
return taskList1;
}
private TaskAttrDTO findTaskAttrByTaskId(Long taskId) {
return this.taskAttrService.findByTaskId(taskId);
}
/**
* 获取任务模板对应的任务列表
*
* @param taskTemplate 任务模板
* @return List<task> 任务列表
*/
private List<Task> loadListTaskByTaskTemplate(TaskTemplate taskTemplate) {
if (Objects.nonNull(taskTemplate)) {
Long taskTemplateId = taskTemplate.getId();
return this.taskService.findByTemplateId(taskTemplateId);
}
return null;
}
/**
* 获取任务模板
* @param event 任务
* @return TaskTemplate 任务模板
*/
private TaskTemplate getTaskTemplate(Integer event, DataSyncMsg dataSyncMsg) {
String msgData1 = null;//dataSyncMsg.getMsgData();
DataSyncMsg.MsgData msg = JSON.parseObject(msgData1, DataSyncMsg.MsgData.class);
if (Objects.nonNull(msg.getParam())) {
return this.findByTypeAndParam(event,msg);
} else {
TaskTemplateDTO taskTemplateDTO = this.taskTemplateService.findByType(event);
if (Objects.nonNull(taskTemplateDTO)) {
TaskTemplate taskTemplate = new TaskTemplate();
BeanUtils.copyProperties(taskTemplateDTO, taskTemplate);
return taskTemplate;
} else {
return null;
}
}
}
private TaskTemplate findByTypeAndParam(Integer event, DataSyncMsg.MsgData taskTemplateParam) {
String param = taskTemplateParam.getParam();
if (StringUtils.isNotBlank(param)) {
Map<String,String> jsonObject = JSONObject.parseObject(param,Map.class);
TaskTemplateDTO taskTemplateDTO = this.taskTemplateService.findByType(event);
if (Objects.nonNull(taskTemplateDTO)) {
String templateParams = taskTemplateDTO.getParams();
if(StringUtils.isNotBlank(templateParams)) {
String templateParamsUpperCase = templateParams.toUpperCase();
Set<String> keySet = jsonObject.keySet();
for (String key : keySet) {
String s = key.toUpperCase();
if (s.equals(templateParamsUpperCase)) {
TaskTemplate taskTemplate = new TaskTemplate();
BeanUtils.copyProperties(taskTemplateDTO, taskTemplate);
return taskTemplate;
}
continue;
}
}
}
}
return null;
}
@AsyncMqSend
public void asyncCreateTask(Task task) {}
@AsyncMqSend
public void asyncUpdateTask(Task task) {}
@AsyncMqSend
public void asyncDeleteTask(Task task) {}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////2021-11 为支持重数《反贪风暴5》活动上线临时做法需要删除//////////////////////////////////////////////////////////////////////
@Autowired
private StringRedisTemplate stringRedisTemplate;
......
......@@ -10,11 +10,13 @@ import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.domain.MemberBuilder;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.member.service.dto.MemberSimpleDTO;
import com.topdraw.business.module.user.iptv.domain.UserConstant;
import com.topdraw.business.module.user.iptv.domain.UserTv;
import com.topdraw.business.module.user.iptv.domain.UserTvBuilder;
import com.topdraw.business.module.user.iptv.service.UserTvService;
import com.topdraw.business.module.user.iptv.service.dto.UserTvDTO;
import com.topdraw.business.module.user.iptv.service.dto.UserTvSimpleDTO;
import com.topdraw.business.module.user.weixin.collection.domain.UserCollection;
import com.topdraw.business.module.user.weixin.collection.domain.UserCollectionDetail;
import com.topdraw.business.module.user.weixin.collection.repository.UserCollectionDetailRepository;
......@@ -34,6 +36,7 @@ import com.topdraw.business.process.service.dto.MemberAndUserTvDTO;
import com.topdraw.business.process.service.dto.MemberAndWeixinUserDTO;
import com.topdraw.business.process.service.mapper.CollectionMq2DetailMapper;
import com.topdraw.config.LocalConstants;
import com.topdraw.config.RedisKeyConstants;
import com.topdraw.config.RedisKeyUtil;
import com.topdraw.exception.BadRequestException;
import com.topdraw.exception.EntityNotFoundException;
......@@ -49,6 +52,7 @@ import org.springframework.aop.framework.AopContext;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.CachePut;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
......@@ -119,8 +123,9 @@ public class UserOperationServiceImpl implements UserOperationService {
UserTvDTO userTvDTO = this.userTvService.findByPlatformAccount(platformAccount);
// 无账号
if (Objects.isNull(userTvDTO)) {
if (Objects.isNull(userTvDTO.getId())) {
// 会员昵称默认采用大屏账号,昵称通过base64加密与小屏保持一致
String platformAccountEncode = Base64Utils.encodeToString(platformAccount.getBytes());
// x_member
......@@ -133,14 +138,15 @@ public class UserOperationServiceImpl implements UserOperationService {
UserTv userTv = UserTvBuilder.build(memberDTO.getId(), memberDTO.getCode(), resources);
// 创建大屏账户
UserTvDTO tvUserDTO = this.createTvUser(userTv, memberDTO.getId(), memberDTO.getCode());
UserTvDTO _tvUserDTO = this.createTvUser(userTv, memberDTO.getId(), memberDTO.getCode());
((UserOperationServiceImpl)AopContext.currentProxy()).asyncMemberAndUserTv4Iptv(new MemberAndUserTvDTO(memberDTO, tvUserDTO));
((UserOperationServiceImpl)AopContext.currentProxy()).asyncMemberAndUserTv4Iptv(new MemberAndUserTvDTO(memberDTO, _tvUserDTO));
return tvUserDTO;
return _tvUserDTO;
}
log.error("保存大屏账号信息异常,无法创建大屏账号对应的会员,platoformAccount ==> {}", platformAccount);
throw new EntityNotFoundException(MemberDTO.class, "code", GlobeExceptionMsg.MEMBER_ID_IS_NULL);
// 有账号
......@@ -165,10 +171,10 @@ public class UserOperationServiceImpl implements UserOperationService {
UserTv userTv = new UserTv();
BeanUtils.copyProperties(userTvDTO, userTv);
UserTvDTO userTvDTO1 = this.updateUserTvUnsyncIptv(userTv);
((UserOperationServiceImpl)AopContext.currentProxy()).asyncMemberAndUserTv4Iptv(new MemberAndUserTvDTO(memberDTO, userTvDTO1));
UserTvDTO _userTvDTO = this.userTvService.update(userTv);
((UserOperationServiceImpl)AopContext.currentProxy()).asyncMemberAndUserTv4Iptv(new MemberAndUserTvDTO(memberDTO, _userTvDTO));
return userTvDTO1;
return _userTvDTO;
}
}
......@@ -1065,6 +1071,13 @@ public class UserOperationServiceImpl implements UserOperationService {
// 同步至iptv
((UserOperationServiceImpl)AopContext.currentProxy()).asyncMinaBind(new MemberAndUserTvDTO(memberDTO, userTvDTO));
// 修改缓存中MemberSimple的大屏主账号信息,因为执行任务之前会去检查主会员d
UserTvSimpleDTO userTvSimpleDTO = this.userTvService.findSimpleByPlatformAccount(platformAccount);
if (Objects.nonNull(userTvDTO)) {
userTvSimpleDTO.setPriorityMemberCode(memberDTO.getCode());
HashMap hashMap = JSONObject.parseObject(userTvSimpleDTO.toString(), HashMap.class);
this.redisUtils.set(RedisKeyConstants.cacheVisUserByPlatformAccount + "::" + platformAccount, hashMap);
}
return userTvDTO;
}
......@@ -1088,15 +1101,6 @@ public class UserOperationServiceImpl implements UserOperationService {
}
/**
*
* @param userTv 大屏账号
* @return UserTvDTO
*/
private UserTvDTO updateUserTvUnsyncIptv(UserTv userTv){
return this.userTvService.update(userTv);
}
/**
* 重置主账号
* @param memberDTO 会员code
* @param userTvDTO 大屏id
......@@ -1242,8 +1246,14 @@ public class UserOperationServiceImpl implements UserOperationService {
* @param member 会员信息
* @return MemberDTO
*/
private MemberDTO createMember(Member member){
return this.memberService.create(member);
public MemberDTO createMember(Member member){
MemberDTO memberDTO = this.memberService.create(member);
if (Objects.nonNull(memberDTO.getId())) {
MemberSimpleDTO memberSimpleDTO = new MemberSimpleDTO();
BeanUtils.copyProperties(memberDTO, memberSimpleDTO);
this.redisUtils.set(RedisKeyConstants.cacheMemberSimpleById+"::"+memberDTO.getId(), memberSimpleDTO);
}
return memberDTO;
}
/**
......
......@@ -10,19 +10,49 @@ package com.topdraw.config;
* @since : modified in 2022/6/18 13:25
*/
public interface RedisKeyConstants {
// 全量会员信息
String cacheMemberById = "uce::member::id";
// 任务处理时会员信息
String cacheMemberSimpleById = "uce::memberSimple::id";
// 会员全量信息
String cacheMemberByCode = "uce::member::code";
String updateCacheMemberById = "uce::updateMember::id";
// 修改会员积分时的分布式锁
String updateCachePointsByMemberId = "uce::updatePoints::memberId";
// 修改会员成长值时的分布式锁
String updateCacheExpByMemberId = "uce::updateExp::memberId";
// 修改会员优惠券时的分布式锁
String updateCacheCouponByMemberId = "uce::updateCoupon::memberId";
// 全量大屏信息
String cacheUserTvByPlatformAccount = "uce::userTv::platformAccount";
String cacheVisUserByPlatformAccount = "uus::visUser::platformAccount";
// 会员已完成的任务进度
String cacheTaskProcessByMemberId = "uce::taskProcess::memberId";
String cacheTaskByTaskTemplateId = "uce::task::taskTemplateId";
// 任务模板类型对应的全量任务
String cacheTaskByEvent = "uce::task::event";
// 全量优惠券信息
String cacheCouponById = "uce::coupon::id";
// 权益全量信息
String cacheRightById = "uce::right::id";
// 会员可以做的任务
String cacheTaskByEventAndMemberLevelAndVip = "uce::task::eventAndMemberLevelAndVip";
// 全量会员等级
String cacheMemberLevelByLevel = "uce::memberLevel::level";
// 今天处理完成任务数量
String cacheTodayFinishTaskCount = "uce::todayCount::memberId";
// 历史完成的任务数量
String cacheTotalFinishTaskCount = "uce::totalCount::memberId";
String CACHE_PLATFROMACCOUNT_PLAYDURATION = "uce::eventPlay::playduration";
String CACHE_TODAY_FINISH_COUNT = "todayFinishCount";
String CACHE_TOTAL_FINISH_COUNT = "totalFinishCount";
}
......
package com.topdraw.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/6/22 11:06
* @version: :
* @modified By:
* @since : modified in 2022/6/22 11:06
*/
@Configuration
public class TheadPoolTaskExecutorConfiguration {
@Value("${task.pool.core-pool-size}")
private Integer corePoolSize;
@Value("${task.pool.core-pool-size}")
private Integer maxPoolSize;
@Value("${task.pool.keep-alive-seconds}")
private Integer keepAliveSeconds;
@Value("${task.pool.queue-capacity}")
private Integer queueCapacity;
@Bean
@Primary
public ThreadPoolTaskExecutor getThreadPoolTaskExecutor() {
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(corePoolSize);
threadPoolTaskExecutor.setMaxPoolSize(maxPoolSize);
threadPoolTaskExecutor.setKeepAliveSeconds(keepAliveSeconds);
threadPoolTaskExecutor.setQueueCapacity(queueCapacity);
threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
threadPoolTaskExecutor.initialize();
return threadPoolTaskExecutor;
}
/*@Bean
public ThreadPoolExecutor getThreadPoolTaskExecutor() {
ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue(queueCapacity);
ThreadPoolExecutor threadPoolTaskExecutor = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveSeconds, TimeUnit.SECONDS, arrayBlockingQueue);
return threadPoolTaskExecutor;
}*/
}
package com.topdraw.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import java.time.Duration;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/6/19 16:30
* @version: :
* @modified By:
* @since : modified in 2022/6/19 16:30
*/
@Slf4j
@Configuration
public class UceRedisConfig {
@Autowired
private RedisConfig redisConfig;
@Autowired
private RedisConnectionFactory redisConnectionFactory;
@Bean(value = "uceRedisTemplate")
public RedisTemplate<Object, Object> uceRedisTemplate() {
return redisConfig.redisTemplate(redisConnectionFactory);
}
/**
* 自定义缓存管理器
*/
@Bean(value = "uceCacheManagemer")
@Primary
public RedisCacheManager cacheManager(RedisConnectionFactory factory) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
Set<String> cacheNames = new HashSet<>();
// cacheNames.add("car");
// cacheNames.add(RedisKeyConstants.cacheTaskByEvent);
cacheNames.add(RedisKeyConstants.cacheTaskProcessByMemberId);
ConcurrentHashMap<String, RedisCacheConfiguration> configMap = new ConcurrentHashMap<>();
// configMap.put("car", config.entryTtl(Duration.ofMinutes(6L)));
configMap.put(RedisKeyConstants.cacheTaskProcessByMemberId, config.entryTtl(Duration.ofDays(1)));
// configMap.put(RedisKeyConstants.cacheTaskByEvent, config);
//需要先初始化缓存名称,再初始化其它的配置。
RedisCacheManager cacheManager = RedisCacheManager.builder(factory).
initialCacheNames(cacheNames).withInitialCacheConfigurations(configMap).build();
return cacheManager;
}
}
......@@ -6,7 +6,6 @@ import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.sql.Timestamp;
import java.time.LocalDateTime;
/**
......@@ -25,43 +24,8 @@ public class DataSyncMsg implements Serializable {
//设备类型 1:大屏;2:小屏(微信)3.小屏(xx)
private Integer deviceType;
// 发送时间
private String time;
private LocalDateTime time;
// 消息体
private String msgData;
/**
* 消息体
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class MsgData {
/**备注*/
private String remarks;
// 会员id
private Long memberId;
// 账户id
private Long userId;
//用户对应的应用code
private String appCode;
// 会员code
private String memberCode;
// 账号id
private Long accountId;
// 订单Id
private Long orderId;
// 活动id
private Long activityId;
// 节目id
private Long mediaId;
// 产品id
private Long itemId;
// 模板参数
private String param;
// 描述
private String description;
// 大屏账号
private String platformAccount;
}
}
......
......@@ -5,7 +5,7 @@ spring:
url: jdbc:log4jdbc:mysql://122.112.214.149:3306/tj_user_admin?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
username: root
password: root
# url: jdbc:log4jdbc:mysql://139.196.145.150:3306/ucs-small-sichuan?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
# url: jdbc:log4jdbc:mysql://139.196.145.150:3306/ucs_admin_chongshu?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
# username: root
# password: Tjlh@2021
......@@ -20,7 +20,7 @@ spring:
# 最大连接数
max-active: 15
# 获取连接超时时间
max-wait: 5000
max-wait: 5000000
# 连接有效性检测时间
time-between-eviction-runs-millis: 90000
# 最大空闲时间
......
......@@ -25,13 +25,13 @@ spring:
task:
pool:
# 核心线程池大小
core-pool-size: 10
core-pool-size: 16
# 最大线程数
max-pool-size: 30
max-pool-size: 35
# 活跃时间
keep-alive-seconds: 60
keep-alive-seconds: 10
# 队列容量
queue-capacity: 50
queue-capacity: 300
#登录图形验证码有效时间/分钟
loginCode:
......
......@@ -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>
......
......@@ -96,11 +96,12 @@ public class TaskOperationControllerTest extends BaseTest {
public void play() {
try {
String s = "{\"evt\":\"PLAY\",\"event\":8,\"time\":\"2022-05-03 23:10:09\",\"deviceType\":1," +
"\"msgData\":{\"memberCode\":\"1537253277861699584\",\"param\":\"{\\\"playDuration\\\":60}\"}}";
"\"msgData\":{\"platformAccount\":\"1537253277861699584\",\"param\":\"{\\\"playDuration\\\":60}\"}}";
TaskOperationQueryCriteria pointsQueryCriteria = new TaskOperationQueryCriteria();
pointsQueryCriteria.setContent(s);
String s1 = JSON.toJSONString(pointsQueryCriteria);
this.taskOperationController.dealTask(pointsQueryCriteria);
System.out.println(s1);
// this.taskOperationController.dealTask(pointsQueryCriteria);
} catch (Exception e) {
e.printStackTrace();
}
......
......@@ -2,6 +2,8 @@ package com.topdraw.test.business.process.service;
import com.alibaba.fastjson.JSONObject;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberSimpleDTO;
import com.topdraw.business.process.service.member.MemberOperationService;
import com.topdraw.BaseTest;
import com.topdraw.util.IdWorker;
......@@ -16,6 +18,15 @@ public class MemberOperationServiceTest extends BaseTest {
@Autowired
MemberOperationService memberOperationService;
@Autowired
MemberService memberService;
@Test
public void findMemberSimpleTest(){
MemberSimpleDTO memberSimpleDTO = this.memberService.findSimpleById(20718L);
System.out.println(memberSimpleDTO);
}
@Test
public void findById() {
Long memberId = 2L;
......
......@@ -19,11 +19,7 @@ public class TaskOperationServiceTest extends BaseTest {
DataSyncMsg dataSyncMsg = new DataSyncMsg();
// dataSyncMsg.setEntityType(EntityType.MEMBER);
dataSyncMsg.setEvt(EventType.LOGIN.name());
DataSyncMsg.MsgData msgData = new DataSyncMsg.MsgData();
msgData.setRemarks("remark");
msgData.setMemberId(memberId);
msgData.setAppCode("WEI_XIN_GOLD_PANDA");
// dataSyncMsg.setMsgData(msgData);
String s = JSON.toJSONString(dataSyncMsg);
......
......@@ -22,10 +22,10 @@ public class MqTest extends BaseTest {
DataSyncMsg dataSyncMsg = new DataSyncMsg();
// dataSyncMsg.setEventType(EventType.LOGIN.name());
dataSyncMsg.setEvt(EventType.LOGIN.name());
DataSyncMsg.MsgData msgData = new DataSyncMsg.MsgData();
/* DataSyncMsg.MsgData msgData = new DataSyncMsg.MsgData();
msgData.setRemarks("remark");
msgData.setMemberId(1L);
msgData.setAppCode("WEI_XIN_GOLD_PANDA");
msgData.setAppCode("WEI_XIN_GOLD_PANDA");*/
// dataSyncMsg.setMsgData(msgData);
String s = JSON.toJSONString(dataSyncMsg);
amqpTemplate.convertAndSend( "uc.route.key.direct.event.aaa", s);
......