Commit 8189259a 8189259af592c47545929f81786d211967df96e0 by xianghan

Merge branch '2.2.0-release'

# Conflicts:
#	.gitignore
#	member-service-impl/src/main/java/com/topdraw/business/module/member/domain/Member.java
#	member-service-impl/src/main/java/com/topdraw/business/module/member/repository/MemberRepository.java
#	member-service-impl/src/main/java/com/topdraw/business/module/member/service/impl/MemberServiceImpl.java
#	member-service-impl/src/main/java/com/topdraw/business/process/domian/constant/RightType.java
#	member-service-impl/src/main/java/com/topdraw/business/process/rest/TaskOperationController.java
#	member-service-impl/src/main/java/com/topdraw/business/process/rest/UserOperationController.java
#	member-service-impl/src/main/java/com/topdraw/business/process/service/impl/CouponOperationServiceImpl.java
#	member-service-impl/src/main/java/com/topdraw/business/process/service/impl/ExpOperationServiceImpl.java
#	member-service-impl/src/main/java/com/topdraw/business/process/service/impl/PointsOperationServiceImpl.java
#	member-service-impl/src/main/java/com/topdraw/business/process/service/impl/RightsOperationServiceImpl.java
#	member-service-impl/src/main/java/com/topdraw/business/process/service/impl/TaskOperationServiceImpl.java
#	member-service-impl/src/main/java/com/topdraw/business/process/service/impl/UserOperationServiceImpl.java
#	member-service-impl/src/main/java/com/topdraw/mq/module/mq/DataSyncMsg.java
#	member-service-impl/src/main/resources/config/application-dev.yml
#	member-service-impl/src/test/java/com/topdraw/test/business/process/rest/TaskOperationControllerTest.java
#	member-service-impl/src/test/java/com/topdraw/test/business/process/service/TaskOperationServiceTest.java
#	member-service-impl/src/test/java/com/topdraw/test/mq/MqTest.java
2 parents 7d0ef571 4fb34343
Showing 200 changed files with 8343 additions and 3079 deletions
......@@ -3,4 +3,4 @@
/logs/
/member-service-impl/target/
/member-service-api/target/
member-service.iml
/.member-service.iml
\ No newline at end of file
......
package com.topdraw.config;
package com.topdraw.business;
public class LocalConstants {
......@@ -28,4 +28,10 @@ public class LocalConstants {
// 事件类型 3:参加活动
public static final Integer EVT_TYPE_ACTIVITY = 3;
// 会员黑名单状态
public static final Long BLACK_STATUS = 1L;
}
......
package com.topdraw.business;
/**
* @author :
* @description:\
* @function :
* @date :Created in 2022/6/18 13:25
* @version: :
* @modified By:
* @since : modified in 2022/6/18 13:25
*/
public interface RedisKeyConstants {
// 全量会员信息
String cacheMemberById = "uce::member::id";
// 任务处理时会员信息
String cacheMemberSimpleById = "uce::memberSimple::id";
String cacheMemberSimpleByCode = "uce::memberSimple::code";
// 会员全量信息
String cacheMemberByCode = "uce::member::code";
// 修改会员积分时的分布式锁
String updateCachePointsByMemberId = "uce::updatePoints::memberId";
// 修改会员成长值时的分布式锁
String updateCacheExpByMemberId = "uce::updateExp::memberId";
// 修改会员优惠券时的分布式锁
String updateCacheCouponByMemberId = "uce::updateCoupon::memberId";
// 全量大屏信息
String cacheUserTvByPlatformAccount = "uce::userTv::platformAccount";
String cacheVisUserByPlatformAccount = "uus::visUser";
// 会员已完成的任务进度
String cacheTaskProcessByMemberId = "uce::taskProcess::memberId";
// 任务模板类型对应的全量任务
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.business.module.coupon.service.impl;
import com.topdraw.business.module.coupon.domain.Coupon;
import com.topdraw.business.RedisKeyConstants;
import com.topdraw.exception.GlobeExceptionMsg;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.coupon.repository.CouponRepository;
import com.topdraw.business.module.coupon.service.CouponService;
import com.topdraw.business.module.coupon.service.dto.CouponDTO;
import com.topdraw.business.module.coupon.service.mapper.CouponMapper;
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;
......@@ -30,9 +31,9 @@ public class CouponServiceImpl implements CouponService {
private CouponRepository couponRepository;
@Override
@Cacheable(cacheNames = RedisKeyConstants.cacheCouponById, key = "#id", unless = "#result.id == null")
public CouponDTO findById(Long id) {
Assert.notNull(id, GlobeExceptionMsg.COUPON_ID_IS_NULL);
Coupon coupon = this.couponRepository.findById(id).orElseGet(Coupon::new);
// ValidationUtil.isNull(coupon.getId(),"Coupon","id",id);
return this.couponMapper.toDto(coupon);
......
......@@ -3,6 +3,9 @@ package com.topdraw.business.module.exp.detail.repository;
import com.topdraw.business.module.exp.detail.domain.ExpDetail;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.Optional;
......@@ -13,4 +16,15 @@ import java.util.Optional;
public interface ExpDetailRepository extends JpaRepository<ExpDetail, Long>, JpaSpecificationExecutor<ExpDetail> {
Optional<ExpDetail> findFirstByCode(String code);
@Modifying
@Query(value = "INSERT INTO `uc_exp_detail`(`code`, `member_id`, `account_id`, `original_exp`, `result_exp`, `exp`, " +
"`device_type`, `evt_type`, `order_id`, `media_id`, `activity_id`, `description`, `app_code`, `create_time`, `update_time`)\n" +
" VALUES (:#{#resources.code}, :#{#resources.memberId}, :#{#resources.accountId}, :#{#resources.originalExp}, " +
" :#{#resources.resultExp}, :#{#resources.exp}, :#{#resources.deviceType}, :#{#resources.evtType}, " +
" :#{#resources.orderId}, :#{#resources.mediaId}, :#{#resources.activityId}, '#', NULL, now(), now())", nativeQuery = true)
void insertIntoExpDetail(@Param("resources") ExpDetail expDetail);
}
......
......@@ -44,7 +44,7 @@ public class ExpDetailServiceImpl implements ExpDetailService {
@Transactional(rollbackFor = Exception.class)
public void create(ExpDetail resources) {
ExpDetail expDetail = ExpDetailBuilder.build(resources);
this.expDetailRepository.save(expDetail);
this.expDetailRepository.insertIntoExpDetail(expDetail);
}
@Override
......
......@@ -3,6 +3,7 @@ package com.topdraw.business.module.member.address.repository;
import com.topdraw.business.module.member.address.domain.MemberAddress;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
/**
......@@ -14,4 +15,12 @@ public interface MemberAddressRepository extends JpaRepository<MemberAddress, Lo
@Query(value = "select IFNULL(max(sequence),0) from uc_member_address where member_id = ?1" , nativeQuery = true)
int findMaxSequenceByMemberId(Long memberId);
@Modifying
@Query(value = "UPDATE `uc_member_address` SET `is_default` = 1, `update_time` = now() WHERE `id` = ?1", nativeQuery = true)
Integer updateDefaultMemberAddressById(Long id);
@Modifying
@Query(value = "UPDATE `uc_member_address` SET `is_default` = 0, `update_time` = now() WHERE `member_id` = ?1", nativeQuery = true)
Integer updateUnDefaultMemberAddressByMemberId(Long memberId);
}
......
......@@ -40,4 +40,8 @@ public interface MemberAddressService {
* @return
*/
int findMaxSequenceByMemberId(Long memberId);
Integer updateDefaultMemberAddressById(Long id);
Integer updateUnDefaultMemberAddressByMemberId(Long memberId);
}
......
......@@ -105,6 +105,18 @@ public class MemberAddressServiceImpl implements MemberAddressService {
return this.memberAddressRepository.findMaxSequenceByMemberId(memberId);
}
@Override
@Transactional(rollbackFor = Exception.class)
public Integer updateDefaultMemberAddressById(Long id) {
return this.memberAddressRepository.updateDefaultMemberAddressById(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public Integer updateUnDefaultMemberAddressByMemberId(Long memberId) {
return this.memberAddressRepository.updateUnDefaultMemberAddressByMemberId(memberId);
}
/**
* 检查会员
* @param memberAddress
......
......@@ -44,7 +44,7 @@ public class Member implements Serializable {
@Column(name = "code")
private String code;
/** 类型 1:大屏;2:小屏 */
/** 类型 1:大屏;2:小屏 3:app;*/
@Column(name = "`type`")
private Integer type;
......
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.domain;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/6/27 15:38
* @version: :
* @modified By:
* @since : modified in 2022/6/27 15:38
*/
public interface MemberTypeConstant {
// 大屏
Integer vis = 1;
// 微信
Integer weixin = 2;
// app
Integer app = 3;
}
......@@ -15,5 +15,5 @@ public interface MemberLevelRepository extends JpaRepository<MemberLevel, Long>,
Optional<MemberLevel> findFirstByCode(String code);
List<MemberLevel> findByLevelAndStatus(Integer level, Integer status);
Optional<MemberLevel> findByLevelAndStatus(Integer level, Integer status);
}
......
......@@ -25,12 +25,9 @@ public interface MemberLevelService {
MemberLevelDTO getByCode(String code);
/**
* 通过等级和状态检索
*
* @param i
* @param status
* @return
*/
List<MemberLevelDTO> findLevelAndStatus(Integer i, Integer status);
MemberLevelDTO findByLevel(int i);
}
......
package com.topdraw.business.module.member.level.service.impl;
import com.topdraw.business.module.member.level.domain.MemberLevel;
import com.topdraw.business.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;
import com.topdraw.utils.StringUtils;
import java.util.List;
/**
* @author XiangHan
* @date 2021-10-22
......@@ -29,6 +29,7 @@ public class MemberLevelServiceImpl implements MemberLevelService {
private MemberLevelMapper memberLevelMapper;
@Override
@Transactional(readOnly = true)
public MemberLevelDTO findById(Long id) {
MemberLevel MemberLevel = this.memberLevelRepository.findById(id).orElseGet(MemberLevel::new);
ValidationUtil.isNull(MemberLevel.getId(),"MemberLevel","id",id);
......@@ -36,14 +37,18 @@ public class MemberLevelServiceImpl implements MemberLevelService {
}
@Override
@Transactional(readOnly = true)
public MemberLevelDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? this.memberLevelMapper.toDto(this.memberLevelRepository.findFirstByCode(code).orElseGet(MemberLevel::new))
: new MemberLevelDTO();
}
@Override
public List<MemberLevelDTO> findLevelAndStatus(Integer level, Integer status) {
return this.memberLevelMapper.toDto(this.memberLevelRepository.findByLevelAndStatus(level,status));
@Transactional(readOnly = true)
@Cacheable(cacheNames = RedisKeyConstants.cacheMemberLevelByLevel, key = "#level", unless = "#result.id == null")
public MemberLevelDTO findByLevel(int level) {
MemberLevel memberLevel = this.memberLevelRepository.findByLevelAndStatus(level, 1).orElseGet(MemberLevel::new);
return this.memberLevelMapper.toDto(memberLevel);
}
}
......
......@@ -7,7 +7,6 @@ import com.topdraw.business.module.member.profile.service.dto.MemberProfileDTO;
import com.topdraw.business.process.service.member.MemberProfileOperationService;
import com.topdraw.common.ResultInfo;
import com.topdraw.business.module.member.profile.domain.MemberProfile;
import com.topdraw.business.module.member.profile.service.MemberProfileService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
......@@ -32,10 +31,8 @@ public class MemberProfileController {
@RequestMapping(value = "/update")
@ApiOperation("修改会员属性")
@AnonymousAccess
@Deprecated
public ResultInfo update(@Validated(value = {UpdateGroup.class}) @RequestBody MemberProfile resources) {
log.info("memberProfile ==>> update ==>> resources ===>> [{}]",resources);
log.info("memberProfile ==>> update ==>> resources ===>> {}",resources);
MemberProfileDTO memberProfileDTO = this.memberProfileOperationService.updateMemberProfileAndMember(resources);
return ResultInfo.success(memberProfileDTO);
}
......@@ -44,8 +41,7 @@ public class MemberProfileController {
@ApiOperation("修改会员属性并同步会员信息")
@AnonymousAccess
public ResultInfo updateMemberProfileAndMember(@Validated @RequestBody MemberProfile resources) {
log.info("MemberProfileServiceImpl ==>> update ==>> resources ===>> [{}]",resources);
log.info("MemberProfileServiceImpl ==>> update ==>> resources ===>> {}",resources);
MemberProfileDTO memberProfileDTO = this.memberProfileOperationService.updateMemberProfileAndMember(resources);
return ResultInfo.success(memberProfileDTO);
}
......@@ -55,9 +51,7 @@ public class MemberProfileController {
@AnonymousAccess
@Deprecated
public ResultInfo create(@Validated(value = {CreateGroup.class}) @RequestBody MemberProfile resources) {
log.info("memberProfile ==>> update ==>> resources ===>> [{}]",resources);
log.info("memberProfile ==>> update ==>> resources ===>> {}",resources);
MemberProfileDTO memberProfileDTO = this.memberProfileOperationService.createMemberProfileAndSyncMember(resources);
return ResultInfo.success(memberProfileDTO);
}
......
......@@ -6,6 +6,7 @@ import com.topdraw.business.module.member.profile.domain.MemberProfileBuilder;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.util.Base64Util;
import com.topdraw.util.RegexUtil;
import com.topdraw.utils.RedisUtils;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.member.profile.repository.MemberProfileRepository;
......@@ -141,6 +142,13 @@ public class MemberProfileServiceImpl implements MemberProfileService {
memberProfile.setGender(_memberProfileDTO1.getGender());
}
String phone = resources.getPhone();
if (StringUtils.isNotBlank(phone) && RegexUtil.mobileRegex(phone)) {
memberProfile.setPhone(phone);
} else {
memberProfile.setPhone(_memberProfileDTO1.getPhone());
}
MemberProfile _memberProfile = this.memberProfileRepository.save(memberProfile);
MemberProfileDTO memberProfileDTO = new MemberProfileDTO();
......@@ -171,31 +179,35 @@ public class MemberProfileServiceImpl implements MemberProfileService {
log.info("MemberProfileServiceImpl ==>> updateMemberProfileAndMember ==>> resources ===>> [{}]",resources);
MemberProfileDTO memberProfileDTO = this.update(resources);
// 同步会员信息
this.synchronizedMemberData(resources, memberDTO);
return memberProfileDTO;
}
private void synchronizedMemberData(MemberProfile resources, MemberDTO memberDTO) {
log.info("updateMemberProfileAndMember ==>> resources ==>> [{}]",resources);
log.info("updateMemberProfileAndMember ==>> resources ==>> [{}]",memberProfileDTO);
memberDTO.setId(resources.getMemberId());
if(StringUtils.isNotBlank(resources.getRealname())) {
memberDTO.setNickname(resources.getRealname());
Member member = new Member();
member.setId(memberDTO.getId());
member.setCode(memberDTO.getCode());
if(StringUtils.isNotBlank(memberProfileDTO.getRealname())) {
member.setNickname(memberProfileDTO.getRealname());
} else {
member.setNickname(memberDTO.getNickname());
}
if(Objects.nonNull(resources.getGender()) && resources.getGender() != -1) {
memberDTO.setGender(resources.getGender());
if(Objects.nonNull(memberProfileDTO.getGender()) && memberProfileDTO.getGender() != -1) {
member.setGender(memberProfileDTO.getGender());
} else {
member.setGender(memberDTO.getGender());
}
if(StringUtils.isNotBlank(resources.getBirthday())) {
memberDTO.setBirthday(resources.getBirthday());
if(StringUtils.isNotBlank(memberProfileDTO.getBirthday())) {
member.setBirthday(memberProfileDTO.getBirthday());
} else {
member.setBirthday(memberDTO.getBirthday());
}
if(StringUtils.isNotBlank(resources.getAvatarUrl())) {
memberDTO.setAvatarUrl(resources.getAvatarUrl());
member.setAvatarUrl(resources.getAvatarUrl());
} else {
member.setAvatarUrl(memberDTO.getAvatarUrl());
}
this.memberService.doUpdateMemberAvatarUrlAndNicknameAndGender(member);
Member member = new Member();
BeanUtils.copyProperties(memberDTO,member);
this.memberService.update(member);
return memberProfileDTO;
}
}
......
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;
......@@ -10,6 +11,7 @@ import org.springframework.data.repository.query.Param;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
import java.util.Set;
/**
* @author XiangHan
......@@ -23,7 +25,6 @@ public interface MemberRepository extends JpaRepository<Member, Long>, JpaSpecif
Optional<Member> findByIdOrCode(Long id,String code);
@Modifying
@Query(value = "UPDATE `uc_member` SET `user_iptv_id` = ?2, `update_time` = ?3 , `bind_iptv_platform_type`= 0, " +
"`bind_iptv_time`=?3 WHERE `id` = ?1", nativeQuery = true)
......@@ -32,15 +33,40 @@ public interface MemberRepository extends JpaRepository<Member, Long>, JpaSpecif
@Modifying
@Query(value = "UPDATE `uc_member` SET `exp` = :#{#resources.exp}, `level` = :#{#resources.level} , `update_time`= now() " +
" WHERE `id` = :#{#resources.id}", nativeQuery = true)
void updateExpAndLevel(@Param("resources") Member member);
Integer updateExpAndLevel(@Param("resources") Member member);
@Modifying
@Query(value = "UPDATE `uc_member` SET `points` = :#{#resources.points}, `due_points` = :#{#resources.duePoints} , `update_time`= now() " +
" WHERE `id` = :#{#resources.id}", nativeQuery = true)
void updatePointAndDuePoint(@Param("resources") Member resources);
@Query(value = "UPDATE `uc_member` SET `points` = :#{#resources.points}, `update_time`= now() WHERE `id` = :#{#resources.id}", nativeQuery = true)
Integer updatePointAndDuePoint(@Param("resources") Member resources);
@Modifying
@Query(value = "UPDATE `uc_member` SET `coupon_amount` = :#{#resources.couponAmount}, `due_coupon_amount` = :#{#resources.dueCouponAmount} , `update_time`= now() " +
" WHERE `id` = :#{#resources.id}", nativeQuery = true)
void doUpdateMemberCoupon(@Param("resources") Member member);
Integer doUpdateMemberCoupon(@Param("resources") Member member);
@Query(value = "SELECT um.* FROM uc_member um LEFT JOIN uc_user_tv tv ON um.id = tv.member_id " +
" WHERE tv.platform_account = ?1 ", nativeQuery = true)
Optional<Member> findByPlatformAccount(String platformAccount);
@Modifying
@Query(value = "UPDATE `uc_member` SET `vip` = :#{#resources.vip}, `vip_expire_time` = :#{#resources.vipExpireTime} , `update_time`= now() " +
" WHERE `id` = :#{#resources.id}", nativeQuery = true)
Integer updateMemberVipAndVipExpireTime(@Param("resources") Member member);
@Modifying
@Query(value = "UPDATE `uc_member` SET `user_iptv_id` = :#{#resources.userIptvId}, `update_time` = now() , `bind_iptv_platform_type`= :#{#resources.bindIptvPlatformType}, " +
" `bind_iptv_time`=:#{#resources.bindIptvTime} WHERE `id` = :#{#resources.id}", nativeQuery = true)
Integer updateMemberUserIptvIdAndBindIptvPlatformAndBindIptvTime(@Param("resources") Member member);
@Modifying
@Query(value = "UPDATE `uc_member` SET `avatar_url` = :#{#resources.avatarUrl}, `update_time` = now() , `nickname`= :#{#resources.nickname}, " +
" `gender`=:#{#resources.gender} WHERE `id` = :#{#resources.id}", nativeQuery = true)
Integer updateMemberAvatarUrlAndNicknameAndGender(@Param("resources") Member resource);
@Query(value = "SELECT IFNULL(`exp`,0) AS exp FROM uc_member WHERE `id` = ?1 ", nativeQuery = true)
Long findExpByMemberId(Long memberId);
@Modifying
@Query(value = "UPDATE `uc_member` SET `groups` = ?1, `update_time` = now() WHERE `code` IN ?2 ", nativeQuery = true)
Integer doUpdateGroupsBatch(String groups, Set<String> codes);
}
......
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);
}
......@@ -18,6 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Objects;
/**
......@@ -52,11 +53,22 @@ public class MemberController {
@AnonymousAccess
@ApiOperation("手动修改vip")
public ResultInfo doUpdateVipByCode(@Validated(value = {UpdateGroup.class}) @RequestBody Member resources) {
log.info("member ==>> doUpdateVipByCode ==>> param ==>> [{}]",resources);
this.memberOperationService.updateMemberVip(resources);
log.info("member ==>> doUpdateVipByCode ==>> param ==>> {}",resources);
this.memberOperationService.doUpdateMemberVipAndVipExpireTime(resources);
return ResultInfo.success();
}
@RequestMapping(value = "/doUpdateGroupsBatch")
@AnonymousAccess
@ApiOperation("批量手动修改会员分组")
public ResultInfo doUpdateGroupsBatch(@Validated(value = {UpdateGroup.class}) @RequestBody List<Member> resources) {
log.info("doUpdateGroupsBatch ==>> param ==>> {}",resources);
Integer count = this.memberOperationService.doUpdateGroupsBatch(resources);
return ResultInfo.success(count);
}
@PutMapping(value = "/update")
@ApiOperation("修改会员信息")
@AnonymousAccess
......@@ -67,7 +79,6 @@ public class MemberController {
if (StringUtils.isNotBlank(code)) {
MemberDTO memberDTO = this.memberOperationService.findByCode(code);
resources.setId(memberDTO.getId());
// BeanUtils.copyProperties(resources, memberDTO);
}
MemberDTO memberDTO = this.memberOperationService.update(resources);
......
......@@ -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
......@@ -40,13 +56,6 @@ public interface MemberService {
MemberDTO create(Member resources);
/**
* 创建并返回会员
* @param resources 会员
* @return Member
*/
MemberDTO createAndReturnMember(Member resources);
/**
* 修改会员
* @param resources
*/
......@@ -56,7 +65,7 @@ public interface MemberService {
* 修改会员积分
* @param member 会员
*/
MemberDTO doUpdateMemberPoints(Member member);
Integer doUpdateMemberPoints(Member member);
/**
* 查询绑定了大屏会员列表
......@@ -83,12 +92,53 @@ public interface MemberService {
* @param resources
* @return
*/
MemberDTO doUpdateMemberExpAndLevel(Member resources);
Integer doUpdateMemberExpAndLevel(Member resources);
/**
*
* @param member
* @return
*/
MemberDTO doUpdateMemberCoupon(Member member);
Integer doUpdateMemberCoupon(Member member);
/**
*
* @param platformAccount
* @return
*/
MemberDTO findByPlatformAccount(String platformAccount);
/**
*
* @param member
* @return
*/
MemberDTO doUpdateMemberVipAndVipExpireTime(Member member);
/**
*
* @param member
* @return
*/
MemberDTO doUpdateMemberUserIptvIdAndBindIptvPlatformAndBindIptvTime(Member member);
/**
*
* @param member
*/
MemberDTO doUpdateMemberAvatarUrlAndNicknameAndGender(Member member);
/**
*
* @param memberId
* @return
*/
Long findExpByMemberId(Long memberId);
/**
*
* @param resources
* @return
*/
Integer doUpdateGroupsBatch(List<Member> resources);
}
......
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;
/** vip过期时间 */
private Timestamp vipExpireTime;
/** 会员等级(对应level表的level字段,非id) */
private Integer level;
/** iptv账号id */
private Long userIptvId;
/** 是否在黑名单 1:是;0否 */
private Long blackStatus;
}
package com.topdraw.business.module.member.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
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.business.RedisKeyConstants;
import com.topdraw.exception.BadRequestException;
import com.topdraw.exception.GlobeExceptionMsg;
import com.topdraw.utils.RedisUtils;
import com.topdraw.utils.ValidationUtil;
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.CacheEvict;
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;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author XiangHan
......@@ -40,51 +45,69 @@ public class MemberServiceImpl implements MemberService {
@Autowired
private MemberRepository memberRepository;
@Autowired
private MemberSimpleRepository memberSimpleRepository;
@Autowired
private MemberProfileService memberProfileService;
@Autowired
private MemberSimpleMapper memberSimpleMapper;
@Autowired
private RedisUtils redisUtils;
@Override
@Transactional(readOnly = true)
public String findCodeById(Long id) {
MemberDTO memberDTO = this.findById(id);
return memberDTO.getCode();
}
@Override
@Transactional(readOnly = true)
public MemberDTO findById(Long id) {
Member member = this.memberRepository.findById(id).orElseGet(Member::new);
return this.memberMapper.toDto(member);
}
@Override
@Transactional(readOnly = true)
public MemberSimpleDTO findSimpleById(Long id) {
Object memberSimpleRedis = this.redisUtils.get(RedisKeyConstants.cacheMemberSimpleById + "::" + id);
log.info("从redis中获取会员信息, 结果集 dealTask# memberSimpleRedis ==>> {} ", memberSimpleRedis);
if (Objects.nonNull(memberSimpleRedis)) {
return JSONObject.parseObject(JSON.toJSONString(memberSimpleRedis), MemberSimpleDTO.class);
}
MemberSimple memberSimple = this.memberSimpleRepository.findSimpleById(id).orElseGet(MemberSimple::new);
log.info("从数据库中获取会员信息, 结果集 dealTask# memberSimple ==>> {} ", memberSimple);
if (Objects.nonNull(memberSimple.getId())) {
MemberSimpleDTO memberSimpleDTO = new MemberSimpleDTO();
BeanUtils.copyProperties(memberSimple, memberSimpleDTO);
boolean result = this.redisUtils.set(RedisKeyConstants.cacheMemberSimpleById + "::" + id, memberSimpleDTO);
log.info("将结果存入redis中, dealTask# memberSimpleDTO ==>> {} || 存入结果 ==>> {}", memberSimpleDTO, result);
}
return this.memberSimpleMapper.toDto(memberSimple);
}
@Override
@Transactional(readOnly = true)
public MemberDTO findByCode(String code) {
Member member = this.memberRepository.findFirstByCode(code).orElseGet(Member::new);
ValidationUtil.isNull(member.getId(),"Member","id",code);
return this.memberMapper.toDto(member);
}
private MemberDTO findByIdOrCode(Long id,String code) {
Member member = this.memberRepository.findByIdOrCode(id,code).orElseGet(Member::new);
ValidationUtil.isNull(member.getId(),"Member","param",code);
return this.memberMapper.toDto(member);
@Override
@Transactional(readOnly = true)
@Cacheable(cacheNames = RedisKeyConstants.cacheMemberSimpleByCode, key = "#code", 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);
}
@Override
......@@ -94,11 +117,11 @@ public class MemberServiceImpl implements MemberService {
throw new BadRequestException(GlobeExceptionMsg.MEMBER_ID_AND_CODE_ARE_NULL);
if (StringUtils.isNotBlank(memberCode)) {
MemberDTO memberDTO = this.findByCode(memberCode);
return memberDTO;
Member member = this.memberRepository.findFirstByCode(memberCode).orElseGet(Member::new);
return this.memberMapper.toDto(member);
} else if (Objects.nonNull(id)) {
MemberDTO memberDTO = this.findById(id);
return memberDTO;
Member member = this.memberRepository.findById(id).orElseGet(Member::new);
return this.memberMapper.toDto(member);
}
return null;
......@@ -106,52 +129,104 @@ public class MemberServiceImpl implements MemberService {
@Override
public MemberDTO checkMember(Member member) {
String memberCode = member.getCode();
Long memberId = member.getId();
return this.checkMember(memberId,memberCode);
}
@Override
@Transactional(rollbackFor = Exception.class)
public Integer doUpdateMemberExpAndLevel(Member resource) {
return this.memberRepository.updateExpAndLevel(resource);
}
@Override
@Transactional(rollbackFor = Exception.class)
public Integer doUpdateMemberCoupon(Member resource) {
return this.memberRepository.doUpdateMemberCoupon(resource);
}
@Override
@Transactional(readOnly = true)
public MemberDTO findByPlatformAccount(String platformAccount) {
log.info("从数据库中检索大屏账号对应的会员, platformAccount ==>> {}", platformAccount);
Member member = this.memberRepository.findByPlatformAccount(platformAccount).orElseGet(Member::new);
return this.memberMapper.toDto(member);
}
@Override
@Transactional(rollbackFor = Exception.class)
public MemberDTO doUpdateMemberExpAndLevel(Member resources) {
this.redisUtils.doLock("member::code" + resources.getCode());
public MemberDTO doUpdateMemberVipAndVipExpireTime(Member resource) {
log.info("修改会员vip和vip过期时间 ==>> {}", resource);
try {
MemberDTO memberDTO = this.findById(resources.getId());
if (Objects.nonNull(memberDTO)) {
this.memberRepository.updateExpAndLevel(resources);
// this.redisUtils.doLock(RedisKeyConstants.updateCacheMemberById + resource.getId());
Integer count = this.memberRepository.updateMemberVipAndVipExpireTime(resource);
if (Objects.nonNull(count) && count > 0) {
Member member = this.memberRepository.findById(resource.getId()).orElseGet(Member::new);
return this.memberMapper.toDto(member);
}
return memberDTO;
} catch (Exception e) {
e.printStackTrace();
throw e;
log.info("修改会员vip和vip过期时间,"+e.getMessage());
} finally {
this.redisUtils.doUnLock("member::code" + resources.getCode());
// this.redisUtils.doUnLock(RedisKeyConstants.updateCacheMemberById + resource.getId());
}
return this.memberMapper.toDto(resource);
}
@Override
@Transactional(rollbackFor = Exception.class)
public MemberDTO doUpdateMemberUserIptvIdAndBindIptvPlatformAndBindIptvTime(Member resource) {
Integer count = this.memberRepository.updateMemberUserIptvIdAndBindIptvPlatformAndBindIptvTime(resource);
log.info("修改会员绑定关系的结果, count ==>> {}", count);
if (count > 0) {
Member member = this.memberRepository.findById(resource.getId()).orElseGet(Member::new);
log.info("修改会员绑定关系成功,==>> {}", member);
return this.memberMapper.toDto(member);
}
return this.memberMapper.toDto(resource);
}
@Override
@Transactional(rollbackFor = Exception.class)
public MemberDTO doUpdateMemberCoupon(Member member) {
// MemberDTO memberDTO = this.update(member);
this.redisUtils.doLock("member::code" + member.getCode());
public MemberDTO doUpdateMemberAvatarUrlAndNicknameAndGender(Member resource) {
log.info("修改会员头像、昵称、性别 ==>> {}", resource);
try {
MemberDTO memberDTO = this.findById(member.getId());
if (Objects.nonNull(memberDTO)) {
this.memberRepository.doUpdateMemberCoupon(member);
// this.redisUtils.doLock(RedisKeyConstants.updateCacheMemberById + resource.getId());
Integer count = this.memberRepository.updateMemberAvatarUrlAndNicknameAndGender(resource);
if (Objects.nonNull(count) && count > 0) {
Member member = this.memberRepository.findById(resource.getId()).orElseGet(Member::new);
return this.memberMapper.toDto(member);
}
return memberDTO;
} catch (Exception e) {
e.printStackTrace();
throw e;
log.info("修改会员头像、昵称、性别异常,"+e.getMessage());
} finally {
this.redisUtils.doUnLock("member::code" + member.getCode());
// this.redisUtils.doUnLock(RedisKeyConstants.updateCacheMemberById + resource.getId());
}
return this.memberMapper.toDto(resource);
}
@Override
@Transactional(readOnly = true)
public Long findExpByMemberId(Long memberId) {
return this.memberRepository.findExpByMemberId(memberId);
}
@Override
@Transactional(rollbackFor = Exception.class)
public Integer doUpdateGroupsBatch(List<Member> resources) {
Set<String> codes = resources.stream().map(t -> t.getCode()).collect(Collectors.toSet());
return this.memberRepository.doUpdateGroupsBatch( resources.get(0).getGroups(), codes);
}
@Override
@Transactional(rollbackFor = Exception.class)
public MemberDTO create(Member resources) {
......@@ -170,38 +245,25 @@ public class MemberServiceImpl implements MemberService {
@Override
@Transactional(rollbackFor = Exception.class)
public MemberDTO createAndReturnMember(Member resources) {
MemberDTO memberDTO = this.create(MemberBuilder.build(resources));
return memberDTO;
}
@Override
@Transactional(rollbackFor = Exception.class)
public MemberDTO update(Member resources) {
log.info("MemberServiceImpl ==>> update ==>> resources ==>> [{}]" , resources);
this.redisUtils.doLock("member::code" + resources.getCode());
log.info("修改会员信息 ==>> {}", resources);
try {
MemberDTO memberDTO = this.checkMember(resources);
// this.redisUtils.doLock(RedisKeyConstants.updateCacheMemberById + resources.getId());
MemberDTO memberDTO = this.checkMember(resources);
Member member = new Member();
BeanUtils.copyProperties(memberDTO,member);
member.copy(resources);
Member _member = this.save(member);
return this.memberMapper.toDto(_member);
} catch (Exception e) {
e.printStackTrace();
throw e;
log.info(e.getMessage());
} finally {
this.redisUtils.doUnLock("member::code" + resources.getCode());
// this.redisUtils.doUnLock(RedisKeyConstants.updateCacheMemberById + resources.getId());
}
return this.memberMapper.toDto(resources);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
......@@ -211,27 +273,8 @@ public class MemberServiceImpl implements MemberService {
@Override
@Transactional(rollbackFor = Exception.class)
public MemberDTO doUpdateMemberPoints(Member resources) {
try {
this.redisUtils.doLock("member::code" + resources.getCode());
/*ValidationUtil.isNull(member.getId(), "Member", "id", resources.getId());
member.copy(resources);
Member _member = this.save(member);*/
MemberDTO memberDTO = this.findById(resources.getId());
if (Objects.nonNull(memberDTO)) {
this.memberRepository.updatePointAndDuePoint(resources);
}
return memberDTO;
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
this.redisUtils.doUnLock("member::code" + resources.getCode());
}
public Integer doUpdateMemberPoints(Member resources) {
return this.memberRepository.updatePointAndDuePoint(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> {
}
package com.topdraw.business.module.member.viphistory.rest;
import com.topdraw.business.module.member.viphistory.domain.MemberVipHistory;
import com.topdraw.business.process.service.member.MemberOperationService;
import com.topdraw.common.ResultInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* @author luerlong
* @date 2021-12-10
*/
@Api(tags = "会员vip历史管理")
@RestController
@RequestMapping("/uce/memberVipHistory")
public class MemberVipHistoryController {
@Autowired
private MemberOperationService memberOperationService;
@PostMapping
@ApiOperation("新增MemberVipHistory")
public ResultInfo create(@Validated @RequestBody MemberVipHistory resources) {
this.memberOperationService.createVipHistory(resources);
return ResultInfo.success();
}
}
......@@ -24,7 +24,7 @@ public interface MemberVipHistoryService {
*
* @param resources
*/
void create(MemberVipHistory resources);
MemberVipHistoryDTO create(MemberVipHistory resources);
/**
*
......
......@@ -52,15 +52,14 @@ public class MemberVipHistoryServiceImpl implements MemberVipHistoryService {
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend
public void create(MemberVipHistory resources) {
public MemberVipHistoryDTO create(MemberVipHistory resources) {
log.info("MemberVipHistoryServiceImpl ==>> MemberVipHistoryServiceImpl ==>> param ==>> [{}]",resources);
MemberDTO memberDTO = this.checkMember(resources);
MemberVipHistory memberVipHistory = MemberVipHistoryBuilder.build(resources);
MemberVipHistory vipHistory = this.memberVipHistoryRepository.save(memberVipHistory);
vipHistory.setMemberCode(memberDTO.getCode());
return this.memberVipHistoryMapper.toDto(vipHistory);
}
@Override
......
......@@ -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);
}
}
......
......@@ -88,6 +88,10 @@ public class PointsDetail implements Serializable {
@Column(name = "item_id")
private Long itemId;
// 状态:0:异常;1:正常
@Column(name = "status")
private Long status;
// 创建时间
@CreatedDate
@Column(name = "create_time")
......
......@@ -3,6 +3,9 @@ package com.topdraw.business.module.points.detail.repository;
import com.topdraw.business.module.points.detail.domain.PointsDetail;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
import java.util.Optional;
......@@ -16,4 +19,14 @@ public interface PointsDetailRepository extends JpaRepository<PointsDetail, Long
Optional<PointsDetail> findFirstByCode(String code);
List<PointsDetail> findByMemberId(Long memberId);
@Modifying
@Query(value = "INSERT INTO `uc_points_detail`(`code`, `app_code`, `member_id`, `account_id`, `original_points`, `result_points`, " +
" `points`, `device_type`, `evt_type`, `order_id`, `media_id`, `activity_id`, `item_id`, `status`, `description`, `create_time`, `update_time`)" +
" VALUES (:#{#resources.code}, :#{#resources.appCode}, :#{#resources.memberId}, :#{#resources.accountId}," +
" :#{#resources.originalPoints}, :#{#resources.resultPoints}, :#{#resources.points}, :#{#resources.deviceType}," +
" :#{#resources.evtType}, :#{#resources.orderId}, :#{#resources.mediaId}, :#{#resources.activityId}, " +
" :#{#resources.itemId}, :#{#resources.status}, :#{#resources.description}, now(), now())", nativeQuery = true)
Integer insertPointsDetail(@Param("resources") PointsDetail pointsDetail);
}
......
......@@ -46,13 +46,6 @@ public interface PointsDetailService {
PointsDetailDTO getByCode(String code);
/**
*
* @param memberId
* @return
*/
List<PointsDetailDTO> loadListExpirePointsByMemberId(Long memberId);
/**
* 已过期的积分
* @param memberId
* @return
......@@ -63,5 +56,5 @@ public interface PointsDetailService {
*
* @param pointsDetail
*/
void create4Custom(PointsDetail pointsDetail);
void insertPointsDetail(PointsDetail pointsDetail);
}
......
......@@ -54,6 +54,9 @@ public class PointsDetailDTO implements Serializable {
// 积分变化描述,用于管理侧显示
private String description;
// 状态:0:异常;1:正常
private Long status;
// 商品id
private Long itemId;
......
......@@ -31,6 +31,7 @@ public class PointsDetailServiceImpl implements PointsDetailService {
private PointsDetailMapper pointsDetailMapper;
@Override
@Transactional(readOnly = true)
public PointsDetailDTO findById(Long id) {
PointsDetail pointsDetail = this.pointsDetailRepository.findById(id).orElseGet(PointsDetail::new);
ValidationUtil.isNull(pointsDetail.getId(),"PointsDetail","id",id);
......@@ -40,8 +41,7 @@ public class PointsDetailServiceImpl implements PointsDetailService {
@Override
@Transactional(rollbackFor = Exception.class)
public PointsDetailDTO create(PointsDetail resources) {
PointsDetail pointsDetail = this.pointsDetailRepository.save(resources);
return this.pointsDetailMapper.toDto(pointsDetail);
return this.pointsDetailMapper.toDto(this.pointsDetailRepository.save(resources));
}
@Override
......@@ -65,17 +65,14 @@ public class PointsDetailServiceImpl implements PointsDetailService {
@Override
@Transactional(readOnly = true)
public PointsDetailDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? this.pointsDetailMapper.toDto(this.pointsDetailRepository.findFirstByCode(code).orElseGet(PointsDetail::new))
: new PointsDetailDTO();
}
@Override
public List<PointsDetailDTO> loadListExpirePointsByMemberId(Long memberId) {
return null;
}
@Override
@Transactional(readOnly = true)
public List<PointsDetailDTO> findByMemberId(Long memberId) {
return Objects.nonNull(memberId)?
this.pointsDetailMapper.toDto(this.pointsDetailRepository.findByMemberId(memberId))
......@@ -83,7 +80,8 @@ public class PointsDetailServiceImpl implements PointsDetailService {
}
@Override
public void create4Custom(PointsDetail pointsDetail) {
this.pointsDetailRepository.save(pointsDetail);
@Transactional(rollbackFor = Exception.class)
public void insertPointsDetail(PointsDetail pointsDetail) {
this.pointsDetailRepository.insertPointsDetail(pointsDetail);
}
}
......
package com.topdraw.business.process.domian.constant;
package com.topdraw.business.module.rights.constant;
public enum RightType {
/**积分*/
......
package com.topdraw.business.module.rights.constant;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/6/18 16:06
* @version: :
* @modified By:
* @since : modified in 2022/6/18 16:06
*/
public interface RightTypeConstants {
// 优惠券
int DISCOUNT_COUPON = 1;
// 观影券
int VIEW_COUPON= 2;
// 参加活动
int JOIN_ACTIVITY = 3;
// 积分商品
int POINTS_GOODS = 4;
// IPTV产品包
int IPTV_PRODUCT = 5;
// IPTV观影权益
int IPTV_VIEW = 6;
}
package com.topdraw.business.module.rights.constant;
public class RightsType {
public static String TYPE_1 = "1";
Integer TYPE_2 = 2;
Integer TYPE_3 = 3;
}
......@@ -47,7 +47,7 @@ public class Rights implements Serializable {
/** 权益的实体类型 1:积分;2成长值;3优惠券 */
@Column(name = "entity_type", nullable = false)
private String entityType;
private Integer entityType;
/** 实体id */
@Column(name = "entity_id", nullable = false)
......
......@@ -28,7 +28,7 @@ public class RightsDTO implements Serializable {
private Integer type;
/** 权益的实体类型 1:积分;2成长值;3优惠券 */
private String entityType;
private Integer entityType;
/** 实体id */
private Long entityId;
......
package com.topdraw.business.module.rights.service.impl;
import com.topdraw.business.module.rights.domain.Rights;
import com.topdraw.business.RedisKeyConstants;
import com.topdraw.utils.*;
import com.topdraw.business.module.rights.repository.RightsRepository;
import com.topdraw.business.module.rights.service.RightsService;
import com.topdraw.business.module.rights.service.dto.RightsDTO;
import com.topdraw.business.module.rights.service.mapper.RightsMapper;
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;
......@@ -25,9 +27,9 @@ public class RightsServiceImpl implements RightsService {
private RightsMapper rightsMapper;
@Override
@Cacheable(cacheNames = RedisKeyConstants.cacheRightById, key = "#id", unless = "#result.id == null")
public RightsDTO findById(Long id) {
Rights Rights = this.rightsRepository.findById(id).orElseGet(Rights::new);
ValidationUtil.isNull(Rights.getId(),"Rights","id",id);
return this.rightsMapper.toDto(Rights);
}
......
......@@ -3,8 +3,12 @@ package com.topdraw.business.module.task.attribute.repository;
import com.topdraw.business.module.task.attribute.domain.TaskAttr;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
/**
* @author XiangHan
......@@ -13,4 +17,7 @@ import java.util.Optional;
public interface TaskAttrRepository extends JpaRepository<TaskAttr, Long>, JpaSpecificationExecutor<TaskAttr> {
Optional<TaskAttr> findByTaskId(Long taskId);
@Query(value = "SELECT * FROM `tr_task_attr` WHERE task_id IN(?1)", nativeQuery = true)
List<Map<String, Object>> findTasksByTaskIds(Set<Object> taskIds);
}
......
......@@ -3,6 +3,9 @@ package com.topdraw.business.module.task.attribute.service;
import com.topdraw.business.module.task.attribute.domain.TaskAttr;
import com.topdraw.business.module.task.attribute.service.dto.TaskAttrDTO;
import java.util.List;
import java.util.Set;
/**
* @author XiangHan
* @date 2022-01-13
......@@ -39,4 +42,6 @@ public interface TaskAttrService {
* @return
*/
TaskAttrDTO findByTaskId(Long taskId);
List<TaskAttrDTO> findTasksByTaskIds(Set<Object> id);
}
......
package com.topdraw.business.module.task.attribute.service.impl;
import com.alibaba.fastjson.JSON;
import com.topdraw.business.module.task.attribute.domain.TaskAttr;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.task.attribute.repository.TaskAttrRepository;
......@@ -12,6 +13,12 @@ import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author XiangHan
......@@ -64,5 +71,20 @@ public class TaskAttrServiceImpl implements TaskAttrService {
return this.taskAttrMapper.toDto(taskAttr);
}
@Override
public List<TaskAttrDTO> findTasksByTaskIds(Set<Object> taskIds) {
List<Map<String,Object>> maps = this.taskAttrRepository.findTasksByTaskIds(taskIds);
if (!CollectionUtils.isEmpty(maps)) {
List<TaskAttr> taskAttrs = new ArrayList<>();
for (Map<String, Object> map : maps) {
TaskAttr taskAttr = JSON.parseObject(JSON.toJSONString(map), TaskAttr.class);
taskAttrs.add(taskAttr);
}
return this.taskAttrMapper.toDto(taskAttrs);
}
return new ArrayList<>();
}
}
......
......@@ -15,6 +15,7 @@ import java.sql.Timestamp;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author XiangHan
......@@ -151,6 +152,9 @@ public class Task implements Serializable {
@Transient
private String attr;
@Transient
private Integer event;
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
......
......@@ -61,7 +61,7 @@ public class TaskBuilder {
task_.setDeleteMark(Objects.isNull(task.getDeleteMark()) ? 0 : task.getDeleteMark());
task_.setAttr(StringUtils.isBlank(task.getAttr()) ? null : task.getAttr());
// task_.setAttr(StringUtils.isBlank(task.getAttr()) ? null : task.getAttr());
return task_;
}
......
......@@ -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)
List<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);
}
......
......@@ -2,7 +2,11 @@ package com.topdraw.business.module.task.progress.service;
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
......@@ -21,13 +25,13 @@ public interface TrTaskProgressService {
*
* @param resources
*/
void create(TrTaskProgress resources);
TrTaskProgress create(TrTaskProgress resources, String date);
/**
*
* @param resources
*/
void update(TrTaskProgress resources);
TrTaskProgress update(TrTaskProgress resources, String date);
/**
*
......@@ -42,5 +46,28 @@ public interface TrTaskProgressService {
* @param time1
* @return
*/
List<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 com.topdraw.business.module.task.progress.domain.TrTaskProgress;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.RedisKeyConstants;
import com.topdraw.utils.RedisUtils;
import com.topdraw.business.module.task.progress.repository.TrTaskProgressRepository;
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.progress.service.mapper.TrTaskProgressMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.time.LocalDate;
import java.util.*;
/**
* @author XiangHan
......@@ -21,34 +25,35 @@ import java.util.List;
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
@Slf4j
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)
public void create(TrTaskProgress resources) {
this.trTaskProgressRepository.save(resources);
// @CachePut(cacheNames = RedisKeyConstants.cacheTaskProcessByMemberId, key = "#resources.memberId+':'+#resources.taskId+':'+#date", unless = "#result == null ")
public TrTaskProgress create(TrTaskProgress resources, String date) {
return this.trTaskProgressRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(TrTaskProgress resources) {
TrTaskProgress TrTaskProgress = this.trTaskProgressRepository.findById(resources.getId()).orElseGet(TrTaskProgress::new);
ValidationUtil.isNull( TrTaskProgress.getId(),"TrTaskProgress","id",resources.getId());
TrTaskProgress.copy(resources);
this.trTaskProgressRepository.save(TrTaskProgress);
// @CachePut(cacheNames = RedisKeyConstants.cacheTaskProcessByMemberId, key = "#resources.memberId+':'+#resources.taskId+':'+#date", unless = "#result == null ")
public TrTaskProgress update(TrTaskProgress resources, String date) {
return this.trTaskProgressRepository.save(resources);
}
@Override
......@@ -61,8 +66,73 @@ public class TrTaskProgressServiceImpl implements TrTaskProgressService {
}
@Override
public List<TrTaskProgressDTO> findByMemberIdAndTaskIdAndCompletionTime(Long memberId, Long taskId, String time1) {
return this.trTaskProgressMapper.toDto(this.trTaskProgressRepository.findByMemberIdAndTaskIdAndCompletionTime(memberId,taskId,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.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(taskId, Integer.valueOf(map.get("finishCount").toString()));
}
if (finishTasks.size() > 0) {
// 总记录一直存储
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(taskId, Integer.valueOf(map.get("finishCount").toString()));
}
if (finishTasks.size() > 0) {
// 单天的记录只存储一天
this.redisUtils.hmset(RedisKeyConstants.cacheTodayFinishTaskCount + "::" + memberId + ":" + LocalDate.now(), finishTasks, 24*60*60);
}
return finishTasks;
}
}
return hmget;
}
......
......@@ -8,6 +8,7 @@ import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
......@@ -21,7 +22,12 @@ public interface TaskRepository extends JpaRepository<Task, Long>, JpaSpecificat
@Modifying
@Transactional
@Query(value = "UPDATE `tr_task` SET `delete_mark` = 1 , `update_time` = now() WHERE `id` = ?1", nativeQuery = true)
void updateDeleteMark(Long id);
Integer updateDeleteMark(Long id);
Optional<Task> findByCode(String code);
@Query(value = "SELECT ta.* FROM tr_task ta LEFT JOIN tr_task_template tm ON ta.task_template_id = tm.id " +
" WHERE ta.`status` = 1 AND ta.valid_time <= now() and ta.expire_time >= now() AND ta.delete_mark = 0 AND " +
" tm.type = ?1 AND ta.`member_level` <= ?2 and ta.`member_vip` <= ?3", nativeQuery = true)
List<Map<String,Object>> findByEventAndLevelAndVip(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;
import java.time.LocalDateTime;
import java.util.List;
/**
......@@ -47,11 +51,19 @@ public interface TaskService {
*
* @param task
*/
void delete(Task task);
Integer delete(Task task);
/**
*
* @param id
*/
void delete(Long id);
Integer delete(Long id);
/**
*
* @param event
* @return
*/
List<Task> findByEventAndMemberLevelAndVip(Integer event, Integer level, Integer vip);
}
......
package com.topdraw.business.module.task.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.topdraw.business.module.task.attribute.service.TaskAttrService;
import com.topdraw.business.module.task.attribute.service.dto.TaskAttrDTO;
import com.topdraw.business.module.task.domain.Task;
import com.topdraw.business.module.task.repository.TaskRepository;
import com.topdraw.business.module.task.service.TaskService;
import com.topdraw.business.module.task.service.dto.TaskDTO;
import com.topdraw.business.module.task.service.mapper.TaskMapper;
import com.topdraw.business.RedisKeyConstants;
import com.topdraw.utils.RedisUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* @author XiangHan
......@@ -19,12 +31,18 @@ import java.util.Objects;
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
@Slf4j
public class TaskServiceImpl implements TaskService {
@Autowired
private TaskAttrService taskAttrService;
@Autowired
private TaskMapper taskMapper;
@Autowired
private TaskRepository taskRepository;
@Autowired
private RedisUtils redisUtils;
@Override
public TaskDTO findById(Long id) {
......@@ -56,14 +74,70 @@ public class TaskServiceImpl implements TaskService {
}
@Override
public void delete(Task task) {
public Integer delete(Task task) {
Long id = task.getId();
this.delete(id);
return this.delete(id);
}
@Override
public void delete(Long id) {
this.taskRepository.updateDeleteMark(id);
public Integer delete(Long id) {
return this.taskRepository.updateDeleteMark(id);
}
@Override
@Transactional(readOnly = true)
public List<Task> findByEventAndMemberLevelAndVip(Integer event, Integer level, Integer vip) {
try {
boolean b = this.redisUtils.hasKey(RedisKeyConstants.cacheTaskByEventAndMemberLevelAndVip + "::" + event + ":" + level + ":" + vip);
if (b) {
List<Object> tasksObjs = redisUtils.lGet(RedisKeyConstants.cacheTaskByEventAndMemberLevelAndVip + "::" + event + ":" + level + ":" + vip, 0, -1);
return JSONArray.parseArray(tasksObjs.get(0).toString(), Task.class);
}
List<Map<String, Object>> maps = this.taskRepository.findByEventAndLevelAndVip(event, level, vip);
List<Task> tasks = new ArrayList<>();
if (CollectionUtils.isEmpty(maps)) {
return tasks;
}
List<TaskAttrDTO> taskAttrDTOS = this.taskAttrService.findTasksByTaskIds(maps.stream().map(t -> t.get("id")).collect(Collectors.toSet()));
if (!CollectionUtils.isEmpty(taskAttrDTOS)) {
for (Map<String, Object> map : maps) {
Task task = JSONObject.parseObject(JSON.toJSONString(map), Task.class);
List<String> taskAttrs = taskAttrDTOS.stream().filter(taskAttrDTO -> taskAttrDTO.getTaskId().equals(task.getId())).
map(TaskAttrDTO::getAttrStr).collect(Collectors.toList());
log.info("任务属性值, dealTask# taskAttrs ==>> {}", taskAttrs);
if (!CollectionUtils.isEmpty(taskAttrs)) {
task.setAttr(String.join(",", taskAttrs));
}
tasks.add(task);
}
} else {
for (Map<String, Object> map : maps) {
Task task = JSONObject.parseObject(JSON.toJSONString(map), Task.class);
tasks.add(task);
}
}
if (!CollectionUtils.isEmpty(tasks)) {
this.redisUtils.lSet(RedisKeyConstants.cacheTaskByEventAndMemberLevelAndVip + "::" + event + ":" + level + ":" + vip, tasks, 45 * 60);
}
return tasks;
} catch (Exception e) {
log.error(e.getMessage());
}
return new ArrayList<>();
}
}
......
package com.topdraw.business.module.task.template.constant;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/6/18 14:30
* @version: :
* @modified By:
* @since : modified in 2022/6/18 14:30
*/
public interface TaskEventType {
//类型 1:登录;2:观影;3:参加活动;4:订购;5:优享会员;6:签到;7:完成设置;
// 8:播放记录;10:跨屏绑定;11:积分转移;30:积分兑换商品;98:系统操作;99:其他
int LOGIN = 1;
int VIEW = 2;
int ACTIVITY = 3;
int ORDER = 4;
int MEMBER_PRIORITY = 5;
int SIGN = 6;
int COMPLETE_INFO = 7;
int PLAY = 8;
int BINDING = 10;
int POINTS_TRANS = 11;
int POINTS_EXCHANGE_GOODS = 30;
int SYSTEM_OPERATE = 98;
int OHHER = 99;
}
......@@ -26,4 +26,6 @@ public interface TaskTemplateRepository extends JpaRepository<TaskTemplate, Long
@Transactional
@Query(value = "UPDATE `tr_task_template` SET `delete_mark` = 1 , `update_time` = now() WHERE `id` = ?1", nativeQuery = true)
void updateDeleteMark(Long id);
Long countByCodeAndType(String code, Integer type);
}
......
......@@ -61,4 +61,11 @@ public interface TaskTemplateService {
* @return
*/
TaskTemplateDTO findByType(Integer event);
/**
*
* @param taskTemplate
* @return
*/
Long countByCodeAndType(TaskTemplate taskTemplate);
}
......
......@@ -83,4 +83,10 @@ public class TaskTemplateServiceImpl implements TaskTemplateService {
return Objects.nonNull(event) ? this.taskTemplateMapper.toDto(this.taskTemplateRepository.findByType(event).orElseGet(TaskTemplate::new)) : new TaskTemplateDTO();
}
@Override
public Long countByCodeAndType(TaskTemplate taskTemplate) {
Long count = this.taskTemplateRepository.countByCodeAndType(taskTemplate.getCode(), taskTemplate.getType());
return count;
}
}
......
package com.topdraw.business.module.user.app.domain;
import lombok.Data;
import lombok.experimental.Accessors;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import javax.persistence.*;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2022-06-27
*/
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_user_app")
public class UserApp implements Serializable {
// 第三方账号类型 3:微信;4:QQ;5:微博;6:苹果账号
@Transient
private Integer accountType;
// 第三方账号
@Transient
private String account;
// ID
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 会员id
@Column(name = "member_id")
private Long memberId;
// 用户名(一般为手机号)
@Column(name = "username", nullable = false)
private String username;
// 密码
@Column(name = "password")
private String password;
// 类型 0:苹果;1:安卓;-1:未知
@Column(name = "type", nullable = false)
private Integer type;
// 状态 0:禁用;1:生效;-1:注销
@Column(name = "status", nullable = false)
private Integer status;
// 昵称
@Column(name = "nickname")
private String nickname;
// 头像地址
@Column(name = "headimgurl")
private String headimgurl;
// 邮箱
@Column(name = "email")
private String email;
// 手机号
@Column(name = "cellphone")
private String cellphone;
// 性别 0:女;1:男;-1:其他
@Column(name = "gender")
private Integer gender;
// 生日
@Column(name = "birthday")
private String birthday;
// 最近活跃时间
@Column(name = "last_active_time")
private Timestamp lastActiveTime;
// 注销时间
@Column(name = "delete_time")
private Timestamp deleteTime;
// 标签
@Column(name = "tags")
private String tags;
// 描述
@Column(name = "description")
private String description;
// 创建时间
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
public void copy(UserApp source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}
}
package com.topdraw.business.module.user.app.domain;
import lombok.Data;
import lombok.experimental.Accessors;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import javax.persistence.*;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2022-06-27
*/
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_user_app_bind")
public class UserAppBind implements Serializable {
@Transient
private String username;
@Transient
private String password;
@Transient
private String headimgurl;
// 主键
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 第三方账号类型 3:微信;4:QQ;5:微博;6:苹果账号
@Column(name = "account_type", nullable = false)
private Integer accountType;
// 第三方账号
@Column(name = "account", nullable = false)
private String account;
// app账号id
@Column(name = "user_app_id", nullable = false)
private Long userAppId;
// 绑定状态 0:解绑;1 绑定
@Column(name = "status", nullable = false)
private Integer status;
// 昵称
@Column(name = "nickname", nullable = false)
private String nickname;
// 创建时间
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
public void copy(UserAppBind source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}
}
package com.topdraw.business.module.user.app.domain;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/6/30 13:18
* @version: :
* @modified By:
* @since : modified in 2022/6/30 13:18
*/
public class UserAppBindBuilder {
public static UserAppBind build(Long userAppId, String account, Integer accountType){
UserAppBind userAppBind = new UserAppBind();
userAppBind.setAccount(account);
userAppBind.setUserAppId(userAppId);
userAppBind.setAccountType(accountType);
userAppBind.setStatus(UserAppStatusConstant.VALID_STATUS);
return userAppBind;
}
}
package com.topdraw.business.module.user.app.domain;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/6/30 11:42
* @version: :
* @modified By:
* @since : modified in 2022/6/30 11:42
*/
public interface UserAppBindStatusConstant {
// 绑定状态 0:解绑;1 绑定
Integer VALID_STATUS = 1;
Integer INVALID_STATUS = 0;
}
package com.topdraw.business.module.user.app.domain;
import com.topdraw.util.TimestampUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import java.util.Objects;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/6/30 11:35
* @version: :
* @modified By:
* @since : modified in 2022/6/30 11:35
*/
public class UserAppBuilder {
public static UserApp build(Long memberId, UserApp resource){
UserApp userApp = new UserApp();
userApp.setId(null);
userApp.setMemberId(memberId);
userApp.setUsername(resource.getUsername());
userApp.setTags(resource.getTags());
userApp.setLastActiveTime(TimestampUtil.now());
userApp.setEmail(resource.getEmail());
userApp.setType(Objects.isNull(resource.getType()) ? -1 : resource.getType());
userApp.setNickname(StringUtils.isNotBlank(resource.getNickname()) ? resource.getNickname() : resource.getUsername());
userApp.setHeadimgurl(resource.getHeadimgurl());
userApp.setPassword(resource.getPassword());
userApp.setCellphone(StringUtils.isNotBlank(resource.getCellphone()) ? resource.getCellphone() : resource.getUsername());
userApp.setBirthday(StringUtils.isNotBlank(resource.getBirthday()) ? resource.getBirthday() : null);
userApp.setGender(Objects.nonNull(resource.getGender()) ? resource.getGender() : -1);
userApp.setStatus(UserAppStatusConstant.VALID_STATUS);
userApp.setCreateTime(null);
userApp.setUpdateTime(null);
return userApp;
}
}
package com.topdraw.business.module.user.app.domain;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
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 java.io.Serializable;
import java.sql.Timestamp;
/**
* @author XiangHan
* @date 2022-06-27
*/
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_user_app")
public class UserAppIdManual implements Serializable {
// 第三方账号类型 3:微信;4:QQ;5:微博;6:苹果账号
@Transient
private Integer accountType;
// 第三方账号
@Transient
private String account;
@Transient
private String memberCode;
// ID
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "id")
private Long id;
// 会员id
@Column(name = "member_id")
private Long memberId;
// 用户名(一般为手机号)
@Column(name = "username", nullable = false)
private String username;
// 密码
@Column(name = "password")
private String password;
// 类型 0:苹果;1:安卓;-1:未知
@Column(name = "type", nullable = false)
private Integer type;
// 状态 0:禁用;1:生效;-1:注销
@Column(name = "status", nullable = false)
private Integer status;
// 昵称
@Column(name = "nickname")
private String nickname;
// 头像地址
@Column(name = "headimgurl")
private String headimgurl;
// 邮箱
@Column(name = "email")
private String email;
// 手机号
@Column(name = "cellphone")
private String cellphone;
// 性别 0:女;1:男;-1:其他
@Column(name = "gender")
private Integer gender;
// 生日
@Column(name = "birthday")
private String birthday;
// 最近活跃时间
@Column(name = "last_active_time")
private Timestamp lastActiveTime;
// 注销时间
@Column(name = "delete_time")
private Timestamp deleteTime;
// 标签
@Column(name = "tags")
private String tags;
// 描述
@Column(name = "description")
private String description;
// 创建时间
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
public void copy(UserAppIdManual source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}
}
package com.topdraw.business.module.user.app.domain;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2022-06-27
*/
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_user_app")
public class UserAppSimple implements Serializable {
// ID
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 会员id
@Column(name = "member_id")
private Long memberId;
// 用户名(一般为手机号)
@Column(name = "username", nullable = false)
private String username;
// 状态 0:禁用;1:生效;-1:注销
@Column(name = "status", nullable = false)
private Integer status;
// 昵称
@Column(name = "nickname")
private String nickname;
// 头像地址
@Column(name = "headimgurl")
private String headimgurl;
// 邮箱
@Column(name = "email")
private String email;
// 手机号
@Column(name = "cellphone")
private String cellphone;
// 性别 0:女;1:男;-1:其他
@Column(name = "gender")
private Integer gender;
// 生日
@Column(name = "birthday")
private String birthday;
// 标签
@Column(name = "tags")
private String tags;
// 描述
@Column(name = "description")
private String description;
public void copy(UserAppSimple source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}
}
package com.topdraw.business.module.user.app.domain;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/6/30 11:42
* @version: :
* @modified By:
* @since : modified in 2022/6/30 11:42
*/
public interface UserAppStatusConstant {
// 状态 0:禁用;1:生效;-1:注销
Integer VALID_STATUS = 1;
Integer FORBID_STATUS = 0;
Integer INVALID_STATUS = -1;
}
package com.topdraw.business.module.user.app.repository;
import com.topdraw.business.module.user.app.domain.UserAppBind;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Optional;
/**
* @author XiangHan
* @date 2022-06-27
*/
public interface UserAppBindRepository extends JpaRepository<UserAppBind, Long>, JpaSpecificationExecutor<UserAppBind> {
Optional<UserAppBind> findFirstByAccount(String account);
@Modifying
@Query(value = "UPDATE `uc_user_app_bind` SET `status` = 0 , `update_time` = now() WHERE `account` = ?1 AND `account_type` = ?2", nativeQuery = true)
Integer cancelUserAppBind(String account, Integer accountType);
Optional<UserAppBind> findFirstByAccountAndAccountType(String account, Integer accountType);
@Modifying
@Query(value = "UPDATE `uc_user_app_bind` SET `status` = :#{#resources.status}, `update_time` = now(), " +
" `user_app_id` = :#{#resources.userAppId}, `nickname` = :#{#resources.nickname} " +
" WHERE `account` = :#{#resources.account} AND accountType = :#{#resources.accountType}", nativeQuery = true)
Integer updateThirdAccount(@Param("resources") UserAppBind resources);
@Modifying
@Query(value = "UPDATE `uc_user_app_bind` SET `status` = :#{#resources.status}, `update_time` = now(), " +
" `user_app_id` = :#{#resources.userAppId} WHERE `account` = :#{#resources.account} AND accountType = :#{#resources.accountType}",
nativeQuery = true)
Integer updateThirdAccountStatusAndUserAppId(@Param("resources") UserAppBind resources);
@Modifying
@Query(value = "UPDATE `uc_user_app_bind` SET `status` = 1, `update_time` = now(), " +
" `user_app_id` = :#{#resources.userAppId} WHERE `account` = :#{#resources.account} AND accountType = :#{#resources.accountType}",
nativeQuery = true)
Integer updateValidStatusAndUserAppId(@Param("resources") UserAppBind resources);
@Modifying
@Query(value = "UPDATE `uc_user_app_bind` SET `update_time` = now(), `nickname` = :#{#resources.nickname} " +
" WHERE `account` = :#{#resources.account} AND `account_type` = :#{#resources.accountType}", nativeQuery = true)
Integer updateThirdAccountNickname(@Param("resources") UserAppBind resources);
@Modifying
@Query(value = "UPDATE `uc_user_app_bind` SET `update_time` = now(), `nickname` = :#{#resources.nickname}, `status` = 1, `user_app_id` = :#{#resources.userAppId} " +
" WHERE `account` = :#{#resources.account} AND `account_type` = :#{#resources.accountType}", nativeQuery = true)
Integer updateValidStatusAndUserAppIdAndNickname(@Param("resources") UserAppBind resources);
@Modifying
@Query(value = "UPDATE `uc_user_app_bind` SET `update_time` = now(), `status` = 0 WHERE `id` IN ?1", nativeQuery = true)
Integer appCancellation(List<Long> ids);
List<UserAppBind> findByUserAppId(Long id);
}
package com.topdraw.business.module.user.app.repository;
import com.topdraw.business.module.user.app.domain.UserApp;
import com.topdraw.business.module.user.app.domain.UserAppIdManual;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.Optional;
/**
* @author XiangHan
* @date 2022-06-27
*/
public interface UserAppRepository extends JpaRepository<UserApp, Long>, JpaSpecificationExecutor<UserApp> {
@Query(value = "SELECT ua.* FROM uc_user_app ua WHERE ua.`username` = ?1 and ua.`status` IN (0 , 1)", nativeQuery = true)
Optional<UserApp> findByUsername(String username);
Optional<UserApp> findByUsernameAndPassword(String username, String password);
@Modifying
@Query(value = "UPDATE `uc_user_app` SET `update_time` = now(), `last_active_time` = now() WHERE `username` = ?1 AND `status` = 1 ", nativeQuery = true)
Integer updateLastActiveTime(String username);
@Modifying
@Query(value = "UPDATE `uc_user_app` SET `update_time` = now(), `password` = ?2 WHERE `username` = ?1 AND `status` = 1", nativeQuery = true)
Integer updatePasswordByUsername(String username, String password);
@Modifying
@Query(value = "UPDATE `uc_user_app` SET `update_time` = now(), `nickname` = :#{#resources.nickname}, " +
" `headimgurl` = :#{#resources.headimgurl}, `email` = :#{#resources.email}, `cellphone` = :#{#resources.cellphone}, " +
" `gender` = :#{#resources.gender}, `birthday` = :#{#resources.birthday}, `tags` = :#{#resources.tags}, `description` = :#{#resources.description}" +
" WHERE `id` = :#{#resources.id}", nativeQuery = true)
Integer updateAppInfo(@Param("resources") UserApp resources);
@Modifying
@Query(value = "UPDATE `uc_user_app` SET `update_time` = now(), `password` = ?2 WHERE `id` = ?1", nativeQuery = true)
Integer updatePasswordById(Long id, String password);
@Modifying
@Query(value = "UPDATE `uc_user_app` SET `update_time` = now(), `delete_time` = now(), `status` = -1 WHERE `id` = ?1", nativeQuery = true)
Integer appCancellation(Long id);
@Modifying
@Query(value = "UPDATE `uc_user_app` SET `last_active_time` = now(), `nickname` = ?2, `headimgurl` = ?3 " +
" WHERE `username` = ?1 and `status` = 1 ", nativeQuery = true)
Integer updateAppLastActiveTimeAndNicknameAndHeadImg(String username, String nickname, String headimgurl);
@Modifying
@Query(value = "UPDATE `uc_user_app` SET `cellphone`= :#{#resources.cellphone}, `username`= :#{#resources.username},`last_active_time` = now(), `nickname` = :#{#resources.nickname}, `headimgurl` = :#{#resources.headimgurl} " +
" WHERE `id` = :#{#resources.id} and `status` = 1 ", nativeQuery = true)
Integer updateAppLastActiveTimeAndNicknameAndHeadImgById(@Param("resources") UserApp userApp);
@Modifying
@Query(value = "INSERT INTO `uc_user_app`(`id`, `member_id`, `username`, `password`, `type`, `status`, `nickname`, `headimgurl`, `email`, `cellphone`, `gender`, `birthday`, `last_active_time`, `delete_time`, `tags`, `description`, `create_time`, `update_time`) " +
" VALUES (:#{#resources.id}, :#{#resources.memberId}, :#{#resources.username}, :#{#resources.password}, :#{#resources.type}," +
" 1, :#{#resources.nickname}, :#{#resources.headimgurl}, :#{#resources.email}, :#{#resources.cellphone}, " +
" :#{#resources.gender}, NULL, now(), NULL, :#{#resources.tags}, " +
" :#{#resources.description}, :#{#resources.createTime}, now());", nativeQuery = true)
void saveByIdManual(@Param("resources") UserAppIdManual userAppIdManual);
}
package com.topdraw.business.module.user.app.repository;
import com.topdraw.business.module.user.app.domain.UserAppSimple;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
/**
* @author XiangHan
* @date 2022-06-27
*/
public interface UserAppSimpleRepository extends JpaRepository<UserAppSimple, Long>, JpaSpecificationExecutor<UserAppSimple> {
}
package com.topdraw.business.module.user.app.rest;
import com.topdraw.annotation.AnonymousAccess;
import com.topdraw.business.module.user.app.domain.UserApp;
import com.topdraw.business.module.user.app.domain.UserAppBind;
import com.topdraw.business.module.user.app.service.UserAppBindService;
import com.topdraw.business.module.user.app.service.dto.UserAppBindDTO;
import com.topdraw.business.module.user.app.service.dto.UserAppDTO;
import com.topdraw.business.module.vis.hainan.apple.domain.VisUserApple;
import com.topdraw.business.module.vis.hainan.qq.domain.VisUserQq;
import com.topdraw.business.module.vis.hainan.weibo.domain.VisUserWeibo;
import com.topdraw.business.module.vis.hainan.weixin.domain.VisUserWeixin;
import com.topdraw.common.ResultInfo;
import com.topdraw.annotation.Log;
import com.topdraw.business.module.user.app.service.UserAppService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
import java.util.Objects;
/**
* @author XiangHan
* @date 2022-06-27
*/
@Api(tags = "UserApp管理")
@RestController
@RequestMapping("/uce/userApp")
@Slf4j
public class UserAppController {
@Autowired
private UserAppService userAppService;
@Autowired
private UserAppBindService userAppBindService;
@Log
@PostMapping(value = "/saveAppAndBindApple4Vis")
@ApiOperation("兼容海南app苹果数据")
@AnonymousAccess
public ResultInfo saveAppAndBindApple4Vis(@Validated @RequestBody VisUserApple resources) {
log.info("兼容海南app苹果数据,参数 ==>> [saveAppAndBindApple4Vis#{}]", resources);
String user = resources.getUser();
if (StringUtils.isBlank(user)) {
log.error("兼容海南app苹果数据,参数错误,app账号不得为空,[saveAppAndBindApple4Vis#{}]", resources);
return ResultInfo.failure("兼容海南app苹果数据,参数错误,app账号不得为空");
}
return this.userAppService.saveAppAndBindApple4Vis(resources);
}
@Log
@PostMapping(value = "/saveAppAndBindWeibo4Vis")
@ApiOperation("兼容海南app原微博数据")
@AnonymousAccess
public ResultInfo saveAppAndBindWeibo4Vis(@Validated @RequestBody VisUserWeibo resources) {
log.info("兼容海南app原weibo数据,参数 ==>> [saveAppAndBindWeibo4Vis#{}]", resources);
String userId = resources.getUserId();
if (StringUtils.isBlank(userId)) {
log.error("兼容海南app原weibo数据,参数错误,app账号不得为空,[saveAppAndBindWeibo4Vis#{}]", resources);
return ResultInfo.failure("兼容海南app原weibo数据,参数错误,app账号不得为空");
}
return this.userAppService.saveAppAndBindWeibo4Vis(resources);
}
@Log
@PostMapping(value = "/saveAppAndBindQq4Vis")
@ApiOperation("兼容海南app原QQ数据")
@AnonymousAccess
public ResultInfo saveAppAndBindQq4Vis(@Validated @RequestBody VisUserQq resources) {
log.info("兼容海南app原QQ数据,参数 ==>> [saveAppAndBindQq4Vis#{}]", resources);
String openid = resources.getOpenid();
if (StringUtils.isBlank(openid)) {
log.error("兼容海南app原QQ数据,参数错误,app账号不得为空,[saveAppAndBindWeibo4Vis#{}]", resources);
return ResultInfo.failure("兼容海南app原QQ数据,参数错误,无openid");
}
return this.userAppService.saveAppAndBindQq4Vis(resources);
}
@Log
@PostMapping(value = "/saveAppAndBindWeixin4Vis")
@ApiOperation("兼容海南app原微信数据")
@AnonymousAccess
public ResultInfo saveAppAndBindWeixin4Vis(@Validated @RequestBody VisUserWeixin resources) {
log.info("兼容海南app原weibo数据,参数 ==>> [saveAppAndBindWeixin4Vis#{}]", resources);
String openid = resources.getOpenid();
if (StringUtils.isBlank(openid)) {
log.error("兼容海南app原微信数据,参数错误,app账号不得为空,[saveAppAndBindWeixin4Vis#{}]", resources);
return ResultInfo.failure("兼容海南app原微信数据,参数错误,无openid");
}
/*String username = resources.getUsername();
if (StringUtils.isBlank(username)) {
log.error("兼容海南app原微信数据,参数错误,app账号不得为空,[saveAppAndBindWeixin4Vis#{}]", resources);
return ResultInfo.failure("兼容海南app原微信数据失败,参数错误,无username");
}*/
return this.userAppService.saveAppAndBindWeixin4Vis(resources);
}
@Log
@PostMapping(value = "/updateAppLastActiveTimeAndNicknameAndHeadImgById")
@ApiOperation("修改app账号最后登录时间、昵称和头像和用户名")
@AnonymousAccess
public ResultInfo updateAppLastActiveTimeAndNicknameAndHeadImgById(@Validated @RequestBody UserApp resources) {
log.info("修改app账号最后登录时间、昵称和头像和用户名,参数 ==>> [updatePassword#{}]", resources);
Long id = resources.getId();
if (Objects.isNull(id)) {
log.error("修改app账号最后登录时间、昵称和头像和用户名,参数错误,id不存在,[updateAppLastActiveTimeAndNicknameAndHeadImgById#{}]", resources);
return ResultInfo.failure("修改app账号密码失败,参数错误,app账号不得为空");
}
String username = resources.getUsername();
if (StringUtils.isBlank(username)) {
log.error("修改app账号最后登录时间、昵称和头像和用户名,参数错误,app账号不得为空,[updateAppLastActiveTimeAndNicknameAndHeadImgById#{}]", resources);
return ResultInfo.failure("修改app账号最后登录时间、昵称和头像和用户名失败,参数错误,app账号不得为空");
}
boolean result = this.userAppService.updateAppLastActiveTimeAndNicknameAndHeadImgById(resources);
return ResultInfo.success(result);
}
@Log
@PostMapping(value = "/updateAppLastActiveTimeAndNicknameAndHeadImg")
@ApiOperation("修改app账号最后登录时间、昵称和头像")
@AnonymousAccess
public ResultInfo updateAppLastActiveTimeAndNicknameAndHeadImg(@Validated @RequestBody UserApp resources) {
log.info("修改app账号密码,参数 ==>> [updateAppLastActiveTimeAndNicknameAndHeadImg#{}]", resources);
String username = resources.getUsername();
if (StringUtils.isBlank(username)) {
log.error("修改app账号密码,参数错误,app账号不得为空,[updateAppLastActiveTimeAndNicknameAndHeadImg#{}]", resources);
return ResultInfo.failure("修改app账号密码失败,参数错误,app账号不得为空");
}
boolean result = this.userAppService.updateAppLastActiveTimeAndNicknameAndHeadImg(resources);
return ResultInfo.success(result);
}
@Log
@PostMapping(value = "/updateAppPasswordByUsername")
@ApiOperation("修改app账号密码")
@AnonymousAccess
public ResultInfo updateAppPasswordByUsername(@Validated @RequestBody UserApp resources) {
log.info("修改app账号密码,参数 ==>> [updatePassword#{}]", resources);
String username = resources.getUsername();
if (StringUtils.isBlank(username)) {
log.error("修改app账号密码,参数错误,app账号不得为空,[updateLastActiveTime#{}]", resources);
return ResultInfo.failure("修改app账号密码失败,参数错误,app账号不得为空");
}
String password = resources.getPassword();
if (StringUtils.isBlank(password)) {
log.error("修改app账号密码失败,参数错误,密码不得为空,[updatePassword#{}]", resources);
return ResultInfo.failure("修改app账号最新登录时间失败,参数错误,app账号不得为空");
}
// boolean passwordRegexResult = RegexUtil.appPasswordRegex(password);
// if (!passwordRegexResult) {
// log.error("修改app账号密码失败,参数错误,密码格式不正确,[updatePassword#{}]", resources);
// return ResultInfo.failure("密码必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 8-25 之间");
// }
boolean result = this.userAppService.updatePasswordByUsername(resources);
return ResultInfo.success(result);
}
@Log
@PostMapping(value = "/updateLastActiveTime")
@ApiOperation("修改app账号最新登录时间")
@AnonymousAccess
public ResultInfo updateLastActiveTime(@Validated @RequestBody UserAppBind resources) {
log.info("修改app账号最新登录时间 ==>> param ==>> [updateLastActiveTime#{}]", resources);
String username = resources.getUsername();
if (StringUtils.isBlank(username)) {
log.error("修改app账号最新登录时间失败,参数错误,app账号不得为空,[updateLastActiveTime#{}]", resources);
return ResultInfo.failure("修改app账号最新登录时间失败,参数错误,app账号不得为空");
}
boolean result = this.userAppService.updateLastActiveTime(resources);
return ResultInfo.success(result);
}
@Log
@PostMapping(value = "/saveThirdAccount")
@ApiOperation("保存第三方账号")
@AnonymousAccess
public ResultInfo saveThirdAccount(@Validated @RequestBody UserAppBind resources) {
log.info("保存第三方账号, 参数 ==>> [saveUserBindApp#{}]", resources);
String username = resources.getUsername();
if (StringUtils.isBlank(username)) {
log.error("修改app账号最新登录时间失败,参数错误,app账号不得为空,[updateLastActiveTime#{}]", resources);
return ResultInfo.failure("修改app账号最新登录时间失败,参数错误,app账号不得为空");
}
UserAppDTO userAppDTO = this.userAppService.findByUsername(username);
if (Objects.nonNull(userAppDTO.getId())) {
Long id = userAppDTO.getId();
resources.setUserAppId(id);
}
UserAppBindDTO userAppBindDTO = this.userAppBindService.create(resources);
return ResultInfo.success(userAppBindDTO);
}
@Log
@PostMapping(value = "/updateValidStatusAndUserAppIdAndNickname")
@ApiOperation("修改第三方账号绑定状态、绑定的app账号以及第三方账号昵称")
@AnonymousAccess
public ResultInfo updateValidStatusAndUserAppIdAndNickname(@Validated @RequestBody UserAppBind resources) {
log.info("修改第三方账号 ==>> param ==>> [updateThirdAccountStatusAndUserAppId#{}]", resources);
String username = resources.getUsername();
if (StringUtils.isBlank(username)) {
log.error("修改app账号最新登录时间失败,参数错误,app账号不得为空,[updateLastActiveTime#{}]", resources);
return ResultInfo.failure("修改app账号最新登录时间失败,参数错误,app账号不得为空");
}
String account = resources.getAccount();
Integer accountType = resources.getAccountType();
if (StringUtils.isBlank(account) || Objects.isNull(accountType)) {
log.error("检查app账号是否绑定了第三方账号失败, 参数错误, 第三方账号或者第三方账号类型不得为空 [checkThirdAccount# resources ==>> {}]", resources);
return ResultInfo.failure("检查第三方账号是否绑定了第三方账号失败, 参数错误, 第三方账号或者第三方账号类型不得为空");
}
UserAppDTO userAppDTO = this.userAppService.findByUsername(username);
if (Objects.nonNull(userAppDTO.getId())) {
Long id = userAppDTO.getId();
resources.setUserAppId(id);
} else {
log.error("修改第三方账号, 参数错误, app账号不得为空 [updateValidStatusAndUserAppIdAndNickname# resources ==>> {}]", resources);
return ResultInfo.failure("修改第三方账号, 参数错误, app账号不得为空");
}
boolean result = this.userAppBindService.updateValidStatusAndUserAppIdAndNickname(resources);
return ResultInfo.success(result);
}
@Log
@PostMapping(value = "/updateThirdAccountNickname")
@ApiOperation("修改第三方账号昵称")
@AnonymousAccess
public ResultInfo updateThirdAccountNickname(@Validated @RequestBody UserAppBind resources) {
log.info("修改第三方账号 ==>> param ==>> [updateThirdAccountNickname#{}]", resources);
String account = resources.getAccount();
Integer accountType = resources.getAccountType();
if (StringUtils.isBlank(account) || Objects.isNull(accountType)) {
log.error("修改第三方账号昵称, 参数错误, 第三方账号或者第三方账号类型不得为空 [checkThirdAccount# resources ==>> {}]", resources);
return ResultInfo.failure("修改第三方账号昵称, 参数错误, 第三方账号或者第三方账号类型不得为空");
}
String nickname = resources.getNickname();
if (StringUtils.isBlank(nickname)) {
log.error("修改第三方账号昵称, 参数错误, 昵称不得为空 [updateThirdAccountNickname# resources ==>> {}]", resources);
return ResultInfo.failure("修改第三方账号昵称, 参数错误, 昵称不得为空");
}
boolean result = this.userAppBindService.updateThirdAccountNickname(resources);
return ResultInfo.success(result);
}
}
package com.topdraw.business.module.user.app.service;
import com.topdraw.business.module.user.app.domain.UserAppBind;
import com.topdraw.business.module.user.app.service.dto.UserAppBindDTO;
import java.util.List;
/**
* @author XiangHan
* @date 2022-06-27
*/
public interface UserAppBindService {
/**
* 根据ID查询
* @param id ID
* @return UserAppBindDTO
*/
UserAppBindDTO findById(Long id);
/**
*
* @param resources
*/
UserAppBindDTO create(UserAppBind resources);
/**
*
* @param resources
*/
void update(UserAppBind resources);
/**
*
* @param id
*/
void delete(Long id);
/**
*
* @param account
* @return
*/
UserAppBindDTO findFirstByAccount(String account);
/**
*
* @param account
* @return
*/
boolean cancelUserAppBind(String account, Integer accountType);
/**
*
* @param account
* @param accountType
* @return
*/
UserAppBindDTO findFirstByAccountAndAccountType(String account, Integer accountType);
/**
*
* @param resources
* @return
*/
boolean updateThirdAccount(UserAppBind resources);
/**
*
* @param resources
* @return
*/
boolean updateThirdAccountNickname(UserAppBind resources);
/**
*
* @param resources
* @return
*/
boolean updateValidStatusAndUserAppIdAndNickname(UserAppBind resources);
boolean appCancellation(List<Long> ids);
List<UserAppBindDTO> findByUserAppId(Long id);
}
package com.topdraw.business.module.user.app.service;
import com.topdraw.business.module.user.app.domain.UserApp;
import com.topdraw.business.module.user.app.domain.UserAppBind;
import com.topdraw.business.module.user.app.service.dto.UserAppDTO;
import com.topdraw.business.module.user.app.service.dto.UserAppSimpleDTO;
import com.topdraw.business.module.vis.hainan.apple.domain.VisUserApple;
import com.topdraw.business.module.vis.hainan.qq.domain.VisUserQq;
import com.topdraw.business.module.vis.hainan.weibo.domain.VisUserWeibo;
import com.topdraw.business.module.vis.hainan.weixin.domain.VisUserWeixin;
import com.topdraw.common.ResultInfo;
/**
* @author XiangHan
* @date 2022-06-27
*/
public interface UserAppService {
/**
* 根据ID查询
* @param id ID
* @return UserAppDTO
*/
UserAppDTO findById(Long id);
/**
* 检查账号和秘密
* @param username
* @return
*/
UserAppDTO findByUsername(String username);
/**
*
* @param resources
*/
UserAppDTO create(UserApp resources);
/**
*
* @param resources
*/
UserAppDTO update(UserApp resources);
/**
*
* @param id
*/
void delete(Long id);
/**
*
* @param resources
* @return
*/
boolean updateLastActiveTime(UserAppBind resources);
/**
*
* @param resources
* @return
*/
boolean updatePasswordByUsername(UserApp resources);
/**
*
* @param resources
* @return
*/
boolean updatePasswordById(UserApp resources);
/**
*
* @param resources
* @return
*/
UserAppSimpleDTO updateAppInfo(UserApp resources);
boolean appCancellation(Long id);
boolean updateAppLastActiveTimeAndNicknameAndHeadImg(UserApp resources);
boolean updateAppLastActiveTimeAndNicknameAndHeadImgById(UserApp resources);
ResultInfo saveAppAndBindApple4Vis(VisUserApple resources);
ResultInfo saveAppAndBindWeibo4Vis(VisUserWeibo resources);
ResultInfo saveAppAndBindWeixin4Vis(VisUserWeixin resources);
ResultInfo saveAppAndBindQq4Vis(VisUserQq resources);
}
package com.topdraw.business.module.user.app.service.dto;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import lombok.Data;
import java.io.Serializable;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/7/11 21:21
* @version: :
* @modified By:
* @since : modified in 2022/7/11 21:21
*/
@Data
public class AppRegisterDTO implements Serializable {
private UserAppDTO userAppDTO;
private MemberDTO memberDTO;
}
package com.topdraw.business.module.user.app.service.dto;
import lombok.Data;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2022-06-27
*/
@Data
public class UserAppBindDTO implements Serializable {
// 主键
private Long id;
// 第三方账号类型 3:微信;4:QQ;5:微博;6:苹果账号
private Integer accountType;
// 第三方账号
private String account;
// app账号id
private Long userAppId;
// 绑定状态 0:解绑;1 绑定
private Integer status;
// 昵称
private String nickname;
// 创建时间
private Timestamp createTime;
// 更新时间
private Timestamp updateTime;
}
package com.topdraw.business.module.user.app.service.dto;
import lombok.Data;
import javax.persistence.Transient;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2022-06-27
*/
@Data
public class UserAppDTO implements Serializable {
private Integer accountType;
// 第三方账号
private String account;
// ID
private Long id;
// 会员id
private Long memberId;
// 用户名(一般为手机号)
private String username;
// 密码
private String password;
// 类型 0:苹果;1:安卓;-1:未知
private Integer type;
// 状态 0:禁用;1:生效;-1:注销
private Integer status;
// 昵称
private String nickname;
// 头像地址
private String headimgurl;
// 邮箱
private String email;
// 手机号
private String cellphone;
// 性别 0:女;1:男;-1:其他
private Integer gender;
// 生日
private String birthday;
// 最近活跃时间
private Timestamp lastActiveTime;
// 注销时间
private Timestamp deleteTime;
// 标签
private String tags;
// 描述
private String description;
// 创建时间
private Timestamp createTime;
// 更新时间
private Timestamp updateTime;
}
package com.topdraw.business.module.user.app.service.dto;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.member.service.dto.MemberSimpleDTO;
import lombok.Data;
import java.io.Serializable;
import java.sql.Timestamp;
/**
* @author XiangHan
* @date 2022-06-27
*/
@Data
public class UserAppSimpleDTO implements Serializable {
// ID
private Long id;
// 会员id
private Long memberId;
// 用户名(一般为手机号)
private String username;
// 状态 0:禁用;1:生效;-1:注销
private Integer status;
// 昵称
private String nickname;
// 头像地址
private String headimgurl;
// 邮箱
private String email;
// 手机号
private String cellphone;
// 性别 0:女;1:男;-1:其他
private Integer gender;
// 生日
private String birthday;
// 标签
private String tags;
// 描述
private String description;
private MemberSimpleDTO member;
}
package com.topdraw.business.module.user.app.service.impl;
import com.topdraw.business.module.user.app.domain.UserAppBind;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.user.app.repository.UserAppBindRepository;
import com.topdraw.business.module.user.app.service.UserAppBindService;
import com.topdraw.business.module.user.app.service.dto.UserAppBindDTO;
import com.topdraw.business.module.user.app.service.mapper.UserAppBindMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.util.Assert;
import java.util.List;
/**
* @author XiangHan
* @date 2022-06-27
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class UserAppBindServiceImpl implements UserAppBindService {
@Autowired
private UserAppBindRepository userAppBindRepository;
@Autowired
private UserAppBindMapper userAppBindMapper;
@Override
public UserAppBindDTO findById(Long id) {
UserAppBind userAppBind = this.userAppBindRepository.findById(id).orElseGet(UserAppBind::new);
ValidationUtil.isNull(userAppBind.getId(),"UserAppBind","id",id);
return this.userAppBindMapper.toDto(userAppBind);
}
@Override
@Transactional(rollbackFor = Exception.class)
public UserAppBindDTO create(UserAppBind resources) {
UserAppBind userAppBind = this.userAppBindRepository.save(resources);
return this.userAppBindMapper.toDto(userAppBind);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(UserAppBind resources) {
UserAppBind userAppBind = this.userAppBindRepository.findById(resources.getId()).orElseGet(UserAppBind::new);
ValidationUtil.isNull( userAppBind.getId(),"UserAppBind","id",resources.getId());
userAppBind.copy(resources);
this.userAppBindRepository.save(userAppBind);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
UserAppBind UserAppBind = this.userAppBindRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", UserAppBind.class, id), 1));
this.userAppBindRepository.delete(UserAppBind);
}
@Override
public UserAppBindDTO findFirstByAccount(String account) {
UserAppBind userAppBind = this.userAppBindRepository.findFirstByAccount(account).orElseGet(UserAppBind::new);
return this.userAppBindMapper.toDto(userAppBind);
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean cancelUserAppBind(String account, Integer accountType) {
return this.userAppBindRepository.cancelUserAppBind(account, accountType) > 0;
}
@Override
@Transactional(readOnly = true)
public UserAppBindDTO findFirstByAccountAndAccountType(String account, Integer accountType) {
UserAppBind userAppBind = this.userAppBindRepository.findFirstByAccountAndAccountType(account, accountType).orElseGet(UserAppBind::new);
return this.userAppBindMapper.toDto(userAppBind);
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean updateThirdAccount(UserAppBind resources) {
return this.userAppBindRepository.updateThirdAccount(resources) > 0;
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean updateThirdAccountNickname(UserAppBind resources) {
return this.userAppBindRepository.updateThirdAccountNickname(resources) > 0;
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean updateValidStatusAndUserAppIdAndNickname(UserAppBind resources) {
return this.userAppBindRepository.updateValidStatusAndUserAppIdAndNickname(resources) > 0;
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean appCancellation(List<Long> ids) {
return this.userAppBindRepository.appCancellation(ids) > 0;
}
@Override
@Transactional(readOnly = true)
public List<UserAppBindDTO> findByUserAppId(Long id) {
List<UserAppBind> userAppBinds = this.userAppBindRepository.findByUserAppId(id);
return this.userAppBindMapper.toDto(userAppBinds);
}
}
package com.topdraw.business.module.user.app.service.impl;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.domain.MemberBuilder;
import com.topdraw.business.module.member.domain.MemberTypeConstant;
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.app.domain.UserApp;
import com.topdraw.business.module.user.app.domain.UserAppBind;
import com.topdraw.business.module.user.app.domain.UserAppIdManual;
import com.topdraw.business.module.user.app.domain.UserAppSimple;
import com.topdraw.business.module.user.app.repository.UserAppSimpleRepository;
import com.topdraw.business.module.user.app.service.UserAppBindService;
import com.topdraw.business.module.user.app.service.dto.UserAppBindDTO;
import com.topdraw.business.module.user.app.service.dto.UserAppSimpleDTO;
import com.topdraw.business.module.vis.hainan.app.service.VisUserService;
import com.topdraw.business.module.vis.hainan.app.service.dto.VisUserDTO;
import com.topdraw.business.module.vis.hainan.apple.domain.VisUserApple;
import com.topdraw.business.module.vis.hainan.apple.service.VisUserAppleService;
import com.topdraw.business.module.vis.hainan.qq.domain.VisUserQq;
import com.topdraw.business.module.vis.hainan.weibo.domain.VisUserWeibo;
import com.topdraw.business.module.vis.hainan.weixin.domain.VisUserWeixin;
import com.topdraw.common.ResultInfo;
import com.topdraw.util.Base64Util;
import com.topdraw.util.TimestampUtil;
import com.topdraw.utils.StringUtils;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.user.app.repository.UserAppRepository;
import com.topdraw.business.module.user.app.service.UserAppService;
import com.topdraw.business.module.user.app.service.dto.UserAppDTO;
import com.topdraw.business.module.user.app.service.mapper.UserAppMapper;
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.stereotype.Service;
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.Base64Utils;
import java.sql.Timestamp;
import java.util.Objects;
/**
* @author XiangHan
* @date 2022-06-27
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
@Slf4j
public class UserAppServiceImpl implements UserAppService {
@Autowired
private UserAppRepository userAppRepository;
@Autowired
private UserAppSimpleRepository userAppSimpleRepository;
@Autowired
private UserAppMapper userAppMapper;
@Autowired
private MemberService memberService;
@Autowired
private VisUserService visUserService;
@Autowired
private UserAppBindService userAppBindService;
@Autowired
private VisUserAppleService visUserAppleService;
@Override
@Transactional(readOnly = true)
public UserAppDTO findById(Long id) {
UserApp userApp = this.userAppRepository.findById(id).orElseGet(UserApp::new);
ValidationUtil.isNull(userApp.getId(),"UserApp","id",id);
return this.userAppMapper.toDto(userApp);
}
@Override
@Transactional(readOnly = true)
public UserAppDTO findByUsername(String username) {
UserApp userApp = this.userAppRepository.findByUsername(username).orElseGet(UserApp::new);
return this.userAppMapper.toDto(userApp);
}
@Override
@Transactional(rollbackFor = Exception.class)
public UserAppDTO create(UserApp resources) {
UserApp userApp = this.userAppRepository.save(resources);
return this.userAppMapper.toDto(userApp);
}
@Override
@Transactional(rollbackFor = Exception.class)
public UserAppDTO update(UserApp resources) {
UserApp userApp = this.userAppRepository.findById(resources.getId()).orElseGet(UserApp::new);
ValidationUtil.isNull( userApp.getId(),"UserApp","id",resources.getId());
userApp.copy(resources);
UserApp _userApp = this.userAppRepository.save(userApp);
if (Objects.nonNull(_userApp.getId())) {
return this.userAppMapper.toDto(_userApp);
}
return this.userAppMapper.toDto(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
UserApp UserApp = this.userAppRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", UserApp.class, id), 1));
this.userAppRepository.delete(UserApp);
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean updateLastActiveTime(UserAppBind resources) {
return this.userAppRepository.updateLastActiveTime(resources.getUsername()) > 0;
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean updatePasswordByUsername(UserApp resources) {
return this.userAppRepository.updatePasswordByUsername(resources.getUsername(), resources.getPassword()) > 0;
}
@Override
@Transactional(rollbackFor = Exception.class)
public UserAppSimpleDTO updateAppInfo(UserApp resources) {
Long id = resources.getId();
UserApp userApp = this.userAppRepository.findById(id).orElseGet(UserApp::new);
if (Objects.isNull(userApp.getId())) {
log.error("修改app信息失败,app账号信息不存在[updateAppInfo#]");
return new UserAppSimpleDTO();
}
userApp.copy(resources);
if (this.userAppRepository.updateAppInfo(userApp) > 0) {
UserAppSimple userAppSimple = this.userAppSimpleRepository.findById(resources.getId()).orElseGet(UserAppSimple::new);
if (Objects.nonNull(userAppSimple.getId())) {
MemberDTO memberDTO = this.memberService.findById(userAppSimple.getMemberId());
UserAppSimpleDTO userAppSimpleDTO = new UserAppSimpleDTO();
BeanUtils.copyProperties(userAppSimple, userAppSimpleDTO);
MemberSimpleDTO memberSimpleDTO = new MemberSimpleDTO();
BeanUtils.copyProperties(memberDTO, memberSimpleDTO);
userAppSimpleDTO.setMember(memberSimpleDTO);
return userAppSimpleDTO;
}
}
return null;
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean appCancellation(Long id) {
return this.userAppRepository.appCancellation(id) > 0;
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean updateAppLastActiveTimeAndNicknameAndHeadImg(UserApp resources) {
return this.userAppRepository.updateAppLastActiveTimeAndNicknameAndHeadImg(resources.getUsername(),
resources.getNickname(), resources.getHeadimgurl()) > 0;
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean updateAppLastActiveTimeAndNicknameAndHeadImgById(UserApp resources) {
Integer count = this.userAppRepository.updateAppLastActiveTimeAndNicknameAndHeadImgById(resources);
if (count > 0) {
((UserAppServiceImpl) AopContext.currentProxy()).asyncUpdateAppLastActiveTimeAndNicknameAndHeadImgById(resources);
return true;
}
return false;
}
@Override
@Transactional(rollbackFor = Exception.class)
public ResultInfo saveAppAndBindApple4Vis(VisUserApple resources) {
String username = resources.getUsername();
UserAppDTO userAppDTO = this.findByUsername(username);
if (Objects.nonNull(userAppDTO.getId()) && StringUtils.isNotBlank(userAppDTO.getHeadimgurl())) {
UserAppBindDTO userAppBindDTO = this.userAppBindService.findFirstByAccountAndAccountType(resources.getUser(), 6);
if (Objects.nonNull(userAppBindDTO.getId())) {
UserAppBind userAppBind = new UserAppBind();
userAppBind.setAccount(resources.getUser());
userAppBind.setAccountType(6);
userAppBind.setUserAppId(userAppDTO.getId());
userAppBind.setStatus(1);
userAppBind.setNickname(resources.getNickname());
userAppBind.setHeadimgurl(resources.getIcon());
this.userAppBindService.create(userAppBind);
}
return ResultInfo.success(userAppDTO);
}
Long visUserId = resources.getVisUserId();
VisUserDTO visUserDTO = this.visUserService.findById(visUserId);
if (Objects.nonNull(visUserDTO.getId())) {
UserAppIdManual userAppIdManual = new UserAppIdManual();
Long id = visUserDTO.getId();
userAppIdManual.setId(id);
// vis 手机号
String cellphone = visUserDTO.getCellphone();
userAppIdManual.setUsername(StringUtils.isBlank(cellphone) ? username : cellphone);
userAppIdManual.setCellphone(StringUtils.isBlank(cellphone) ? null : cellphone);
if (StringUtils.isBlank(visUserDTO.getNickname())) {
userAppIdManual.setNickname(resources.getNickname());
} else {
if(!Base64Util.isBase64(visUserDTO.getNickname())) {
userAppIdManual.setNickname(Base64Utils.encodeToString(visUserDTO.getNickname().getBytes()));
} else {
userAppIdManual.setNickname(visUserDTO.getNickname());
}
}
Integer gender = visUserDTO.getGender();
userAppIdManual.setGender(Objects.isNull(gender) ? -1 : gender);
userAppIdManual.setHeadimgurl(resources.getIcon());
String email = visUserDTO.getEmail();
userAppIdManual.setEmail(StringUtils.isBlank(email) ? null : email);
String tags = visUserDTO.getTags();
userAppIdManual.setTags(StringUtils.isBlank(tags) ? null : tags);
Timestamp createTime = visUserDTO.getCreateTime();
userAppIdManual.setCreateTime(Objects.isNull(createTime) ? TimestampUtil.now() : createTime);
Member member = MemberBuilder.build(MemberTypeConstant.app, resources.getIcon(), userAppIdManual.getNickname(), 0);
MemberDTO memberDTO = this.memberService.create(member);
userAppIdManual.setMemberCode(memberDTO.getCode());
userAppIdManual.setMemberId(memberDTO.getId());
userAppIdManual.setType(resources.getType());
this.userAppRepository.saveByIdManual(userAppIdManual);
UserAppBindDTO userAppBindDTO = this.userAppBindService.findFirstByAccountAndAccountType(resources.getUser(), 6);
if (Objects.isNull(userAppBindDTO.getId())) {
UserAppBind userAppBind = new UserAppBind();
userAppBind.setAccount(resources.getUser());
userAppBind.setAccountType(6);
userAppBind.setUserAppId(visUserId);
userAppBind.setStatus(1);
userAppBind.setNickname(resources.getNickname());
userAppBind.setHeadimgurl(resources.getIcon());
this.userAppBindService.create(userAppBind);
}
((UserAppServiceImpl) AopContext.currentProxy()).asyncSaveByIdManual(userAppIdManual);
return ResultInfo.success(userAppIdManual);
}
return ResultInfo.failure(null);
}
@Override
@Transactional(rollbackFor = Exception.class)
public ResultInfo saveAppAndBindWeibo4Vis(VisUserWeibo resources) {
String username1 = resources.getUsername();
UserAppDTO userAppDTO = this.findByUsername(username1);
if (Objects.nonNull(userAppDTO.getId()) && StringUtils.isNotBlank(userAppDTO.getHeadimgurl())) {
UserAppBindDTO userAppBindDTO = this.userAppBindService.findFirstByAccountAndAccountType(resources.getUserId(), 5);
if (Objects.nonNull(userAppBindDTO.getId())) {
UserAppBind userAppBind = new UserAppBind();
userAppBind.setAccount(resources.getUserId());
userAppBind.setAccountType(3);
userAppBind.setUserAppId(userAppDTO.getId());
userAppBind.setStatus(1);
userAppBind.setNickname(resources.getNickname());
userAppBind.setHeadimgurl(resources.getIcon());
this.userAppBindService.create(userAppBind);
}
return ResultInfo.success(userAppDTO);
}
Long visUserId = resources.getVisUserId();
VisUserDTO visUserDTO = this.visUserService.findById(visUserId);
if (Objects.nonNull(visUserDTO.getId())) {
UserAppIdManual userAppIdManual = new UserAppIdManual();
Long id = visUserDTO.getId();
userAppIdManual.setId(id);
String cellphone = visUserDTO.getCellphone();
userAppIdManual.setUsername(StringUtils.isBlank(cellphone) ? username1 : cellphone);
userAppIdManual.setCellphone(StringUtils.isBlank(cellphone) ? null : cellphone);
if (StringUtils.isBlank(visUserDTO.getNickname())) {
userAppIdManual.setNickname(resources.getNickname());
} else {
if(!Base64Util.isBase64(visUserDTO.getNickname())) {
userAppIdManual.setNickname(Base64Utils.encodeToString(visUserDTO.getNickname().getBytes()));
} else {
userAppIdManual.setNickname(visUserDTO.getNickname());
}
}
Integer gender = visUserDTO.getGender();
userAppIdManual.setGender(Objects.isNull(gender) ? -1 : gender);
userAppIdManual.setHeadimgurl(resources.getIcon());
String email = visUserDTO.getEmail();
userAppIdManual.setEmail(StringUtils.isBlank(email) ? null : email);
String tags = visUserDTO.getTags();
userAppIdManual.setTags(StringUtils.isBlank(tags) ? null : tags);
Timestamp createTime = visUserDTO.getCreateTime();
userAppIdManual.setCreateTime(Objects.isNull(createTime) ? TimestampUtil.now() : createTime);
Member member = MemberBuilder.build(MemberTypeConstant.app, resources.getIcon(), userAppIdManual.getNickname(), 0);
MemberDTO memberDTO = this.memberService.create(member);
userAppIdManual.setMemberCode(memberDTO.getCode());
userAppIdManual.setMemberId(memberDTO.getId());
userAppIdManual.setType(resources.getType());
this.userAppRepository.saveByIdManual(userAppIdManual);
UserAppBindDTO userAppBindDTO = this.userAppBindService.findFirstByAccountAndAccountType(resources.getUserId(), 5);
if (Objects.isNull(userAppBindDTO.getId())) {
UserAppBind userAppBind = new UserAppBind();
userAppBind.setAccount(resources.getUserId());
userAppBind.setAccountType(5);
userAppBind.setUserAppId(visUserId);
userAppBind.setStatus(1);
userAppBind.setNickname(resources.getNickname());
userAppBind.setHeadimgurl(resources.getIcon());
this.userAppBindService.create(userAppBind);
}
((UserAppServiceImpl) AopContext.currentProxy()).asyncSaveByIdManual(userAppIdManual);
return ResultInfo.success(userAppIdManual);
}
return ResultInfo.failure(null);
}
@Override
@Transactional(rollbackFor = Exception.class)
public ResultInfo saveAppAndBindWeixin4Vis(VisUserWeixin resources) {
String username1 = resources.getUsername();
UserAppDTO userAppDTO = this.findByUsername(username1);
if (Objects.nonNull(userAppDTO.getId()) && StringUtils.isNotBlank(userAppDTO.getHeadimgurl())) {
UserAppBindDTO userAppBindDTO = this.userAppBindService.findFirstByAccountAndAccountType(resources.getOpenid(), 3);
if (Objects.nonNull(userAppBindDTO.getId())) {
UserAppBind userAppBind = new UserAppBind();
userAppBind.setAccount(resources.getOpenid());
userAppBind.setAccountType(3);
userAppBind.setUserAppId(userAppDTO.getId());
userAppBind.setStatus(1);
userAppBind.setNickname(resources.getNickname());
userAppBind.setHeadimgurl(resources.getHeadimgurl());
this.userAppBindService.create(userAppBind);
}
return ResultInfo.success(userAppDTO);
}
Long visUserId = resources.getVisUserId();
VisUserDTO visUserDTO = this.visUserService.findById(visUserId);
if (Objects.nonNull(visUserDTO.getId())) {
UserAppIdManual userAppIdManual = new UserAppIdManual();
Long id = visUserDTO.getId();
userAppIdManual.setId(id);
String cellphone = visUserDTO.getCellphone();
userAppIdManual.setUsername(StringUtils.isBlank(cellphone) ? username1 : cellphone);
userAppIdManual.setCellphone(StringUtils.isBlank(cellphone) ? null : cellphone);
if (StringUtils.isBlank(visUserDTO.getNickname())) {
userAppIdManual.setNickname(resources.getNickname());
} else {
if(!Base64Util.isBase64(visUserDTO.getNickname())) {
userAppIdManual.setNickname(Base64Utils.encodeToString(visUserDTO.getNickname().getBytes()));
} else {
userAppIdManual.setNickname(visUserDTO.getNickname());
}
}
Integer gender = visUserDTO.getGender();
userAppIdManual.setGender(Objects.isNull(gender) ? -1 : gender);
userAppIdManual.setHeadimgurl(resources.getHeadimgurl());
String email = visUserDTO.getEmail();
userAppIdManual.setEmail(StringUtils.isBlank(email) ? null : email);
String tags = visUserDTO.getTags();
userAppIdManual.setTags(StringUtils.isBlank(tags) ? null : tags);
Timestamp createTime = visUserDTO.getCreateTime();
userAppIdManual.setCreateTime(Objects.isNull(createTime) ? TimestampUtil.now() : createTime);
Member member = MemberBuilder.build(MemberTypeConstant.app, resources.getHeadimgurl(), userAppIdManual.getNickname(), 0);
MemberDTO memberDTO = this.memberService.create(member);
userAppIdManual.setMemberCode(memberDTO.getCode());
userAppIdManual.setMemberId(memberDTO.getId());
userAppIdManual.setType(resources.getType());
this.userAppRepository.saveByIdManual(userAppIdManual);
UserAppBindDTO userAppBindDTO = this.userAppBindService.findFirstByAccountAndAccountType(resources.getOpenid(), 3);
if (Objects.isNull(userAppBindDTO.getId())) {
UserAppBind userAppBind = new UserAppBind();
userAppBind.setAccount(resources.getOpenid());
userAppBind.setAccountType(3);
userAppBind.setUserAppId(visUserId);
userAppBind.setStatus(1);
userAppBind.setNickname(resources.getNickname());
userAppBind.setHeadimgurl(resources.getHeadimgurl());
this.userAppBindService.create(userAppBind);
}
((UserAppServiceImpl) AopContext.currentProxy()).asyncSaveByIdManual(userAppIdManual);
return ResultInfo.success(userAppIdManual);
}
return ResultInfo.failure(null);
}
@Override
@Transactional(rollbackFor = Exception.class)
public ResultInfo saveAppAndBindQq4Vis(VisUserQq resources) {
String username1 = resources.getUsername();
UserAppDTO userAppDTO = this.findByUsername(username1);
if (Objects.nonNull(userAppDTO.getId()) && StringUtils.isNotBlank(userAppDTO.getHeadimgurl())) {
UserAppBindDTO userAppBindDTO = this.userAppBindService.findFirstByAccountAndAccountType(resources.getOpenid(), 4);
if (Objects.nonNull(userAppBindDTO.getId())) {
UserAppBind userAppBind = new UserAppBind();
userAppBind.setAccount(resources.getOpenid());
userAppBind.setAccountType(4);
userAppBind.setUserAppId(userAppDTO.getId());
userAppBind.setStatus(1);
userAppBind.setNickname(resources.getNickname());
userAppBind.setHeadimgurl(resources.getIcon());
this.userAppBindService.create(userAppBind);
}
return ResultInfo.success(userAppDTO);
}
Long visUserId = resources.getVisUserId();
VisUserDTO visUserDTO = this.visUserService.findById(visUserId);
if (Objects.nonNull(visUserDTO.getId())) {
UserAppIdManual userAppIdManual = new UserAppIdManual();
Long id = visUserDTO.getId();
userAppIdManual.setId(id);
String cellphone = visUserDTO.getCellphone();
userAppIdManual.setUsername(StringUtils.isBlank(cellphone) ? username1 : cellphone);
userAppIdManual.setCellphone(StringUtils.isBlank(cellphone) ? null : cellphone);
if (StringUtils.isBlank(visUserDTO.getNickname())) {
userAppIdManual.setNickname(resources.getNickname());
} else {
if(!Base64Util.isBase64(visUserDTO.getNickname())) {
userAppIdManual.setNickname(Base64Utils.encodeToString(visUserDTO.getNickname().getBytes()));
} else {
userAppIdManual.setNickname(visUserDTO.getNickname());
}
}
Integer gender = visUserDTO.getGender();
userAppIdManual.setGender(Objects.isNull(gender) ? -1 : gender);
userAppIdManual.setHeadimgurl(resources.getIcon());
String email = visUserDTO.getEmail();
userAppIdManual.setEmail(StringUtils.isBlank(email) ? null : email);
String tags = visUserDTO.getTags();
userAppIdManual.setTags(StringUtils.isBlank(tags) ? null : tags);
Timestamp createTime = visUserDTO.getCreateTime();
userAppIdManual.setCreateTime(Objects.isNull(createTime) ? TimestampUtil.now() : createTime);
Member member = MemberBuilder.build(MemberTypeConstant.app, resources.getIcon(), userAppIdManual.getNickname(), 0);
MemberDTO memberDTO = this.memberService.create(member);
userAppIdManual.setMemberCode(memberDTO.getCode());
userAppIdManual.setMemberId(memberDTO.getId());
userAppIdManual.setType(resources.getType());
this.userAppRepository.saveByIdManual(userAppIdManual);
UserAppBindDTO userAppBindDTO = this.userAppBindService.findFirstByAccountAndAccountType(resources.getOpenid(), 4);
if (Objects.isNull(userAppBindDTO.getId())) {
UserAppBind userAppBind = new UserAppBind();
userAppBind.setAccount(resources.getOpenid());
userAppBind.setAccountType(4);
userAppBind.setUserAppId(visUserId);
userAppBind.setStatus(1);
userAppBind.setNickname(resources.getNickname());
userAppBind.setHeadimgurl(resources.getIcon());
this.userAppBindService.create(userAppBind);
}
((UserAppServiceImpl) AopContext.currentProxy()).asyncSaveByIdManual(userAppIdManual);
return ResultInfo.success(userAppIdManual);
}
return ResultInfo.failure(null);
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean updatePasswordById(UserApp resources) {
return this.userAppRepository.updatePasswordById(resources.getId(), resources.getPassword()) > 0;
}
@AsyncMqSend
public void asyncUpdateAppLastActiveTimeAndNicknameAndHeadImgById(UserApp resources) {}
@AsyncMqSend
public void asyncSaveByIdManual(UserAppIdManual userAppIdManual) {}
}
package com.topdraw.business.module.user.app.service.mapper;
import com.topdraw.base.BaseMapper;
import com.topdraw.business.module.user.app.domain.UserAppBind;
import com.topdraw.business.module.user.app.service.dto.UserAppBindDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
/**
* @author XiangHan
* @date 2022-06-27
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface UserAppBindMapper extends BaseMapper<UserAppBindDTO, UserAppBind> {
}
package com.topdraw.business.module.user.app.service.mapper;
import com.topdraw.base.BaseMapper;
import com.topdraw.business.module.user.app.domain.UserApp;
import com.topdraw.business.module.user.app.service.dto.UserAppDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
/**
* @author XiangHan
* @date 2022-06-27
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface UserAppMapper extends BaseMapper<UserAppDTO, UserApp> {
}
package com.topdraw.business.module.user.app.service.mapper;
import com.topdraw.base.BaseMapper;
import com.topdraw.business.module.user.app.domain.UserApp;
import com.topdraw.business.module.user.app.domain.UserAppSimple;
import com.topdraw.business.module.user.app.service.dto.UserAppDTO;
import com.topdraw.business.module.user.app.service.dto.UserAppSimpleDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
/**
* @author XiangHan
* @date 2022-06-27
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface UserAppSimpleMapper extends BaseMapper<UserAppSimpleDTO, UserAppSimple> {
}
......@@ -24,28 +24,17 @@ public class UserTvBuilder {
private static final String DEFAULT_CREATE_BY = "system";
private static final String DEFAULT_UPDATE_BY = "system";
public static UserTv build(UserTv userTv){
return build(userTv.getMemberId(),userTv.getMemberCode(),userTv.getId(),userTv.getPlatformAccount(),userTv.getNickname(),userTv.getUsername(),
userTv.getLoginDays(),userTv.getStatus(),userTv.getContinueDays(),userTv.getCreateBy(),userTv.getUpdateBy(), userTv.getVisUserId());
}
public static UserTv build(Long memberId, String memberCode , UserTv userTv){
return build(memberId,memberCode,userTv.getId(),userTv.getPlatformAccount(),userTv.getNickname(),userTv.getUsername(),
userTv.getLoginDays(),userTv.getStatus(),userTv.getContinueDays(),userTv.getCreateBy(),userTv.getUpdateBy(), userTv.getVisUserId());
}
public static UserTv build(String memberCode, UserTv userTv){
return build(null,memberCode,userTv.getId(),userTv.getPlatformAccount(),userTv.getNickname(),userTv.getUsername(),
userTv.getLoginDays(),userTv.getStatus(),userTv.getContinueDays(),userTv.getCreateBy(),userTv.getUpdateBy(), userTv.getVisUserId());
}
public static UserTv build(Member member, UserTv userTv){
return build(member.getId() , member.getCode(),userTv.getId(),userTv.getPlatformAccount(),userTv.getNickname(),userTv.getUsername(),
userTv.getLoginDays(),userTv.getStatus(),userTv.getContinueDays(),userTv.getCreateBy(),userTv.getUpdateBy(), userTv.getVisUserId());
userTv.getLoginDays(),userTv.getStatus(),userTv.getContinueDays(),userTv.getCreateBy(),userTv.getUpdateBy(), userTv.getVisUserId(),
userTv.getPlatform(), userTv.getPassword(), userTv.getGroups());
}
public static UserTv build(Long memberId , String memberCode , Long id , String platformAccount , String nickname , String username,
Integer loginDays , Integer status ,Integer continueDays , String createBy , String updateBy,Long visUserId){
Integer loginDays , Integer status ,Integer continueDays , String createBy , String updateBy,Long visUserId,
String platform, String password, String groups){
Assert.notNull(memberId,GlobeExceptionMsg.MEMBER_ID_IS_NULL);
Assert.notNull(memberCode,GlobeExceptionMsg.MEMBER_CODE_IS_NULL);
Assert.notNull(platformAccount,GlobeExceptionMsg.IPTV_PLATFORM_ACCOUNT_IS_NULL);
......@@ -55,10 +44,13 @@ public class UserTvBuilder {
UserTv userTv = new UserTv();
userTv.setId(id);
userTv.setPlatformAccount(platformAccount);
userTv.setPlatform(platform);
userTv.setMemberCode(memberCode);
userTv.setMemberId(memberId);
userTv.setNickname(StringUtils.isBlank(nickname)?platformAccount:nickname);
userTv.setUsername(StringUtils.isBlank(username)?platformAccount:username);
userTv.setPassword(password);
userTv.setGroups(groups);
userTv.setLoginDays(Objects.nonNull(loginDays)?loginDays:DEFAULT_VALUE);
userTv.setLoginType(DEFAULT_VALUE);
userTv.setStatus(Objects.nonNull(status)?status:DEFAULT_VALUE);
......
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;
/** 绑定的小屏账户会员编码 */
@Column(name = "platform_account")
private String platformAccount;
public void copy(UserTvSimple source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(false));
}
}
package com.topdraw.business.module.user.iptv.growreport.domain;
import lombok.Data;
import lombok.experimental.Accessors;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import javax.persistence.*;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2022-07-07
*/
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_growth_report")
public class GrowthReport implements Serializable {
@Id
@Column(name = "id")
private Long id;
// 用户id
@Column(name = "user_id")
private Long userId;
// 会员id
@Column(name = "member_id")
private Long memberId;
// 会员code
@Column(name = "member_code")
private String memberCode;
// 大屏账号
@Column(name = "platform_account")
private String platformAccount;
// 开始日期
@Column(name = "start_date")
private String startDate;
// 结束时间
@Column(name = "end_date")
private String endDate;
// 栏目播放时长数据
@Column(name = "data")
private String data;
// 创建时间
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 修改时间
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
public void copy(GrowthReport source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}
}
package com.topdraw.business.module.user.iptv.growreport.repository;
import com.topdraw.business.module.user.iptv.growreport.domain.GrowthReport;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import java.util.Optional;
/**
* @author XiangHan
* @date 2022-07-07
*/
public interface GrowthReportRepository extends JpaRepository<GrowthReport, Long>, JpaSpecificationExecutor<GrowthReport> {
Optional<GrowthReport> findByPlatformAccountAndStartDateAndEndDate(String platformAccount, String weekFirstDay, String weekLastDay);
@Modifying
@Query(value = "UPDATE `uc_growth_report` SET `data` = ?2, `update_time` = now() WHERE `id` =?1", nativeQuery = true)
Integer updateGrowthReportData(Long id, String data);
}
package com.topdraw.business.module.user.iptv.growreport.rest;
import com.topdraw.common.ResultInfo;
import com.topdraw.annotation.Log;
import com.topdraw.business.module.user.iptv.growreport.domain.GrowthReport;
import com.topdraw.business.module.user.iptv.growreport.service.GrowthReportService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
/**
* @author XiangHan
* @date 2022-07-07
*/
@Api(tags = "GrowthReport管理")
@RestController
@RequestMapping("/api/GrowthReport")
public class GrowthReportController {
@Autowired
private GrowthReportService GrowthReportService;
@Log
@PostMapping
@ApiOperation("新增GrowthReport")
public ResultInfo create(@Validated @RequestBody GrowthReport resources) {
GrowthReportService.create(resources);
return ResultInfo.success();
}
@Log
@PutMapping
@ApiOperation("修改GrowthReport")
public ResultInfo update(@Validated @RequestBody GrowthReport resources) {
GrowthReportService.update(resources);
return ResultInfo.success();
}
@Log
@DeleteMapping(value = "/{id}")
@ApiOperation("删除GrowthReport")
public ResultInfo delete(@PathVariable Long id) {
GrowthReportService.delete(id);
return ResultInfo.success();
}
}
package com.topdraw.business.module.user.iptv.growreport.service;
import com.topdraw.business.module.user.iptv.growreport.domain.GrowthReport;
import com.topdraw.business.module.user.iptv.growreport.service.dto.GrowthReportDTO;
/**
* @author XiangHan
* @date 2022-07-07
*/
public interface GrowthReportService {
/**
* 根据ID查询
* @param id ID
* @return GrowthReportDTO
*/
GrowthReportDTO findById(Long id);
void create(GrowthReport resources);
void update(GrowthReport resources);
void delete(Long id);
/**
*
* @param platformAccount
* @param weekFirstDay
* @param weekLastDay
* @return
*/
GrowthReportDTO findByPlatformAccountAndStartDateAndEndDate(String platformAccount, String weekFirstDay, String weekLastDay);
Integer updateGrowthReportData(Long id, String data);
}
package com.topdraw.business.module.user.iptv.growreport.service.dto;
import lombok.Data;
import java.sql.Timestamp;
import java.io.Serializable;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
/**
* @author XiangHan
* @date 2022-07-07
*/
@Data
public class GrowthReportDTO implements Serializable {
// 处理精度丢失问题
@JsonSerialize(using= ToStringSerializer.class)
private Long id;
// 用户id
private Long userId;
// 会员id
private Long memberId;
// 会员code
private String memberCode;
// 大屏账号
private String platformAccount;
// 开始日期
private String startDate;
// 结束时间
private String endDate;
// 栏目播放时长数据
private String data;
// 创建时间
private Timestamp createTime;
// 修改时间
private Timestamp updateTime;
}
package com.topdraw.business.module.user.iptv.growreport.service.dto;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import java.io.Serializable;
import java.sql.Timestamp;
import java.util.List;
/**
* @author XiangHan
* @date 2022-07-07
*/
@Data
public class GrowthReportRequest implements Serializable {
private String platformAccount;
private List<CategoryContent> playDurationWithCategory;
@Data
public static class CategoryContent{
private String categoryName;
private Long playDuration;
private String categoryCode;
}
}
package com.topdraw.business.module.user.iptv.growreport.service.impl;
import com.topdraw.business.module.user.iptv.growreport.domain.GrowthReport;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.user.iptv.growreport.repository.GrowthReportRepository;
import com.topdraw.business.module.user.iptv.growreport.service.GrowthReportService;
import com.topdraw.business.module.user.iptv.growreport.service.dto.GrowthReportDTO;
import com.topdraw.business.module.user.iptv.growreport.service.mapper.GrowthReportMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.dao.EmptyResultDataAccessException;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.util.Assert;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
* @date 2022-07-07
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class GrowthReportServiceImpl implements GrowthReportService {
@Autowired
private GrowthReportRepository growthReportRepository;
@Autowired
private GrowthReportMapper growthReportMapper;
@Override
@Transactional(readOnly = true)
public GrowthReportDTO findById(Long id) {
GrowthReport growthReport = this.growthReportRepository.findById(id).orElseGet(GrowthReport::new);
ValidationUtil.isNull(growthReport.getId(),"GrowthReport","id",id);
return this.growthReportMapper.toDto(growthReport);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(GrowthReport resources) {
Snowflake snowflake = IdUtil.createSnowflake(1, 1);
resources.setId(snowflake.nextId());
this.growthReportRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(GrowthReport resources) {
GrowthReport growthReport = this.growthReportRepository.findById(resources.getId()).orElseGet(GrowthReport::new);
ValidationUtil.isNull( growthReport.getId(),"GrowthReport","id",resources.getId());
growthReport.copy(resources);
this.growthReportRepository.save(growthReport);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
GrowthReport growthReport = this.growthReportRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", GrowthReport.class, id), 1));
this.growthReportRepository.delete(growthReport);
}
@Override
@Transactional(readOnly = true)
public GrowthReportDTO findByPlatformAccountAndStartDateAndEndDate(String platformAccount, String weekFirstDay, String weekLastDay) {
GrowthReport growthReport = this.growthReportRepository.findByPlatformAccountAndStartDateAndEndDate(platformAccount, weekFirstDay, weekLastDay).orElseGet(GrowthReport::new);
return this.growthReportMapper.toDto(growthReport);
}
@Override
@Transactional(rollbackFor = Exception.class)
public Integer updateGrowthReportData(Long id, String data) {
return this.growthReportRepository.updateGrowthReportData(id, data);
}
}
package com.topdraw.business.module.user.iptv.growreport.service.mapper;
import com.topdraw.base.BaseMapper;
import com.topdraw.business.module.user.iptv.growreport.domain.GrowthReport;
import com.topdraw.business.module.user.iptv.growreport.service.dto.GrowthReportDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
/**
* @author XiangHan
* @date 2022-07-07
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface GrowthReportMapper extends BaseMapper<GrowthReportDTO, GrowthReport> {
}
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;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.Optional;
/**
......@@ -17,4 +23,13 @@ public interface UserTvRepository extends JpaRepository<UserTv, Long>, JpaSpecif
Optional<UserTv> findByPriorityMemberCode(String memberCode);
Optional<UserTv> findByMemberId(Long memberId);
@Modifying
@Query(value = "UPDATE `uc_user_tv` SET `vis_user_id` = ?2, `update_time` = ?3 WHERE `id` = ?1", nativeQuery = true)
Integer updateUserTvVisUserId(Long id, Long visUserId, LocalDateTime now);
@Modifying
@Query(value = "UPDATE `uc_user_tv` SET `priority_member_code` = :#{#resources.priorityMemberCode}, `update_time` = now()" +
" WHERE `id` = :#{#resources.id}", nativeQuery = true)
Integer updatePriorityMemberCode(@Param("resources") UserTv resources);
}
......
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` , `platform_account`, `priority_member_code` FROM `uc_user_tv` WHERE `platform_account` = ?1", nativeQuery = true)
UserTvSimple findSimpleByPlatformAccount(String platformAccount);
}
package com.topdraw.business.module.user.iptv.rest;
import com.topdraw.annotation.AnonymousAccess;
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.common.ResultInfo;
import com.topdraw.exception.BadRequestException;
import com.topdraw.exception.GlobeExceptionMsg;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Objects;
/**
* @author XiangHan
* @date 2021-12-16
*/
@Api(tags = "微信管理")
@RestController
@RequestMapping("/uce/userTv")
@Slf4j
public class UserTvController {
@Autowired
private UserTvService userTvService;
@PostMapping(value = "/updateUserTvVisUserId")
@ApiOperation("新增UserWeixin")
@AnonymousAccess
public ResultInfo updateUserTvVisUserId(@Validated @RequestBody UserTv resources) {
log.info("UserOperationController ==> updateUserTvVisUserId ==>> param ==> {}",resources);
if (StringUtils.isBlank(resources.getPlatformAccount())){
throw new BadRequestException(GlobeExceptionMsg.IPTV_PLATFORM_ACCOUNT_IS_NULL);
}
if (Objects.isNull(resources.getVisUserId())){
throw new BadRequestException(GlobeExceptionMsg.VIS_USER_ID_IS_NULL);
}
UserTvDTO userTvDTO = this.userTvService.updateUserTvVisUserId(resources);
if (Objects.nonNull(userTvDTO.getId()))
return ResultInfo.success(userTvDTO);
else return ResultInfo.failure("操作失败,请检查 ==>> /uce/userTv/updateUserTvVisUserId");
}
}
......@@ -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
*/
......@@ -69,7 +77,7 @@ public interface UserTvService {
* @param memberCode
* @return
*/
boolean checkPriorityMemberByMemberIdOrMemberCode(Long memberId,String memberCode);
boolean checkPriorityMemberByMemberIdOrMemberCode(Long memberId, String memberCode);
/**
*
......@@ -77,4 +85,18 @@ public interface UserTvService {
* @return
*/
MemberDTO findMemberByPlatformAccount(String platformAccount);
/**
*
* @param resources
* @return
*/
UserTvDTO updateUserTvVisUserId(UserTv resources);
/**
*
* @param resources
* @return
*/
UserTvDTO doUpdatePriorityMemberCode(UserTv resources);
}
......
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.JSON;
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.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.business.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;
import com.topdraw.business.module.user.iptv.service.dto.UserTvDTO;
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.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
......@@ -18,6 +29,8 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.util.Assert;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
......@@ -27,15 +40,26 @@ import java.util.Optional;
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
@Slf4j
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) {}
/**
* 获取大屏账户对应的会员
......@@ -46,6 +70,7 @@ public class UserTvServiceImpl implements UserTvService {
* @return
*/
@Override
@Transactional(readOnly = true)
public MemberDTO findMemberByPlatformAccount(String platformAccount){
// 大屏账户
UserTvDTO userTvDTO = this.findByPlatformAccount(platformAccount);
......@@ -64,6 +89,41 @@ public class UserTvServiceImpl implements UserTvService {
throw new EntityNotFoundException(UserTvDTO.class,"platformAccount", GlobeExceptionMsg.IPTV_IS_NULL);
}
@Override
@Transactional(rollbackFor = Exception.class)
public UserTvDTO updateUserTvVisUserId(UserTv resources) {
String platformAccount = resources.getPlatformAccount();
UserTvDTO userTvDTO = this.findByPlatformAccount(platformAccount);
if (Objects.nonNull(userTvDTO.getId())) {
Integer integer = this.userTvRepository.updateUserTvVisUserId(userTvDTO.getId(), resources.getVisUserId(), LocalDateTime.now());
if (integer == 1) {
log.info("修改大屏vis_user id成功,同步至大屏侧数据库, userTvDTO ==>> {}", userTvDTO);
((UserTvServiceImpl) AopContext.currentProxy()).asyncUpdateUserTvVisUserId(userTvDTO);
}
return this.findById(userTvDTO.getId());
}
return null;
}
@Override
@Transactional(rollbackFor = Exception.class)
public UserTvDTO doUpdatePriorityMemberCode(UserTv resources) {
Integer count = this.userTvRepository.updatePriorityMemberCode(resources);
if (Objects.nonNull(count) && count > 0) {
UserTv userTv = this.userTvRepository.findById(resources.getId()).orElseGet(UserTv::new);
return this.userTvMapper.toDto(userTv);
}
return this.userTvMapper.toDto(resources);
}
private MemberDTO findMemberByMemberCode(String memberCode) {
return this.memberService.findByCode(memberCode);
}
......@@ -73,6 +133,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);
......@@ -123,16 +184,38 @@ public class UserTvServiceImpl implements UserTvService {
}
@Override
@Transactional(readOnly = true)
public UserTvDTO findByPlatformAccount(String platformAccount) {
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);
}
return null;
@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)) {
JSONObject userTvSimpleJSON = JSONObject.parseObject(JSON.toJSONString(userTvSimple), JSONObject.class);
this.redisUtils.set(RedisKeyConstants.cacheVisUserByPlatformAccount + "::" + platformAccount, userTvSimpleJSON);
return this.userTvSimpleMapper.toDto(userTvSimple);
}
return this.userTvSimpleMapper.toDto(userTvSimple);
}
@Override
@Transactional(readOnly = true)
public UserTvDTO findByPriorityMemberCode(String memberCode) {
Optional<UserTv> userTv = this.userTvRepository.findByPriorityMemberCode(memberCode);
if (userTv.isPresent()) {
......@@ -143,6 +226,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()) {
......@@ -153,6 +237,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> {
}
......@@ -29,9 +29,7 @@ public interface UserWeixinRepository extends JpaRepository<UserWeixin, Long>, J
Optional<UserWeixin> findFirstByMemberId(Long memberId);
@Modifying
@Transactional
@Query(value = "update `uc_user_weixin` set update_time = :#{#resources.updateTime} " +
"where appid = :#{#resources.appid} and openid = :#{#resources.openid}", nativeQuery = true)
void updateTime(@Param("resources") UserWeixin resources);
@Query(value = "UPDATE `uc_user_weixin` SET update_time = now(), `status` = :#{#resources.status}" +
" WHERE `id` = :#{#resources.id}", nativeQuery = true)
Integer updateWeixinStatus(@Param("resources") UserWeixin resource);
}
......
......@@ -31,12 +31,6 @@ public interface UserWeixinService {
/**
*
* @param resources
*/
void updateTime(UserWeixin resources);
/**
*
* @param id
*/
void delete(Long id);
......@@ -87,4 +81,11 @@ public interface UserWeixinService {
* @return
*/
UserWeixinDTO findFirstByMemberId(Long memberId);
/**
*
* @param userWeixin
* @return
*/
UserWeixinDTO doUpdateWeixinStatus(UserWeixin userWeixin);
}
......
......@@ -14,6 +14,8 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.util.Assert;
import java.util.Objects;
/**
* @author XiangHan
* @date 2021-12-16
......@@ -54,11 +56,6 @@ public class UserWeixinServiceImpl implements UserWeixinService {
}
@Override
public void updateTime(UserWeixin resources) {
this.userWeixinRepository.updateTime(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
......@@ -104,4 +101,15 @@ public class UserWeixinServiceImpl implements UserWeixinService {
return this.userWeixinMapper.toDto(userWeixin);
}
@Override
@Transactional(rollbackFor = Exception.class)
public UserWeixinDTO doUpdateWeixinStatus(UserWeixin resource) {
Integer count = this.userWeixinRepository.updateWeixinStatus(resource);
if (Objects.nonNull(count) && count > 0) {
UserWeixin userWeixin = this.userWeixinRepository.findById(resource.getId()).orElseGet(UserWeixin::new);
return this.userWeixinMapper.toDto(userWeixin);
}
return this.userWeixinMapper.toDto(resource);
}
}
......
package com.topdraw.weixin.subscribe.domain;
package com.topdraw.business.module.user.weixin.subscribe.domain;
import lombok.Data;
import lombok.experimental.Accessors;
......@@ -54,14 +54,22 @@ public class WechatSubscribeRecord implements Serializable {
@Column(name = "entity_type")
private Integer entityType;
// 来源类型 1:大屏;2:营销活动;3:其他;
@Column(name = "source_type")
private Integer sourceType;
// 业务场景 0:分享;1:大屏扫码免费看;2:大屏线上活动扫码引导关注;3:小屏线上活动长按二维码引导关注;4:线下活动海报;5:线下机构/渠道引流;99:其他;
@Column(name = "source_scence")
private Integer sourceScence;
// 来源描述
// 来源描述,前端参数源
@Column(name = "source_info")
private String sourceInfo;
// 来源描述,系统/运营手动维护
@Column(name = "source_desc")
private String sourceDesc;
// 微信场景值 1007:单人聊天会话中的小程序消息卡片;1047:扫描小程序码;详见:https://developers.weixin.qq.com/miniprogram/dev/reference/scene-list.html
@Column(name = "wx_scence")
private Integer wxScence;
// 创建时间
@CreatedDate
@Column(name = "create_time")
......
package com.topdraw.weixin.subscribe.repository;
package com.topdraw.business.module.user.weixin.subscribe.repository;
import com.topdraw.weixin.subscribe.domain.WechatSubscribeRecord;
import com.topdraw.business.module.user.weixin.subscribe.domain.WechatSubscribeRecord;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
......@@ -13,4 +13,6 @@ import java.util.Optional;
public interface WechatSubscribeRecordRepository extends JpaRepository<WechatSubscribeRecord, Long>, JpaSpecificationExecutor<WechatSubscribeRecord> {
Optional<WechatSubscribeRecord> findFirstByCode(String code);
Optional<WechatSubscribeRecord> findFirstByMemberId(Long memberId);
}
......
package com.topdraw.weixin.subscribe.service;
package com.topdraw.business.module.user.weixin.subscribe.service;
import com.topdraw.weixin.subscribe.domain.WechatSubscribeRecord;
import com.topdraw.business.module.user.weixin.subscribe.domain.WechatSubscribeRecord;
/**
* @author XiangHan
......
package com.topdraw.weixin.subscribe.service.dto;
package com.topdraw.business.module.user.weixin.subscribe.service.dto;
import lombok.Data;
import java.sql.Timestamp;
import javax.persistence.Column;
import java.io.Serializable;
import java.sql.Timestamp;
/**
......@@ -33,12 +35,20 @@ public class WechatSubscribeRecordDTO implements Serializable {
// 实例类型 1:大屏扫码;2:营销活动;
private Integer entityType;
// 来源类型 1:大屏;2:营销活动;3:其他;
// 业务场景 0:分享;1:大屏扫码免费看;2:大屏线上活动扫码引导关注;3:小屏线上活动长按二维码引导关注;4:线下活动海报;5:线下机构/渠道引流;99:其他;
private Integer sourceType;
// 来源描述
private Integer sourceScence;
// 来源描述,前端参数源
private String sourceInfo;
// 来源描述,系统/运营手动维护
private String sourceDesc;
// 微信场景值 1007:单人聊天会话中的小程序消息卡片;1047:扫描小程序码;详见:https://developers.weixin.qq.com/miniprogram/dev/reference/scene-list.html
private Integer wxScence;
// 创建时间
private Timestamp createTime;
......
package com.topdraw.weixin.subscribe.service.impl;
package com.topdraw.business.module.user.weixin.subscribe.service.impl;
import com.topdraw.weixin.subscribe.domain.WechatSubscribeRecord;
import com.topdraw.weixin.subscribe.repository.WechatSubscribeRecordRepository;
import com.topdraw.weixin.subscribe.service.WechatSubscribeRecordService;
import com.topdraw.weixin.subscribe.service.mapper.WechatSubscribeRecordMapper;
import com.topdraw.business.module.user.weixin.subscribe.domain.WechatSubscribeRecord;
import com.topdraw.business.module.user.weixin.subscribe.repository.WechatSubscribeRecordRepository;
import com.topdraw.business.module.user.weixin.subscribe.service.WechatSubscribeRecordService;
import com.topdraw.util.TimestampUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.Optional;
/**
* @author XiangHan
* @date 2022-05-21
......@@ -20,12 +22,18 @@ public class WechatSubscribeRecordServiceImpl implements WechatSubscribeRecordSe
@Autowired
private WechatSubscribeRecordRepository wechatSubscribeRecordRepository;
@Autowired
private WechatSubscribeRecordMapper wechatSubscribeRecordMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public void create(WechatSubscribeRecord resources) {
this.wechatSubscribeRecordRepository.save(resources);
/* Optional<WechatSubscribeRecord> wechatSubscribeRecordOptional = this.wechatSubscribeRecordRepository.findFirstByMemberId(resources.getMemberId());
if (!wechatSubscribeRecordOptional.isPresent()) {
this.wechatSubscribeRecordRepository.save(resources);
} else {
WechatSubscribeRecord wechatSubscribeRecord = wechatSubscribeRecordOptional.get();
wechatSubscribeRecord.copy(wechatSubscribeRecord);
wechatSubscribeRecord.setUpdateTime(TimestampUtil.now());
this.wechatSubscribeRecordRepository.save(resources);
}*/
}
}
......
package com.topdraw.weixin.subscribe.service.mapper;
package com.topdraw.business.module.user.weixin.subscribe.service.mapper;
import com.topdraw.base.BaseMapper;
import com.topdraw.weixin.subscribe.domain.WechatSubscribeRecord;
import com.topdraw.weixin.subscribe.service.dto.WechatSubscribeRecordDTO;
import com.topdraw.business.module.user.weixin.subscribe.domain.WechatSubscribeRecord;
import com.topdraw.business.module.user.weixin.subscribe.service.dto.WechatSubscribeRecordDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
......
package com.topdraw.business.module.user.weixin.wechatshare.domain;
import lombok.Data;
import lombok.experimental.Accessors;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import javax.persistence.*;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.sql.Timestamp;
import java.util.UUID;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2022-06-06
*/
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_wechat_share_record")
public class WechatShareRecord implements Serializable {
// ID
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 标识
@Column(name = "code", nullable = false)
private String code;
// 微信账号id
@Column(name = "user_id")
private Long userId;
// 会员id
@Column(name = "member_id", nullable = false)
private Long memberId;
// 会员code
@Column(name = "member_code", nullable = false)
private String memberCode;
// 实例id
@Column(name = "entity_id")
private Long entityId;
// 实例code
@Column(name = "entity_code")
private String entityCode;
// 实例类型 1:营销活动;2:小程序;3:商品;4:投票对象;5:文章;6:视频;99:其他;
@Column(name = "entity_type")
private Long entityType;
// 分享对象 1:朋友;2:朋友圈;99:其他;
@Column(name = "share_type")
private Integer shareType;
// 分享对象昵称
@Column(name = "share_to")
private String shareTo;
// 分享对象查看次数
@Column(name = "click_count")
private Long clickCount;
// 分享对象查看次数
@Column(name = "share_count")
private Long shareCount;
// 来源描述
@Column(name = "source_info")
private String sourceInfo;
// 创建时间
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
public void copy(WechatShareRecord source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}
}
package com.topdraw.business.module.user.weixin.wechatshare.repository;
import com.topdraw.business.module.user.weixin.wechatshare.domain.WechatShareRecord;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import java.util.Optional;
/**
* @author XiangHan
* @date 2022-06-06
*/
public interface WechatShareRecordRepository extends JpaRepository<WechatShareRecord, Long>, JpaSpecificationExecutor<WechatShareRecord> {
Optional<WechatShareRecord> findFirstByCode(String code);
Optional<WechatShareRecord> findFirstByMemberCodeAndEntityCode(String memberCode, String entityCode);
@Modifying
@Query(value = "UPDATE uc_wechat_share_record SET `share_count` = ?2 WHERE id = ?1", nativeQuery = true)
void updateShareCount(Long id, long l);
}
package com.topdraw.business.module.user.weixin.wechatshare.rest;
import com.alibaba.fastjson.JSONObject;
import com.topdraw.common.ResultInfo;
import com.topdraw.annotation.Log;
import com.topdraw.business.module.user.weixin.wechatshare.domain.WechatShareRecord;
import com.topdraw.business.module.user.weixin.wechatshare.service.WechatShareRecordService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
/**
* @author XiangHan
* @date 2022-06-06
*/
@Api(tags = "WechatShareRecord管理")
@RestController
@RequestMapping("/uce/wechatShareRecord/")
@Slf4j
public class WechatShareRecordController {
@Autowired
private WechatShareRecordService wechatShareRecordService;
@Log
@PostMapping(value = "/create")
@ApiOperation("新增WechatShareRecord")
public ResultInfo create(@Validated @RequestBody WechatShareRecord resources) {
this.wechatShareRecordService.create(resources);
return ResultInfo.success();
}
@Log
@PostMapping(value = "/update")
@ApiOperation("修改WechatShareRecord")
public ResultInfo update(@Validated @RequestBody WechatShareRecord resources) {
this.wechatShareRecordService.update(resources);
return ResultInfo.success();
}
@Log
@PostMapping(value = "/createOrUpdate")
@ApiOperation("修改WechatShareRecord")
public ResultInfo createOrUpdate(@Validated @RequestBody String content) {
log.info("wechatShareRecord ==>> createOrUpdate ==>> {}",content);
WechatShareRecord wechatShareRecord = JSONObject.parseObject(content, WechatShareRecord.class);
this.wechatShareRecordService.createOrUpdate(wechatShareRecord);
return ResultInfo.success();
}
@GetMapping(value = "/getByCode")
@ApiOperation(value = "根据标识查询")
public ResultInfo getByCode(@RequestParam(value = "code") String code) {
return ResultInfo.success(this.wechatShareRecordService.getByCode(code));
}
}
package com.topdraw.business.module.user.weixin.wechatshare.service;
import com.topdraw.business.module.user.weixin.wechatshare.domain.WechatShareRecord;
import com.topdraw.business.module.user.weixin.wechatshare.service.dto.WechatShareRecordDTO;
/**
* @author XiangHan
* @date 2022-06-06
*/
public interface WechatShareRecordService {
/**
* 根据ID查询
* @param id ID
* @return WechatShareRecordDTO
*/
WechatShareRecordDTO findById(Long id);
/**
*
* @param resources
*/
void create(WechatShareRecord resources);
/**
*
* @param resources
*/
void update(WechatShareRecord resources);
/**
* Code校验
* @param code
* @return WechatShareRecordDTO
*/
WechatShareRecordDTO getByCode(String code);
void createOrUpdate(WechatShareRecord resources);
}
package com.topdraw.business.module.user.weixin.wechatshare.service.dto;
import lombok.Data;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2022-06-06
*/
@Data
public class WechatShareRecordDTO implements Serializable {
// ID
private Long id;
// 标识
private String code;
// 微信账号id
private Long userId;
// 会员id
private Long memberId;
// 会员code
private String memberCode;
// 实例id
private Long entityId;
// 实例code
private String entityCode;
// 实例类型 1:营销活动;2:小程序;3:商品;4:投票对象;5:文章;6:视频;99:其他;
private Long entityType;
// 分享对象 1:朋友;2:朋友圈;99:其他;
private Integer shareType;
// 分享对象昵称
private String shareTo;
// 分享对象查看次数
private Long clickCount;
// 分享次数
private Long shareCount;
// 来源描述
private String sourceInfo;
// 创建时间
private Timestamp createTime;
// 更新时间
private Timestamp updateTime;
}
package com.topdraw.business.module.user.weixin.wechatshare.service.impl;
import com.topdraw.business.module.user.weixin.wechatshare.domain.WechatShareRecord;
import com.topdraw.util.IdWorker;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.user.weixin.wechatshare.repository.WechatShareRecordRepository;
import com.topdraw.business.module.user.weixin.wechatshare.service.WechatShareRecordService;
import com.topdraw.business.module.user.weixin.wechatshare.service.dto.WechatShareRecordDTO;
import com.topdraw.business.module.user.weixin.wechatshare.service.mapper.WechatShareRecordMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.topdraw.utils.StringUtils;
import java.util.*;
/**
* @author XiangHan
* @date 2022-06-06
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class WechatShareRecordServiceImpl implements WechatShareRecordService {
@Autowired
private WechatShareRecordRepository wechatShareRecordRepository;
@Autowired
private WechatShareRecordMapper wechatShareRecordMapper;
@Override
public WechatShareRecordDTO findById(Long id) {
WechatShareRecord wechatShareRecord = this.wechatShareRecordRepository.findById(id).orElseGet(WechatShareRecord::new);
ValidationUtil.isNull(wechatShareRecord.getId(),"WechatShareRecord","id",id);
return this.wechatShareRecordMapper.toDto(wechatShareRecord);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(WechatShareRecord resources) {
this.wechatShareRecordRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(WechatShareRecord resources) {
WechatShareRecord wechatShareRecord = this.wechatShareRecordRepository.findById(resources.getId()).orElseGet(WechatShareRecord::new);
ValidationUtil.isNull( wechatShareRecord.getId(),"WechatShareRecord","id",resources.getId());
wechatShareRecord.copy(resources);
this.wechatShareRecordRepository.save(wechatShareRecord);
}
@Override
public WechatShareRecordDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ?
this.wechatShareRecordMapper.toDto(this.wechatShareRecordRepository.findFirstByCode(code).orElseGet(WechatShareRecord::new))
: new WechatShareRecordDTO();
}
@Transactional(rollbackFor = Exception.class)
@Override
public void createOrUpdate(WechatShareRecord resources) {
String memberCode = resources.getMemberCode();
Long memberId = resources.getMemberId();
String entityCode = resources.getEntityCode();
Long entityId = resources.getEntityId();
WechatShareRecord wechatShareRecord =
this.wechatShareRecordRepository.findFirstByMemberCodeAndEntityCode(memberCode, entityCode).orElseGet(WechatShareRecord::new);
if (Objects.isNull(wechatShareRecord.getId())) {
resources.setCode(IdWorker.generatorString());
resources.setShareCount(1L);
resources.setClickCount(0L);
this.create(resources);
} else {
Long id = wechatShareRecord.getId();
Long shareCount = wechatShareRecord.getShareCount();
if (Objects.isNull(shareCount))
shareCount = 0L;
this.wechatShareRecordRepository.updateShareCount(id, shareCount+1);
}
}
}
package com.topdraw.business.module.user.weixin.wechatshare.service.mapper;
import com.topdraw.base.BaseMapper;
import com.topdraw.business.module.user.weixin.wechatshare.domain.WechatShareRecord;
import com.topdraw.business.module.user.weixin.wechatshare.service.dto.WechatShareRecordDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
/**
* @author XiangHan
* @date 2022-06-06
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface WechatShareRecordMapper extends BaseMapper<WechatShareRecordDTO, WechatShareRecord> {
}
package com.topdraw.business.module.vis.hainan.app.domain;
import lombok.Data;
import lombok.experimental.Accessors;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import javax.persistence.*;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2022-07-14
*/
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="vis_user")
public class VisUser implements Serializable {
// ID
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 所有者ID
@Column(name = "person_id")
private Long personId;
// 平台
@Column(name = "platform")
private String platform;
// 平台账号
@Column(name = "platform_account")
private String platformAccount;
// 用户名
@Column(name = "username")
private String username;
// 密码
@Column(name = "password")
private String password;
// 积分
@Column(name = "points")
private Integer points;
// 昵称
@Column(name = "nickname")
private String nickname;
// 真实姓名
@Column(name = "realname")
private String realname;
// 头像
@Column(name = "image")
private String image;
// 电子邮件
@Column(name = "email")
private String email;
// 手机号
@Column(name = "cellphone")
private String cellphone;
// 0-女 1-男 2-其他
@Column(name = "gender")
private Integer gender;
// 生日
@Column(name = "birthday")
private Integer birthday;
// 登录天数(总天数)
@Column(name = "login_days")
private Integer loginDays;
// 连续天数
@Column(name = "continue_days")
private Integer continueDays;
// 活跃时间
@Column(name = "active_time")
private Timestamp activeTime;
// 标签
@Column(name = "tags")
private String tags;
// 登录类型:1-运营商隐式登录 2-手机验证登录 3-微信登录 4-QQ登录 5-微博登录 6-苹果登录
@Column(name = "login_type")
private Integer loginType;
// 用户绑定ID
@Column(name = "vis_user_id")
private Long visUserId;
// 微信绑定ID
@Column(name = "vis_user_weixin_id")
private Long visUserWeixinId;
// QQ绑定ID
@Column(name = "vis_user_qq_id")
private Long visUserQqId;
// 微博绑定ID
@Column(name = "vis_user_weibo_id")
private Long visUserWeiboId;
// 苹果绑定ID
@Column(name = "vis_user_apple_id")
private Long visUserAppleId;
// 状态:默认1-生效 2-失效
@Column(name = "status")
private Integer status;
// 创建时间
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
public void copy(VisUser source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}
}
package com.topdraw.business.module.vis.hainan.app.repository;
import com.topdraw.business.module.vis.hainan.app.domain.VisUser;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
/**
* @author XiangHan
* @date 2022-07-14
*/
public interface VisUserRepository extends JpaRepository<VisUser, Long>, JpaSpecificationExecutor<VisUser> {
}
package com.topdraw.business.module.vis.hainan.app.service;
import com.topdraw.business.module.vis.hainan.app.domain.VisUser;
import com.topdraw.business.module.vis.hainan.app.service.dto.VisUserDTO;
/**
* @author XiangHan
* @date 2022-07-14
*/
public interface VisUserService {
/**
* 根据ID查询
* @param id ID
* @return UserDTO
*/
VisUserDTO findById(Long id);
void create(VisUser resources);
void update(VisUser resources);
void delete(Long id);
}
package com.topdraw.business.module.vis.hainan.app.service.dto;
import lombok.Data;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2022-07-14
*/
@Data
public class VisUserDTO implements Serializable {
// ID
private Long id;
// 所有者ID
private Long personId;
// 平台
private String platform;
// 平台账号
private String platformAccount;
// 用户名
private String username;
// 密码
private String password;
// 积分
private Integer points;
// 昵称
private String nickname;
// 真实姓名
private String realname;
// 头像
private String image;
// 电子邮件
private String email;
// 手机号
private String cellphone;
// 0-女 1-男 2-其他
private Integer gender;
// 生日
private Integer birthday;
// 登录天数(总天数)
private Integer loginDays;
// 连续天数
private Integer continueDays;
// 活跃时间
private Timestamp activeTime;
// 标签
private String tags;
// 登录类型:1-运营商隐式登录 2-手机验证登录 3-微信登录 4-QQ登录 5-微博登录 6-苹果登录
private Integer loginType;
// 用户绑定ID
private Long visUserId;
// 微信绑定ID
private Long visUserWeixinId;
// QQ绑定ID
private Long visUserQqId;
// 微博绑定ID
private Long visUserWeiboId;
// 苹果绑定ID
private Long visUserAppleId;
// 状态:默认1-生效 2-失效
private Integer status;
// 创建时间
private Timestamp createTime;
// 更新时间
private Timestamp updateTime;
}
package com.topdraw.business.module.vis.hainan.app.service.impl;
import com.topdraw.business.module.vis.hainan.app.domain.VisUser;
import com.topdraw.business.module.vis.hainan.app.repository.VisUserRepository;
import com.topdraw.business.module.vis.hainan.app.service.VisUserService;
import com.topdraw.business.module.vis.hainan.app.service.dto.VisUserDTO;
import com.topdraw.business.module.vis.hainan.app.service.mapper.VisUserMapper;
import com.topdraw.utils.ValidationUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.util.Assert;
/**
* @author XiangHan
* @date 2022-07-14
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class VisUserServiceImpl implements VisUserService {
@Autowired
private VisUserRepository visUserRepository;
@Autowired
private VisUserMapper visUserMapper;
@Override
public VisUserDTO findById(Long id) {
VisUser visUser = visUserRepository.findById(id).orElseGet(VisUser::new);
ValidationUtil.isNull(visUser.getId(),"User","id",id);
return visUserMapper.toDto(visUser);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(VisUser resources) {
visUserRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(VisUser resources) {
VisUser User = visUserRepository.findById(resources.getId()).orElseGet(VisUser::new);
ValidationUtil.isNull( User.getId(),"User","id",resources.getId());
User.copy(resources);
visUserRepository.save(User);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
VisUser User = visUserRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", VisUser.class, id), 1));
visUserRepository.delete(User);
}
}
package com.topdraw.business.module.vis.hainan.app.service.mapper;
import com.topdraw.base.BaseMapper;
import com.topdraw.business.module.vis.hainan.app.domain.VisUser;
import com.topdraw.business.module.vis.hainan.app.service.dto.VisUserDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
/**
* @author XiangHan
* @date 2022-07-14
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface VisUserMapper extends BaseMapper<VisUserDTO, VisUser> {
}
package com.topdraw.business.module.vis.hainan.apple.domain;
import lombok.Data;
import lombok.experimental.Accessors;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import javax.persistence.*;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2022-07-14
*/
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="vis_user_apple")
public class VisUserApple implements Serializable {
@Transient
private String username;
@Transient
private Integer type;
// ID
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 所有者ID
@Column(name = "person_id")
private Long personId;
// 用户ID
@Column(name = "vis_user_id")
private Long visUserId;
// 苹果用户ID
@Column(name = "user")
private String user;
@Column(name = "identity_token")
private String identityToken;
@Column(name = "real_user_status")
private String realUserStatus;
@Column(name = "authorized_scopes")
private String authorizedScopes;
@Column(name = "authorization_code")
private String authorizationCode;
// 状态 0-失效 1-有效
@Column(name = "status")
private Integer status;
// 全名
@Column(name = "full_name")
private String fullName;
// E-main
@Column(name = "email")
private String email;
// 昵称
@Column(name = "nickname")
private String nickname;
// 性别
@Column(name = "sex")
private Integer sex;
// 国家
@Column(name = "country")
private String country;
// 省份
@Column(name = "province")
private String province;
// 城市
@Column(name = "city")
private String city;
// 头像地址
@Column(name = "icon")
private String icon;
// 描述
@Column(name = "description")
private String description;
// 创建时间
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
public void copy(VisUserApple source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}
}
package com.topdraw.business.module.vis.hainan.apple.repository;
import com.topdraw.business.module.vis.hainan.apple.domain.VisUserApple;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
/**
* @author XiangHan
* @date 2022-07-14
*/
public interface VisUserAppleRepository extends JpaRepository<VisUserApple, Long>, JpaSpecificationExecutor<VisUserApple> {
}
package com.topdraw.business.module.vis.hainan.apple.service;
import com.topdraw.business.module.vis.hainan.apple.domain.VisUserApple;
import com.topdraw.business.module.vis.hainan.apple.service.dto.VisUserAppleDTO;
/**
* @author XiangHan
* @date 2022-07-14
*/
public interface VisUserAppleService {
/**
* 根据ID查询
* @param id ID
* @return VisUserAppleDTO
*/
VisUserAppleDTO findById(Long id);
void create(VisUserApple resources);
void update(VisUserApple resources);
void delete(Long id);
}
package com.topdraw.business.module.vis.hainan.apple.service.dto;
import lombok.Data;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2022-07-14
*/
@Data
public class VisUserAppleDTO implements Serializable {
// ID
private Long id;
// 所有者ID
private Long personId;
// 用户ID
private Long visUserId;
// 苹果用户ID
private String user;
private String identityToken;
private String realUserStatus;
private String authorizedScopes;
private String authorizationCode;
// 状态 0-失效 1-有效
private Integer status;
// 全名
private String fullName;
// E-main
private String email;
// 昵称
private String nickname;
// 性别
private Integer sex;
// 国家
private String country;
// 省份
private String province;
// 城市
private String city;
// 头像地址
private String icon;
// 描述
private String description;
// 创建时间
private Timestamp createTime;
// 更新时间
private Timestamp updateTime;
}
package com.topdraw.business.module.vis.hainan.apple.service.dto;
import lombok.Data;
/**
* @author XiangHan
* @date 2022-07-14
*/
@Data
public class VisUserAppleQueryCriteria{
}
package com.topdraw.business.module.vis.hainan.apple.service.impl;
import com.topdraw.business.module.vis.hainan.apple.domain.VisUserApple;
import com.topdraw.business.module.vis.hainan.apple.repository.VisUserAppleRepository;
import com.topdraw.business.module.vis.hainan.apple.service.VisUserAppleService;
import com.topdraw.business.module.vis.hainan.apple.service.dto.VisUserAppleDTO;
import com.topdraw.business.module.vis.hainan.apple.service.mapper.VisUserAppleMapper;
import com.topdraw.utils.ValidationUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.util.Assert;
/**
* @author XiangHan
* @date 2022-07-14
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class VisUserAppleServiceImpl implements VisUserAppleService {
@Autowired
private VisUserAppleRepository visUserAppleRepository;
@Autowired
private VisUserAppleMapper visUserAppleMapper;
@Override
public VisUserAppleDTO findById(Long id) {
VisUserApple visUserApple = visUserAppleRepository.findById(id).orElseGet(VisUserApple::new);
ValidationUtil.isNull(visUserApple.getId(),"VisUserApple","id",id);
return visUserAppleMapper.toDto(visUserApple);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(VisUserApple resources) {
visUserAppleRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(VisUserApple resources) {
VisUserApple visUserApple = visUserAppleRepository.findById(resources.getId()).orElseGet(VisUserApple::new);
ValidationUtil.isNull( visUserApple.getId(),"VisUserApple","id",resources.getId());
visUserApple.copy(resources);
visUserAppleRepository.save(visUserApple);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
VisUserApple visUserApple = visUserAppleRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", VisUserApple.class, id), 1));
visUserAppleRepository.delete(visUserApple);
}
}
package com.topdraw.business.module.vis.hainan.apple.service.mapper;
import com.topdraw.base.BaseMapper;
import com.topdraw.business.module.vis.hainan.apple.domain.VisUserApple;
import com.topdraw.business.module.vis.hainan.apple.service.dto.VisUserAppleDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
/**
* @author XiangHan
* @date 2022-07-14
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface VisUserAppleMapper extends BaseMapper<VisUserAppleDTO, VisUserApple> {
}
package com.topdraw.business.module.vis.hainan.qq.domain;
import lombok.Data;
import lombok.experimental.Accessors;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import javax.persistence.*;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2022-07-14
*/
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="vis_user_qq")
public class VisUserQq implements Serializable {
@Transient
private String username;
@Transient
private Integer type;
// ID
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 所有者ID
@Column(name = "person_id")
private Long personId;
// 用户ID
@Column(name = "vis_user_id")
private Long visUserId;
// QQunionid,针对开发者
@Column(name = "unionid")
private String unionid;
// QQappid
@Column(name = "app_id")
private String appId;
// QQopenid
@Column(name = "openid")
private String openid;
// QQuserid
@Column(name = "user_id")
private String userId;
// 状态 0-失效 1-有效
@Column(name = "status")
private Integer status;
// 昵称
@Column(name = "nickname")
private String nickname;
// 性别
@Column(name = "sex")
private Integer sex;
// 国家
@Column(name = "country")
private String country;
// 省份
@Column(name = "province")
private String province;
// 城市
@Column(name = "city")
private String city;
// 头像地址
@Column(name = "icon")
private String icon;
@Column(name = "pay_token")
private String payToken;
@Column(name = "secretType")
private String secretType;
@Column(name = "secret")
private String secret;
@Column(name = "pfkey")
private String pfkey;
@Column(name = "pf")
private String pf;
// access_token
@Column(name = "access_token")
private String accessToken;
// expires_in
@Column(name = "expires_in")
private Integer expiresIn;
// expires_time
@Column(name = "expires_time")
private Timestamp expiresTime;
// 描述
@Column(name = "description")
private String description;
// 创建时间
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
public void copy(VisUserQq source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}
}
package com.topdraw.business.module.vis.hainan.qq.repository;
import com.topdraw.business.module.vis.hainan.qq.domain.VisUserQq;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
/**
* @author XiangHan
* @date 2022-07-14
*/
public interface VisUserQqRepository extends JpaRepository<VisUserQq, Long>, JpaSpecificationExecutor<VisUserQq> {
}
package com.topdraw.business.module.vis.hainan.qq.service;
import com.topdraw.business.module.vis.hainan.qq.domain.VisUserQq;
import com.topdraw.business.module.vis.hainan.qq.service.dto.VisUserQqDTO;
/**
* @author XiangHan
* @date 2022-07-14
*/
public interface VisUserQqService {
/**
* 根据ID查询
* @param id ID
* @return VisUserQqDTO
*/
VisUserQqDTO findById(Long id);
void create(VisUserQq resources);
void update(VisUserQq resources);
void delete(Long id);
VisUserQqDTO findByOpenid(String account);
}
package com.topdraw.business.module.vis.hainan.qq.service.dto;
import lombok.Data;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2022-07-14
*/
@Data
public class VisUserQqDTO implements Serializable {
// ID
private Long id;
// 所有者ID
private Long personId;
// 用户ID
private Long visUserId;
// QQunionid,针对开发者
private String unionid;
// QQappid
private String appId;
// QQopenid
private String openid;
// QQuserid
private String userId;
// 状态 0-失效 1-有效
private Integer status;
// 昵称
private String nickname;
// 性别
private Integer sex;
// 国家
private String country;
// 省份
private String province;
// 城市
private String city;
// 头像地址
private String icon;
private String payToken;
private String secretType;
private String secret;
private String pfkey;
private String pf;
// access_token
private String accessToken;
// expires_in
private Integer expiresIn;
// expires_time
private Timestamp expiresTime;
// 描述
private String description;
// 创建时间
private Timestamp createTime;
// 更新时间
private Timestamp updateTime;
}
package com.topdraw.business.module.vis.hainan.qq.service.impl;
import com.topdraw.business.module.vis.hainan.qq.domain.VisUserQq;
import com.topdraw.business.module.vis.hainan.qq.repository.VisUserQqRepository;
import com.topdraw.business.module.vis.hainan.qq.service.VisUserQqService;
import com.topdraw.business.module.vis.hainan.qq.service.dto.VisUserQqDTO;
import com.topdraw.business.module.vis.hainan.qq.service.mapper.VisUserQqMapper;
import com.topdraw.utils.ValidationUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.util.Assert;
/**
* @author XiangHan
* @date 2022-07-14
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class VisUserQqServiceImpl implements VisUserQqService {
@Autowired
private VisUserQqRepository visUserQqRepository;
@Autowired
private VisUserQqMapper visUserQqMapper;
@Override
public VisUserQqDTO findById(Long id) {
VisUserQq visUserQq = visUserQqRepository.findById(id).orElseGet(VisUserQq::new);
ValidationUtil.isNull(visUserQq.getId(),"VisUserQq","id",id);
return visUserQqMapper.toDto(visUserQq);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(VisUserQq resources) {
visUserQqRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(VisUserQq resources) {
VisUserQq visUserQq = visUserQqRepository.findById(resources.getId()).orElseGet(VisUserQq::new);
ValidationUtil.isNull( visUserQq.getId(),"VisUserQq","id",resources.getId());
visUserQq.copy(resources);
visUserQqRepository.save(visUserQq);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
VisUserQq visUserQq = visUserQqRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", VisUserQq.class, id), 1));
visUserQqRepository.delete(visUserQq);
}
@Override
public VisUserQqDTO findByOpenid(String account) {
return null;
}
}
package com.topdraw.business.module.vis.hainan.qq.service.mapper;
import com.topdraw.base.BaseMapper;
import com.topdraw.business.module.vis.hainan.qq.domain.VisUserQq;
import com.topdraw.business.module.vis.hainan.qq.service.dto.VisUserQqDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
/**
* @author XiangHan
* @date 2022-07-14
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface VisUserQqMapper extends BaseMapper<VisUserQqDTO, VisUserQq> {
}
package com.topdraw.business.module.vis.hainan.weibo.domain;
import lombok.Data;
import lombok.experimental.Accessors;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import javax.persistence.*;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2022-07-14
*/
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="vis_user_weibo")
public class VisUserWeibo implements Serializable {
@Transient
private String username;
@Transient
private Integer type;
// ID
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 所有者ID
@Column(name = "person_id")
private Long personId;
// 用户ID
@Column(name = "vis_user_id")
private Long visUserId;
// 微博appid
@Column(name = "app_id")
private String appId;
// 微博用户ID
@Column(name = "user_id")
private String userId;
// 状态 0-失效 1-有效
@Column(name = "status")
private Integer status;
// 昵称
@Column(name = "nickname")
private String nickname;
// 性别
@Column(name = "sex")
private Integer sex;
// 国家
@Column(name = "country")
private String country;
// 省份
@Column(name = "province")
private String province;
// 城市
@Column(name = "city")
private String city;
// 头像地址
@Column(name = "icon")
private String icon;
// secretType
@Column(name = "secretType")
private String secretType;
// secret
@Column(name = "secret")
private String secret;
// snsregat
@Column(name = "snsregat")
private String snsregat;
// snsUserUrl
@Column(name = "snsUserUrl")
private String snsUserUrl;
// shareCount
@Column(name = "shareCount")
private String shareCount;
// followerCount
@Column(name = "followerCount")
private String followerCount;
// refresh_token
@Column(name = "refresh_token")
private String refreshToken;
// access_token
@Column(name = "access_token")
private String accessToken;
// expires_in
@Column(name = "expires_in")
private Long expiresIn;
// expires_time
@Column(name = "expires_time")
private Timestamp expiresTime;
// 描述
@Column(name = "description")
private String description;
// 创建时间
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
public void copy(VisUserWeibo source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}
}
package com.topdraw.business.module.vis.hainan.weibo.repository;
import com.topdraw.business.module.vis.hainan.weibo.domain.VisUserWeibo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
/**
* @author XiangHan
* @date 2022-07-14
*/
public interface VisUserWeiboRepository extends JpaRepository<VisUserWeibo, Long>, JpaSpecificationExecutor<VisUserWeibo> {
}
package com.topdraw.business.module.vis.hainan.weibo.service;
import com.topdraw.business.module.vis.hainan.weibo.domain.VisUserWeibo;
import com.topdraw.business.module.vis.hainan.weibo.service.dto.VisUserWeiboDTO;
/**
* @author XiangHan
* @date 2022-07-14
*/
public interface VisUserWeiboService {
/**
* 根据ID查询
* @param id ID
* @return VisUserWeiboDTO
*/
VisUserWeiboDTO findById(Long id);
void create(VisUserWeibo resources);
void update(VisUserWeibo resources);
void delete(Long id);
VisUserWeiboDTO findByUserid(String account);
}
package com.topdraw.business.module.vis.hainan.weibo.service.dto;
import lombok.Data;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2022-07-14
*/
@Data
public class VisUserWeiboDTO implements Serializable {
// ID
private Long id;
// 所有者ID
private Long personId;
// 用户ID
private Long visUserId;
// 微博appid
private String appId;
// 微博用户ID
private String userId;
// 状态 0-失效 1-有效
private Integer status;
// 昵称
private String nickname;
// 性别
private Integer sex;
// 国家
private String country;
// 省份
private String province;
// 城市
private String city;
// 头像地址
private String icon;
// secretType
private String secretType;
// secret
private String secret;
// snsregat
private String snsregat;
// snsUserUrl
private String snsUserUrl;
// shareCount
private String shareCount;
// followerCount
private String followerCount;
// refresh_token
private String refreshToken;
// access_token
private String accessToken;
// expires_in
private Long expiresIn;
// expires_time
private Timestamp expiresTime;
// 描述
private String description;
// 创建时间
private Timestamp createTime;
// 更新时间
private Timestamp updateTime;
}
package com.topdraw.business.module.vis.hainan.weibo.service.impl;
import com.topdraw.business.module.vis.hainan.weibo.domain.VisUserWeibo;
import com.topdraw.business.module.vis.hainan.weibo.repository.VisUserWeiboRepository;
import com.topdraw.business.module.vis.hainan.weibo.service.VisUserWeiboService;
import com.topdraw.business.module.vis.hainan.weibo.service.dto.VisUserWeiboDTO;
import com.topdraw.business.module.vis.hainan.weibo.service.mapper.VisUserWeiboMapper;
import com.topdraw.utils.ValidationUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.util.Assert;
/**
* @author XiangHan
* @date 2022-07-14
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class VisUserWeiboServiceImpl implements VisUserWeiboService {
@Autowired
private VisUserWeiboRepository visUserWeiboRepository;
@Autowired
private VisUserWeiboMapper visUserWeiboMapper;
@Override
public VisUserWeiboDTO findById(Long id) {
VisUserWeibo visUserWeibo = visUserWeiboRepository.findById(id).orElseGet(VisUserWeibo::new);
ValidationUtil.isNull(visUserWeibo.getId(),"VisUserWeibo","id",id);
return visUserWeiboMapper.toDto(visUserWeibo);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(VisUserWeibo resources) {
visUserWeiboRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(VisUserWeibo resources) {
VisUserWeibo visUserWeibo = visUserWeiboRepository.findById(resources.getId()).orElseGet(VisUserWeibo::new);
ValidationUtil.isNull( visUserWeibo.getId(),"VisUserWeibo","id",resources.getId());
visUserWeibo.copy(resources);
visUserWeiboRepository.save(visUserWeibo);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
VisUserWeibo visUserWeibo = visUserWeiboRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", VisUserWeibo.class, id), 1));
visUserWeiboRepository.delete(visUserWeibo);
}
@Override
public VisUserWeiboDTO findByUserid(String account) {
return null;
}
}
package com.topdraw.business.module.vis.hainan.weibo.service.mapper;
import com.topdraw.base.BaseMapper;
import com.topdraw.business.module.vis.hainan.weibo.domain.VisUserWeibo;
import com.topdraw.business.module.vis.hainan.weibo.service.dto.VisUserWeiboDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
/**
* @author XiangHan
* @date 2022-07-14
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface VisUserWeiboMapper extends BaseMapper<VisUserWeiboDTO, VisUserWeibo> {
}
package com.topdraw.business.module.vis.hainan.weixin.domain;
import lombok.Data;
import lombok.experimental.Accessors;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import javax.persistence.*;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2022-07-14
*/
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="vis_user_weixin")
public class VisUserWeixin implements Serializable {
@Transient
private String username;
@Transient
private Integer type;
// ID
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 所有者ID
@Column(name = "person_id")
private Long personId;
// 用户ID
@Column(name = "vis_user_id")
private Long visUserId;
// 微信unionid,针对开发者
@Column(name = "unionid")
private String unionid;
// 微信appid
@Column(name = "appid")
private String appid;
// 微信appid
@Column(name = "app_id")
private String appId;
// 微信openid,针对微信app
@Column(name = "openid")
private String openid;
// 状态 0-失效 1-有效
@Column(name = "status")
private Integer status;
// 昵称
@Column(name = "nickname")
private String nickname;
// 性别
@Column(name = "sex")
private Integer sex;
// 国家
@Column(name = "country")
private String country;
// 省份
@Column(name = "province")
private String province;
// 城市
@Column(name = "city")
private String city;
// 头像地址
@Column(name = "headimgurl")
private String headimgurl;
// 特权信息
@Column(name = "privilege")
private String privilege;
// refresh_token
@Column(name = "refresh_token")
private String refreshToken;
// access_token
@Column(name = "access_token")
private String accessToken;
// expires_in
@Column(name = "expires_in")
private Integer expiresIn;
// expires_time
@Column(name = "expires_time")
private Timestamp expiresTime;
// 描述
@Column(name = "description")
private String description;
// 创建时间
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
public void copy(VisUserWeixin source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}
}
package com.topdraw.business.module.vis.hainan.weixin.repository;
import com.topdraw.business.module.vis.hainan.weixin.domain.VisUserWeixin;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.util.Optional;
/**
* @author XiangHan
* @date 2022-07-14
*/
public interface VisUserWeixinRepository extends JpaRepository<VisUserWeixin, Long>, JpaSpecificationExecutor<VisUserWeixin> {
Optional<VisUserWeixin> findByOpenid(String account);
}
package com.topdraw.business.module.vis.hainan.weixin.service;
import com.topdraw.business.module.vis.hainan.weixin.domain.VisUserWeixin;
import com.topdraw.business.module.vis.hainan.weixin.service.dto.VisUserWeixinDTO;
/**
* @author XiangHan
* @date 2022-07-14
*/
public interface VisUserWeixinService {
/**
* 根据ID查询
* @param id ID
* @return VisUserWeixinDTO
*/
VisUserWeixinDTO findById(Long id);
void create(VisUserWeixin resources);
void update(VisUserWeixin resources);
void delete(Long id);
VisUserWeixinDTO findByOpenid(String account);
}
package com.topdraw.business.module.vis.hainan.weixin.service.dto;
import lombok.Data;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2022-07-14
*/
@Data
public class VisUserWeixinDTO implements Serializable {
// ID
private Long id;
// 所有者ID
private Long personId;
// 用户ID
private Long visUserId;
// 微信unionid,针对开发者
private String unionid;
// 微信appid
private String appid;
// 微信appid
private String appId;
// 微信openid,针对微信app
private String openid;
// 状态 0-失效 1-有效
private Integer status;
// 昵称
private String nickname;
// 性别
private Integer sex;
// 国家
private String country;
// 省份
private String province;
// 城市
private String city;
// 头像地址
private String headimgurl;
// 特权信息
private String privilege;
// refresh_token
private String refreshToken;
// access_token
private String accessToken;
// expires_in
private Integer expiresIn;
// expires_time
private Timestamp expiresTime;
// 描述
private String description;
// 创建时间
private Timestamp createTime;
// 更新时间
private Timestamp updateTime;
}
package com.topdraw.business.module.vis.hainan.weixin.service.impl;
import com.topdraw.business.module.vis.hainan.weixin.domain.VisUserWeixin;
import com.topdraw.business.module.vis.hainan.weixin.repository.VisUserWeixinRepository;
import com.topdraw.business.module.vis.hainan.weixin.service.VisUserWeixinService;
import com.topdraw.business.module.vis.hainan.weixin.service.dto.VisUserWeixinDTO;
import com.topdraw.business.module.vis.hainan.weixin.service.mapper.VisUserWeixinMapper;
import com.topdraw.utils.ValidationUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.util.Assert;
/**
* @author XiangHan
* @date 2022-07-14
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class VisUserWeixinServiceImpl implements VisUserWeixinService {
@Autowired
private VisUserWeixinRepository visUserWeixinRepository;
@Autowired
private VisUserWeixinMapper visUserWeixinMapper;
@Override
public VisUserWeixinDTO findById(Long id) {
VisUserWeixin visUserWeixin = visUserWeixinRepository.findById(id).orElseGet(VisUserWeixin::new);
ValidationUtil.isNull(visUserWeixin.getId(),"VisUserWeixin","id",id);
return visUserWeixinMapper.toDto(visUserWeixin);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(VisUserWeixin resources) {
visUserWeixinRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(VisUserWeixin resources) {
VisUserWeixin visUserWeixin = visUserWeixinRepository.findById(resources.getId()).orElseGet(VisUserWeixin::new);
ValidationUtil.isNull( visUserWeixin.getId(),"VisUserWeixin","id",resources.getId());
visUserWeixin.copy(resources);
visUserWeixinRepository.save(visUserWeixin);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
VisUserWeixin visUserWeixin = visUserWeixinRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", VisUserWeixin.class, id), 1));
visUserWeixinRepository.delete(visUserWeixin);
}
@Override
public VisUserWeixinDTO findByOpenid(String account) {
VisUserWeixin visUserWeixin = visUserWeixinRepository.findByOpenid(account).orElseGet(VisUserWeixin::new);
return visUserWeixinMapper.toDto(visUserWeixin);
}
}
package com.topdraw.business.module.vis.hainan.weixin.service.mapper;
import com.topdraw.base.BaseMapper;
import com.topdraw.business.module.vis.hainan.weixin.domain.VisUserWeixin;
import com.topdraw.business.module.vis.hainan.weixin.service.dto.VisUserWeixinDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
/**
* @author XiangHan
* @date 2022-07-14
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface VisUserWeixinMapper extends BaseMapper<VisUserWeixinDTO, VisUserWeixin> {
}
......@@ -29,4 +29,7 @@ public class TempPoints extends TempRights {
@Transient
protected Long rewardPointsExpireTime;
@Transient
protected String description;
}
......
......@@ -35,6 +35,9 @@ public class TempRights {
@Transient
protected String memberCode;
@Transient
protected Integer memberLevel;
/** 账号id */
@Transient
protected Long userId;
......
......@@ -7,26 +7,23 @@ import lombok.Data;
@Data
public class SubscribeBean extends WeiXinUserBean {
private JSONObject userInfoJson;
/**
* 大屏账号信息
*/
private JSONObject iptvUserInfo;
private String msgType;
private String event;
/** */
private String openId;
/** */
private String appId;
/** */
private String eventKey;
/**
* 昵称
*/
private String nickname;
/**
* 头像
*/
private String headimgurl;
private String sourceInfo;
/**
* 来源描述
*/
private JSONObject sourceInfo;
}
......
package com.topdraw.business.process.domian.weixin;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/7/4 16:36
* @version: :
* @modified By:
* @since : modified in 2022/7/4 16:36
*/
public interface SubscribeSourceTypeConstant {
int type1 = 1;
int type2 = 2;
}
......@@ -5,6 +5,7 @@ import com.topdraw.business.process.service.ExpOperationService;
import com.topdraw.common.ResultInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
......@@ -13,7 +14,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
/**
* @author XiangHan
......@@ -22,16 +25,28 @@ import java.util.List;
@Api(tags = "成长值管理")
@RestController
@RequestMapping("/uce/expOperation")
@Slf4j
public class ExpOperationController {
@Autowired
private ExpOperationService expOperationService;
@PostMapping(value = "/grantExpByManual")
@PostMapping(value = "/addExp")
@ApiOperation("手动发放成长值")
public ResultInfo grantExpByManual(@Validated @RequestBody TempExp tempExp) {
List<TempExp> tempExpList = Arrays.asList(tempExp);
this.expOperationService.grantExpByManual(tempExpList);
log.info("手动发放成长值,参数 ==>> {}", tempExp);
Long memberId = tempExp.getMemberId();
if (Objects.isNull(memberId)) {
log.error("发放成长值失败,参数错误,无会员id");
return ResultInfo.failure("发放成长值失败,参数错误,无会员id");
}
Long rewardExp = tempExp.getRewardExp();
if (Objects.isNull(rewardExp) || rewardExp <= 0L) {
log.error("发放成长值失败,参数错误,成长值为空或者小于0 ==>> {}", rewardExp);
return ResultInfo.failure("发放成长值失败,参数错误,成长值为空或者小于0");
}
this.expOperationService.grantExpByManual(Collections.singletonList(tempExp));
return ResultInfo.success();
}
......
......@@ -2,24 +2,22 @@ package com.topdraw.business.process.rest;
import com.topdraw.annotation.AnonymousAccess;
import com.topdraw.business.module.common.validated.UpdateGroup;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.address.domain.MemberAddress;
import com.topdraw.business.module.member.address.service.dto.MemberAddressDTO;
import com.topdraw.business.module.member.profile.service.dto.MemberProfileDTO;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.process.domian.member.MemberOperationBean;
import com.topdraw.business.process.domian.weixin.BuyVipBean;
import com.topdraw.business.process.service.member.MemberOperationService;
import com.topdraw.common.IResultInfo;
import com.topdraw.common.ResultInfo;
import com.topdraw.exception.BadRequestException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.sql.Timestamp;
import java.util.Objects;
@Api("会员处理")
......@@ -32,26 +30,31 @@ public class MemberOperationController {
@Autowired
private MemberOperationService memberOperationService;
@RequestMapping(value = "/updateDefaultMemberAddressById")
@ApiOperation("设置默认地址")
@AnonymousAccess
public ResultInfo updateDefaultMemberAddressById(@Validated(value = {UpdateGroup.class}) @RequestBody MemberAddress resources) {
log.info("设置默认地址,参数 ==>> [updateDefaultMemberAddressById#{}]",resources);
Long id = resources.getId();
if (Objects.isNull(id)) {
return ResultInfo.failure("设置默认地址失败,参数错误,id为空");
}
MemberAddressDTO memberAddressDTO = this.memberOperationService.updateDefaultMemberAddressById(id);
return ResultInfo.success(memberAddressDTO);
}
@RequestMapping(value = "/updateVipByMemberId")
@ApiOperation("手动修改vip")
@AnonymousAccess
public ResultInfo updateVipByMemberId(@Validated(value = {UpdateGroup.class}) @RequestBody MemberOperationBean resources) {
log.info("member ==>> doUpdateVipByCode ==>> param ==>> [{}]",resources);
Integer vip = resources.getVip();
Timestamp vipExpireTime = resources.getVipExpireTime();
Long memberId = resources.getMemberId();
MemberDTO memberDTO = this.memberOperationService.findById(memberId);
resources.setMemberCode(memberDTO.getCode());
Member member = new Member();
BeanUtils.copyProperties(memberDTO, member);
if (Objects.nonNull(vip)) {
member.setVip(vip);
}
if (Objects.nonNull(vipExpireTime)) {
member.setVipExpireTime(vipExpireTime);
}
this.memberOperationService.update(member);
return ResultInfo.success();
return this.updateVipByMemberCode(resources);
}
@RequestMapping(value = "/updateVipByMemberCode")
......@@ -59,65 +62,31 @@ public class MemberOperationController {
@AnonymousAccess
public ResultInfo updateVipByMemberCode(@Validated(value = {UpdateGroup.class}) @RequestBody MemberOperationBean resources) {
log.info("member ==>> doUpdateVipByCode ==>> param ==>> [{}]",resources);
Integer vip = resources.getVip();
Timestamp vipExpireTime = resources.getVipExpireTime();
String memberCode = resources.getMemberCode();
MemberDTO memberDTO = this.memberOperationService.findByCode(memberCode);
Member member = new Member();
BeanUtils.copyProperties(memberDTO, member);
if (Objects.nonNull(vip)) {
member.setVip(vip);
}
if (Objects.nonNull(vipExpireTime)) {
member.setVipExpireTime(vipExpireTime);
if (StringUtils.isBlank(memberCode)) {
log.error("参数错误,memberCode 不存在");
return ResultInfo.failure("参数错误,memberCode 不存在");
}
this.createVipHistory(memberDTO.getId(), memberDTO.getCode(), vip, vipExpireTime);
this.memberOperationService.updateMemberVip(member);
return ResultInfo.success();
Integer vip = resources.getVip();
if (Objects.isNull(vip) || vip < 0) {
log.error("参数错误,vip为空或者小于0 , vip ==>> {}", vip);
return ResultInfo.failure("参数错误,vip为空或者小于0");
}
private void createVipHistory(Long memberId, String code, Integer vip , Timestamp vipExpireTime){
BuyVipBean buyVipBean = new BuyVipBean();
buyVipBean.setMemberId(memberId);
buyVipBean.setMemberCode(code);
buyVipBean.setVip(vip);
buyVipBean.setVipExpireTime(vipExpireTime);
this.memberOperationService.buyVipByMemberId(buyVipBean);
MemberDTO memberDTO = this.memberOperationService.doUpdateVipByMemberCode(resources);
return ResultInfo.success(memberDTO);
}
@GetMapping("/getMemberProfileAndCheckVip/{appId}/{memberId}")
@ApiOperation("获取会员基本信息并且检查vip状态")
@AnonymousAccess
@Deprecated
public IResultInfo getMemberProfileAndCheckVip(@PathVariable(value = "appId") String appId, @PathVariable(value = "memberId") Long memberId) {
MemberProfileDTO memberProfileDTO = this.memberOperationService.getMemberProfileAndCheckVip(memberId, appId);
return ResultInfo.success(memberProfileDTO);
}
@PutMapping("/buyVip")
@ApiOperation("购买vip")
@AnonymousAccess
@Deprecated
public ResultInfo buyVip(@RequestBody BuyVipBean buyVipBean) {
/* // 小程序账户id
Long id = buyVipBean.getId();
if (Objects.isNull(id))
throw new BadRequestException("参数异常: id is null !");
// vip等级
Integer vip = buyVipBean.getVip();
if (Objects.isNull(vip) || vip <= 0)
throw new BadRequestException("vip 等级有误");
MemberDTO memberDTO = this.memberOperationService.buyVip(buyVipBean);
return ResultInfo.success(memberDTO);*/
return null;
}
}
......
......@@ -12,7 +12,7 @@ import com.topdraw.business.process.domian.TempPoints;
import com.topdraw.business.process.service.dto.CustomPointsResult;
import com.topdraw.business.process.service.PointsOperationService;
import com.topdraw.common.ResultInfo;
import com.topdraw.config.LocalConstants;
import com.topdraw.business.LocalConstants;
import com.topdraw.exception.BadRequestException;
import com.topdraw.exception.GlobeExceptionMsg;
import io.swagger.annotations.Api;
......@@ -49,6 +49,7 @@ public class PointsOperationController {
@GetMapping(value = "/cleanInvalidPointsAndCalculateCurrentPoints/{id}")
@ApiOperation("清除过期积分并计算总积分,供客户端会员查询积分时调用")
@AnonymousAccess
@Deprecated
public ResultInfo cleanInvalidPointsAndCalculateCurrentPoints(@PathVariable("id") Long id) {
Long aLong = this.pointsOperationService.cleanInvalidPointsAndCalculateCurrentPoints(id);
return ResultInfo.success(Objects.isNull(aLong) ? 0L : aLong);
......@@ -59,17 +60,27 @@ public class PointsOperationController {
@ApiOperation("手动发放积分")
@AnonymousAccess
public ResultInfo addPoints(@Validated @RequestBody TempPoints tempPoints) {
log.info("手动发放积分,参数 ==>>{} ", tempPoints);
Long memberId = tempPoints.getMemberId();
if (Objects.isNull(memberId)) {
log.error("积分发放失败,参数错误,会员id 不存在");
return ResultInfo.failure("积分发放失败,参数错误");
}
Long points = tempPoints.getPoints();
Assert.notNull(memberId,"memberId can't be null!");
Assert.notNull(points,"points can't be null!");
if (Objects.isNull(points) || points <= 0L) {
log.error("积分发放失败,参数错误,积分不存在或者积分小于0");
return ResultInfo.failure("积分发放失败,参数错误");
}
MemberDTO memberDTO = this.memberService.findById(memberId);
if (Objects.nonNull(memberDTO)) {
String code = memberDTO.getCode();
Assert.notNull(code,"code can't be null!");
tempPoints.setMemberCode(code);
if (Objects.nonNull(memberDTO.getId())) {
tempPoints.setMemberId(memberDTO.getId());
tempPoints.setMemberCode(memberDTO.getCode());
this.pointsOperationService.grantPointsByManualByTempPoints(tempPoints);
}
return ResultInfo.success();
}
......@@ -176,7 +187,6 @@ public class PointsOperationController {
return ResultInfo.success(Arrays.asList(b),description);
}
// @Log("积分兑换商品")
@PostMapping(value = "/consumeItemPoints")
@ApiOperation("积分兑换商品")
@AnonymousAccess
......
......@@ -38,20 +38,13 @@ public class TaskOperationController {
@ApiOperation("事件处理")
@AnonymousAccess
public IResultInfo dealTask(@RequestBody @Validated TaskOperationQueryCriteria criteria) {
log.info("事件处理,开始,参数 ==>> {}", criteria);
long l = System.currentTimeMillis();
// 任务处理
this.taskOperationService.dealTask(criteria.getContent());
long l2 = System.currentTimeMillis();
log.info("事件处理,结束,总耗时 ==>> {}", (l2-l));
return ResultInfo.success();
log.info("事件处理,参数 ==>> dealTask#==>>{}", criteria);
return this.taskOperationService.dealTask(criteria.getContent());
}
/**
* 新增任务
*
*uc_tr_task_progress
* @param task 消息
*/
@PostMapping(value = "/createTask")
......@@ -72,22 +65,22 @@ public class TaskOperationController {
/**
* 修改任务
*
* @param task 消息
* @param content 消息
*/
@PostMapping(value = "/updateTask")
@ApiOperation("修改任务")
@AnonymousAccess
public void updateTask(@RequestBody @Validated Task task) {
log.info("taskOperation ==>> updateTask ==>> param ==>> {}", task);
Long id = task.getId();
public void updateTask(@RequestBody @Validated Task content) {
log.info("taskOperation ==>> updateTask ==>> param ==>> {}", content);
Long id = content.getId();
TaskDTO taskDTO = this.taskOperationService.findById(id);
if (Objects.nonNull(taskDTO.getId())) {
task.setCode(taskDTO.getCode());
Task task_ = new Task();
BeanUtils.copyProperties(taskDTO, task_);
task_.copy(task);
content.setCode(taskDTO.getCode());
Task task = new Task();
BeanUtils.copyProperties(taskDTO, task);
task.copy(content);
// 修改任务
this.taskOperationService.updateTask(task_);
this.taskOperationService.updateTask(task);
}
}
......@@ -99,12 +92,17 @@ public class TaskOperationController {
@PostMapping(value = "/deleteTask")
@ApiOperation("删除任务")
@AnonymousAccess
public void deleteTask(@RequestBody @Validated Task task) {
public ResultInfo deleteTask(@RequestBody @Validated Task task) {
log.info("taskOperation ==>> deleteTask ==>> param ==>> {}", task);
Long id = task.getId();
// 删除任务
this.taskOperationService.deleteTask(id);
Integer integer = this.taskOperationService.deleteTask(id);
if (integer > 1) {
return ResultInfo.success("删除成功");
} else {
return ResultInfo.failure("删除失败");
}
}
/**
......
......@@ -34,9 +34,8 @@ public class TaskTemplateOperationController {
log.info("taskTemplateOperation ==>> create ==>> param ==>> {}", taskTemplate);
String code = taskTemplate.getCode();
Integer type = taskTemplate.getType();
TaskTemplateDTO taskTemplateDTO_ = this.taskTemplateOperationService.findByCode(code);
TaskTemplateDTO taskTemplateDTO_1 = this.taskTemplateOperationService.findByType(type);
if (Objects.isNull(taskTemplateDTO_.getId()) && Objects.isNull(taskTemplateDTO_1.getId())) {
Long count = this.taskTemplateOperationService.countByCodeAndType(taskTemplate);
if (count < 1) {
// 新增任务
this.taskTemplateOperationService.create(taskTemplate);
}
......
package com.topdraw.business.process.rest;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.topdraw.annotation.AnonymousAccess;
import com.topdraw.annotation.Log;
import com.topdraw.business.module.common.validated.CreateGroup;
import com.topdraw.business.module.common.validated.UpdateGroup;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.user.app.domain.UserApp;
import com.topdraw.business.module.user.app.domain.UserAppBind;
import com.topdraw.business.module.user.app.service.dto.UserAppDTO;
import com.topdraw.business.module.user.app.service.dto.UserAppSimpleDTO;
import com.topdraw.business.module.user.iptv.domain.UserTv;
import com.topdraw.business.module.user.iptv.growreport.domain.GrowthReport;
import com.topdraw.business.module.user.iptv.growreport.service.dto.GrowthReportRequest;
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.weixin.domain.UserWeixin;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinDTO;
import com.topdraw.business.process.domian.member.MemberOperationBean;
import com.topdraw.business.process.domian.weixin.*;
import com.topdraw.business.process.service.UserOperationService;
import com.topdraw.business.process.service.member.MemberOperationService;
import com.topdraw.common.ResultInfo;
import com.topdraw.config.RedisKeyUtil;
import com.topdraw.util.RedisKeyUtil;
import com.topdraw.config.WechatConfig;
import com.topdraw.exception.BadRequestException;
import com.topdraw.exception.EntityNotFoundException;
import com.topdraw.exception.GlobeExceptionMsg;
......@@ -26,24 +35,25 @@ import com.topdraw.resttemplate.RestTemplateClient;
import com.topdraw.util.Base64Util;
import com.topdraw.util.JSONUtil;
import com.topdraw.utils.RedisUtils;
import com.topdraw.weixin.util.WeChatConstants;
import com.topdraw.weixin.util.WeixinUtil;
import com.topdraw.weixin.service.WeChatConstants;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
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.util.Assert;
import org.springframework.util.Base64Utils;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.naming.ConfigurationException;
import java.io.IOException;
import java.net.URLDecoder;
import java.sql.Timestamp;
import java.util.*;
@Api("账处理")
@Api("账处理")
@RestController
@RequestMapping(value = "/uce/userOperation")
@Slf4j
......@@ -56,14 +66,241 @@ public class UserOperationController {
private UserOperationService userOperationService;
@Autowired
private MemberOperationService memberOperationService;
@Autowired
private UserTvService userTvService;
@Autowired
private RedisUtils redisUtils;
@Autowired
private WechatConfig weixinInfoConfig;
private static final String SUBSCRIBE = "subscribe";
private static final String UNSUBSCRIBE = "unsubscribe";
private static final Integer SUBSCRIBE_STATUS = 1;
/******************************************************* APP ************************************/
/**
* app账号退出登录
* @param userApp app账号
* @return ResultInfo
*/
@Log
@PostMapping(value = "/appSignOut")
@ApiOperation("app账号退出登录")
@AnonymousAccess
public ResultInfo appSignOut(@Validated @RequestBody UserApp userApp) {
log.info("app账号退出登录,参数 ==>> [appSignOut#{}]", userApp.getId());
if (Objects.isNull(userApp.getId())) {
log.error("app账号退出登录失败,参数错误,id不得为空,[appSignOut#]");
return ResultInfo.failure("app账号退出登录失败,参数错误,id不得为空");
}
return ResultInfo.success(true);
}
/**
* 注销app账号
* @param userApp app账号
* @return ResultInfo
*/
@Log
@PostMapping(value = "/appCancellation")
@ApiOperation("注销app账号")
@AnonymousAccess
public ResultInfo appCancellation(@Validated @RequestBody UserApp userApp) {
log.info("注销app账号,参数 ==>> [appCancellation#{}]", userApp.getId());
if (Objects.isNull(userApp.getId())) {
log.error("注销app账号失败,参数错误,id不得为空,[appCancellation#]");
return ResultInfo.failure("");
}
boolean result = this.userOperationService.appCancellation(userApp);
return ResultInfo.success(result);
}
@Log
@PostMapping(value = "/updateAppInfo")
@ApiOperation("修改app账号信息")
@AnonymousAccess
public ResultInfo updateAppInfo(@Validated @RequestBody UserApp resources) {
log.info("修改app账号信息,参数 ==>> [updateAppInfo#{}]", resources);
Long id = resources.getId();
if (Objects.isNull(id)) {
log.error("修改app账号密码,参数错误,id不得为空,[updateAppInfo#{}]", resources);
return ResultInfo.failure("修改app账号密码失败,参数错误,id不得为空");
}
String headimgurl = resources.getHeadimgurl();
log.info("前端头像地址 ==>> [updateAppInfo#{}]", headimgurl);
if (StringUtils.isNotBlank(headimgurl) && (headimgurl.contains("http") || headimgurl.contains("https"))) {
String image = RestTemplateClient.netImage(headimgurl);
log.info("图片本地化后的图片地址 ==>> [updateAppInfo#{}]", image);
resources.setHeadimgurl(image);
}
UserAppSimpleDTO result = this.userOperationService.updateAppInfo(resources);
return ResultInfo.success(result);
}
@Log
@PostMapping(value = "/appRegister")
@ApiOperation("app注册")
@AnonymousAccess
public ResultInfo appRegister(@Validated @RequestBody UserApp resources) {
log.info("app注册 ==>> param ==>> [appRegister#{}]", resources);
String username = resources.getUsername();
if (StringUtils.isBlank(username)) {
log.error("app注册,参数错误,账号不得为空 ");
return ResultInfo.failure("app注册,参数错误,账号不得为空");
}
Integer type = resources.getType();
if (Objects.isNull(type)) {
log.error("app注册,参数错误,账号类型不得为空 ");
return ResultInfo.failure("app注册,参数错误,账号类型不得为空");
}
String account = resources.getAccount();
if (StringUtils.isNotBlank(account)) {
if (Objects.isNull(resources.getAccountType())) {
log.error("app注册,参数错误,第三方账号类型不得为空");
return ResultInfo.failure("app注册,参数错误,第三方账号类型不得为空");
}
}
if (StringUtils.isBlank(resources.getNickname())) {
resources.setNickname(Base64Utils.encodeToString(username.getBytes()));
}
UserAppDTO userAppDTO = this.userOperationService.appRegister(resources);
return ResultInfo.success(userAppDTO);
}
@Log
@PostMapping(value = "/appBindThirdAccount")
@ApiOperation("app账号绑定第三方账号")
@AnonymousAccess
public ResultInfo appBindThirdAccount(@Validated @RequestBody UserAppBind resources) {
log.info("app账号绑定第三方账号,参数 ==>> [appBindThirdAccount#{}]", resources);
String username = resources.getUsername();
if (StringUtils.isBlank(username)) {
log.error("app账号绑定第三方账号,参数错误,账号不得为空 ");
return ResultInfo.failure("app账号绑定第三方账号,参数错误,账号不得为空");
}
String account = resources.getAccount();
if (StringUtils.isNotBlank(account)) {
if (Objects.isNull(resources.getAccountType())) {
log.error("app账号绑定第三方账号,参数错误,第三方账号不得为空");
return ResultInfo.failure("app账号绑定第三方账号,参数错误,第三方账号不得为空");
}
}
// 第三方账号类型 3:微信;4:QQ;5:微博;6:苹果账号
Integer accountType = resources.getAccountType();
if (Objects.isNull(accountType)) {
log.error("app账号绑定第三方账号,参数错误,第三方账号类型不得为空");
return ResultInfo.failure("app账号绑定第三方账号,参数错误,第三方账号类型不得为空");
}
return this.userOperationService.appBindThirdAccount(resources);
}
@Log
@PostMapping(value = "/cancelUserAppBind")
@ApiOperation("取消关联第三方账号")
@AnonymousAccess
public ResultInfo cancelUserAppBind(@Validated @RequestBody UserAppBind resources) {
log.info("取消关联第三方账号, 参数 ==>> [cancelUserAppBind#{}]", resources);
String account = resources.getAccount();
if (StringUtils.isBlank(account)) {
log.error("取消关联第三方账号失败,参数错误了,第三方账号不能为空");
return ResultInfo.failure("取消关联第三方账号失败,参数错误,第三方账号不能为空");
}
// 第三方账号类型 3:微信;4:QQ;5:微博;6:苹果账号
Integer accountType = resources.getAccountType();
if (Objects.isNull(accountType)) {
log.error("取消关联第三方账号失败,参数错误,第三方账号类型不得为空");
return ResultInfo.failure("取消关联第三方账号失败,参数错误,第三方账号类型不得为空");
}
return this.userOperationService.cancelUserAppBind(resources);
}
@PostMapping("/appBind")
@ApiOperation("app绑定大屏")
@AnonymousAccess
public ResultInfo appBind(@Validated(value = {BindGroup.class}) @RequestBody BindBean resources) {
log.info("UserOperationController ==> appletBind ==>> param ==> [{}]",resources);
Long memberId = resources.getMemberId();
if (Objects.isNull(memberId)) {
return ResultInfo.failure("参数错误,memberId 不存在");
}
String platformAccount = resources.getPlatformAccount();
if (StringUtils.isBlank(platformAccount)) {
return ResultInfo.failure("参数错误,大屏账号不存在");
}
boolean result = this.userOperationService.appBind(resources);
return ResultInfo.success(result);
}
@PostMapping("/appUnbind")
@ApiOperation("app解绑")
@AnonymousAccess
public ResultInfo appUnbind(@Validated(value = {UnbindGroup.class}) @RequestBody WeixinUnBindBean weixinUnBindBean) {
log.info("UserOperationController ==> minaUnbind ==>> param ==> [{}]", weixinUnBindBean);
Long memberId = weixinUnBindBean.getMemberId();
if (Objects.isNull(memberId)) {
log.error("小屏解绑失败,参数错误,memberId不存在");
return ResultInfo.failure("参数错误,会员id不存在");
}
return this.userOperationService.minaUnbind(weixinUnBindBean);
}
/******************************************************* weixin ************************************/
@Log
@PostMapping(value = "/saveGrowthReport")
@ApiOperation("同步大屏成长报告")
@AnonymousAccess
public ResultInfo saveGrowthReport(@Validated @RequestBody String resources) {
log.info("同步大屏成长报告,参数 ==>> [saveGrowthReport#{}]", resources);
GrowthReportRequest growthReportRequest = JSON.parseObject(new String(Base64Utils.decode(resources.getBytes())), GrowthReportRequest.class);
String platformAccount = growthReportRequest.getPlatformAccount();
log.info("同步大屏成长报告消息,大屏账号 ==>> [saveGrowthReport#{}]", platformAccount);
List<GrowthReportRequest.CategoryContent> playDurationWithCategory = growthReportRequest.getPlayDurationWithCategory();
log.info("同步大屏成长报告消息主体,消息体 ==>> [saveGrowthReport#{}]", playDurationWithCategory);
if (!CollectionUtils.isEmpty(playDurationWithCategory)) {
GrowthReport growthReport = new GrowthReport();
growthReport.setPlatformAccount(platformAccount);
JSONObject jsonObject = new JSONObject();
jsonObject.put("playDurationWithCategory", playDurationWithCategory);
growthReport.setData(jsonObject.toJSONString());
return this.userOperationService.saveGrowthReport(growthReport);
}
return ResultInfo.failure("保存失败");
}
@PutMapping(value = "/updateWeixin")
@ApiOperation("修改UserWeixin")
@AnonymousAccess
......@@ -80,37 +317,32 @@ public class UserOperationController {
log.info("userOperation ==>> updateVipByUserId ==>> param ==>> [{}]",resources);
Integer vip = resources.getVip();
if (Objects.isNull(vip) || vip < 1) {
return ResultInfo.failure("手动修改vip异常,参数错误,vip为空或者小于1");
}
Timestamp vipExpireTime = resources.getVipExpireTime();
// 微信账号id
Long userId = resources.getUserId();
if (Objects.isNull(userId)) {
return ResultInfo.failure("手动修改vip异常,参数错误,小屏账号id为空");
}
UserWeixinDTO userWeixinDTO = this.userOperationService.findById(userId);
Long memberId = userWeixinDTO.getMemberId();
MemberDTO memberDTO = this.memberService.findById(memberId);
Member member = new Member();
BeanUtils.copyProperties(memberDTO, member);
if (Objects.nonNull(vip)) {
member.setVip(vip);
}
if (Objects.nonNull(vipExpireTime)) {
member.setVipExpireTime(vipExpireTime);
}
this.createVipHistory(userId, vip, vipExpireTime);
this.memberOperationService.updateMemberVip(member);
return ResultInfo.success();
MemberOperationBean memberOperationBean = new MemberOperationBean();
memberOperationBean.setMemberCode(memberDTO.getCode());
if (vip < memberDTO.getVip()) {
vip = memberDTO.getVip();
} else {
memberOperationBean.setVipExpireTime(vipExpireTime);
}
memberOperationBean.setVip(vip);
MemberDTO memberDTO1 = this.memberOperationService.doUpdateVipByMemberCode(memberOperationBean);
private void createVipHistory(Long weixinUserId, Integer vip , Timestamp vipExpireTime){
BuyVipBean buyVipBean = new BuyVipBean();
buyVipBean.setId(weixinUserId);
buyVipBean.setVip(vip);
buyVipBean.setVipExpireTime(vipExpireTime);
this.memberOperationService.buyVipByUserId(buyVipBean);
return ResultInfo.success(memberDTO1);
}
@PostMapping(value = "/createWeixinUserAndCreateMember")
......@@ -146,14 +378,18 @@ public class UserOperationController {
@PostMapping("/subscribe")
@ApiOperation("微信公众号关注")
@AnonymousAccess
public ResultInfo subscribe(@Validated @RequestBody SubscribeBeanEvent data) throws IOException {
public ResultInfo subscribe(@Validated @RequestBody SubscribeBeanEvent data) throws Exception {
log.info("UserOperationController ==> subscribe ==>> param ==> [{}]",data);
SubscribeBean subscribeBean = JSONUtil.parseMsg2Object(data.getContent(), SubscribeBean.class);
// 解析参数
this.parseSubscribe(subscribeBean);
this.userOperationService.subscribe(subscribeBean);
return ResultInfo.success();
boolean subscribe = this.userOperationService.subscribe(subscribeBean);
if (subscribe) {
return ResultInfo.success("关注成功");
} else {
return ResultInfo.failure("关注失败");
}
}
/**
......@@ -161,11 +397,11 @@ public class UserOperationController {
* @param subscribeBean
* @throws IOException
*/
private void parseSubscribe(SubscribeBean subscribeBean) throws IOException {
private void parseSubscribe(SubscribeBean subscribeBean) throws Exception {
// appId
String appId = subscribeBean.getAppid();
Assert.notNull(appId, GlobeExceptionMsg.APP_ID_IS_NULL);
// Assert.notNull(appId, GlobeExceptionMsg.APP_ID_IS_NULL);
// openId
String openId = subscribeBean.getOpenid();
Assert.notNull(openId, GlobeExceptionMsg.OPEN_ID_IS_NULL);
......@@ -174,45 +410,41 @@ public class UserOperationController {
Assert.notNull(openId, GlobeExceptionMsg.UNION_ID_IS_NULL);
// 匹配配置文件中的微信列表信息
Map<String, String> wxInfoMap = WeixinUtil.getWeixinInfoByAppid(appId);
Map<String, String> wxInfoMap = this.getWeixinInfoByAppid(appId);
if (Objects.nonNull(wxInfoMap)) {
// 程序类型
String appType = wxInfoMap.get("appType");
// 非订阅号,暂不处理。返回暂不支持
if (ObjectUtil.notEqual(appType, WeChatConstants.WX_SUBSCRIPTION))
throw new BadRequestException("非订阅号");
}
// 大屏账户信息
JSONObject iptvUserInfo = null;
JSONObject redisInfo = null;
// 缓存的大屏信息,使用unionid即可
String content = (String) this.redisUtils.get(RedisKeyUtil.genSeSuSubscribeKey(unionId));
log.info("获取redis中存储的数据,[subscribe#{}]", content);
if (StringUtils.isNotBlank(content)) {
// 大屏信息
iptvUserInfo = JSONObject.parseObject(content);
redisInfo = JSONObject.parseObject(content);
}
// 用户自己搜索关注就没有大屏信息,否则表示扫码关注
if (Objects.nonNull(iptvUserInfo)) {
if (Objects.nonNull(redisInfo)) {
subscribeBean.setIptvUserInfo(iptvUserInfo);
Object sourceInfo1 = iptvUserInfo.get("sourceInfo");
if (Objects.nonNull(sourceInfo1)) {
String sourceInfo = sourceInfo1.toString();
if (StringUtils.isNotBlank(sourceInfo))
subscribeBean.setSourceInfo(sourceInfo);
}
subscribeBean.setIptvUserInfo(redisInfo);
// 关注来源信息
log.info("关注来源信息,[subscribe#{}]", redisInfo);
subscribeBean.setSourceInfo(redisInfo);
String nickname = iptvUserInfo.get("nickname").toString();
String nickname = redisInfo.get("nickname").toString();
if (StringUtils.isNotBlank(nickname)) {
String nicknameDecode = URLDecoder.decode(nickname, "UTF-8");
String nicknameEncode = Base64Util.encode(nicknameDecode);
subscribeBean.setNickname(nicknameEncode);
}
String headimgurl = iptvUserInfo.get("headimgurl").toString();
String headimgurl = redisInfo.get("headimgurl").toString();
log.info("parseSubscribe ==>> headimgurl ==>> {}", headimgurl);
if (StringUtils.isNotBlank(headimgurl)) {
String headimgurlDecode = URLDecoder.decode(headimgurl, "UTF-8");
......@@ -239,6 +471,24 @@ public class UserOperationController {
}
/**
* 获取配置的微信应用列表
* @param appid 应用Id
* @return
* @throws ConfigurationException
*/
private Map<String, String> getWeixinInfoByAppid(String appid) throws ConfigurationException {
if (com.topdraw.utils.StringUtils.isBlank(appid)) {
throw new RuntimeException("wxAppid can not be null");
}
List<Map<String, String>> list = weixinInfoConfig.getWechatAppList();
Optional<Map<String, String>> weixinInfoOptional = list.stream().filter(o -> o.get("appid").equals(appid)).findFirst();
if (!weixinInfoOptional.isPresent()) {
throw new RuntimeException("wxAppid error, appid is : " + appid);
}
return weixinInfoOptional.get();
}
@PostMapping("/unsubscribe")
@ApiOperation("微信公众号取关")
@AnonymousAccess
......@@ -266,6 +516,16 @@ public class UserOperationController {
public ResultInfo minaBind(@Validated(value = {BindGroup.class}) @RequestBody BindBean resources) {
log.info("UserOperationController ==> appletBind ==>> param ==> [{}]",resources);
Long memberId = resources.getMemberId();
if (Objects.isNull(memberId)) {
return ResultInfo.failure("参数错误,memberId 不存在");
}
String platformAccount = resources.getPlatformAccount();
if (StringUtils.isBlank(platformAccount)) {
return ResultInfo.failure("参数错误,大屏账号不存在");
}
boolean result = this.userOperationService.minaBind(resources);
return ResultInfo.success(result);
}
......@@ -274,10 +534,16 @@ public class UserOperationController {
@ApiOperation("小屏解绑")
@AnonymousAccess
public ResultInfo minaUnbind(@Validated(value = {UnbindGroup.class}) @RequestBody WeixinUnBindBean weixinUnBindBean) {
log.info("UserOperationController ==> minaUnbind ==>> param ==> [{}]", weixinUnBindBean);
log.info("小屏解绑,参数 ==> [minaUnbind#{}]", weixinUnBindBean);
Long memberId = weixinUnBindBean.getMemberId();
if (Objects.isNull(memberId)) {
log.error("小屏解绑失败,参数错误,memberId不存在");
return ResultInfo.failure("参数错误,无会员id");
}
return this.userOperationService.minaUnbind(weixinUnBindBean);
this.userOperationService.minaUnbind(weixinUnBindBean);
return ResultInfo.success();
}
/**
......@@ -293,12 +559,18 @@ public class UserOperationController {
public ResultInfo memberPreprocess(@RequestBody String data) {
log.info("UserOperationController ==> saveUserInfo ==>> param ==>> [{}]",data);
Assert.notNull(data, "用户数据不可为空");
if (StringUtils.isBlank(data)) {
log.error("预存大小屏账号信息失败,无参数");
return ResultInfo.failure("参数错误");
}
JSONObject json = JSONObject.parseObject(data);
String unionid = json.getString("unionid");
Assert.state(StrUtil.isNotBlank(unionid), "unionid不可为空");
if (StringUtils.isBlank(unionid)) {
log.error("预存大小屏账号信息失败,参数错误,unionid不存在");
return ResultInfo.failure("参数错误,unionid不存在");
}
List<Object> resultList = new ArrayList<>();
......@@ -321,7 +593,7 @@ public class UserOperationController {
} else {
// 账号存在,未关注
if (userWeixinDTO.getStatus() != SUBSCRIBE_STATUS) {
if (!userWeixinDTO.getStatus().equals(SUBSCRIBE_STATUS)) {
result = UNSUBSCRIBE;
}
......@@ -384,7 +656,7 @@ public class UserOperationController {
String headimgurlDecode = URLDecoder.decode(headimgurl, "UTF-8");
// String imageEncode = Base64Util.encode(headimgurlDecode);
String image = RestTemplateClient.netImage(headimgurlDecode);
memberDTO.setAvatarUrl(StringUtils.isNotBlank(image) == true ? image:headimgurlDecode);
memberDTO.setAvatarUrl(StringUtils.isNotBlank(image) ? image:headimgurlDecode);
}
}
......@@ -419,8 +691,7 @@ public class UserOperationController {
private String downloadWeixinImge(String headimgurl){
try {
if (StringUtils.isNotBlank(headimgurl)) {
String image = RestTemplateClient.netImage(headimgurl);
return image;
return RestTemplateClient.netImage(headimgurl);
}
} catch (Exception e) {
log.info("头像解析失败!!!");
......@@ -447,8 +718,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);
}
......@@ -471,21 +746,36 @@ public class UserOperationController {
throw new BadRequestException(GlobeExceptionMsg.IPTV_PLATFORM_ACCOUNT_IS_NULL);
}
this.userOperationService.tvUnbind(resources);
return ResultInfo.success();
boolean b = this.userOperationService.tvUnbind(resources);
if (b) {
return ResultInfo.success("解绑成功");
} else return ResultInfo.failure("解绑失败");
}
@RequestMapping(value = "/changeMainAccount")
@ApiOperation("大屏更换主账号")
@AnonymousAccess
public ResultInfo changeMainAccount(@Validated(value = {UpdateGroup.class}) @RequestBody BindBean resources) {
log.info("UserOperationController ==> changeMainAccount ==>> param ==> [{}]",resources);
log.info("大屏更换主账号,参数 [changeMainAccount# ==> {}]",resources);
Long memberId = resources.getMemberId();
// Long memberId = resources.getMemberId();
String memberCode = resources.getMemberCode();
if (StringUtils.isBlank(memberCode) && Objects.nonNull(memberId)) {
/* if (StringUtils.isBlank(memberCode) && Objects.nonNull(memberId)) {
memberCode = this.memberService.findCodeById(memberId);
} else if (StringUtils.isNotBlank(memberCode) && Objects.isNull(memberId)) {
MemberDTO memberDTO = this.memberService.findByCode(memberCode);
memberCode = memberDTO.getCode();
}*/
if (StringUtils.isBlank(memberCode))
return ResultInfo.failure("会员code不得为空");
MemberDTO memberDTO = this.memberService.findByCode(memberCode);
if (Objects.isNull(memberDTO.getId())) {
log.error("大屏更换主账号失败,会员信息不存在, changeMainAccount# ==> {}", memberCode);
return ResultInfo.failure("会员信息不存在");
}
String platformAccount = resources.getPlatformAccount();
if (StringUtils.isBlank(platformAccount))
throw new BadRequestException(GlobeExceptionMsg.IPTV_PLATFORM_ACCOUNT_IS_NULL);
......@@ -493,9 +783,9 @@ public class UserOperationController {
UserTv userTv = new UserTv();
userTv.setMemberCode(memberCode);
userTv.setPlatformAccount(platformAccount);
this.userOperationService.changeMainAccount(userTv);
boolean b = this.userOperationService.changeMainAccount(userTv);
return ResultInfo.success();
return ResultInfo.success(b);
}
@PostMapping(value = "/deleteAllCollection")
......@@ -530,6 +820,7 @@ public class UserOperationController {
return ResultInfo.success();
}
}
......
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 {
}
......@@ -18,14 +18,6 @@ public interface ExpOperationService {
void grantExpThroughTempExp( List<TempExp> tempExpList);
/**
* 系统手动发放优惠券
* @param memberId
* @param userId
* @param tempExpList
*/
void grantExpByManual(Long memberId,Long userId ,List<TempExp> tempExpList);
/**
*
* @param tempExpList
*/
......
......@@ -13,13 +13,6 @@ import java.util.List;
public interface PointsOperationService {
/**
* 手动发放积分
* @param memberId 会员id
* @param tempPoints 积分详情
*/
void grantPointsByManual(Long memberId , TempPoints tempPoints);
/**
*
* @param tempPoints
*/
......@@ -44,5 +37,6 @@ public interface PointsOperationService {
* @param memberId
* @return
*/
@Deprecated
Long cleanInvalidPointsAndCalculateCurrentPoints(Long memberId);
}
......
package com.topdraw.business.process.service;
import com.topdraw.business.module.rights.history.domain.RightsHistory;
import com.topdraw.business.process.domian.constant.RightType;
import com.topdraw.business.module.rights.constant.RightType;
import java.util.List;
import java.util.Map;
......@@ -23,5 +23,5 @@ public interface RightsOperationService {
* 任务完成自动发放权益
* @param tempRightsMap
*/
void grantRights(Map<RightType, Object> tempRightsMap);
Integer grantRights(Map<RightType, Object> tempRightsMap);
}
......
......@@ -11,8 +11,18 @@ import com.topdraw.common.ResultInfo;
*/
public interface TaskOperationService {
/**
*
* @param id
* @return
*/
TaskDTO findById(Long id);
/**
*
* @param code
* @return
*/
TaskDTO findByCode(String code);
/**
......@@ -26,25 +36,25 @@ public interface TaskOperationService {
*
* @param task
*/
void createTask(Task task);
TaskDTO createTask(Task task);
/**
*
* @param task
*/
void updateTask(Task task);
TaskDTO updateTask(Task task);
/**
*
* @param task
*/
void deleteTask(Task task);
Integer deleteTask(Task task);
/**
*
* @param id
*/
void deleteTask(Long id);
Integer deleteTask(Long id);
/**
*
......@@ -54,6 +64,4 @@ public interface TaskOperationService {
*/
boolean createPoint2ChongQing(String platformAccount, Long points);
}
......
......@@ -43,6 +43,13 @@ public interface TaskTemplateOperationService {
/**
*
* @param taskTemplate
* @return
*/
Long countByCodeAndType(TaskTemplate taskTemplate);
/**
*
* @param id
* @return
*/
......
package com.topdraw.business.process.service;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.user.app.domain.UserApp;
import com.topdraw.business.module.user.app.domain.UserAppBind;
import com.topdraw.business.module.user.app.service.dto.UserAppDTO;
import com.topdraw.business.module.user.app.service.dto.UserAppSimpleDTO;
import com.topdraw.business.module.user.iptv.domain.UserTv;
import com.topdraw.business.module.user.iptv.growreport.domain.GrowthReport;
import com.topdraw.business.module.user.iptv.service.dto.UserTvDTO;
import com.topdraw.business.module.user.weixin.domain.UserWeixin;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinDTO;
......@@ -9,6 +14,7 @@ import com.topdraw.business.process.domian.weixin.BindBean;
import com.topdraw.business.process.domian.weixin.SubscribeBean;
import com.topdraw.business.process.domian.weixin.TvUnBindBean;
import com.topdraw.business.process.domian.weixin.WeixinUnBindBean;
import com.topdraw.common.ResultInfo;
public interface UserOperationService {
......@@ -52,13 +58,13 @@ public interface UserOperationService {
* 大屏解绑
* @param userTv
*/
void tvUnbind(TvUnBindBean userTv);
boolean tvUnbind(TvUnBindBean userTv);
/**
* 大屏切换主账户(会员)
* @param userTv
*/
void changeMainAccount(UserTv userTv);
boolean changeMainAccount(UserTv userTv);
/**
* 微信公众号关注
......@@ -70,6 +76,7 @@ public interface UserOperationService {
*/
boolean subscribe(SubscribeBean resources);
/**
* 微信公众号取关
* @param resources
......@@ -113,18 +120,11 @@ public interface UserOperationService {
boolean minaBind(BindBean resources);
/**
*
* @param memberCode
* @param platformAccount
*/
void bind(String memberCode, String platformAccount);
/**
*
* @param memberDTO
* @param userTvDTO
* app绑定大屏
* @param resources
* @return
*/
void bind(MemberDTO memberDTO, UserTvDTO userTvDTO);
boolean appBind(BindBean resources);
/**
*
......@@ -152,7 +152,7 @@ public interface UserOperationService {
* 小屏解绑
* @param weixinUnBindBean
*/
void minaUnbind(WeixinUnBindBean weixinUnBindBean);
ResultInfo minaUnbind(WeixinUnBindBean weixinUnBindBean);
/**
*
......@@ -173,4 +173,50 @@ public interface UserOperationService {
* @return
*/
UserTvDTO updateUserTv(UserTv resources);
/**
*
* @param resources
* @return
*/
UserAppDTO appRegister(UserApp resources);
/**
*
* @param resources
* @return
*/
ResultInfo cancelUserAppBind(UserAppBind resources);
/**
*
* @param resources
* @return
*/
ResultInfo appBindThirdAccount(UserAppBind resources);
/**
*
* @param resources
* @return
*/
UserAppSimpleDTO updateAppInfo(UserApp resources);
/**
*
* @param resources
* @return
*/
boolean updatePasswordById(UserApp resources);
/**
*
* @param growthReport
* @return
*/
ResultInfo saveGrowthReport(GrowthReport growthReport);
boolean appCancellation(UserApp userApp);
}
......
......@@ -4,7 +4,6 @@ import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.coupon.history.domain.CouponHistory;
import com.topdraw.business.module.coupon.history.service.CouponHistoryService;
import com.topdraw.business.module.coupon.service.CouponService;
import com.topdraw.business.module.exp.detail.domain.ExpDetail;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
......@@ -12,15 +11,16 @@ import com.topdraw.business.process.service.CouponOperationService;
import com.topdraw.business.process.service.member.MemberOperationService;
import com.topdraw.business.process.domian.TempCoupon;
import com.topdraw.business.process.service.RightsOperationService;
import com.topdraw.business.RedisKeyConstants;
import com.topdraw.util.TimestampUtil;
import com.topdraw.utils.RedisUtils;
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;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
......@@ -42,6 +42,9 @@ public class CouponOperationServiceImpl implements CouponOperationService {
MemberService memberService;
@Autowired
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
@Autowired
private RedisUtils redisUtils;
// 过期阀值(默认一个月)
......@@ -73,7 +76,6 @@ public class CouponOperationServiceImpl implements CouponOperationService {
}
}
/**
* 优惠券领取历史记录表
*
......@@ -92,38 +94,30 @@ public class CouponOperationServiceImpl implements CouponOperationService {
* @param tempCoupon 账号id
*/
private void refreshMemberCoupon(TempCoupon tempCoupon) {
// Long userId = tempCoupon.getUserId();
Long memberId = tempCoupon.getMemberId();
Integer rightsAmount = tempCoupon.getRightsAmount();
try {
this.redisUtils.doLock(RedisKeyConstants.updateCacheCouponByMemberId + memberId.toString());
// 1.历史总优惠券数量
Long historyCouponCount = this.getTotalHistoryCoupon(memberId);
Long historyCouponCount = this.couponHistoryService.countByUserId(memberId);
// 1.当前总优惠券数量
Long totalCouponCount = this.getTotalCoupon(historyCouponCount, rightsAmount);
Long totalCouponCount = (Objects.nonNull(historyCouponCount) ? historyCouponCount: 0L) + (Objects.nonNull(rightsAmount) ? rightsAmount: 0L);
// 2.获取已过期的优惠券数量
Long expireCouponCount = this.getTotalExpireCoupon(memberId);
Long expireCouponCount = this.couponHistoryService.countByUserIdAndExpireTimeBefore(memberId, LocalDateTime.now());
// 3.即将过期的优惠券数量
Long expireSoonCouponCount = this.getTotalExpireSoonCoupon(memberId, EXPIRE_FACTOR_DAY);
Long expireSoonCouponCount = this.couponHistoryService.countByUserIdAndExpireTimeBetween(memberId, LocalDateTime.now(),LocalDateTime.now().plusDays(EXPIRE_FACTOR_DAY));
// 4.当前优惠券数量 = 总优惠券-已过期的优惠券
Long currentCoupon = this.getCurrentCoupon(totalCouponCount, expireCouponCount);
this.redisUtils.doLock("right::member::id::" + memberId.toString());
Long currentCoupon = (Objects.nonNull(totalCouponCount)?totalCouponCount:0L)-(Objects.nonNull(expireCouponCount)?expireCouponCount:0L);
// 5.更新用户信息(优惠券数量、即将过期的优惠券数量)
this.doUpdateMemberInfo(memberId,currentCoupon,expireSoonCouponCount);
} catch (Exception e) {
e.printStackTrace();
throw e;
log.error(e.getMessage());
} finally {
this.redisUtils.doUnLock("right::member::id::" + memberId.toString());
this.redisUtils.doUnLock(RedisKeyConstants.updateCacheCouponByMemberId + memberId.toString());
}
}
private Long getTotalCoupon(Long historyCouponCount, Integer rightsAmount) {
return (Objects.nonNull(historyCouponCount) ? historyCouponCount: 0L) + (Objects.nonNull(rightsAmount) ? rightsAmount: 0L);
}
/**
* 更新当前用户优惠券信息
* @param memberId
......@@ -134,7 +128,6 @@ public class CouponOperationServiceImpl implements CouponOperationService {
MemberDTO memberDTO = this.findMemberByMemberId(memberId);
Member member = new Member();
// BeanUtils.copyProperties(memberDTO,member);
member.setId(memberDTO.getId());
member.setCode(memberDTO.getCode());
member.setCouponAmount(currentCoupon);
......@@ -142,7 +135,10 @@ public class CouponOperationServiceImpl implements CouponOperationService {
member.setUpdateTime(TimestampUtil.now());
this.memberOperationService.doUpdateMemberCoupon(member);
// ((CouponOperationServiceImpl) AopContext.currentProxy()).asyncMemberCoupon(member);
this.threadPoolTaskExecutor.submit(() -> {
((CouponOperationServiceImpl) AopContext.currentProxy()).asyncMemberCoupon(member);
});
}
private MemberDTO findMemberByMemberId(Long memberId) {
......@@ -170,27 +166,7 @@ public class CouponOperationServiceImpl implements CouponOperationService {
*/
private Long getTotalExpireSoonCoupon(Long userId, Integer expireFactor) {
LocalDateTime expireTime = LocalDateTime.now().plusDays(expireFactor);
return this.couponHistoryService.countByUserIdAndExpireTimeBetween(userId,LocalDateTime.now(),expireTime);
}
/**
* 获取已过期的优惠券数量
* @param userId
* @return
*/
private Long getTotalExpireCoupon(Long userId) {
return this.couponHistoryService.countByUserIdAndExpireTimeBefore(userId, LocalDateTime.now());
}
/**
* 获取用户领取的总优惠券
* @param userId
* @return
*/
private Long getTotalHistoryCoupon(Long userId) {
return this.couponHistoryService.countByUserId(userId);
return this.couponHistoryService.countByUserIdAndExpireTimeBetween(userId,LocalDateTime.now(),LocalDateTime.now().plusDays(expireFactor));
}
......
......@@ -7,11 +7,11 @@ import com.topdraw.business.module.member.domain.Member;
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.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.member.service.dto.MemberSimpleDTO;
import com.topdraw.business.process.service.ExpOperationService;
import com.topdraw.business.process.service.member.MemberOperationService;
import com.topdraw.business.process.domian.TempExp;
import com.topdraw.util.IdWorker;
import com.topdraw.business.RedisKeyConstants;
import com.topdraw.util.TimestampUtil;
import com.topdraw.utils.RedisUtils;
import com.topdraw.utils.StringUtils;
......@@ -19,11 +19,12 @@ 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;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
/**
*
......@@ -42,6 +43,9 @@ public class ExpOperationServiceImpl implements ExpOperationService {
MemberService memberService;
@Autowired
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
@Autowired
private RedisUtils redisUtils;
@AsyncMqSend
......@@ -51,73 +55,46 @@ public class ExpOperationServiceImpl implements ExpOperationService {
@Override
public void grantExpThroughTempExp(List<TempExp> tempExpList) {
for (TempExp tempExp : tempExpList) {
this.refresh(tempExp);
}
this.refresh(tempExpList);
}
@Override
public void grantExpByManual(Long memberId, Long userId, List<TempExp> tempExpList) {
for (TempExp tempExp : tempExpList) {
this.refresh(tempExp);
}
}
@Override
public void grantExpByManual(List<TempExp> tempExpList) {
for (TempExp tempExp : tempExpList) {
this.refresh(tempExp);
}
this.refresh(tempExpList);
}
/**
*
* @param tempExp
* @param tempExps
*/
private void refresh(TempExp tempExp) {
private void refresh(List<TempExp> tempExps) {
TempExp _tempExp = tempExps.get(0);
try {
this.redisUtils.doLock(RedisKeyConstants.updateCacheExpByMemberId + _tempExp.getMemberId());
// 原始经验值
long originExp = this.getExpByMemberId(tempExp);
long originExp = this.memberService.findExpByMemberId(_tempExp.getMemberId());
log.info("----获取会员当前原始经验值 ==>> {}", originExp);
long totalExp = originExp;
for (TempExp exp : tempExps) {
// 总经验值
long totalExp = this.calculateTotalExp(originExp, tempExp);
log.info("----计算总经验值 ==>> {}", totalExp);
totalExp = this.doInsertExpDetail(exp, totalExp, (exp.getRewardExp()+totalExp));
log.info("----保存经验值历史 -->>{}", totalExp);
}
this.redisUtils.doLock("right::member::id::" + tempExp.getMemberId());
// 2.更新成长值与等级
this.refreshMemberExpAndLevel(_tempExp, totalExp);
log.info("----更新会员经验值与对应等级 ==>> {}", totalExp);
this.refreshMemberExpAndLevel(tempExp, totalExp);
log.info("----保存经验值历史 ");
this.doInsertExpDetail(tempExp, originExp, totalExp);
} catch (Exception e) {
e.printStackTrace();
throw e;
log.error("成长值发放失败,{}",e.getMessage());
} finally {
this.redisUtils.doUnLock("right::member::id::" + tempExp.getMemberId());
}
}
private long calculateTotalExp(long originalExp, TempExp tempExp) {
Long rewardExp = tempExp.getRewardExp();
return rewardExp + originalExp;
}
/**
*
* @param tempExp
* @return
*/
private long getExpByMemberId(TempExp tempExp) {
Long memberId = tempExp.getMemberId();
MemberDTO memberDTO = this.memberOperationService.findById(memberId);
if (Objects.nonNull(memberDTO)) {
Long exp = memberDTO.getExp();
return Objects.isNull(exp) ? 0L : exp;
this.redisUtils.doUnLock(RedisKeyConstants.updateCacheExpByMemberId + _tempExp.getMemberId());
}
return 0L;
}
/**
......@@ -125,73 +102,48 @@ public class ExpOperationServiceImpl implements ExpOperationService {
*
* @param tempExp 成长值列表
*/
private void refreshMemberExpAndLevel(TempExp tempExp,long totalExp) {
private void refreshMemberExpAndLevel(TempExp tempExp, long totalExp) {
Integer memberLevel = tempExp.getMemberLevel();
Long memberId = tempExp.getMemberId();
// 1.获取当前成长值
MemberDTO memberDTO = this.getMemberInfoByMemberId(memberId);
String memberCode = tempExp.getMemberCode();
// 2.获取下一级需要的成长值
MemberLevelDTO memberLevelDTO = this.getNextLevelExp(memberDTO.getLevel() + 1, 1);
MemberLevelDTO memberLevelDTO = this.memberLevelService.findByLevel(memberLevel + 1);
// 4.成长值比较,判断是否升级
Integer level = this.compareExp(totalExp, memberLevelDTO,memberDTO);
// 5.更新用户信息
this.updateMemberInfo(level, totalExp, memberId);
}
/**
*
* @param level
* @param totalExp 总积分
* @param memberId 会员id
*/
private void updateMemberInfo(Integer level,Long totalExp,Long memberId) {
MemberDTO memberDTO = this.findMemberByMemberId(memberId);
Integer level = this.compareExp(totalExp, memberLevelDTO, memberLevel);
// 5.更新用户信息
Member member = new Member();
// BeanUtils.copyProperties(memberDTO, member);
member.setId(memberDTO.getId());
member.setCode(memberDTO.getCode());
member.setId(memberId);
member.setCode(memberCode);
member.setExp(totalExp);
member.setLevel(level);
member.setUpdateTime(TimestampUtil.now());
this.memberOperationService.doUpdateMemberExpAndLevel(member);
((ExpOperationServiceImpl) AopContext.currentProxy()).asyncMemberExpAndLevel(member);
if (level > memberLevel) {
MemberSimpleDTO memberSimpleDTO = this.memberService.findSimpleById(memberId);
if (Objects.nonNull(memberLevelDTO.getId())) {
memberSimpleDTO.setLevel(level);
boolean result = this.redisUtils.set(RedisKeyConstants.cacheMemberSimpleById + "::" + memberId, memberSimpleDTO);
log.info("更新redis中会员等级 ==>> {} || 更新结果 ==>>{}", memberSimpleDTO, result);
}
}
private MemberDTO findMemberByMemberId(Long memberId) {
MemberDTO memberDTO = this.memberService.findById(memberId);
return memberDTO;
}
private Integer compareExp(long newExp, MemberLevelDTO memberLevelDTO,MemberDTO memberDTO) {
if (Objects.nonNull(memberLevelDTO)) {
private Integer compareExp(long newExp, MemberLevelDTO memberLevelDTO, Integer oldMemberLevel) {
if (Objects.nonNull(memberLevelDTO.getId())) {
Long nextLevelExp = memberLevelDTO.getExpValue();
if (Objects.nonNull(nextLevelExp) && nextLevelExp > 0)
if(newExp - nextLevelExp >= 0){
return memberLevelDTO.getLevel();
}
}
return memberDTO.getLevel();
}
private MemberLevelDTO getNextLevelExp(Integer i,Integer status) {
List<MemberLevelDTO> memberLevelDTOList = this.memberLevelService.findLevelAndStatus(i,status);
if (!CollectionUtils.isEmpty(memberLevelDTOList)) {
return memberLevelDTOList.get(0);
}
return null;
}
/**
* 获取当前会员的成长值
* @param memberId 会员id
* @return Long 当前会员成长值
*/
private MemberDTO getMemberInfoByMemberId(Long memberId) {
MemberDTO memberDTO = this.memberOperationService.findById(memberId);
return memberDTO;
return oldMemberLevel;
}
/**
......@@ -199,14 +151,13 @@ public class ExpOperationServiceImpl implements ExpOperationService {
*
* @param tempExp 成长值列表
*/
private void doInsertExpDetail(TempExp tempExp,long originalExp,long totalExp) {
private long doInsertExpDetail(TempExp tempExp, long originalExp, long totalExp) {
// 获得的积分
Long rewardExp = tempExp.getRewardExp();
ExpDetail expDetail = new ExpDetail();
BeanUtils.copyProperties(tempExp,expDetail);
expDetail.setCode(String.valueOf(IdWorker.generator()));
BeanUtils.copyProperties(tempExp, expDetail);
expDetail.setCode("expD_"+UUID.randomUUID().toString());
// 原始积分
expDetail.setOriginalExp(originalExp);
// 总积分
......@@ -218,8 +169,9 @@ public class ExpOperationServiceImpl implements ExpOperationService {
}
this.expDetailService.create(expDetail);
((ExpOperationServiceImpl) AopContext.currentProxy()).asyncExpDetail(expDetail);
return totalExp;
}
}
......
......@@ -8,24 +8,19 @@ import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.points.available.domain.PointsAvailable;
import com.topdraw.business.module.points.available.service.PointsAvailableService;
import com.topdraw.business.module.points.available.service.dto.PointsAvailableDTO;
import com.topdraw.business.module.points.detail.detailhistory.service.PointsDetailHistoryService;
import com.topdraw.business.module.points.detail.domain.PointsDetail;
import com.topdraw.business.module.points.detail.service.PointsDetailService;
import com.topdraw.business.module.points.service.PointsService;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinDTO;
import com.topdraw.business.process.service.dto.CustomPointsResult;
import com.topdraw.business.process.service.member.MemberOperationService;
import com.topdraw.business.process.service.PointsOperationService;
import com.topdraw.business.process.domian.TempPoints;
import com.topdraw.business.RedisKeyConstants;
import com.topdraw.util.DateUtil;
import com.topdraw.util.IdWorker;
import com.topdraw.util.TimestampUtil;
import com.topdraw.utils.RedisUtils;
import com.topdraw.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -36,10 +31,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
*
......@@ -50,22 +42,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;
......@@ -82,26 +71,18 @@ public class PointsOperationServiceImpl implements PointsOperationService {
@AsyncMqSend
public void asyncPointsDetail(PointsDetail pointsDetail) {}
@Override
@Transactional(rollbackFor = Exception.class)
public void grantPointsByManual(Long memberId, TempPoints tempPoints){
if (Objects.nonNull(tempPoints) && Objects.nonNull(tempPoints.getPoints())) {
MemberDTO memberDTo = this.memberService.findById(memberId);
String memberCode = memberDTo.getCode();
tempPoints.setMemberCode(memberCode);
this.refresh(tempPoints);
}
}
/**
* uc-admin调用此接口进行发放积分
* @param tempPoints
*/
@Override
public void grantPointsByManualByTempPoints(TempPoints tempPoints) {
if (Objects.nonNull(tempPoints) && Objects.nonNull(tempPoints.getPoints())) {
Timestamp expireTime = tempPoints.getExpireTime();
if (Objects.isNull(expireTime)){
tempPoints.setExpireTime(TimestampUtil.localDateTime2Timestamp(DateUtil.getLastDateTimeSecondYear()));
}
this.refresh(tempPoints);
}
this.refresh(Arrays.asList(tempPoints));
}
/**
......@@ -118,7 +99,9 @@ public class PointsOperationServiceImpl implements PointsOperationService {
Long memberId = tempPoints.getMemberId();
try {
this.redisUtils.doLock("member::id::" + memberId.toString());
this.redisUtils.doLock(RedisKeyConstants.cacheMemberById + memberId.toString());
MemberDTO memberDTO = this.memberService.findById(memberId);
//1.删除过期的积分
this.cleanInvalidAvailablePointsByMemberId(memberId);
log.info("删除过期的积分 ==>> cleanInvalidAvailablePointsByMemberId ==>> ");
......@@ -128,7 +111,7 @@ public class PointsOperationServiceImpl implements PointsOperationService {
long currentPoints = this.findAvailablePointsByMemberId(memberId);
if (b) {
// 2.可用积分表,按照过期时间进行升序排列
List<PointsAvailableDTO> pointsAvailableDTOS = this.findByMemberIdOrderByExpireTime(tempPoints);
List<PointsAvailableDTO> pointsAvailableDTOS = this.pointsAvailableService.findByMemberIdOrderByExpireTime(tempPoints.getMemberId());
// 2.优先使用即将过期的积分,累加到超过需兑换积分时,需要进行拆分
Map<String, List<PointsAvailableDTO>> customAvailablePointsMap =
this.customAvailablePoints(tempPoints, pointsAvailableDTOS);
......@@ -138,11 +121,10 @@ public class PointsOperationServiceImpl implements PointsOperationService {
// 4.更新可用积分表,超过的删除,剩余的新增
long totalPoints = this.doFreshTrPointsAvailableByAvailablePointsMap(customAvailablePointsMap, currentPoints);
// 5.即将过期的积分
long soonExpirePoints = this.getSoonExpirePoints(memberId, tempPoints);
// long soonExpirePoints = this.getSoonExpirePoints(memberId, tempPoints);
// 6.更新会员积分信息
this.freshMemberCurrentPoints(memberId, totalPoints, soonExpirePoints);
this.freshMemberCurrentPoints(memberId, memberDTO.getCode(), totalPoints);
customPointsResult.setResult(true);
customPointsResult.setPoint(totalPoints);
......@@ -153,11 +135,10 @@ public class PointsOperationServiceImpl implements PointsOperationService {
customPointsResult.setPoint(currentPoints);
}
}catch (Exception e) {
e.printStackTrace();
throw e;
} catch (Exception e) {
log.error("消耗积分失败,"+e.getMessage());
} finally {
this.redisUtils.doUnLock("member::id::" + memberId.toString());
this.redisUtils.doUnLock(RedisKeyConstants.cacheMemberById + memberId.toString());
}
return customPointsResult;
......@@ -211,6 +192,7 @@ public class PointsOperationServiceImpl implements PointsOperationService {
long currentPoints) {
// 兑换的积分
Long points = tempPoints.getPoints();
String memberCode = tempPoints.getMemberCode();
List<PointsAvailableDTO> pointsAvailableDTOS = customAvailablePointsMap.get(DELETE_AVAILABLE_POINTS);
......@@ -222,9 +204,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);
}
}
......@@ -288,14 +270,6 @@ public class PointsOperationServiceImpl implements PointsOperationService {
return map;
}
/**
* 可用积分表,按照过期时间进行升序排列
* @param tempPoints
* @return
*/
private List<PointsAvailableDTO> findByMemberIdOrderByExpireTime(TempPoints tempPoints) {
return this.pointsAvailableService.findByMemberIdOrderByExpireTime(tempPoints.getMemberId());
}
/**
* 检查当前用户可用积分是否足够
......@@ -321,9 +295,7 @@ public class PointsOperationServiceImpl implements PointsOperationService {
@Override
@Transactional(rollbackFor = Exception.class)
public void grantPointsThroughTempPoint(List<TempPoints> tempPointsList){
for (TempPoints tempPoints : tempPointsList){
this.refresh(tempPoints);
}
this.refresh(tempPointsList);
}
/**
......@@ -385,7 +357,6 @@ public class PointsOperationServiceImpl implements PointsOperationService {
member.setPoints(currentPoints);
member.setDuePoints(soonExpirePoints);
// this.memberOperationService.update(member);
this.memberOperationService.doUpdateMemberPoints(member);
}
......@@ -429,7 +400,7 @@ public class PointsOperationServiceImpl implements PointsOperationService {
pointsDetail.setCreateTime(TimestampUtil.now());
pointsDetail.setUpdateTime(TimestampUtil.now());
pointsDetail.setMemberCode(memberDTO.getCode());
this.pointsDetailService.create4Custom(pointsDetail);
this.pointsDetailService.insertPointsDetail(pointsDetail);
log.info("asyncPointsDetail ==>> pointsDetail ==>> {}",pointsDetail);
((PointsOperationServiceImpl) AopContext.currentProxy()).asyncPointsDetail(pointsDetail);
......@@ -438,60 +409,44 @@ public class PointsOperationServiceImpl implements PointsOperationService {
/**
* 模板方法,提供更新积分的总体流程
*
* @param tempPoints 积分
* @param tempPointsList 积分
*/
private void refresh(TempPoints tempPoints) {
private void refresh(List<TempPoints> tempPointsList) {
TempPoints tempPoints = tempPointsList.get(0);
Long memberId = tempPoints.getMemberId();
log.info("----------->> 会员id ===>>>>" + memberId);
String memberCode = tempPoints.getMemberCode();
try {
this.redisUtils.doLock(RedisKeyConstants.updateCachePointsByMemberId + memberId.toString());
// 1.可用总积分
Long currentPoints = this.findAvailablePointsByMemberId(memberId);
log.info("----------->> 获取会员当前可用总积分 --->>>> {}", currentPoints);
// 2.计算总积分
Long totalPoints = this.calculateTotalPoints(tempPoints, currentPoints);
log.info("----------->> 总积分(可用总积分+获得的积分) --->>> {}", totalPoints);
Long totalPoints = currentPoints;
for (TempPoints tempPoint : tempPointsList) {
// 3.添加积分明细
this.doInsertTrPointsDetail(memberId, tempPoints, currentPoints, totalPoints);
log.info("----------->> 添加积分明细 --->>> ");
totalPoints = this.doInsertTrPointsDetail(memberId, memberCode, tempPoint, totalPoints, (totalPoints + tempPoint.getPoints()));
log.info("----------->> 总积分(可用总积分+获得的积分) --->>> {}", totalPoints);
// 4.添加可用积分
this.doInsertTrPointsAvailable(tempPoints);
log.info("----------->> 添加可用积分 -->>> ");
this.doInsertTrPointsAvailable(tempPoint);
log.info("----------->> 添加可用积分结束");
// 5.即将过期的积分
long soonExpirePoints = this.getSoonExpirePoints(memberId, tempPoints);
log.info("----------->> 即将过期的积分 ------->>>>> {}", soonExpirePoints);
}
this.redisUtils.doLock("right::member::id::" + memberId.toString());
// 5.即将过期的积分
// TODO 查询的时候再更新过期积分
// long soonExpirePoints = this.getSoonExpirePoints(memberId, tempPoints);
// log.info("----------->> 即将过期的积分 ------->>>>> {}", soonExpirePoints);
// 6.更新会员的总积分
this.freshMemberCurrentPoints(memberId, memberCode, totalPoints);
log.info("----------->> 更新会员的总积分 ------->>>>> 总积分--->>> {}", totalPoints);
this.freshMemberCurrentPoints(memberId, totalPoints, soonExpirePoints);
} catch (Exception e) {
e.printStackTrace();
throw e;
log.error(" ==>> {}", e.getMessage());
} finally {
this.redisUtils.doUnLock("right::member::id::" + memberId.toString());
}
this.redisUtils.doUnLock(RedisKeyConstants.updateCachePointsByMemberId + memberId.toString());
}
/**
* 获取总积分
* @param tempPoints
* @param currentPoints
* @return
*/
private Long calculateTotalPoints(TempPoints tempPoints, Long currentPoints) {
// 获取的积分
Long rewardPoints = tempPoints.getPoints();
// 总积分
Long totalPoints = currentPoints + rewardPoints;
return totalPoints;
}
/**
......@@ -523,33 +478,23 @@ public class PointsOperationServiceImpl implements PointsOperationService {
/**
* 更新会员总积分
* @param memberId 会员Id
* @param currentPoints 当前总积分
* @param memberCode 当前总积分
*/
private void freshMemberCurrentPoints(Long memberId, Long currentPoints, long duePoints) {
MemberDTO memberDTO = this.findMemberByMemberId(memberId);
private void freshMemberCurrentPoints(Long memberId, String memberCode, Long currentPoints) {
Member member = new Member();
// BeanUtils.copyProperties(memberDTO, member);
member.setId(memberDTO.getId());
member.setCode(memberDTO.getCode());
member.setId(memberId);
member.setCode(memberCode);
member.setPoints(Objects.nonNull(currentPoints) ? currentPoints:0);
member.setDuePoints(duePoints);
member.setUpdateTime(TimestampUtil.now());
try {
this.memberOperationService.doUpdateMemberPoints(member);
((PointsOperationServiceImpl) AopContext.currentProxy()).asyncMemberPoint(member);
} catch (Exception e){
throw e;
log.error("同步会员积分异常,"+e.getMessage());
}
}
private MemberDTO findMemberByMemberId(Long memberId) {
MemberDTO memberDTO = this.memberService.findById(memberId);
return memberDTO;
}
/**
* 更新可用积分表
* @param tempPoints
......@@ -560,7 +505,7 @@ public class PointsOperationServiceImpl implements PointsOperationService {
BeanUtils.copyProperties(tempPoints,pointsAvailable);
String description = pointsAvailable.getDescription();
pointsAvailable.setCode(String.valueOf(IdWorker.generator()));
pointsAvailable.setCode("pointsA_"+UUID.randomUUID().toString());
pointsAvailable.setDescription(StringUtils.isEmpty(description)?"#":description);
Timestamp timestamp = tempPoints.getExpireTime();
if (Objects.nonNull(timestamp)) {
......@@ -570,6 +515,7 @@ public class PointsOperationServiceImpl implements PointsOperationService {
this.pointsAvailableService.create4Custom(pointsAvailable);
((PointsOperationServiceImpl) AopContext.currentProxy()).asyncPointsAvailable(pointsAvailable);
}
/**
......@@ -578,30 +524,36 @@ 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 Long 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.setCode(String.valueOf(IdWorker.generator()));
pointsDetail.setMemberCode(memberCode);
pointsDetail.setCode("pointsD_"+UUID.randomUUID().toString());
pointsDetail.setPoints(tempPoints.getPoints());
pointsDetail.setOriginalPoints(currentPoints);
pointsDetail.setResultPoints(totalPoints);
pointsDetail.setCreateTime(null);
pointsDetail.setUpdateTime(null);
String description = pointsDetail.getDescription();
pointsDetail.setEvtType(tempPoints.getEvtType());
pointsDetail.setDeviceType(tempPoints.getDeviceType());
pointsDetail.setOrderId(tempPoints.getOrderId());
pointsDetail.setMediaId(tempPoints.getMediaId());
pointsDetail.setAccountId(tempPoints.getAccountId());
pointsDetail.setActivityId(tempPoints.getActivityId());
pointsDetail.setAppCode(tempPoints.getAppCode());
String description = tempPoints.getDescription();
if (StringUtils.isEmpty(description)) {
pointsDetail.setDescription("#");
}else {
pointsDetail.setDescription(description);
}
// 保存积分流水
this.pointsDetailService.create4Custom(pointsDetail);
this.pointsDetailService.insertPointsDetail(pointsDetail);
((PointsOperationServiceImpl) AopContext.currentProxy()).asyncPointsDetail(pointsDetail);
return totalPoints;
}
}
......
......@@ -6,7 +6,8 @@ import com.topdraw.business.module.rights.history.domain.RightsHistory;
import com.topdraw.business.module.rights.history.service.RightsHistoryService;
import com.topdraw.business.module.rights.service.RightsService;
import com.topdraw.business.module.rights.service.dto.RightsDTO;
import com.topdraw.business.process.domian.constant.RightType;
import com.topdraw.business.module.rights.constant.RightType;
import com.topdraw.business.module.rights.constant.RightTypeConstants;
import com.topdraw.business.process.service.CouponOperationService;
import com.topdraw.business.process.service.ExpOperationService;
import com.topdraw.business.process.service.PointsOperationService;
......@@ -14,8 +15,6 @@ import com.topdraw.business.process.service.RightsOperationService;
import com.topdraw.business.process.domian.*;
import com.topdraw.util.TimestampUtil;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
......@@ -24,7 +23,6 @@ import org.springframework.util.StringUtils;
import java.sql.Timestamp;
import java.util.*;
import java.util.concurrent.ThreadPoolExecutor;
/**
* 权益处理
......@@ -73,30 +71,9 @@ 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);
// 3.保存权益历史
this.doInsertTrRightHistory(rightsList);
}
});
// 1.权益下发
this.refresh(tempRightsMap);
}
/**
*
* @param tempRightsMap
* @return
*/
private List<RightsHistory> getRightHistory(Map<RightType, Object> tempRightsMap) {
List<TempRights> values = (List<TempRights>)tempRightsMap.get(RightType.RIGHTS);
List<RightsHistory> rightsHistoryList = new ArrayList<>();
if (!CollectionUtils.isEmpty(values)) {
values.forEach(value -> {
RightsHistory rightsHistory = new RightsHistory();
......@@ -106,11 +83,18 @@ public class RightsOperationServiceImpl implements RightsOperationService {
rightsHistory.setExpireTime(value.getExpireTime());
String memberCode = value.getMemberCode();
rightsHistory.setMemberCode(memberCode);
rightsHistoryList.add(rightsHistory);
Long operatorId = rightsHistory.getOperatorId();
String operatorName = rightsHistory.getOperatorName();
rightsHistory.setSendTime(TimestampUtil.now());
rightsHistory.setOperatorId(Objects.nonNull(operatorId)?operatorId:0);
rightsHistory.setOperatorName(!StringUtils.isEmpty(operatorName)?operatorName:"系统发放");
this.rightsHistoryService.create(rightsHistory);
});
}
return rightsHistoryList;
// 1.权益下发
return this.refresh(tempRightsMap);
}
/**
......@@ -143,103 +127,34 @@ public class RightsOperationServiceImpl implements RightsOperationService {
this.couponOperationService.grantCouponThroughTempCoupon(tempCouponList);
}
/**
* 权益发放
* @param tempRightsMap
*/
private void refresh(Map<RightType, Object> tempRightsMap) {
/*FutureTask<Map<Long,Long>> futureTask1 = new FutureTask(()->{
log.info(Thread.currentThread().getName() + "=========>> start");
// 积分
this.grantPoint((List<TempPoints>) tempRightsMap.get(RightType.POINTS));
log.info(Thread.currentThread().getName() + "=========>>grantPoint end");
// 成长值
// this.grantExp((List<TempExp>) tempRightsMap.get(RightType.EXP));
// 优惠券
// this.grantCoupon((List<TempCoupon>) tempRightsMap.get(RightType.COUPON));
return null;
});
FutureTask<Map<Long,Long>> futureTask2 = new FutureTask(()->{
// 积分
// this.grantPoint((List<TempPoints>) tempRightsMap.get(RightType.POINTS));
// 成长值
this.grantExp((List<TempExp>) tempRightsMap.get(RightType.EXP));
// 优惠券
// this.grantCoupon((List<TempCoupon>) tempRightsMap.get(RightType.COUPON));
return null;
});
FutureTask<Map<Long,Long>> futureTask3 = new FutureTask(()->{
// 积分
// this.grantPoint((List<TempPoints>) tempRightsMap.get(RightType.POINTS));
// 成长值
// this.grantExp((List<TempExp>) tempRightsMap.get(RightType.EXP));
// 优惠券
this.grantCoupon((List<TempCoupon>) tempRightsMap.get(RightType.COUPON));
return null;
});
this.threadPoolTaskExecutor.execute(futureTask1);
this.threadPoolTaskExecutor.execute(futureTask2);
this.threadPoolTaskExecutor.execute(futureTask3);*/
/*this.threadPoolTaskExecutor.execute(() -> {
// 积分
this.grantPoint((List<TempPoints>) tempRightsMap.get(RightType.POINTS));
// 成长值
this.grantExp((List<TempExp>) tempRightsMap.get(RightType.EXP));
// 优惠券
this.grantCoupon((List<TempCoupon>) tempRightsMap.get(RightType.COUPON));
});*/
private Integer refresh(Map<RightType, Object> tempRightsMap) {
/*this.threadPoolTaskExecutor.execute(() -> {
log.info(Thread.currentThread().getName() + "=========>> start");
// 积分
this.grantPoint((List<TempPoints>) tempRightsMap.get(RightType.POINTS));
log.info(Thread.currentThread().getName() + "=========>> end");
});*/
this.threadPoolTaskExecutor.execute(() -> {
List<TempPoints> tempPointsList = (List<TempPoints>) tempRightsMap.get(RightType.POINTS);
if (!CollectionUtils.isEmpty(tempPointsList)) {
log.info("发放积分开始 ==>> [{}]", tempPointsList);
long l = System.currentTimeMillis();
// 积分
log.info("发放积分开始 ==>> {}", tempPointsList);
this.grantPoint(tempPointsList);
long l2 = System.currentTimeMillis();
log.info("发放积分结束,总耗时 ==>> {}", (l2 - l));
log.info("发放积分结束 ==>> {}", tempPointsList);
}
});
this.threadPoolTaskExecutor.execute(()-> {
List<TempExp> tempExpList = (List<TempExp>) tempRightsMap.get(RightType.EXP);
if (!CollectionUtils.isEmpty(tempExpList)) {
log.info("发放成长值开始 ==>> [{}]", tempExpList);
long l = System.currentTimeMillis();
// 成长值
log.info("发放成长值开始 ==>> {}", tempExpList);
this.grantExp(tempExpList);
long l2 = System.currentTimeMillis();
log.info("发放成长值结束,总耗时 ==>> {}", (l2 - l));
}
});
this.threadPoolTaskExecutor.execute(()-> {
List<TempCoupon> tempCouponList = (List<TempCoupon>) tempRightsMap.get(RightType.COUPON);
if (!CollectionUtils.isEmpty(tempCouponList)) {
log.info("发放优惠券开始 ==>> [{}]", tempCouponList);
long l = System.currentTimeMillis();
// 优惠券
this.grantCoupon(tempCouponList);
long l2 = System.currentTimeMillis();
log.info("发放优惠券结束,总耗时 ==>> {}", (l2 - l));
log.info("发放成长值结束 ==>> ");
}
});
// 其他权益
this.threadPoolTaskExecutor.execute(()-> {
log.info("发放其他权益开始 ==>> [{}]", tempRightsMap);
this.grantOtherRight(tempRightsMap);
log.info("发放其他权益结束 ==>> [{}]", tempRightsMap);
});
log.info("发放其他权益结束 ==>>" );
return tempRightsMap.keySet().size();
}
private void grantOtherRight(Map<RightType, Object> tempRightsMap) {
......@@ -252,7 +167,7 @@ public class RightsOperationServiceImpl implements RightsOperationService {
// 活动机会
case ACTIVITYCHANCE:
// TODO MOSS 增加活动机会接口
break;
// 积分商品
......@@ -296,9 +211,9 @@ public class RightsOperationServiceImpl implements RightsOperationService {
Long memberId = right.getMemberId();
Long userId = right.getUserId();
// 权益类型
RightsDTO rightsDTO = this.getRights(rightId);
RightsDTO rightsDTO = this.rightsService.findById(rightId);
// 权益的实体类型 1:积分;2成长值;3优惠券
String type = rightsDTO.getEntityType();
Integer type = rightsDTO.getEntityType();
Long expireTime1 = rightsDTO.getExpireTime();
Timestamp expireTime = null;
if (Objects.nonNull(expireTime1)){
......@@ -307,9 +222,10 @@ public class RightsOperationServiceImpl implements RightsOperationService {
switch (type) {
// 优惠券
case "1":
case RightTypeConstants
.DISCOUNT_COUPON:
Long entityId = rightsDTO.getEntityId();
CouponDTO couponDTO = this.findCouponById(entityId);
CouponDTO couponDTO = this.couponService.findById(entityId);
if (Objects.nonNull(couponDTO)) {
TempCoupon tempCoupon = new TempCoupon();
tempCoupon.setId(couponDTO.getId());
......@@ -319,16 +235,15 @@ public class RightsOperationServiceImpl implements RightsOperationService {
tempCoupon.setRightsSendStrategy(0);
tempCoupon.setCode(couponDTO.getCode());
if (Objects.nonNull(expireTime))
// tempCoupon.setExpireTime(TimestampUtil.long2LocalDateTime(expireTime));
tempCoupon.setExpireTime(expireTime);
tempCouponList.add(tempCoupon);
}
break;
// 观影券
case "2":
case RightTypeConstants.VIEW_COUPON:
break;
// 活动参与机会
case "3":
case RightTypeConstants.JOIN_ACTIVITY:
break;
default:
......@@ -343,27 +258,6 @@ public class RightsOperationServiceImpl implements RightsOperationService {
}
/**
* 获取优惠券信息
* @param id
* @return
*/
private CouponDTO findCouponById(Long id) {
CouponDTO couponDTO = this.couponService.findById(id);
return couponDTO;
}
/**
* 权益详情
* @param rightsId
* @return
*/
private RightsDTO getRights(Long rightsId) {
RightsDTO rightsDTO = this.rightsService.findById(rightsId);
return rightsDTO;
}
/**
* 添加权益领取记录
* @param rightsHistories
*/
......
......@@ -6,8 +6,7 @@ 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,14 +15,13 @@ 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.process.domian.constant.RightType;
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;
import com.topdraw.business.process.service.TaskOperationService;
......@@ -31,19 +29,25 @@ 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;
import com.topdraw.common.ResultInfo;
import com.topdraw.exception.BadRequestException;
import com.topdraw.business.LocalConstants;
import com.topdraw.business.module.rights.constant.RightTypeConstants;
import com.topdraw.business.module.task.template.constant.TaskEventType;
import com.topdraw.business.RedisKeyConstants;
import com.topdraw.mq.module.mq.DataSyncMsg;
import com.topdraw.util.*;
import com.topdraw.utils.RedisUtils;
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.beans.factory.annotation.Value;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;
......@@ -55,7 +59,6 @@ import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.TimeUnit;
import static java.util.stream.Collectors.toList;
/**
* 任务处理
......@@ -81,67 +84,41 @@ 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 RedisUtils redisUtils;
@Value("${uc.validPriorityMember:1}")
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
public void createTask(Task task) {
// @CacheEvict(cacheNames = RedisKeyConstants.cacheTaskByEvent, key = "#task.event")
public TaskDTO createTask(Task task) {
Long taskTemplateId = task.getTaskTemplateId();
TaskTemplateDTO taskTemplateDTO = this.findByTemplateId(taskTemplateId);
TaskTemplateDTO taskTemplateDTO = this.taskTemplateService.findById(taskTemplateId);
task.setTaskTemplateCode(taskTemplateDTO.getCode());
Task task_ = TaskBuilder.build(task);
TaskDTO taskDTO = this.taskService.create(task_);
if (Objects.nonNull(taskDTO.getId())) {
task_.setId(taskDTO.getId());
this.createTaskAttr(task_);
}
((TaskOperationServiceImpl) AopContext.currentProxy()).asyncCreateTask(task_);
}
/**
*
* @param taskTemplateId
* @return
*/
private TaskTemplateDTO findByTemplateId(Long taskTemplateId){
return this.taskTemplateService.findById(taskTemplateId);
}
/**
*
* @param task_
*/
private void createTaskAttr(Task task_) {
TaskAttr taskAttr = new TaskAttr();
taskAttr.setAttrStr(task_.getAttr());
taskAttr.setTaskId(task_.getId());
this.taskAttrService.create(taskAttr);
return taskDTO;
}
@Override
public void updateTask(Task task) {
// @CacheEvict(cacheNames = RedisKeyConstants.cacheTaskByEventAndMemberLevelAndVip, key = "#task.event")
public TaskDTO updateTask(Task task) {
Long taskTemplateId = task.getTaskTemplateId();
TaskTemplateDTO taskTemplateDTO = this.findByTemplateId(taskTemplateId);
TaskTemplateDTO taskTemplateDTO = this.taskTemplateService.findById(taskTemplateId);
task.setTaskTemplateCode(taskTemplateDTO.getCode());
TaskDTO update = this.taskService.update(task);
if (Objects.nonNull(update.getId())) {
......@@ -149,44 +126,52 @@ public class TaskOperationServiceImpl implements TaskOperationService {
}
((TaskOperationServiceImpl) AopContext.currentProxy()).asyncUpdateTask(task);
return update;
}
/**
*
* @param task_
* @param task 任务
*/
private void updateTaskAttr(Task task_) {
TaskAttrDTO taskAttrDTO = this.findTaskAttrByTaskId(task_.getId());
private void updateTaskAttr(Task task) {
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);
}
}
@Override
public void deleteTask(Task task) {
// @CacheEvict(cacheNames = RedisKeyConstants.cacheTaskByEvent, key = "#task.event")
public Integer deleteTask(Task task) {
Long id = task.getId();
TaskDTO taskDTO = this.findById(id);
if (Objects.nonNull(taskDTO.getId())) {
task.setId(taskDTO.getId());
this.taskService.delete(task);
Integer delete = this.taskService.delete(task);
task.setCode(taskDTO.getCode());
((TaskOperationServiceImpl) AopContext.currentProxy()).asyncDeleteTask(task);
return delete;
}
return 0;
}
@Override
public void deleteTask(Long id) {
public Integer deleteTask(Long id) {
TaskDTO taskDTO = this.findById(id);
if (Objects.nonNull(taskDTO.getId())) {
Task task = new Task();
task.setId(taskDTO.getId());
task.setCode(taskDTO.getCode());
this.deleteTask(task);
return this.deleteTask(task);
}
return 0;
}
@Override
......@@ -203,148 +188,490 @@ 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
public ResultInfo dealTask(String content) {
DataSyncMsg dataSyncMsg = JSONUtil.parseMsg2Object(content, DataSyncMsg.class);
Integer event = dataSyncMsg.getEvent();
String msgData1 = dataSyncMsg.getMsgData();
DataSyncMsg.MsgData msgData = JSON.parseObject(msgData1, DataSyncMsg.MsgData.class);
String memberCode = msgData.getMemberCode();
Long memberId = msgData.getMemberId();
if (StringUtils.isBlank(dataSyncMsg.getMsgData())) {
log.error("参数错误,事件消息体为空");
return ResultInfo.failure("参数错误,事件消息体为空");
}
long l = System.currentTimeMillis();
if (StringUtils.isNotBlank(memberCode)) {
JSONObject msgData = JSON.parseObject(dataSyncMsg.getMsgData(), JSONObject.class);
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都为空");
}
MemberDTO memberDTO = this.memberService.findByCode(memberCode);
log.info("获取会员信息 ==>> {}", memberDTO);
// 大屏侧传递的参数是platformAccount
MemberSimpleDTO memberDTO = null;
if (Objects.nonNull(platformAccountObj)) {
// 检查当前会员的黑名单状态
boolean b = this.validatedMemberBlackStatus(memberDTO);
log.info("会员信息 ==>> {} || 会员id ==>> {} || 黑名单状态 ==>> {}", memberDTO, memberDTO.getId(), memberDTO.getBlackStatus());
if (!b) {
return ResultInfo.forbidden("会员已被加入黑名单");
String platformAccount = platformAccountObj.toString();
UserTvSimpleDTO userTvDTO = this.userTvService.findSimpleByPlatformAccount(platformAccount);
log.info("查询大屏信息, dealTask# ==>> {}", userTvDTO);
if (Objects.nonNull(userTvDTO)) {
// 开启积分自动同步至小屏主会员
if (validPriorityMember == 1) {
String priorityMemberCode = userTvDTO.getPriorityMemberCode();
if (StringUtils.isNotBlank(priorityMemberCode)) {
memberDTO = this.memberService.findSimpleByCode(priorityMemberCode);
log.info("查询绑定的小屏的主会员信息, dealTask# member ==>> {}", memberDTO);
} else if (Objects.nonNull(userTvDTO.getMemberId())) {
memberDTO = this.memberService.findSimpleById(userTvDTO.getMemberId());
log.info("查询大屏自身的会员信息, dealTask# memberId ==>> {}", userTvDTO.getMemberId());
}
memberId = memberDTO.getId();
} else {
memberDTO = this.memberService.findSimpleById(userTvDTO.getMemberId());
log.info("查询大屏会员信息, dealTask# memberDTO ==>> {}", memberDTO);
}
// 1.通过任务标识获取任务模板,通过模板参数获取具体的模板
TaskTemplate taskTemplate = this.getTaskTemplate(event, dataSyncMsg);
log.info("获取任务模板 taskTemplate ==>> {} ", taskTemplate);
} else {
log.error("大屏账号不存在,请检查数据, dealTask# platformAccount ==>> {}", platformAccount);
return ResultInfo.failure("大屏账号不存在,请检查数据");
}
// 2.通过任务模板获取对应的任务列表
List<Task> taskList = this.loadListTaskByTaskTemplate(taskTemplate, dataSyncMsg);
log.info("获取任务 taskList ==>> [{}] ", taskList);
} else {
// 小屏侧传递的参数是memberId
memberDTO = this.memberService.findSimpleById(Long.valueOf(memberIdObj.toString()));
}
// 4.判断当前用户是否满足任务完成条件
boolean checkResult = this.checkTaskCompletion(memberId, taskList, event, msgData);
log.info("检查当前会员的任务完成情况 ==>> {} , true:未完成", checkResult);
if (checkResult) {
// 5.权益区分(积分、权益、成长值)
Map<RightType,Object> tempRightsMap = this.distinguishRight(memberId, taskList, msgData, dataSyncMsg);
log.info("获取当前任务对应的权益 tempRightsMap ==>> {} ", tempRightsMap);
log.info("获取会员信息, dealTask# memberDTO ==>> {}", memberDTO);
// 6.风控检查
boolean result = this.checkRiskManagement(memberId, tempRightsMap);
log.info("针对各项权益检查当前会员是否达到风控值 ==>> {},true:已达到风控指标 ", result);
if (Objects.isNull(memberDTO.getId())) {
log.error("会员信息不存在 ==>> dealTask# memberDTO ==>> {}", memberDTO);
return ResultInfo.failure("会员信息不存在");
}
if (result) throw new BadRequestException("发放失败,已达风控上限");
// 检查黑名单状态 0:正常 1:黑名单
Long blackStatus = memberDTO.getBlackStatus();
if (Objects.nonNull(blackStatus) && blackStatus.equals(LocalConstants.BLACK_STATUS)) {
log.error("会员已被加入黑名单, dealTask# ==>> {}", memberDTO);
return ResultInfo.forbidden("会员已被加入黑名单");
}
long l1 = System.currentTimeMillis();
log.info("各项检查总耗时 ==>> {}", (l1-l));
// 检索满足条件的任务 1.先检查redis中是否存在符合条件的任务 2.从redis中获取当前会员未完成的任务
List<Task> tasks = this.findValidTasksAndRefreshTaskProcess(memberDTO, dataSyncMsg.getEvent(), msgData);
log.info("当前用户可执行的任务详情, dealTask# tasks ==>> [{}]", tasks);
if (CollectionUtils.isEmpty(tasks)) {
// 类型 1:登录;2:观影;3:参加活动;4:订购;5:优享会员;6:签到;7:完成设置;8:播放记录;
// 10:跨屏绑定;11:积分转移;30:积分兑换商品;98:系统操作;99:其他
log.warn("无可执行的任务");
return ResultInfo.failure("无可执行的任务");
}
// 5.权益区分(积分、权益、成长值)
Map<RightType,Object> tempRightsMap = this.distinguishRight(memberDTO, tasks, msgData, dataSyncMsg);
// 7.权益发放
log.info("下发开始 ==>> {}", tempRightsMap);
long l2 = System.currentTimeMillis();
this.grantRight(tempRightsMap);
long l3 = System.currentTimeMillis();
log.info("下发结束,总耗时 ==>> {}", (l3-l2));
Integer integer = this.grantRight(tempRightsMap);
if (integer > 0) {
return ResultInfo.success(integer);
}
return ResultInfo.success();
return ResultInfo.failure("任务处理失败");
}
/**
*
* @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);
trTaskProgress.setCurrentActionAmount(currentActionAmount);
trTaskProgress.setCompletionTime(TimestampUtil.now());
trTaskProgress.setStatus(status);
trTaskProgress.setTaskId(task.getId());
trTaskProgress.setMemberId(memberId);
trTaskProgress.setTargetActionAmount(task.getActionAmount());
trTaskProgress.setUpdateTime(TimestampUtil.now());
log.info("更新任务完成情况 ==>> {}", trTaskProgress);
TrTaskProgress _trTaskProgress = this.trTaskProgressService.create(trTaskProgress, LocalDateTimeUtil.todayStart());
if (status.equals(TASK_FINISH_STATUS) && Objects.nonNull(_trTaskProgress)) {
boolean todayFinishCount = this.redisUtils.hHasKey(RedisKeyConstants.cacheTodayFinishTaskCount + "::" + memberId + ":" + LocalDate.now(), task.getId().toString());
if (!todayFinishCount) {
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);
}
}
/**
* 风控检查
* @param memberId
* @param tempRightsMap
* 获取满足条件的任务列表
* @param memberDTO 会员
* @param msgData 事件消息体
* @param event 任务模板类型
* @return
*/
private boolean checkRiskManagement(Long memberId , Map<RightType, Object> tempRightsMap) {
// TODO 风控
private List<Task> findValidTasksAndRefreshTaskProcess(MemberSimpleDTO memberDTO, Integer event, JSONObject msgData) {
// 任务是否存在
List<Task> tasks = this.taskService.findByEventAndMemberLevelAndVip(event, memberDTO.getLevel(), memberDTO.getVip());
log.info("查询任务列表, dealTask# tasks ==>> [{}]",tasks);
if (Objects.isNull(tasks) || CollectionUtils.isEmpty(tasks)) {
return Collections.singletonList(null);
}
// 获取当前会员所有任务的完成进度
Map<Object, Object> todayFinishTask =
this.trTaskProgressService.countTodayFinishTaskByMemberId(memberDTO.getId(), LocalDateTimeUtil.todayStart());
log.info("查询今天所有任务的完成进度, dealTask# todayFinishTask ==>> {}", todayFinishTask);
Map<Object, Object> finishTaskCount = this.trTaskProgressService.countTotalFinishTaskByMemberId(memberDTO.getId());
log.info("查询所有任务的完成次数, dealTask# finishTaskCount ==>> {}", finishTaskCount);
List<Task> tasksResult = new ArrayList<>();
// 检查当前会员针对这些任务的完成情况
for (Task task : tasks) {
boolean result = false;
// 校验用户分组
if (StringUtils.isNotBlank(task.getGroups()) && !task.getGroups().contains("0")) {
String groups = memberDTO.getGroups();
log.info("会员分组信息, dealTask# groups ==>> {}", groups);
if (StringUtils.isNotBlank(groups)) {
String[] split = groups.split(",");
if (split.length > 0) {
for (String s : split) {
if (task.getGroups().contains(s)){
result = true;
break;
}
}
}
}
if (!result) {
log.warn("此用户分组不满足任务要求,任务分组 ==>> {} || 会员分组 ==>> {}", task.getGroups(), memberDTO.getGroups());
continue;
}
}
// 任务每日重置 0:不重置;1:重置
Integer taskDailyReset = task.getTaskDailyReset();
// 任务重复类型,-1:不限次;1:单次;>1:多次
Integer taskRepeatType = task.getTaskRepeatType();
if (taskDailyReset.equals(0)) {
// 不重置,检查是否做过此任务
Object finishCount = finishTaskCount.get(task.getId().toString());
if (!taskRepeatType.equals(-1) && Objects.nonNull(finishCount)) {
if (Long.parseLong(finishCount.toString()) >= taskRepeatType) {
continue;
}
}
} else {
Object todayFinishCount = todayFinishTask.get(task.getId().toString());
if (taskRepeatType >= 1 && Objects.nonNull(todayFinishCount)) {
if (Long.parseLong(todayFinishCount.toString()) >= taskRepeatType) {
continue;
}
}
}
switch (event) {
// 开机、登录
case TaskEventType.LOGIN:
if (this.doLoginEvent(msgData, task, memberDTO)) {
tasksResult.add(task);
}
break;
// 观影
case TaskEventType.VIEW:
if (this.doViewEvent(msgData, task, memberDTO)) {
tasksResult.add(task);
}
break;
// 参加活动
case TaskEventType.ACTIVITY:
if (this.doActivityEvent(msgData, task, memberDTO)) {
tasksResult.add(task);
}
break;
// 订购
case TaskEventType.ORDER:
if (this.doOrderEvent(msgData, task, memberDTO)) {
tasksResult.add(task);
}
break;
// 优享会员
case TaskEventType.MEMBER_PRIORITY:
break;
// 签到
case TaskEventType.SIGN:
if (this.doSignEvent(msgData, task, memberDTO)) {
tasksResult.add(task);
}
break;
// 完善个人资料
case TaskEventType.COMPLETE_INFO:
if (this.doCompleteMemberInfoEvent(msgData, task, memberDTO)) {
tasksResult.add(task);
}
break;
// 播放时长
case TaskEventType.PLAY:
// 用户播放总时长
if (this.doPlayEvent(msgData, task, memberDTO)) {
tasksResult.add(task);
}
break;
// 跨屏绑定
case TaskEventType.BINDING:
// 跨屏绑定次数
if (this.doBindingEvent(msgData, task, memberDTO)) {
tasksResult.add(task);
}
break;
// 积分转移
case TaskEventType.POINTS_TRANS:
if (this.doPointsTransEvent(msgData, task, memberDTO)) {
tasksResult.add(task);
}
break;
// 积分兑换商品
case TaskEventType.POINTS_EXCHANGE_GOODS:
// 完成设置次数
if (this.doPointsExchangeGoodsEvent(msgData, task, memberDTO)) {
tasksResult.add(task);
}
break;
// 其他
case TaskEventType.SYSTEM_OPERATE:
break;
default:
log.info("没有找到对应的任务");
break;
}
}
return tasksResult;
}
private boolean doOrderEvent(JSONObject msgData, Task task, MemberSimpleDTO memberDTO) {
Integer actionAmount = task.getActionAmount();
// 用户行为次数
// TODO 后续需要按照业务对用户行为数据进行修改
int completeCount = 1;
if (completeCount >= actionAmount) {
this.saveOrUpdateTaskProcess(null, memberDTO.getId(), task, completeCount, TASK_FINISH_STATUS);
return true;
}
return false;
}
/**
* 验证会员信息
* @param memberDTO
* @return
*/
private boolean validatedMemberBlackStatus(MemberDTO memberDTO) {
Long blackStatus = memberDTO.getBlackStatus();
if (Objects.nonNull(blackStatus) && blackStatus == 1) {
log.error("validatedMember -->> 会员已被加入黑名单 【blackStatus】 -->> " + blackStatus);
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;
}
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 doActivityEvent(JSONObject msgData, Task task, MemberSimpleDTO memberDTO) {
Integer actionAmount = task.getActionAmount();
String attrStr = task.getAttr();
if (StringUtils.isBlank(attrStr)) {
int joinCount = 1;//msgData.getInteger("joinCount");
if (joinCount >= actionAmount) {
this.saveOrUpdateTaskProcess(null, memberDTO.getId(), task, joinCount, TASK_FINISH_STATUS);
return true;
}
}
Integer marketingActivityId = msgData.getInteger("marketingActivityId");
if (new ArrayList<>(Arrays.asList(attrStr.split(","))).contains(Integer.toString(marketingActivityId))) {
int joinCount = 1;//msgData.getInteger("joinCount");
if (joinCount >= actionAmount) {
this.saveOrUpdateTaskProcess(null, memberDTO.getId(), task, joinCount, TASK_FINISH_STATUS);
return true;
}
}
log.warn("未找到对应的活动,参数 marketingActivityId ==>> {} || 任务属性 ==>> {}", marketingActivityId, attrStr);
return false;
}
private boolean doSignEvent(JSONObject msgData, Task task, MemberSimpleDTO memberDTO) {
Integer actionAmount = task.getActionAmount();
// // 用户行为次数 签到天数
int signDays = msgData.getInteger("signDays");
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 resources 任务完成情况
* 播放时长
* @param paramJsonObject
*/
private void doRefreshTrTaskProcess(TrTaskProgress resources) {
Long id = resources.getId();
if (Objects.nonNull(id)) {
resources.setUpdateTime(TimestampUtil.now());
this.trTaskProgressService.update(resources);
} else {
this.trTaskProgressService.create(resources);
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;
}
/**
* 风控检查
* @param memberId
* @param tempRightsMap
* @return
*/
private boolean checkRiskManagement(Long memberId , Map<RightType, Object> tempRightsMap) {
// TODO 风控
return false;
}
/**
* 权益发放
* @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);
}
/**
* 权益区分
*
* @param taskList 任务列表
* @param tasks 任务列表
* @return Map<RightType,Object> 权益分类
*/
private Map<RightType,Object> distinguishRight(Long memberId, List<Task> taskList, DataSyncMsg.MsgData msgData, DataSyncMsg dataSyncMsg) {
private Map<RightType,Object> distinguishRight(MemberSimpleDTO memberDTO, List<Task> tasks, JSONObject msgData, DataSyncMsg dataSyncMsg) {
Map<RightType,Object> map = new HashMap<>();
// 区分权益类型(成长值(reward_exp)、积分(reward_points)、实体券),并发放权益
for (Task task : taskList) {
List<TempPoints> tempPoints = new ArrayList<>();
List<TempExp> tempExps = new ArrayList<>();
for (Task task : tasks) {
// 积分
List<TempPoints> tempPointsList = this.getTempPoints(memberId, msgData, task, dataSyncMsg);
if (!CollectionUtils.isEmpty(tempPointsList))
map.put(RightType.POINTS,tempPointsList);
this.getTempPoints(memberDTO, msgData, task, dataSyncMsg, tempPoints);
if (!CollectionUtils.isEmpty(tempPoints))
map.put(RightType.POINTS, tempPoints);
// 成长值
List<TempExp> tempExpList = this.getTempExp(memberId,msgData,task, dataSyncMsg);
if (!CollectionUtils.isEmpty(tempExpList))
map.put(RightType.EXP,tempExpList);
this.getTempExp(memberDTO, msgData, task, dataSyncMsg, tempExps);
if (!CollectionUtils.isEmpty(tempExps))
map.put(RightType.EXP, tempExps);
// 权益
map = this.getTempRight(memberId, task, map);
this.getTempRight(memberDTO, task, map);
}
......@@ -368,7 +695,6 @@ public class TaskOperationServiceImpl implements TaskOperationService {
Long expireTime1 = rightsDTO.getExpireTime();
if (Objects.nonNull(expireTime1)) {
Timestamp expireTime = TimestampUtil.long2Timestamp(expireTime1);
if (Objects.nonNull(expireTime))
tempRights.setExpireTime(expireTime);
}
return tempRights;
......@@ -395,17 +721,17 @@ public class TaskOperationServiceImpl implements TaskOperationService {
/**
* 权益1
* @param task
* @param task 任务
* @param memberDTO 会员
* @param map 权益分类
* @return
*/
private Map<RightType,Object> getTempRight(Long memberId , Task task , Map<RightType,Object> map) {
private Map<RightType,Object> getTempRight(MemberSimpleDTO memberDTO, Task task, Map<RightType,Object> map) {
// 优惠券
List<TempCoupon> tempCouponList = new ArrayList<>();
// 权益列表,用以保存权益记录
List<TempRights> rightsList = new ArrayList<>();
// 会员信息
MemberDTO memberDTO = this.findMemberById(memberId);
// 权益1
Long rights1Id = task.getRightsId();
......@@ -437,27 +763,9 @@ public class TaskOperationServiceImpl implements TaskOperationService {
// 权益分类
this.getTempRightType(memberDTO,rights3Id,rights3Amount,rightsSendStrategy,tempCouponList,rightsList,map);
}
// 优惠券
/*if (!CollectionUtils.isEmpty(tempCouponList)) {
map.put(RightType.COUPON,tempCouponList);
}*/
// 权益
/*if (!CollectionUtils.isEmpty(rightsList)) {
map.put(RightType.RIGHTS,rightsList);
}*/
return map;
}
/**
* 会员对象
* @param memberId
* @return
*/
private MemberDTO findMemberById(Long memberId) {
return this.memberService.findById(memberId);
}
/**
* 权益分类
* @param memberDTO
......@@ -467,16 +775,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();
// 权益详情
RightsDTO rightsDTO = this.getRight(rightsId);
if (Objects.nonNull(rightsDTO)){
long l = System.currentTimeMillis();
RightsDTO rightsDTO = this.rightsService.findById(rightsId);
long l1 = System.currentTimeMillis();
log.info("查询权益信息,总耗时 ==>> {}", (l1-l));
if (Objects.nonNull(rightsDTO.getId())){
// 用以保存权益历史
TempRights tempRights = this.tmpRightsBuild(memberId,memberCode,rightsAmount,rightsDTO);
rightsList.add(tempRights);
......@@ -486,13 +796,13 @@ public class TaskOperationServiceImpl implements TaskOperationService {
}
// 权益类型
String type = rightsDTO.getEntityType();
Integer type = rightsDTO.getEntityType();
switch (type) {
// 优惠券
case "1":
case RightTypeConstants.DISCOUNT_COUPON:
Long entityId1 = rightsDTO.getEntityId();
if (Objects.nonNull(entityId1)) {
CouponDTO couponDTO = this.findCouponById(entityId1);
CouponDTO couponDTO = this.couponService.findById(entityId1);
if (Objects.nonNull(couponDTO.getId())) {
// 优惠券
TempCoupon tempCoupon = this.tempCouponBuild(memberId, memberCode,rightsAmount, rightsSendStrategy, couponDTO, nickname);
......@@ -505,10 +815,10 @@ public class TaskOperationServiceImpl implements TaskOperationService {
}
break;
// 观影券
case "2":
case RightTypeConstants.VIEW_COUPON:
Long entityId2 = rightsDTO.getEntityId();
if (Objects.nonNull(entityId2)) {
CouponDTO couponDTO = this.findCouponById(entityId2);
CouponDTO couponDTO = this.couponService.findById(entityId2);
if (Objects.nonNull(couponDTO.getId())) {
// 优惠券
TempCoupon tempCoupon = this.tempCouponBuild(memberId, memberCode,rightsAmount, rightsSendStrategy, couponDTO, nickname);
......@@ -521,19 +831,19 @@ public class TaskOperationServiceImpl implements TaskOperationService {
}
break;
// 活动参与机会
case "3":
case RightTypeConstants.JOIN_ACTIVITY:
map.put(RightType.ACTIVITYCHANCE, tempRights);
break;
// 积分商品
case "4":
case RightTypeConstants.POINTS_GOODS:
map.put(RightType.POINTGOODS, tempRights);
break;
// IPTV产品包
case "5":
case RightTypeConstants.IPTV_PRODUCT:
map.put(RightType.IPTVPRODUCT, tempRights);
break;
// IPTV观影权益
case "6":
case RightTypeConstants.IPTV_VIEW:
map.put(RightType.IPTVVIEW, tempRights);
break;
default:
......@@ -543,55 +853,32 @@ public class TaskOperationServiceImpl implements TaskOperationService {
}
/**
* 获取优惠券信息
* @param id
* @return
*/
private CouponDTO findCouponById(Long id) {
CouponDTO couponDTO = this.couponService.findById(id);
return couponDTO;
}
/**
*
* @param rightsId
* @return
*/
private RightsDTO getRight(Long rightsId) {
RightsDTO rightsDTO = this.rightsService.findById(rightsId);
return rightsDTO;
}
/**
* 成长值
* @param task
* @return
*/
private List<TempExp> getTempExp(Long memberId, DataSyncMsg.MsgData msgData, Task task, DataSyncMsg dataSyncMsg) {
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(memberId);
tempExp.setAppCode(msgData.getAppCode());
tempExp.setMemberId(memberId);
tempExp.setMemberCode(msgData.getMemberCode());
tempExp.setItemId(msgData.getItemId());
tempExp.setAccountId(msgData.getAccountId());
tempExp.setMemberId(memberDTO.getId());
tempExp.setAppCode(msgData.getString("appCode"));
tempExp.setMemberCode(memberDTO.getCode());
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);
return Arrays.asList(tempExp);
tempExps.add(tempExp);
}
return null;
}
/**
......@@ -599,8 +886,8 @@ public class TaskOperationServiceImpl implements TaskOperationService {
* @param task
* @return
*/
private List<TempPoints> getTempPoints(Long memberId, DataSyncMsg.MsgData msgData, Task task, DataSyncMsg dataSyncMsg) {
private void getTempPoints(MemberSimpleDTO memberDTO, JSONObject msgData, Task task,
DataSyncMsg dataSyncMsg, List<TempPoints> tempPoints) {
// 积分: 数值、过期时间、积分类型(定值、随机)、随机积分最大值
Long rewardPoints = task.getRewardPoints();
// 过期时间
......@@ -610,560 +897,42 @@ public class TaskOperationServiceImpl implements TaskOperationService {
Integer pointsType = task.getPointsType();
// 随机积分的最大值
Integer rewardMaxPoints = task.getRewardMaxPoints();
if (Objects.nonNull(rewardPoints)) {
TempPoints tempPoints = new TempPoints();
if (Objects.nonNull(rewardPoints) && rewardPoints > 0) {
TempPoints tempPoint = new TempPoints();
// 如果积分是随机的,则取随机值
if (pointsType == POINTS_TYPE_RANDOM) {
rewardPoints = RandomUtil.getRandomPoints(POINTS_MIN,rewardMaxPoints);
}
tempPoints.setRewardPointsExpireTime(rewardPointsExpireTime);
tempPoints.setMemberId(memberId);
tempPoints.setMemberCode(msgData.getMemberCode());
tempPoints.setAppCode(msgData.getAppCode());
tempPoints.setPoints(rewardPoints);
tempPoints.setPointsType(pointsType);
tempPoints.setDeviceType(dataSyncMsg.getDeviceType());
tempPoints.setExpireTime(expireTime);
tempPoints.setOrderId(msgData.getOrderId());
tempPoints.setActivityId(msgData.getOrderId());
tempPoints.setMediaId(msgData.getMediaId());
tempPoints.setItemId(msgData.getItemId());
tempPoints.setAccountId(msgData.getAccountId());
tempPoints.setEvtType(dataSyncMsg.getEvent());
if (pointsType.equals(POINTS_TYPE_RANDOM)) {
rewardPoints = RandomUtil.getRandomPoints(POINTS_MIN, rewardMaxPoints);
}
tempPoint.setRewardPointsExpireTime(rewardPointsExpireTime);
tempPoint.setMemberId(memberDTO.getId());
tempPoint.setMemberCode(memberDTO.getCode());
tempPoint.setAppCode(msgData.getString("appCode"));
tempPoint.setPoints(rewardPoints);
tempPoint.setPointsType(pointsType);
tempPoint.setDeviceType(dataSyncMsg.getDeviceType());
tempPoint.setExpireTime(expireTime);
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();
tempPoints.setRightsSendStrategy(Objects.isNull(rightsSendStrategy) ? 0 : rightsSendStrategy);
return Arrays.asList(tempPoints);
}
return null;
}
/**
* 判断任务是否完成
* 完成的条件如下:->
* 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);
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 =
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);
Integer status_0 = trTaskProgressDTO_0.getStatus();
Integer currentActionAmount_0 = trTaskProgressDTO_0.getCurrentActionAmount();
Timestamp completionTime_0 = trTaskProgressDTO_0.getCompletionTime();
if (status_0 == 1 && currentActionAmount_0 != null && Objects.nonNull(completionTime_0)) {
return false;
}
}
String param = msgData.getParam();
JSONObject jsonObject = JSON.parseObject(param);
Integer value = Integer.valueOf(jsonObject.get("playDuration").toString());
if (value >= actionAmount) {
currentActionAmount = actionAmount;
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);
// 更新任务完成情况
this.doRefreshTrTaskProcess(trTaskProgress);
return true;
}
return false;
}
/**
* 获取任务模板对应的任务列表
*
* @param taskTemplate 任务模板
* @return List<task> 任务列表
*/
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;
tempPoint.setRightsSendStrategy(Objects.isNull(rightsSendStrategy) ? 0 : rightsSendStrategy);
tempPoints.add(tempPoint);
}
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 = 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 = 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;
......
......@@ -82,6 +82,11 @@ public class TaskTemplateOperationServiceImpl implements TaskTemplateOperationSe
}
@Override
public Long countByCodeAndType(TaskTemplate taskTemplate) {
return this.taskTemplateService.countByCodeAndType(taskTemplate);
}
@Override
public TaskTemplateDTO findById(Long id) {
return this.taskTemplateService.findById(id);
}
......
......@@ -8,13 +8,26 @@ import com.alibaba.fastjson.JSONObject;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.domain.MemberBuilder;
import com.topdraw.business.module.member.domain.MemberTypeConstant;
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.app.domain.*;
import com.topdraw.business.module.user.app.service.UserAppBindService;
import com.topdraw.business.module.user.app.service.UserAppService;
import com.topdraw.business.module.user.app.service.dto.AppRegisterDTO;
import com.topdraw.business.module.user.app.service.dto.UserAppBindDTO;
import com.topdraw.business.module.user.app.service.dto.UserAppDTO;
import com.topdraw.business.module.user.app.service.dto.UserAppSimpleDTO;
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.growreport.domain.GrowthReport;
import com.topdraw.business.module.user.iptv.growreport.service.GrowthReportService;
import com.topdraw.business.module.user.iptv.growreport.service.dto.GrowthReportDTO;
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;
......@@ -26,24 +39,24 @@ import com.topdraw.business.module.user.weixin.repository.UserWeixinRepository;
import com.topdraw.business.module.user.weixin.service.UserWeixinService;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinDTO;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinQueryCriteria;
import com.topdraw.business.module.user.weixin.subscribe.domain.WechatSubscribeRecord;
import com.topdraw.business.module.user.weixin.subscribe.service.WechatSubscribeRecordService;
import com.topdraw.business.process.domian.weixin.*;
import com.topdraw.business.process.service.UserOperationService;
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.RedisKeyUtil;
import com.topdraw.business.LocalConstants;
import com.topdraw.business.RedisKeyConstants;
import com.topdraw.common.ResultInfo;
import com.topdraw.util.RedisKeyUtil;
import com.topdraw.exception.BadRequestException;
import com.topdraw.exception.EntityNotFoundException;
import com.topdraw.exception.GlobeExceptionMsg;
import com.topdraw.resttemplate.RestTemplateClient;
import com.topdraw.util.Base64Util;
import com.topdraw.util.IdWorker;
import com.topdraw.util.TimestampUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.RedisUtils;
import com.topdraw.weixin.subscribe.domain.WechatSubscribeRecord;
import com.topdraw.weixin.subscribe.service.WechatSubscribeRecordService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.aop.framework.AopContext;
......@@ -55,10 +68,8 @@ import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import org.springframework.util.Base64Utils;
import org.springframework.util.CollectionUtils;
import springfox.documentation.spring.web.json.Json;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
......@@ -75,8 +86,14 @@ public class UserOperationServiceImpl implements UserOperationService {
@Autowired
private MemberService memberService;
@Autowired
private UserAppService userAppService;
@Autowired
private UserWeixinService userWeixinService;
@Autowired
private UserAppBindService userAppBindService;
@Autowired
private GrowthReportService growthReportService;
@Autowired
private UserWeixinRepository userWeixinRepository;
@Autowired
private UserCollectionService userCollectionService;
......@@ -97,7 +114,7 @@ public class UserOperationServiceImpl implements UserOperationService {
/** 取消关注 */
private static final Integer UNSUBSCRIBE_STATUS = 0;
private static final Integer SUBSCRIBE_STATUS = 1;
// 服务域 0:电信 1:联通 2:移动 3:其他
private static final Integer[] PLATFORM_LIST = new Integer[]{0,1,2,3};
@Value("${uc.app.h5AppId:wxca962918dfeed88c}")
......@@ -107,22 +124,235 @@ public class UserOperationServiceImpl implements UserOperationService {
private String appletAppid;
@AsyncMqSend
public void asyncMemberAndUserWeixin4Iptv(MemberAndWeixinUserDTO memberAndWeixinUserDTO) {}
@AsyncMqSend
public void asyncMemberAndUserTv4Iptv(MemberAndUserTvDTO memberAndUserTv) {}
@AsyncMqSend
public void asyncWeixin(UserWeixinDTO weixinDTO) {}
@AsyncMqSend
public void asyncUserTv(UserTvDTO userTvDTO) {}
@AsyncMqSend
public void asyncAppletBind(MemberAndUserTvDTO memberAndUserTvDTO) {}
@AsyncMqSend
public void asyncUnbind(MemberAndUserTvDTO memberAndUserTvDTO) {}
@AsyncMqSend
public void asyncUnsubscribe(MemberAndWeixinUserDTO memberAndWeixinUserDTO) {}
@AsyncMqSend
public void asyncSubscribe(MemberAndWeixinUserDTO memberAndWeixinUserDTO) {}
@Override
@Transactional(rollbackFor = Exception.class)
public UserAppDTO appRegister(UserApp resources) {
UserAppDTO userAppDTO = this.userAppService.findByUsername(resources.getUsername());
if (Objects.isNull(userAppDTO.getId())) {
// 先创建会员
Member member = MemberBuilder.build(MemberTypeConstant.app, resources.getHeadimgurl(), resources.getNickname(), 0);
MemberDTO memberDTO = this.memberService.create(member);
if (Objects.nonNull(memberDTO.getId())) {
// 保存app账号
UserAppDTO _userAppDTO = this.userAppService.create(UserAppBuilder.build(memberDTO.getId(), resources));
if (Objects.nonNull(_userAppDTO.getId()) && StringUtils.isNotBlank(resources.getAccount())) {
UserAppBindDTO userAppBindDTO = this.userAppBindService.findFirstByAccount(resources.getAccount());
if (Objects.isNull(userAppBindDTO.getId())) {
// 保存绑定关系
UserAppBind userAppBind = UserAppBindBuilder.build(_userAppDTO.getId(), resources.getAccount(), resources.getAccountType());
this.userAppBindService.create(userAppBind);
_userAppDTO.setAccount(resources.getAccount());
_userAppDTO.setAccountType(resources.getAccountType());
}
}
AppRegisterDTO appRegisterDTO = new AppRegisterDTO();
appRegisterDTO.setMemberDTO(memberDTO);
appRegisterDTO.setUserAppDTO(_userAppDTO);
((UserOperationServiceImpl)AopContext.currentProxy()).asyncAppRegister(appRegisterDTO);
return _userAppDTO;
}
}
return userAppDTO;
}
@Override
public ResultInfo cancelUserAppBind(UserAppBind resources) {
String account = resources.getAccount();
Integer accountType = resources.getAccountType();
UserAppBindDTO userAppBindDTO = this.userAppBindService.findFirstByAccountAndAccountType(account, accountType);
if (Objects.nonNull(userAppBindDTO.getId())) {
if (Objects.nonNull(userAppBindDTO.getUserAppId())) {
UserAppDTO userAppDTO = this.userAppService.findById(userAppBindDTO.getUserAppId());
if (Objects.isNull(userAppDTO.getId())) {
return ResultInfo.failure("app账号不存在");
}
}
boolean b = this.userAppBindService.cancelUserAppBind(account, accountType);
if (b) {
return ResultInfo.success(true);
}
}
return ResultInfo.failure("取消绑定失败");
}
@Override
@Transactional(rollbackFor = Exception.class)
public ResultInfo appBindThirdAccount(UserAppBind resources) {
String username = resources.getUsername();
String headImgUrl = resources.getHeadimgurl();
String nickname = resources.getNickname();
UserAppDTO userAppDTO = this.userAppService.findByUsername(username);
log.info("通过app账号查询app信息是否存在,[appBindThirdAccount#{}]", userAppDTO);
if (Objects.isNull(userAppDTO.getId())) {
return ResultInfo.failure("app账号不存在");
}
String account = resources.getAccount();
Integer accountType = resources.getAccountType();
UserAppBindDTO userAppBindDTO = this.userAppBindService.findFirstByAccountAndAccountType(account, accountType);
if (Objects.nonNull(userAppBindDTO.getId()) && userAppBindDTO.getStatus() == 1 && Objects.nonNull(userAppBindDTO.getUserAppId())) {
Integer bindAccountType = userAppBindDTO.getAccountType();
String accountStr = "";
switch (bindAccountType) {
case 3:
accountStr = "微信";
break;
case 4:
accountStr = "QQ";
break;
case 5:
accountStr = "微博";
break;
case 6:
accountStr = "苹果账号";
break;
}
return ResultInfo.failure("绑定失败,当前"+accountStr+"已经绑定了其他手机号");
}
if (Objects.isNull(userAppDTO.getHeadimgurl())) {
UserApp userApp = new UserApp();
userApp.setUsername(username);
if (StringUtils.isNotBlank(headImgUrl)) {
if (headImgUrl.contains("http") || headImgUrl.contains("https")) {
String image = this.downloadWeixinImgeFromAppEngine(headImgUrl);
userApp.setHeadimgurl(image);
}
}
userApp.setNickname(nickname);
log.info("同步app账号的昵称、头像,[appBindThirdAccount#{}]", userAppDTO);
boolean result = this.userAppService.updateAppLastActiveTimeAndNicknameAndHeadImg(userApp);
if (result) {
UserAppDTO userAppDTO1 = new UserAppDTO();
BeanUtils.copyProperties(userApp, userAppDTO1);
((UserOperationServiceImpl) AopContext.currentProxy()).asyncUpdateAppLastActiveTimeAndNicknameAndHeadImg(userAppDTO1);
}
}
if (Objects.nonNull(userAppBindDTO.getId())) {
resources.setUserAppId(userAppDTO.getId());
boolean result = this.userAppBindService.updateValidStatusAndUserAppIdAndNickname(resources);
if (result) {
UserAppDTO userAppDTO1 = new UserAppDTO();
userAppDTO1.setUsername(username);
userAppDTO1.setNickname(nickname);
userAppDTO1.setHeadimgurl(headImgUrl);
((UserOperationServiceImpl) AopContext.currentProxy()).asyncUpdateAppLastActiveTimeAndNicknameAndHeadImg(userAppDTO1);
}
} else {
resources.setUserAppId(userAppDTO.getId());
resources.setStatus(1);
log.info("第三方账号不存在,新增关联关系[appBindThirdAccount#{}]", resources);
this.userAppBindService.create(resources);
UserAppDTO userAppDTO1 = new UserAppDTO();
BeanUtils.copyProperties(resources, userAppDTO1);
userAppDTO1.setUsername(username);
((UserOperationServiceImpl) AopContext.currentProxy()).asyncCreateUserAppBindThirdAccount(userAppDTO1);
}
return ResultInfo.success(true);
}
@Override
public UserAppSimpleDTO updateAppInfo(UserApp resources) {
UserAppSimpleDTO userAppSimpleDTO = this.userAppService.updateAppInfo(resources);
if (Objects.nonNull(userAppSimpleDTO.getId())) {
UserAppDTO userAppDTO = new UserAppDTO();
BeanUtils.copyProperties(resources, userAppDTO);
userAppDTO.setUsername(userAppSimpleDTO.getUsername());
((UserOperationServiceImpl)AopContext.currentProxy()).asyncUpdateAppInfo(userAppDTO);
}
return userAppSimpleDTO;
}
@Override
public boolean updatePasswordById(UserApp resources) {
UserAppDTO userAppDTO = this.userAppService.findById(resources.getId());
if (Objects.nonNull(userAppDTO.getId())) {
if (this.userAppService.updatePasswordById(resources)) {
((UserOperationServiceImpl)AopContext.currentProxy()).asyncUpdatePasswordByUsername(userAppDTO);
return true;
}
}
return false;
}
@Override
@Transactional(rollbackFor = Exception.class)
public ResultInfo saveGrowthReport(GrowthReport growthReport) {
String platformAccount = growthReport.getPlatformAccount();
UserTvDTO userTvDTO = this.userTvService.findByPlatformAccount(platformAccount);
if (Objects.isNull(userTvDTO.getId())) {
log.error("保存成长报告失败,大屏信息不存在[saveGrowthReport#]");
return ResultInfo.failure("保存成长报告失败,大屏信息不存在");
}
String weekFirstDay = com.topdraw.util.DateUtil.getWeekFirstDay();
String weekLastDay = com.topdraw.util.DateUtil.getWeekLastDay();
GrowthReportDTO growthReportDTO = this.growthReportService.findByPlatformAccountAndStartDateAndEndDate(platformAccount, weekFirstDay, weekLastDay);
if (Objects.isNull(growthReportDTO.getId())) {
Long id = userTvDTO.getId();
Long memberId = userTvDTO.getMemberId();
growthReport.setUserId(id);
growthReport.setMemberId(memberId);
growthReport.setStartDate(weekFirstDay);
growthReport.setEndDate(weekLastDay);
log.info("保存成长报告,参数[saveGrowthReport#{}]", growthReport);
this.growthReportService.create(growthReport);
} else {
log.info("修改成长报告,参数[saveGrowthReport#{}]", growthReport);
this.growthReportService.updateGrowthReportData(growthReportDTO.getId(), growthReport.getData());
}
((UserOperationServiceImpl)AopContext.currentProxy()).asyncsaveGrowthReport(growthReport);
return ResultInfo.success("保存成功");
}
@Override
public boolean appCancellation(UserApp userApp) {
UserAppDTO userAppDTO = this.userAppService.findById(userApp.getId());
if (Objects.nonNull(userAppDTO.getId())){
boolean b = this.userAppService.appCancellation(userApp.getId());
if (b) {
List<UserAppBindDTO> userAppBindDTOS = this.userAppBindService.findByUserAppId(userAppDTO.getId());
if (!CollectionUtils.isEmpty(userAppBindDTOS)) {
List<Long> ids = userAppBindDTOS.stream().map(UserAppBindDTO::getId).collect(Collectors.toList());
this.userAppBindService.appCancellation(ids);
}
((UserOperationServiceImpl)AopContext.currentProxy()).asyncAppCancellation(userAppDTO);
}
}
return true;
}
/**
* 创建大屏账户同时创建会员
......@@ -131,23 +361,20 @@ public class UserOperationServiceImpl implements UserOperationService {
* @return UserTvDTO
*/
@Override
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
@Transactional(rollbackFor = Exception.class)
public UserTvDTO createTvUserAndMember(UserTv resources) {
boolean flag = true;
// 大屏账户
String platformAccount = resources.getPlatformAccount();
UserTvDTO userTvDTO = this.userTvService.findByPlatformAccount(platformAccount);
// 无账号
if (Objects.isNull(userTvDTO)) {
if (Objects.isNull(userTvDTO.getId())) {
// 会员昵称默认采用大屏账号,昵称通过base64加密与小屏保持一致
String platformAccountEncode = Base64Utils.encodeToString(platformAccount.getBytes());
String platformAccountEncode = platformAccount;
if (flag) {
platformAccountEncode = Base64Utils.encodeToString(platformAccount.getBytes());
}
// x_member
Member member =
MemberBuilder.build(LocalConstants.MEMBER_PLATFORM_TYPE_VIS,
......@@ -158,14 +385,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);
// 有账号
......@@ -190,10 +418,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;
}
}
......@@ -204,11 +432,11 @@ public class UserOperationServiceImpl implements UserOperationService {
/**
* 创建小屏账户同时创建会员
* @param resources
* @param resources 微信信息
* @return UserWeixinDTO
*/
@Override
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
@Transactional(rollbackFor = Exception.class)
public UserWeixinDTO createWeixinUserAndMember(UserWeixin resources) {
return this.createWeixinUserAndMember(resources, 0);
}
......@@ -239,7 +467,7 @@ public class UserOperationServiceImpl implements UserOperationService {
if (Objects.nonNull(_userWeixinDTO.getMemberId())) {
// 有其他账号的话,将此账号与对应的会员进行绑定
MemberDTO memberDTO = this.findMemberById(_userWeixinDTO.getMemberId());
MemberDTO memberDTO = this.memberService.findById(_userWeixinDTO.getMemberId());
userWeixinDTO.setMemberId(memberDTO.getId());
userWeixinDTO.setMemberCode(memberDTO.getCode());
if (StringUtils.isBlank(userWeixinDTO.getUnionid())) {
......@@ -247,17 +475,15 @@ public class UserOperationServiceImpl implements UserOperationService {
}
UserWeixin userWeixin = new UserWeixin();
BeanUtils.copyProperties(userWeixinDTO, userWeixin);
UserWeixinDTO _userWeixinDTO1 = this.updateWeixin(userWeixin);
return _userWeixinDTO1;
return this.updateWeixin(userWeixin);
} else {
// 有其他账号但都无会员,新建会员并将此账号绑定新建的这个会员
Member _member =
MemberBuilder.build(LocalConstants.MEMBER_PLATFORM_TYPE_WEIXIN,
Member member = MemberBuilder.build(LocalConstants.MEMBER_PLATFORM_TYPE_WEIXIN,
headimgurl, nickname, vip, sex);
MemberDTO memberDTO = this.createMember(_member);
MemberDTO memberDTO = this.createMember(member);
if (Objects.nonNull(memberDTO)) {
userWeixinDTO.setMemberId(memberDTO.getId());
......@@ -267,8 +493,7 @@ public class UserOperationServiceImpl implements UserOperationService {
}
UserWeixin userWeixin = new UserWeixin();
BeanUtils.copyProperties(userWeixinDTO, userWeixin);
UserWeixinDTO _userWeixinDTO1 = this.updateWeixin(userWeixin);
return _userWeixinDTO1;
return this.updateWeixin(userWeixin);
}
......@@ -277,11 +502,11 @@ public class UserOperationServiceImpl implements UserOperationService {
} else {
// 该账号存在但无其他账号,新建会员
Member _member =
Member member =
MemberBuilder.build(LocalConstants.MEMBER_PLATFORM_TYPE_WEIXIN,
headimgurl, nickname, vip, sex);
MemberDTO memberDTO = this.createMember(_member);
MemberDTO memberDTO = this.createMember(member);
if (Objects.nonNull(memberDTO)) {
userWeixinDTO.setMemberId(memberDTO.getId());
......@@ -291,8 +516,7 @@ public class UserOperationServiceImpl implements UserOperationService {
}
UserWeixin userWeixin = new UserWeixin();
BeanUtils.copyProperties(userWeixinDTO, userWeixin);
UserWeixinDTO _userWeixinDTO1 = this.updateWeixin(userWeixin);
return _userWeixinDTO1;
return this.updateWeixin(userWeixin);
}
......@@ -374,11 +598,10 @@ public class UserOperationServiceImpl implements UserOperationService {
return userWeixinDTO;
}
/**
* 服务号登录
* @param resources
* @return
* @param resources 微信信息
* @return UserWeiXinDTO
*/
@Override
public UserWeixinDTO serviceLogin(UserWeixin resources) {
......@@ -387,25 +610,23 @@ public class UserOperationServiceImpl implements UserOperationService {
UserWeixinDTO userWeixinDTO = this.createWeixinUserAndMember(resources);
// 为了保证返回的同一用户
UserWeixinDTO userWeixinDTO_0 = this.getFirstId(userWeixinDTO);
return userWeixinDTO_0;
return this.getFirstId(userWeixinDTO);
}
/**
* 小程序登录
* @param resources
* @return
* @param resources 微信
* @return UserWeiXinDTO
*/
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = Exception.class)
@Transactional(rollbackFor = Exception.class)
public UserWeixinDTO appletLogin(UserWeixin resources) {
// 创建小屏账户同时创建会员
UserWeixinDTO userWeixinDTO = this.createWeixinUserAndMember(resources);
// 为了保证返回的同一用户
UserWeixinDTO userWeixinDTO_0 = this.getFirstId(userWeixinDTO);
return userWeixinDTO_0;
return this.getFirstId(userWeixinDTO);
}
/**
......@@ -417,8 +638,8 @@ public class UserOperationServiceImpl implements UserOperationService {
* 2). 大屏账户保存小屏会员的code
* 3). 小屏会员中保存大屏的id
* @description 大小屏绑定,大屏账户保存小屏会员编码
* @param resources
* @return
* @param resources 关注信息
* @return boolean
*/
@Override
public boolean subscribe(SubscribeBean resources) {
......@@ -429,76 +650,83 @@ public class UserOperationServiceImpl implements UserOperationService {
String headImgUrl = resources.getHeadimgurl();
// 小屏账户
UserWeixinDTO _userWeixinDTO = this.findFirstByUnionIdAndAppIdAndOpenId(unionId,appId, openId);
UserWeixinDTO userWeixinDTO = this.userWeixinService.findFirstByUnionIdAndAppIdAndOpenId(unionId, appId, openId);
MemberDTO memberDTO = null;
if (Objects.isNull(_userWeixinDTO.getId()) || StringUtils.isBlank(_userWeixinDTO.getUnionid()) ||
Objects.isNull(_userWeixinDTO.getMemberId())) {
MemberDTO memberDTO;
if (Objects.isNull(userWeixinDTO.getId()) || StringUtils.isBlank(userWeixinDTO.getUnionid()) ||
Objects.isNull(userWeixinDTO.getMemberId())) {
UserWeixin userWeixin = new UserWeixin();
BeanUtils.copyProperties(resources, userWeixin);
userWeixin.setStatus(SUBSCRIBE_STATUS);
userWeixin.setNickname(nickname);
userWeixin.setHeadimgurl(headImgUrl);
// 创建小屏账户同时创建会员
_userWeixinDTO = this.createWeixinUserAndMember(userWeixin, 1);
Long memberId = _userWeixinDTO.getMemberId();
userWeixinDTO = this.createWeixinUserAndMember(userWeixin, 1);
Long memberId = userWeixinDTO.getMemberId();
memberDTO = this.memberService.findById(memberId);
memberDTO.setVip(SUBSCRIBE_STATUS);
} else {
// 修改微信账户关注状态
_userWeixinDTO = this.doUpdateUserWeiXinStatus(_userWeixinDTO, SUBSCRIBE_STATUS);
UserWeixin userWeixin = new UserWeixin();
userWeixin.setId(userWeixinDTO.getId());
userWeixin.setStatus(SUBSCRIBE_STATUS);
userWeixinDTO = this.userWeixinService.doUpdateWeixinStatus(userWeixin);
// 小屏会员
memberDTO = this.findMemberByAppIdAndOpenId(appId,openId);
if (memberDTO != null) {
memberDTO = this.memberService.findById(userWeixinDTO.getMemberId());
if (StringUtils.isNotBlank(headImgUrl) && StringUtils.isNotBlank(nickname)) {
memberDTO.setAvatarUrl(headImgUrl);
memberDTO.setNickname(nickname);
}
Member member = new Member();
member.setId(memberDTO.getId());
if (Objects.nonNull(memberDTO.getId())) {
Integer vip = memberDTO.getVip();
// 未购买付费会员
if (Objects.isNull(vip) || vip < 1) {
memberDTO.setVip(1);
}
member.setVip(1);
member.setVipExpireTime(null);
} else {
member.setVip(vip);
}
}
// 修改会员信息
MemberDTO _memberDTO1 = this.doUpdateMemberByMemberDTO(memberDTO);
log.info("发送关注消息至大屏侧,发送的账号信息 ==>> {} || 会员信息 ==>> {}", _userWeixinDTO , _memberDTO1);
// 同步至iptv
((UserOperationServiceImpl)AopContext.currentProxy()).asyncSubscribe(new MemberAndWeixinUserDTO(_memberDTO1, _userWeixinDTO));
memberDTO = this.memberService.doUpdateMemberVipAndVipExpireTime(member);
log.info("发送关注消息至大屏侧,发送的账号信息 ==>> {} || 会员信息 ==>> {}", userWeixinDTO , memberDTO);
// 同步大屏侧
((UserOperationServiceImpl)AopContext.currentProxy()).asyncSubscribe(new MemberAndWeixinUserDTO(memberDTO, userWeixinDTO));
// 大屏信息
JSONObject iptvUserInfo = resources.getIptvUserInfo();
log.info("存储的大小屏账号信息 iptvUserInfo ==>> {}" , iptvUserInfo);
if (Objects.nonNull(iptvUserInfo)) {
JSONObject visUserInfo = resources.getIptvUserInfo();
log.info("存储的大小屏账号信息 iptvUserInfo ==>> {}" , visUserInfo);
if (Objects.nonNull(visUserInfo)) {
// 大屏账户
String platformAccount = iptvUserInfo.getString("platformAccount");
log.info("存储的大屏账号信息 platformAccount ==>> {}" , platformAccount);
log.info("绑定开始");
String platformAccount = visUserInfo.getString("platformAccount");
if (StringUtils.isBlank(platformAccount)) {
platformAccount = visUserInfo.getString("platformUserId");
if (StringUtils.isBlank(platformAccount)) {
platformAccount = visUserInfo.getString("nNO");
}
if (StringUtils.isBlank(platformAccount)) {
log.warn("绑定失败,platformAccount is null ");
log.error("关注后绑定失败,platformAccount is null ");
return false;
}
}
log.info("存储的大屏账号信息 platformAccount ==>> {}" , platformAccount);
// 绑定
this.bind(memberDTO, platformAccount);
log.info("绑定结束");
}
// 保存关注记录
String sourceInfo = resources.getSourceInfo();
JSONObject sourceInfo = resources.getSourceInfo();
log.info("保存关注记录,数据 [subscribe#{}]", sourceInfo);
this.saveWechatSubscribeRecord(memberDTO, sourceInfo, 1);
return true;
......@@ -507,56 +735,61 @@ public class UserOperationServiceImpl implements UserOperationService {
/**
*
* @param memberDTO
* @param subscribe
* @param sourceInfo
* @param memberDTO 会员
* @param subscribe 关注状态
* @param sourceInfo 来源描述
*/
private void saveWechatSubscribeRecord(MemberDTO memberDTO, String sourceInfo, int subscribe) {
private void saveWechatSubscribeRecord(MemberDTO memberDTO, JSONObject sourceInfo, int subscribe) {
WechatSubscribeRecord wechatSubscribeRecord = new WechatSubscribeRecord();
wechatSubscribeRecord.setCode(IdWorker.generatorString());
wechatSubscribeRecord.setCode("subscribe_"+UUID.randomUUID().toString());
wechatSubscribeRecord.setMemberId(memberDTO.getId());
wechatSubscribeRecord.setOperationFlag(subscribe);
if (StringUtils.isBlank(sourceInfo)) {
wechatSubscribeRecord.setEntityType(3);
} else {
JSONObject jsonObject = JSONObject.parseObject(sourceInfo, JSONObject.class);
Object activityId = jsonObject.get("activityId");
Object activityCode = jsonObject.get("activityCode");
Object entityType = jsonObject.get("entityType");
if (Objects.nonNull(entityType)) {
String s = entityType.toString();
switch (s) {
case "1":
wechatSubscribeRecord.setSourceType(1);
wechatSubscribeRecord.setEntityType(1);
break;
case "2":
if (Objects.nonNull(activityId))
wechatSubscribeRecord.setEntityId(Long.valueOf(activityId.toString()));
if (Objects.nonNull(activityCode))
wechatSubscribeRecord.setEntityCode(activityCode.toString());
wechatSubscribeRecord.setSourceType(2);
wechatSubscribeRecord.setEntityType(2);
break;
default:
wechatSubscribeRecord.setSourceType(3);
wechatSubscribeRecord.setEntityType(3);
break;
if (Objects.nonNull(sourceInfo)) {
// 内容ID,entityId:实体ID
Object entityId = sourceInfo.get("entityId");
if (Objects.nonNull(entityId) && StringUtils.isNotBlank(entityId.toString())) {
wechatSubscribeRecord.setEntityId(Long.parseLong(entityId.toString()));
}
// 内容Code, entityCode: 实体Code
Object entityCode = sourceInfo.get("entityCode");
if (Objects.nonNull(entityCode) && StringUtils.isNotBlank(entityCode.toString())) {
wechatSubscribeRecord.setEntityCode(entityCode.toString());
}
// 内容类型,entityType:不填/空:首页;1:分类列表;2:商品;3:活动;4:投票对象;5:证书;6:用户上传内容;99:其他;
Object entityType = sourceInfo.get("entityType");
if (Objects.nonNull(entityType) && StringUtils.isNotBlank(entityType.toString())) {
wechatSubscribeRecord.setEntityType(Integer.parseInt(entityType.toString()));
}
// 微信场景类型,sourceType
Object sourceType = sourceInfo.get("sourceType");
if (Objects.nonNull(sourceType) && StringUtils.isNotBlank(sourceType.toString())) {
wechatSubscribeRecord.setWxScence(Integer.parseInt(sourceType.toString()));
}
// 来源描述,sourceDesc:系统/运营手动维护
Object sourceDesc = sourceInfo.get("sourceDesc");
if (Objects.nonNull(sourceType) && StringUtils.isNotBlank(sourceDesc.toString())) {
wechatSubscribeRecord.setSourceDesc(sourceDesc.toString());
}
// 业务场景,0-分享 1-大屏扫码免费看 2-大屏线上活动扫码引导关注 3-小屏线上活动长按二维码引导关注 4-线下活动海报 5-线下机构/渠道引流 99-其他
Object sourceScence = sourceInfo.get("sourceScence");
if (Objects.nonNull(sourceScence) && StringUtils.isNotBlank(sourceScence.toString())) {
wechatSubscribeRecord.setSourceScence(Integer.parseInt(sourceScence.toString()));
}
wechatSubscribeRecord.setSourceInfo(sourceInfo);
}
log.info("保存关注记录,落库对象 subscribe# wechatSubscribeRecord ==>> {}", wechatSubscribeRecord);
this.wechatSubscribeRecordService.create(wechatSubscribeRecord);
}
/**
* 微信公众号取消关注
* @param resources
* @return
* @param resources 参数
* @return boolean
*/
@Override
public boolean unsubscribe(SubscribeBean resources) {
......@@ -565,20 +798,44 @@ public class UserOperationServiceImpl implements UserOperationService {
String openId = resources.getOpenid();
// 修改关注状态 0:未关注
UserWeixinDTO userWeixinDTO = this.doUpdateUserWeiXinStatus(appId, openId, UNSUBSCRIBE_STATUS);
UserWeixinDTO userWeixinDTO = this.userWeixinService.findFirstByAppIdAndOpenId(appId, openId);
if (Objects.isNull(userWeixinDTO.getId())) {
log.error("取关失败,通过appid ==>> {} 和 openId ==>> {} 无法查询到指定的微信账号", appId, openId);
return false;
}
if (Objects.isNull(userWeixinDTO.getMemberId())) {
log.error("取关失败,该微信账号无会员id ==>> {}", userWeixinDTO);
return false;
}
UserWeixin userWeixin = new UserWeixin();
userWeixin.setId(userWeixinDTO.getId());
userWeixin.setStatus(UNSUBSCRIBE_STATUS);
userWeixinDTO = this.userWeixinService.doUpdateWeixinStatus(userWeixin);
// 会员
MemberDTO memberDTO = this.findMemberByUserWeixinDTO(userWeixinDTO);
MemberDTO memberDTO = this.memberService.findById(userWeixinDTO.getMemberId());
memberDTO.setUserIptvId(null);
// 修改会员vip,如果没有购买会员则取消团粉
MemberDTO _memberDTO = this.doUpdateMemberVip(memberDTO, 0);
// 同步至iptv
((UserOperationServiceImpl)AopContext.currentProxy()).asyncUnsubscribe(new MemberAndWeixinUserDTO(_memberDTO, userWeixinDTO));
Integer vip = memberDTO.getVip();
vip = (vip == null ? 0 : vip);
// 未购买付费会员
if (vip <= 1) {
Member member = new Member();
member.setId(memberDTO.getId());
member.setCode(memberDTO.getCode());
member.setVipExpireTime(null);
member.setVip(0);
memberDTO = this.memberService.doUpdateMemberVipAndVipExpireTime(member);
}
// 关注记录
this.saveWechatSubscribeRecord(_memberDTO, "",2);
this.saveWechatSubscribeRecord(memberDTO, null,2);
// 同步至iptv
((UserOperationServiceImpl)AopContext.currentProxy()).asyncUnsubscribe(new MemberAndWeixinUserDTO(memberDTO, userWeixinDTO));
return true;
}
......@@ -588,8 +845,7 @@ public class UserOperationServiceImpl implements UserOperationService {
try {
if (StringUtils.isNotBlank(headimgurl)) {
String headimgurlDecode = URLDecoder.decode(headimgurl, "UTF-8");
String image = RestTemplateClient.netImage(headimgurlDecode);
return image;
return RestTemplateClient.netImage(headimgurlDecode);
}
} catch (Exception e) {
log.info("头像解析失败!!!");
......@@ -601,8 +857,8 @@ public class UserOperationServiceImpl implements UserOperationService {
/**
* 更新大屏信息,同时判断是否已经关注,如果关注了则不跳转H5页面
* @param data
* @return
* @param data 参数
* @return UserWeixinDTO
*/
@Override
public UserWeixinDTO saveUserInfo(String data) {
......@@ -612,7 +868,6 @@ public class UserOperationServiceImpl implements UserOperationService {
JSONObject json = JSONObject.parseObject(data);
String unionId = json.getString("unionid");
// 订阅号appid
// String appId = json.getString("dyAppid");
String appId = json.getString("appid");
try {
......@@ -642,8 +897,7 @@ public class UserOperationServiceImpl implements UserOperationService {
// 若未传dyAppId。不走下面的流程
if (StrUtil.isNotBlank(appId)) {
UserWeixinDTO userWeixinDTO = this.findUserWeiXinByUnionIdAndAppId(unionId,appId);
return userWeixinDTO;
return this.findUserWeiXinByUnionIdAndAppId(unionId,appId);
}
} catch (Exception e) {
......@@ -655,76 +909,107 @@ public class UserOperationServiceImpl implements UserOperationService {
/**
* 大屏更换主账号
* @param resources
* @param resources 大屏账号信息
* @return boolean
*/
@Override
public void changeMainAccount(UserTv resources) {
public boolean changeMainAccount(UserTv resources) {
// 会员编码
String memberCode = resources.getMemberCode();
this.findMemberByCode(memberCode);
String platformAccount = resources.getPlatformAccount();
UserTvDTO userTvDTO = this.findByPlatformAccount(platformAccount);
UserTvDTO userTvDTO = this.userTvService.findByPlatformAccount(platformAccount);
if (Objects.nonNull(userTvDTO)) {
if (StringUtils.isNotBlank(userTvDTO.getPriorityMemberCode()) && userTvDTO.getPriorityMemberCode().equalsIgnoreCase(memberCode))
throw new BadRequestException("会员已是主账户");
} else {
throw new EntityNotFoundException(UserTvDTO.class , "platformAccount" , GlobeExceptionMsg.IPTV_IS_NULL);
}
// 设置主会员
UserTvDTO _userTvDTO = this.bondPriorityMember(userTvDTO, memberCode, "manual");
UserTv userTv = new UserTv();
userTv.setId(userTvDTO.getId());
userTv.setPriorityMemberCode(memberCode);
this.userTvService.doUpdatePriorityMemberCode(userTv);
userTvDTO.setPriorityMemberCode(memberCode);
// 同步至iptv
((UserOperationServiceImpl)AopContext.currentProxy()).asyncUserTv(_userTvDTO);
((UserOperationServiceImpl)AopContext.currentProxy()).asyncUserTvChangeMainAccount(userTvDTO);
return true;
}
/**
* 大屏解绑
* @param resources
* @param resources 大屏解绑参数
* @return boolean
*/
@Override
public void tvUnbind(TvUnBindBean resources) {
public boolean tvUnbind(TvUnBindBean resources) {
Boolean autoModel = resources.getAutoModel();
// 希望绑定的会员code
String bindMemberCode = resources.getBindMemberCode();
String platformAccount = resources.getPlatformAccount();
String memberCode = resources.getMemberCode();
UserTvDTO userTvDTO = this.findByPlatformAccount(platformAccount);
UserTvDTO userTvDTO = this.userTvService.findByPlatformAccount(platformAccount);
log.info("大屏解绑,通过大屏账号查询大屏账号信息,结果 userTvDTO ==>> {}", userTvDTO);
if (Objects.isNull(userTvDTO.getId()))
throw new EntityNotFoundException(UserTvDTO.class, "PlatformAccount", GlobeExceptionMsg.IPTV_IS_NULL);
if (Objects.isNull(userTvDTO.getId())) {
log.error("大屏解绑失败,无对应的大屏账号信息, platformAccount ==>> {}", platformAccount);
return false;
}
MemberDTO memberDTO = this.memberService.findByCode(memberCode);
log.info("大屏解绑,通过会员code查询会员信息,结果memberDTO==>>{}", memberDTO);
if (Objects.isNull(memberDTO.getId())) {
log.error("大屏解绑失败,无对应的会员信息, memberCode ==>> {}", memberCode);
return false;
}
// 解绑(置空大屏信息)
log.info("开始置空会员的user_iptv_id ==>> {}", memberDTO);
MemberDTO _memberDTO = this.minaUnbind_(memberDTO);
if (Objects.isNull(_memberDTO)) {
_memberDTO = memberDTO;
}
log.info("会员信息置空大屏的结果,_memberDTO ==>> {}", _memberDTO);
Member member = new Member();
member.setId(memberDTO.getId());
member.setCode(memberDTO.getCode());
member.setBindIptvTime(null);
member.setUserIptvId(null);
member.setBindIptvPlatformType(null);
log.info("置空会员绑定的大屏信息, member ==>> {}", member);
memberDTO = this.memberService.doUpdateMemberUserIptvIdAndBindIptvPlatformAndBindIptvTime(member);
log.info("会员信息置空大屏的结果,memberDTO ==>> {}", memberDTO);
memberDTO.setPlatformAccount(platformAccount);
// 置空主账号
log.info("开始置空大屏账号的主会员priorityMemberCode");
UserTvDTO _userTvDTO = this.resetMainAccount(memberCode, userTvDTO.getId(), autoModel, bindMemberCode);
if (Objects.isNull(_userTvDTO)){
_userTvDTO = userTvDTO;
if (StringUtils.isBlank(bindMemberCode)) {
UserTv userTv = new UserTv();
userTv.setId(userTvDTO.getId());
userTv.setPriorityMemberCode(null);
this.userTvService.doUpdatePriorityMemberCode(userTv);
UserTvDTO _userTvDTO = new UserTvDTO();
_userTvDTO.setPlatformAccount(platformAccount);
_userTvDTO.setPriorityMemberCode(null);
log.info("大屏账号置空主会员的结果,userTvDTO ==>> {}", _userTvDTO);
((UserOperationServiceImpl)AopContext.currentProxy()).asyncUnbind(new MemberAndUserTvDTO(memberDTO, _userTvDTO));
this.updateUserTvSimplePriorityMemberCodeRedis(platformAccount, "");
} else {
UserTv userTv = new UserTv();
userTv.setId(userTvDTO.getId());
userTv.setPriorityMemberCode(bindMemberCode);
// 绑定新的主账号
this.userTvService.doUpdatePriorityMemberCode(userTv);
UserTvDTO _userTvDTO = new UserTvDTO();
_userTvDTO.setPlatformAccount(platformAccount);
_userTvDTO.setPriorityMemberCode(bindMemberCode);
log.info("大屏账号置空主会员的结果,userTvDTO ==>> {}", userTvDTO);
((UserOperationServiceImpl)AopContext.currentProxy()).asyncUnbind(new MemberAndUserTvDTO(memberDTO, _userTvDTO));
this.updateUserTvSimplePriorityMemberCodeRedis(platformAccount, bindMemberCode);
}
log.info("大屏账号置空主会员的结果,_userTvDTO ==>> {}", _userTvDTO);
// 同步至iptv
log.info("开始同步解绑,参数 ==>> {} ",new MemberAndUserTvDTO(_memberDTO, _userTvDTO));
((UserOperationServiceImpl)AopContext.currentProxy()).asyncUnbind(new MemberAndUserTvDTO(_memberDTO, _userTvDTO));
return true;
}
......@@ -904,7 +1189,6 @@ public class UserOperationServiceImpl implements UserOperationService {
} else {
log.info("传过来的观影时间 ==>> {} 和今天的时间 ==>> {} 不相同,不做处理", userCollectionDetail.getCreateTime().getTime(),
new Date().toInstant().getEpochSecond());
continue;
}
}
......@@ -921,57 +1205,62 @@ public class UserOperationServiceImpl implements UserOperationService {
@Override
public boolean minaBind(BindBean resources) {
Long _memberId = resources.getMemberId();
Long memberId = resources.getMemberId();
String platformAccount = resources.getPlatformAccount();
// 大屏账户
UserTvDTO userTvDTO = this.userTvService.findByPlatformAccount(platformAccount);
log.info("查询大屏账号信息, userTvDTO ==>> {}", userTvDTO);
// 账户是否存在
if (Objects.isNull(userTvDTO.getId())) {
log.error("appletBind ==> platformAccount ==> [{}]",platformAccount);
throw new EntityNotFoundException(UserTvDTO.class,"id",GlobeExceptionMsg.IPTV_IS_NULL);
log.error("大屏账号信息不存在,platformAccount ==> {}",platformAccount);
return false;
}
resources.setPlatformUserId(userTvDTO.getId());
UserWeixinDTO userWeixinDTO = null;
// 微信账户
if (Objects.nonNull(_memberId)) {
userWeixinDTO = this.userWeixinService.findFirstByMemberId(_memberId);
}
if (Objects.nonNull(memberId)) {
UserWeixinDTO userWeixinDTO = this.userWeixinService.findFirstByMemberId(memberId);
log.info("检查小屏账号是否存在, userWeixinDTO ==>> {}", userWeixinDTO);
// 账户是否存在
if (Objects.isNull(userWeixinDTO.getId())) {
log.error("appletBind ==> weixinId ==> [{}]",userWeixinDTO.getId());
throw new EntityNotFoundException(UserWeixinDTO.class, "id", userWeixinDTO.getId().toString());
log.error("通过会员id无法找到对应的微信账号,memberId ==> {}", memberId);
return false;
}
// 会员
Long memberId = userWeixinDTO.getMemberId();
if (Objects.isNull(memberId)) {
log.error("appletBind ==> memberId ==> [{}]",memberId);
throw new EntityNotFoundException(UserWeixinDTO.class, "memberId", memberId.toString());
}
MemberDTO memberDTO = this.findMemberById(memberId);
MemberDTO memberDTO = this.memberService.findById(memberId);
log.info("检查会员是否存在, memberDTO ==>> {}", memberDTO);
if (Objects.nonNull(memberDTO.getId())) {
Long userIptvId = memberDTO.getUserIptvId();
if (Objects.nonNull(userIptvId))
if (Objects.nonNull(userIptvId)) {
log.error("该会员已绑定,大屏id ==> {}", userIptvId);
throw new BadRequestException(GlobeExceptionMsg.ALREADY_BIND);
}
} else {
log.error("会员信息不存在,请检查数据, memberId ==>> {}", memberId);
return false;
}
// 主账户会员
String code = memberDTO.getCode();
// 更新大屏信息,同步大屏信息时使用
userTvDTO.setMemberCode(code);
// 主账户
String priorityMemberCode = userTvDTO.getPriorityMemberCode();
if (StringUtils.isBlank(priorityMemberCode)) {
// 设置主账号
userTvDTO.setPriorityMemberCode(code);
priorityMemberCode = memberDTO.getCode();
log.info("大屏账号为绑定主账号,开始设置主会员 priorityMemberCode ==>> {}", priorityMemberCode);
UserTv userTv = new UserTv();
userTv.setId(userTvDTO.getId());
userTv.setPriorityMemberCode(priorityMemberCode);
// 更新大屏账户
this.userTvService.doUpdatePriorityMemberCode(userTv);
userTvDTO.setPriorityMemberCode(memberDTO.getCode());
}
Member member = new Member();
member.setId(memberDTO.getId());
member.setCode(memberDTO.getCode());
String platform = userTvDTO.getPlatform();
// 绑定IPTV平台 0:未知;1:电信;2:移动;3:联通
Integer bindIptvPlatformType = 0;
......@@ -987,66 +1276,42 @@ public class UserOperationServiceImpl implements UserOperationService {
if (UserConstant.platform_dx.contains(platform)) {
bindIptvPlatformType = PLATFORM_LIST[1];
}
memberDTO.setUserIptvId(userTvDTO.getId());
memberDTO.setBindIptvTime(TimestampUtil.now());
memberDTO.setBindIptvPlatformType(bindIptvPlatformType);
memberDTO.setPlatformAccount(platformAccount);
// 更新大屏账户
UserTvDTO _userTvDTO = this.doUpdateUserTv(userTvDTO);
member.setUserIptvId(userTvDTO.getId());
member.setBindIptvTime(TimestampUtil.now());
member.setBindIptvPlatformType(bindIptvPlatformType);
log.info("修改小屏会员对应的绑定关系,member ==>> {}", member);
// 修改会员信息
MemberDTO _memberDTO = this.doUpdateMemberByMemberDTO(memberDTO);
this.memberService.doUpdateMemberUserIptvIdAndBindIptvPlatformAndBindIptvTime(member);
memberDTO.setPlatformAccount(platformAccount);
log.info("发送绑定消息至大屏,memberDTO ==>> {} || userTvDTO ==>> {}", memberDTO, userTvDTO);
// 同步至iptv
((UserOperationServiceImpl)AopContext.currentProxy())
.asyncAppletBind(new MemberAndUserTvDTO(_memberDTO, _userTvDTO));
.asyncMinaBind(new MemberAndUserTvDTO(memberDTO, userTvDTO));
this.updateUserTvSimplePriorityMemberCodeRedis(platformAccount, memberDTO.getCode());
return true;
}
/**
*
* @param memberCode
* @param platformAccount
*/
@Override
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public void bind(String memberCode, String platformAccount) {
MemberDTO memberDTO = this.memberService.findByCode(memberCode);
this.bind(memberDTO,platformAccount);
public boolean appBind(BindBean resources) {
return this.minaBind(resources);
}
/**
*
* @param memberDTO
* @param userTvDTO
* @param resource 会员信息
* @param platformAccount 大屏账号
* @return UserTvDTO
*/
@Override
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public void bind(MemberDTO memberDTO, UserTvDTO userTvDTO) {
String platformAccount = userTvDTO.getPlatformAccount();
if (StringUtils.isBlank(platformAccount)) {
return;
}
// 绑定
this.bind(memberDTO,platformAccount);
}
/**
*
* @param memberDTO
* @param platformAccount
* @return
*/
@Override
public UserTvDTO bind(MemberDTO memberDTO, String platformAccount) {
log.info("bind start");
MemberDTO memberDTO1 = this.memberService.findByCode(memberDTO.getCode());
log.info("查询会员信息 ==>> {}", memberDTO1);
if (Objects.nonNull(memberDTO1.getUserIptvId())) {
UserTvDTO userTvDTO = this.userTvService.findById(memberDTO1.getUserIptvId());
return userTvDTO;
public UserTvDTO bind(MemberDTO resource, String platformAccount) {
log.info("bind start");
MemberDTO memberDTO = this.memberService.findByCode(resource.getCode());
log.info("查询会员信息 ==>> {}", memberDTO);
if (Objects.nonNull(memberDTO.getUserIptvId())) {
return this.userTvService.findById(memberDTO.getUserIptvId());
}
// 大屏账户
......@@ -1056,9 +1321,19 @@ public class UserOperationServiceImpl implements UserOperationService {
throw new BadRequestException(GlobeExceptionMsg.IPTV_IS_NULL);
}
// mq同步数据时使用
memberDTO.setPlatformAccount(platformAccount);
// 大屏是否绑定主账号,如果绑定了主账户则不操作大屏账户表
String priorityMemberCode = userTvDTO.getPriorityMemberCode();
if (StringUtils.isBlank(priorityMemberCode)) {
UserTv userTv = new UserTv();
userTv.setId(userTvDTO.getId());
userTv.setPriorityMemberCode(memberDTO.getCode());
this.userTvService.doUpdatePriorityMemberCode(userTv);
userTvDTO.setPriorityMemberCode(memberDTO.getCode());
}
Member member = new Member();
// 构建小屏会员对象,绑定user_iptv_id字段
String platform = userTvDTO.getPlatform();
// 绑定IPTV平台 0:未知;1:电信;2:移动;3:联通
......@@ -1075,327 +1350,69 @@ public class UserOperationServiceImpl implements UserOperationService {
if (UserConstant.platform_dx.contains(platform)) {
bindIptvPlatformType = PLATFORM_LIST[1];
}
memberDTO.setUserIptvId(userTvDTO.getId());
memberDTO.setBindIptvTime(TimestampUtil.now());
memberDTO.setBindIptvPlatformType(bindIptvPlatformType);
memberDTO.setPlatformAccount(platformAccount);
member.setUserIptvId(userTvDTO.getId());
member.setBindIptvTime(TimestampUtil.now());
member.setBindIptvPlatformType(bindIptvPlatformType);
member.setPlatformAccount(platformAccount);
// 大屏是否绑定主账号,如果绑定了主账户则不操作大屏账户表
UserTvDTO _userTvDTO = this.bondPriorityMember(userTvDTO, memberDTO.getCode(), "auto");
if (Objects.isNull(_userTvDTO)) {
_userTvDTO = userTvDTO;
}
// 修改会员
MemberDTO _memberDTO = this.doUpdateMemberByMemberDTO(memberDTO);
_memberDTO.setPlatformAccount(platformAccount);
this.memberService.doUpdateMemberUserIptvIdAndBindIptvPlatformAndBindIptvTime(member);
memberDTO.setPlatformAccount(platformAccount);
log.info("发送到大屏侧的消息对象 会员信息 ==>> {} || 账号信息 ==>> {}", _memberDTO , _userTvDTO);
// 同步至iptv
((UserOperationServiceImpl)AopContext.currentProxy()).asyncAppletBind(new MemberAndUserTvDTO(_memberDTO, _userTvDTO));
return null;
}
/**
*
* @param unionid
* @param appId
* @return
*/
private UserWeixinDTO findUserWeiXinByUnionIdAndAppId(String unionid, String appId) {
return this.userWeixinService.findFirstByUnionidAndAppid(unionid,appId);
}
/**
* 修改会员vip状态
*/
private MemberDTO doUpdateMemberVip(MemberDTO memberDTO,Integer vip1) {
if (memberDTO != null) {
Integer vip = memberDTO.getVip();
vip = (vip == null ? 0 : vip);
// 未购买付费会员
if (vip <= 1) {
memberDTO.setVip(vip1);
log.info("发送绑定消息至大屏侧, 会员信息 ==>> {} || 账号信息 ==>> {}", memberDTO , userTvDTO);
// 同步至大屏侧
((UserOperationServiceImpl)AopContext.currentProxy()).asyncMinaBind(new MemberAndUserTvDTO(memberDTO, userTvDTO));
Member member = new Member();
BeanUtils.copyProperties(memberDTO, member);
this.memberService.update(member);
this.updateUserTvSimplePriorityMemberCodeRedis(platformAccount, memberDTO.getCode());
return memberDTO;
}
return userTvDTO;
}
return null;
}
/**
* 获取小屏会员
* @param userWeixinDTO
* @return
*/
private MemberDTO findMemberByUserWeixinDTO(UserWeixinDTO userWeixinDTO) {
Long memberId = userWeixinDTO.getMemberId();
if (Objects.nonNull(memberId)) {
MemberDTO memberDTO = this.findMemberById(memberId);
return memberDTO;
private void updateUserTvSimplePriorityMemberCodeRedis(String platformAccount, String priorityMemberCode){
// 修改缓存中MemberSimple的大屏主账号信息,因为执行任务之前会去检查主会员d
UserTvSimpleDTO userTvSimpleDTO = this.userTvService.findSimpleByPlatformAccount(platformAccount);
if (Objects.nonNull(userTvSimpleDTO)) {
userTvSimpleDTO.setPriorityMemberCode(priorityMemberCode);
JSONObject hashMap = JSONObject.parseObject(JSON.toJSONString(userTvSimpleDTO), JSONObject.class);
this.redisUtils.set(RedisKeyConstants.cacheVisUserByPlatformAccount + "::" + platformAccount, hashMap);
}
return null;
}
/**
* 修改微信公众号关注状态
* @param status 0:取消关注 1:关注
*/
private UserWeixinDTO doUpdateUserWeiXinStatus(String appId, String openId, Integer status) {
UserWeixinDTO userWeixinDTO = this.userWeixinService.findFirstByAppIdAndOpenId(appId, openId);
if (Objects.nonNull(userWeixinDTO.getId())) {
userWeixinDTO.setStatus(status);
UserWeixin userWeixin = new UserWeixin();
BeanUtils.copyProperties(userWeixinDTO,userWeixin);
this.userWeixinService.update(userWeixin);
}
return userWeixinDTO;
}
/**
* 修改微信公众号关注状态
* @param status 0:取消关注 1:关注
*
* @param unionId 身份唯一标识
* @param appId 应用标识
* @return UserWeiXinDTO
*/
public UserWeixinDTO doUpdateUserWeiXinStatus(UserWeixinDTO userWeixinDTO, Integer status) {
userWeixinDTO.setStatus(status);
UserWeixin userWeixin = new UserWeixin();
BeanUtils.copyProperties(userWeixinDTO,userWeixin);
this.userWeixinService.update(userWeixin);
return userWeixinDTO;
private UserWeixinDTO findUserWeiXinByUnionIdAndAppId(String unionId, String appId) {
return this.userWeixinService.findFirstByUnionidAndAppid(unionId, appId);
}
/**
* 获取会员
* @param memberId
* @return
* @param memberId 会员id
* @return MemberDTO
*/
private MemberDTO findMemberById(Long memberId) {
MemberDTO memberDTO = this.memberService.findById(memberId);
return memberDTO;
}
/**
* 获取小屏会员
* @param appId
* @param openId
* @return
*/
private MemberDTO findMemberByAppIdAndOpenId(String appId, String openId) {
UserWeixinDTO userWeixinDTO = this.userWeixinService.findFirstByAppIdAndOpenId(appId,openId);
if (Objects.nonNull(userWeixinDTO)) {
Long memberId = userWeixinDTO.getMemberId();
return this.findMemberById(memberId);
}
return null;
}
/**
* 设置主会员
* @description 检查大屏账户有没有绑定小屏会员,如果没有绑定就将当前会员的code保存到大屏账户中
* @param userTvDTO
* @param memberCode
* @param auto manual:手动 auto:自动
*/
private UserTvDTO bondPriorityMember(UserTvDTO userTvDTO, String memberCode, String auto) {
if (auto.equalsIgnoreCase("auto")) {
// 主账户
String priorityMemberCode = userTvDTO.getPriorityMemberCode();
if (StringUtils.isNotEmpty(priorityMemberCode)) {
return null;
}
}
userTvDTO.setPriorityMemberCode(memberCode);
UserTv userTv = new UserTv();
BeanUtils.copyProperties(userTvDTO, userTv);
UserTvDTO _userTvDTO = this.updateUserTvUnsyncIptv(userTv);
return _userTvDTO;
}
/**
*
* @param userTv
* @return
*/
private UserTvDTO updateUserTvUnsyncIptv(UserTv userTv){
return this.userTvService.update(userTv);
}
/**
* 重置主账号
* @param memberCode 会员code
* @param id 大屏id
* @param autoModel true:自动设置主账号 false: 手动设置
*/
private UserTvDTO resetMainAccount(String memberCode, Long id, Boolean autoModel, String bindMemberCode) {
UserTvDTO userTvDTO = this.userTvService.findByPriorityMemberCode(memberCode);
log.info("大屏解绑,重置大屏账号的主会员,查看当前会员是否是主账号 ==>>memberCode ==>> {} || 大屏账号 ==>> userTvDTO ==>> {}", userTvDTO);
if (Objects.nonNull(userTvDTO.getId())) {
log.info("主账号存在");
if (StringUtils.isBlank(bindMemberCode)) {
// 有其他绑定的小程序会员,排除自己
/*List<MemberDTO> memberDTOList = this.memberService.findByUserIptvId(id);
log.info("后台指定一个默认主会员,通过大屏id查询到的绑定的小屏会员memberDTOList ==>> {}", memberDTOList);
if (!CollectionUtils.isEmpty(memberDTOList)) {
Long memberId = userTvDTO.getMemberId();
MemberDTO memberDTO1 = this.memberService.findById(memberId);
List<MemberDTO> collect =
memberDTOList.stream().filter(memberDTO ->
!memberDTO.getCode().equalsIgnoreCase(memberCode) &&
!memberDTO.getCode().equalsIgnoreCase(memberDTO1.getCode())).collect(Collectors.toList());
log.info("过滤掉当前需要解绑的会员以及绑定的大屏会员之后剩余的会员列表 ==>> {}", memberDTOList);
if (!CollectionUtils.isEmpty(collect)) {
// 按绑定时间倒排
collect.sort(new Comparator<MemberDTO>() {
@Override
public int compare(MemberDTO memberDTO, MemberDTO t1) {
return t1.getBindIptvTime().compareTo(memberDTO.getBindIptvTime());
}
});
// 绑定新的主账号
UserTvDTO _userTvDTO = this.bondPriorityMember(userTvDTO, memberDTOList.get(0).getCode(), "manual");
log.info("绑定新的主账号 ==>> _userTvDTO ==>> {}", _userTvDTO);
return _userTvDTO;
return this.memberService.findById(memberId);
}
} else {
log.info("无其他绑定的小屏会员信息 ");
// 绑定新的主账号
UserTvDTO _userTvDTO = this.bondPriorityMember(userTvDTO, null, "manual");
log.info("绑定新的主账号 ==>> _userTvDTO ==>> {}", _userTvDTO);
return _userTvDTO;
}*/
log.info("无其他绑定的小屏会员信息 ");
// 绑定新的主账号
UserTvDTO _userTvDTO = this.bondPriorityMember(userTvDTO, null, "manual");
log.info("绑定新的主账号 ==>> _userTvDTO ==>> {}", _userTvDTO);
return _userTvDTO;
} else {
this.memberService.findByCode(bindMemberCode);
// 绑定新的主账号
UserTvDTO _userTvDTO = this.bondPriorityMember(userTvDTO, bindMemberCode, "manual");
return _userTvDTO;
}
}
return userTvDTO;
}
/**
* 解绑(置空大屏信息)
* @param memberDTOS
*/
private MemberDTO minaUnbind_(MemberDTO memberDTOS) {
// 若无关系,不做处理
if (Objects.nonNull(memberDTOS) && Objects.isNull(memberDTOS.getUserIptvId()))
return null;
Member member = new Member();
memberDTOS.setBindIptvTime(null);
memberDTOS.setUserIptvId(null);
memberDTOS.setBindIptvPlatformType(null);
BeanUtils.copyProperties(memberDTOS, member);
log.info("大屏绑定,置空绑定的大屏信息, member ==>> {}", member);
MemberDTO memberDTO = this.memberService.update(member);
return memberDTO;
}
/**
*
* @param memberCode 会员编码
* @return
*/
private MemberDTO findMemberByCode(String memberCode) {
return memberService.findByCode(memberCode);
}
/**
* 修改会员
* @param memberDTO
*/
private MemberDTO doUpdateMemberByMemberDTO(MemberDTO memberDTO){
Member member = new Member();
BeanUtils.copyProperties(memberDTO,member);
member.setUpdateTime(TimestampUtil.now());
log.info("doUpdateMemberByMemberDTO=====?>>member ==>> [{}]",member);
return this.doUpdateMember(member);
}
/**
* 修改会员
* @param member
*/
private MemberDTO doUpdateMember(Member member){
return this.memberService.update(member);
}
/**
*
* @param unionId
* @return
* @param unionId 身份标识
* @return UserWeixinDTO
*/
private UserWeixinDTO findFirstByUnionId(String unionId) {
return this.userWeixinService.findFirstByUnionId(unionId);
}
/**
* 更新大屏
* @param userTvDTO
*/
private UserTvDTO doUpdateUserTv(UserTvDTO userTvDTO) {
UserTv userTv = new UserTv();
BeanUtils.copyProperties(userTvDTO,userTv);
userTv.setUpdateTime(TimestampUtil.now());
return this.userTvService.update(userTv);
}
/**
* 同一用户有多个微信APP的情况下展示同一个账户信息
* 原则:那个先创建就用那个id
* @param userWeixinDTO
* @param userWeixinDTO 微信信息
*/
private UserWeixinDTO getFirstId(UserWeixinDTO userWeixinDTO) {
String unionid = userWeixinDTO.getUnionid();
......@@ -1442,20 +1459,9 @@ public class UserOperationServiceImpl implements UserOperationService {
/**
* 获取小屏账户
* @param unionId
* @param appId
* @param openId
* @return
*/
private UserWeixinDTO findFirstByUnionIdAndAppIdAndOpenId(String unionId, String appId, String openId) {
return this.userWeixinService.findFirstByUnionIdAndAppIdAndOpenId(unionId,appId,openId);
}
/**
* 获取小屏账户
* @param appId
* @param openId
* @return
* @param appId 应用标识
* @param openId 应用唯一标识
* @return UserWeixinDTO
*/
private UserWeixinDTO findFirstByAppIdAndOpenId(String appId, String openId) {
return this.userWeixinService.findFirstByAppIdAndOpenId(appId, openId);
......@@ -1463,62 +1469,64 @@ public class UserOperationServiceImpl implements UserOperationService {
/**
*
* @param member
* @return
* @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;
}
/**
*
* @param resources
* @param memberId
* @return
* @param resources 大屏账号信息
* @param memberId 会员id
* @return UserTvDTO
*/
private UserTvDTO createTvUser(UserTv resources, Long memberId, String memberCode){
resources.setMemberId(memberId);
resources.setMemberCode(memberCode);
UserTvDTO userTvDTO = this.userTvService.create(resources);
return userTvDTO;
return this.userTvService.create(resources);
}
/**
*
* @param resource
* @param memberId
* @param memberCode
* @return
* @param resource 微信信息
* @param memberId 会员id
* @param memberCode 会员code
* @return UserWeixinDTO
*/
private UserWeixinDTO createWeixinUser(UserWeixin resource, Long memberId, String memberCode){
if (Objects.nonNull(memberId)) resource.setMemberId(memberId);
if (StringUtils.isNotBlank(memberCode)) resource.setMemberCode(memberCode);
UserWeixinDTO userWeixinDTO = this.userWeixinService.create(resource);
return userWeixinDTO;
return this.userWeixinService.create(resource);
}
/**
*
* @param memberDTO
* @return
* @param memberDTO 会员信息
* @return UserTvDTO
*/
@Override
public UserTvDTO checkBind(MemberDTO memberDTO) {
MemberDTO memberDTO1 = this.memberService.findByCode(memberDTO.getCode());
if (Objects.nonNull(memberDTO1.getUserIptvId())) {
UserTvDTO userTvDTO = this.userTvService.findById(memberDTO1.getUserIptvId());
return userTvDTO;
return this.userTvService.findById(memberDTO1.getUserIptvId());
}
return null;
}
/**
*
* @param platformAccount
* @return
* @param platformAccount 大屏账号
* @return UserTvDTO
*/
@Override
public UserTvDTO findByPlatformAccount(String platformAccount) {
......@@ -1526,27 +1534,92 @@ public class UserOperationServiceImpl implements UserOperationService {
}
@Override
public void minaUnbind(WeixinUnBindBean weixinUnBindBean) {
public ResultInfo minaUnbind(WeixinUnBindBean weixinUnBindBean) {
Long memberId = weixinUnBindBean.getMemberId();
MemberDTO memberDTO = this.memberService.findById(memberId);
if (Objects.isNull(memberDTO.getId())) {
log.error("小屏解绑失败,会员信息不存在, minaUnbind# ==>> {}", memberId);
return ResultInfo.failure("小屏解绑失败,当前会员信息不存在");
}
Assert.notNull(memberDTO.getUserIptvId(), GlobeExceptionMsg.IPTV_IS_NULL);
if (Objects.isNull(memberDTO.getUserIptvId())) {
log.error("小屏解绑失败,无绑定的大屏, memberId ==>> {}", memberId);
return ResultInfo.failure("小屏解绑失败,无绑定的大屏");
}
UserTvDTO userTvDTO = this.userTvService.findById(memberDTO.getUserIptvId());
if (Objects.isNull(userTvDTO.getPlatformAccount())) {
log.info("小屏解绑失败,绑定的大屏账号不存在 minaUnbind# ==>> userIptvId ==>> {}", memberDTO.getUserIptvId());
return ResultInfo.failure("小屏解绑失败,大屏信息不存在请联系客服");
}
// 解绑(置空大屏信息)
Member member = new Member();
member.setId(memberDTO.getId());
member.setCode(memberDTO.getCode());
member.setBindIptvTime(null);
member.setUserIptvId(null);
member.setBindIptvPlatformType(null);
log.info("置空会员绑定的大屏信息, member ==>> {}", member);
this.memberService.doUpdateMemberUserIptvIdAndBindIptvPlatformAndBindIptvTime(member);
log.info("会员信息置空大屏的结果,memberDTO ==>> {}", memberDTO);
// 有其他绑定的小程序会员,排除自己
List<MemberDTO> memberDTOS = this.memberService.findByUserIptvId(userTvDTO.getId());
log.info("后台指定一个默认主会员,通过大屏id查询到的绑定的小屏会员memberDTOList ==>> {}", memberDTOS);
if (!CollectionUtils.isEmpty(memberDTOS)) {
String oldMemberCode = memberDTO.getCode();
List<MemberDTO> collect =
memberDTOS.stream().filter(memberDTO_ ->
!memberDTO_.getCode().equalsIgnoreCase(oldMemberCode)).collect(Collectors.toList());
log.info("过滤掉当前会员 ==>> {}", collect);
if (!CollectionUtils.isEmpty(collect)) {
TvUnBindBean tvUnBindBean = new TvUnBindBean();
tvUnBindBean.setMemberId(memberId);
tvUnBindBean.setAutoModel(weixinUnBindBean.getAutoModel());
String platformAccount = userTvDTO.getPlatformAccount();
tvUnBindBean.setPlatformAccount(platformAccount);
this.tvUnbind(tvUnBindBean);
// 按绑定时间倒排
collect.sort((memberDTO1, t1) -> t1.getBindIptvTime().compareTo(memberDTO1.getBindIptvTime()));
// 绑定新的主账号
UserTv userTv = new UserTv();
userTv.setId(userTvDTO.getId());
userTv.setPlatform(userTvDTO.getPlatformAccount());
userTv.setPriorityMemberCode(collect.get(0).getCode());
this.userTvService.doUpdatePriorityMemberCode(userTv);
UserTvDTO _userTvDTO = new UserTvDTO();
_userTvDTO.setPlatformAccount(userTvDTO.getPlatformAccount());
_userTvDTO.setPriorityMemberCode(userTv.getPriorityMemberCode());
log.info("同步绑定信息至大屏侧, 参数 ==>> {}", new MemberAndUserTvDTO(memberDTO, _userTvDTO));
((UserOperationServiceImpl)AopContext.currentProxy()).asyncUnbind(new MemberAndUserTvDTO(memberDTO, _userTvDTO));
this.updateUserTvSimplePriorityMemberCodeRedis(userTvDTO.getPlatformAccount(), userTv.getPriorityMemberCode());
}
} else {
log.info("无其他绑定的小屏会员信息 ");
// 绑定新的主账号
UserTv userTv = new UserTv();
userTv.setId(userTvDTO.getId());
userTv.setPriorityMemberCode(null);
this.userTvService.doUpdatePriorityMemberCode(userTv);
UserTvDTO _userTvDTO = new UserTvDTO();
_userTvDTO.setPlatformAccount(userTvDTO.getPlatformAccount());
_userTvDTO.setPriorityMemberCode(null);
log.info("同步绑定信息至大屏侧, 参数 ==>> {}", new MemberAndUserTvDTO(memberDTO, _userTvDTO));
((UserOperationServiceImpl)AopContext.currentProxy()).asyncUnbind(new MemberAndUserTvDTO(memberDTO, _userTvDTO));
this.updateUserTvSimplePriorityMemberCodeRedis(userTvDTO.getPlatformAccount(), "");
}
return ResultInfo.success("解绑成功");
}
@Override
public UserWeixinDTO findById(Long userId) {
UserWeixinDTO userWeixinDTO = this.userWeixinService.findById(userId);
return userWeixinDTO;
return this.userWeixinService.findById(userId);
}
@Override
......@@ -1566,10 +1639,51 @@ public class UserOperationServiceImpl implements UserOperationService {
Long memberId = userTvDTO.getMemberId();
if (Objects.nonNull(memberId)) {
MemberDTO memberDTO = this.memberService.findById(memberId);
resources.setMemberCode(memberDTO.getCode());
userTvDTO.setMemberCode(memberDTO.getCode());
}
// 同步至iptv
((UserOperationServiceImpl)AopContext.currentProxy()).asyncUserTv(userTvDTO);
return userTvDTO;
}
@AsyncMqSend
public void asyncCreateUserAppBindThirdAccount(UserAppDTO userAppDTO) {}
@AsyncMqSend
public void asyncUpdateAppLastActiveTimeAndNicknameAndHeadImg(UserAppDTO userAppDTO) { }
@AsyncMqSend
public void asyncCancelUserAppBind(UserAppBindDTO userAppBindDTO) {}
@AsyncMqSend
public void asyncUpdatePasswordByUsername(UserAppDTO userAppDTO) {}
@AsyncMqSend
public void asyncUpdateAppInfo(UserAppDTO userAppDTO) {}
@AsyncMqSend
public void asyncAppCancellation(UserAppDTO userAppDTO) {}
@AsyncMqSend
public void asyncAppRegister(AppRegisterDTO appRegisterDTO) {}
@AsyncMqSend
public void asyncsaveGrowthReport(GrowthReport growthReport) {}
@AsyncMqSend
public void asyncMemberAndUserWeixin4Iptv(MemberAndWeixinUserDTO memberAndWeixinUserDTO) {}
@AsyncMqSend
public void asyncMemberAndUserTv4Iptv(MemberAndUserTvDTO memberAndUserTv) {}
@AsyncMqSend
public void asyncWeixin(UserWeixinDTO weixinDTO) {}
@AsyncMqSend
public void asyncUserTv(UserTvDTO userTvDTO) {}
@AsyncMqSend
public void asyncUserTvChangeMainAccount(UserTvDTO userTvDTO) {}
@AsyncMqSend
public void asyncMinaBind(MemberAndUserTvDTO memberAndUserTvDTO) {}
@AsyncMqSend
public void asyncUnbind(MemberAndUserTvDTO memberAndUserTvDTO) {}
@AsyncMqSend
public void asyncUnsubscribe(MemberAndWeixinUserDTO memberAndWeixinUserDTO) {}
@AsyncMqSend
public void asyncSubscribe(MemberAndWeixinUserDTO memberAndWeixinUserDTO) {}
}
......
......@@ -2,196 +2,176 @@ package com.topdraw.business.process.service.impl.member;
import cn.hutool.core.util.ObjectUtil;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.member.address.service.MemberAddressService;
import com.topdraw.business.module.member.address.service.dto.MemberAddressDTO;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.profile.domain.MemberProfile;
import com.topdraw.business.module.member.profile.service.MemberProfileService;
import com.topdraw.business.module.member.profile.service.dto.MemberProfileDTO;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.member.viphistory.domain.MemberVipHistory;
import com.topdraw.business.module.member.viphistory.service.MemberVipHistoryService;
import com.topdraw.business.module.task.domain.Task;
import com.topdraw.business.module.user.weixin.domain.UserWeixin;
import com.topdraw.business.module.member.viphistory.service.dto.MemberVipHistoryDTO;
import com.topdraw.business.module.user.weixin.service.UserWeixinService;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinDTO;
import com.topdraw.business.process.domian.weixin.BuyVipBean;
import com.topdraw.business.process.domian.member.MemberOperationBean;
import com.topdraw.business.process.service.member.MemberOperationService;
import com.topdraw.business.process.service.member.MemberProfileOperationService;
import com.topdraw.exception.EntityNotFoundException;
import com.topdraw.business.RedisKeyConstants;
import com.topdraw.util.TimestampUtil;
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.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.List;
import java.util.Objects;
@Service
//@CacheConfig(cacheNames = "member")
@Slf4j
@CacheConfig(cacheNames = RedisKeyConstants.cacheMemberById)
public class MemberOperationServiceImpl implements MemberOperationService {
@Autowired
private MemberService memberService;
@Autowired
private UserWeixinService userWeixinService;
@Autowired
private MemberProfileService memberProfileService;
@Autowired
private MemberVipHistoryService memberVipHistoryService;
@Autowired
private UserWeixinService userWeixinService;
@Autowired
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
private MemberAddressService memberAddressService;
@AsyncMqSend
public void asyncUpdateMemberVip(MemberDTO me) {}
public void asyncUpdateMemberVipAndVipExpireTime(MemberDTO memberDTO) {}
@AsyncMqSend
public void asyncCreateMemberVipHistory(MemberVipHistoryDTO memberVipHistoryDTO) {}
@AsyncMqSend
public void asyncDoUpdateGroupsBatch(List<Member> resources) {}
// @CachePut(key = "#resources.memberId")
@AsyncMqSend
@Override
public MemberDTO buyVipByUserId(BuyVipBean resources) {
// 小程序账户id
Long id = resources.getId();
// 查询微信账户
UserWeixinDTO userWeixin = this.findWeiXinById(id);
Long memberId = userWeixin.getMemberId();
resources.setMemberId(memberId);
return this.buyVipByMemberId(resources);
public MemberDTO update(Member resources) {
return this.memberService.update(resources);
}
@Override
public MemberDTO buyVipByMemberId(BuyVipBean resources) {
public MemberDTO findByCode(String code) {
return this.memberService.findByCode(code);
}
Timestamp vipExpireTime1 = resources.getVipExpireTime();
Integer vip1 = resources.getVip();
@Override
public MemberDTO doInsertMember(Member resources) {
return this.memberService.create(resources);
}
Long memberId = resources.getMemberId();
//
MemberDTO memberDTO = this.findById(memberId);
String memberCode = memberDTO.getCode();
Integer vip = memberDTO.getVip();
@Override
public MemberDTO findById(Long memberId) {
MemberDTO memberDTO = this.memberService.findById(memberId);
return Objects.nonNull(memberId) ? memberDTO : null;
}
//
Timestamp vipExpireTime = memberDTO.getVipExpireTime();
if (Objects.nonNull(vipExpireTime1)) {
vipExpireTime = vipExpireTime1;
@Override
public Integer doUpdateMemberExpAndLevel(Member resources) {
return this.memberService.doUpdateMemberExpAndLevel(resources);
}
//判断之前有没有买过,没买过,失效时间为一年后;
if (Objects.isNull(vipExpireTime1)) {
if (ObjectUtil.isNull(vipExpireTime)) {
LocalDateTime now = LocalDateTime.now();
vipExpireTime = TimestampUtil.localDateTime2Timestamp(now.plusYears(1L));
} else {
LocalDateTime localDateTime = TimestampUtil.timestamp2LocalDateTime(vipExpireTime).plusYears(1L);
vipExpireTime = TimestampUtil.localDateTime2Timestamp(localDateTime);
@Override
public Integer doUpdateMemberPoints(Member resources) {
return this.memberService.doUpdateMemberPoints(resources);
}
@Override
// @CachePut(cacheNames = RedisKeyConstants.cacheMemberByCode, key = "#member.code", unless = "#result.id == null")
public Integer doUpdateMemberCoupon(Member member) {
return this.memberService.doUpdateMemberCoupon(member);
}
memberDTO.setVip(vip1);
memberDTO.setVipExpireTime(vipExpireTime);
@Override
// @CachePut(cacheNames = RedisKeyConstants.cacheMemberById, key = "#member.id")
public MemberDTO doUpdateMemberVipAndVipExpireTime(Member resource) {
MemberDTO memberDTO1 = this.memberService.findByCode(resource.getCode());
Member member = new Member();
BeanUtils.copyProperties(memberDTO,member);
this.update(member);
member.setId(memberDTO1.getId());
member.setCode(memberDTO1.getCode());
member.setVip(resource.getVip());
member.setVipExpireTime(resource.getVipExpireTime());
MemberDTO memberDTO = this.memberService.doUpdateMemberVipAndVipExpireTime(member);
MemberVipHistory memberVipHistory = new MemberVipHistory();
memberVipHistory.setMemberId(memberId).setVip(vip1).setBeforeVip(vip);
if (ObjectUtil.equal(vip1,vip)) {
memberVipHistory.setStatus(1);
}
memberVipHistory.setMemberCode(memberCode);
memberVipHistory.setVipExpireTime(member.getVipExpireTime());
this.createVipHistory(memberVipHistory);
((MemberOperationServiceImpl) AopContext.currentProxy()).asyncUpdateMemberVipAndVipExpireTime(memberDTO);
return memberDTO;
}
@Override
public void createVipHistory(MemberVipHistory memberVipHistory){
this.memberVipHistoryService.create(memberVipHistory);
}
public MemberDTO doUpdateVipByMemberCode(MemberOperationBean resources) {
Integer nowVip = resources.getVip();
Long memberId = resources.getMemberId();
String memberCode = resources.getMemberCode();
Timestamp vipExpireTime = resources.getVipExpireTime();
@AsyncMqSend
@Override
public MemberDTO update(Member resources) {
MemberDTO memberDTO = this.memberService.update(resources);
return memberDTO;
}
MemberDTO memberDTO = this.memberService.findByCode(memberCode);
@Override
public MemberDTO findByCode(String code) {
return this.memberService.findByCode(code);
}
Integer vip = memberDTO.getVip();
private UserWeixinDTO findWeiXinById(Long id) {
UserWeixinDTO userWeixinDTO = this.userWeixinService.findById(id);
if (Objects.isNull(userWeixinDTO)) {
throw new EntityNotFoundException(UserWeixin.class, "id", userWeixinDTO.getId().toString());
}
Member member = new Member();
member.setId(memberDTO.getId());
member.setCode(memberCode);
member.setVip(nowVip);
member.setVipExpireTime(vipExpireTime);
return userWeixinDTO;
}
MemberDTO memberDTO_ = this.memberService.doUpdateMemberVipAndVipExpireTime(member);
@Override
public MemberDTO doUpdateMember(Member resources) {
Long id = resources.getId();
Assert.notNull(id,"ERROR MSG: MemberOperationServiceImpl -> doUpdateMemberInfo -> id not be null!!");
return this.update(resources);
}
((MemberOperationServiceImpl) AopContext.currentProxy()).asyncUpdateMemberVipAndVipExpireTime(memberDTO_);
// @CachePut(key = "#resources.id")
@Override
public MemberDTO doInsertMember(Member resources) {
return this.memberService.create(resources);
}
MemberVipHistory memberVipHistory = new MemberVipHistory();
memberVipHistory.setMemberId(memberId).setVip(nowVip).setBeforeVip(vip);
memberVipHistory.setMemberCode(memberCode);
memberVipHistory.setVipExpireTime(vipExpireTime);
MemberVipHistoryDTO memberVipHistoryDTO = this.memberVipHistoryService.create(memberVipHistory);
@Override
public MemberDTO findById(Long memberId) {
MemberDTO memberDTO = this.memberService.findById(memberId);
return Objects.nonNull(memberId) ? memberDTO : null;
((MemberOperationServiceImpl) AopContext.currentProxy()).asyncCreateMemberVipHistory(memberVipHistoryDTO);
return memberDTO_;
}
// @CachePut(key = "#resources.id")
@Override
public MemberDTO doUpdateMemberExpAndLevel(Member resources) {
return this.memberService.doUpdateMemberExpAndLevel(resources);
public Integer doUpdateGroupsBatch(List<Member> resources) {
Integer count = this.memberService.doUpdateGroupsBatch(resources);
if (count > 0) {
((MemberOperationServiceImpl) AopContext.currentProxy()).asyncDoUpdateGroupsBatch(resources);
}
// @CachePut(key = "#resources.id")
@Override
public MemberDTO doUpdateMemberPoints(Member resources) {
return this.memberService.doUpdateMemberPoints(resources);
return count;
}
// @CachePut(key = "#resources.id")
@Override
public MemberDTO doUpdateMemberCoupon(Member member) {
return this.memberService.doUpdateMemberCoupon(member);
public MemberAddressDTO updateDefaultMemberAddressById(Long id) {
MemberAddressDTO memberAddressDTO = this.memberAddressService.findById(id);
if (Objects.nonNull(memberAddressDTO.getId())) {
Long memberId = memberAddressDTO.getMemberId();
Integer _count = this.memberAddressService.updateUnDefaultMemberAddressByMemberId(memberId);
if (_count > 0) {
Integer count = this.memberAddressService.updateDefaultMemberAddressById(id);
if (count > 0 ) {
return this.memberAddressService.findById(id);
}
}
}
@Override
public MemberDTO updateMemberVip(Member member) {
MemberDTO memberDTO1 = this.memberService.findByCode(member.getCode());
Member member1 = new Member();
BeanUtils.copyProperties(memberDTO1, member1);
member1.setVip(member.getVip());
member1.setVipExpireTime(member.getVipExpireTime());
MemberDTO memberDTO = this.update(member1);
((MemberOperationServiceImpl) AopContext.currentProxy()).asyncUpdateMemberVip(memberDTO);
return memberDTO;
return null;
}
@Override
public MemberProfileDTO getMemberProfileAndCheckVip(Long memberId, String appid) {
public MemberProfileDTO getMemberProfileAndCheckVip(Long memberId, String appId) {
// 会员加密信息
MemberProfileDTO memberProfileDTO_0 = this.findMemberProfileByMemberId(memberId);
......@@ -200,13 +180,11 @@ public class MemberOperationServiceImpl implements MemberOperationService {
MemberDTO memberDTO = this.findById(memberId);
// 初始化会员加密信息
MemberProfileDTO memberProfileDTO_1 = this.configMemberProfile(memberProfileDTO_0,memberDTO,appid);
return memberProfileDTO_1;
return this.configMemberProfile(memberProfileDTO_0, memberDTO, appId);
}
private MemberProfileDTO configMemberProfile(MemberProfileDTO memberProfileDTO_0, MemberDTO memberDTO, String appid) {
private MemberProfileDTO configMemberProfile(MemberProfileDTO memberProfileDTO_0, MemberDTO memberDTO, String appId) {
if (Objects.isNull(memberProfileDTO_0)) return memberProfileDTO_0;
......@@ -218,18 +196,19 @@ public class MemberOperationServiceImpl implements MemberOperationService {
// 过期时间
Timestamp vipExpireTime = memberDTO.getVipExpireTime();
Long timeLong = 0L;
long timeLong = 0L;
if (ObjectUtil.isNotNull(vipExpireTime)) {
// 检查vip
MemberDTO memberDTO1 = this.checkVipStatus(memberDTO,vipExpireTime,appid);
MemberDTO memberDTO1 = this.checkVipStatus(memberDTO, vipExpireTime, appId);
// 更新会员信息
this.threadPoolTaskExecutor.execute(()->{
Member member = new Member();
BeanUtils.copyProperties(memberDTO1,member);
this.update(member);
});
member.setId(memberDTO1.getId());
member.setCode(memberDTO1.getCode());
member.setVip(memberDTO1.getVip());
member.setVipExpireTime(memberDTO1.getVipExpireTime());
this.doUpdateMemberVipAndVipExpireTime(member);
vip = memberDTO1.getVip();
Timestamp vipExpireTime1 = memberDTO1.getVipExpireTime();
......@@ -259,10 +238,10 @@ public class MemberOperationServiceImpl implements MemberOperationService {
* 1.当前vip如果过期则查看是否有vip历史变动
* 2.如果vip变动历史有记录则获取vip变动记录
* 3.如果vip没有记录则查看是否关注了公众号
* @param vipExpireTime
* @return
* @param vipExpireTime 过期时间
* @return MemberDTO
*/
private MemberDTO checkVipStatus(MemberDTO memberDTO,Timestamp vipExpireTime, String appid) {
private MemberDTO checkVipStatus(MemberDTO memberDTO,Timestamp vipExpireTime, String appId) {
Long memberId = memberDTO.getId();
Timestamp nowTime = TimestampUtil.now();
......@@ -271,16 +250,16 @@ public class MemberOperationServiceImpl implements MemberOperationService {
if (nowTime.compareTo(vipExpireTime) >= 0 ) {
Integer vip = 0;
Timestamp vipExpireTime1 = memberDTO.getVipExpireTime();
Timestamp vipExpireTime1;
//查询小于失效时间的那条记录 查不到 取微信表里 关注状态
MemberVipHistory memberVipHistory = this.memberVipHistoryService.findByTime(memberId, nowTime);
if (ObjectUtil.isNull(memberVipHistory.getId())) {
UserWeixinDTO userWeixin = this.userWeixinService.findFirstByMemberIdAndAppid(memberId, appid);
UserWeixinDTO userWeiXin = this.userWeixinService.findFirstByMemberIdAndAppid(memberId, appId);
// 微信公众号关注的状态 0:未关注 1:关注
Integer status = userWeixin.getStatus();
Integer status = userWeiXin.getStatus();
if (status != 1) vip = 0; else vip = 1;
vipExpireTime1 = null;
......@@ -300,8 +279,8 @@ public class MemberOperationServiceImpl implements MemberOperationService {
/**
* 查询会员加密信息
* @param memberId
* @return
* @param memberId 会员id
* @return MemberProfileDTO
*/
private MemberProfileDTO findMemberProfileByMemberId(Long memberId) {
return this.memberProfileService.findByMemberId(memberId);
......
......@@ -11,13 +11,11 @@ import com.topdraw.business.process.service.dto.MemberProfileAndMemberDTO;
import com.topdraw.business.process.service.member.MemberProfileOperationService;
import com.topdraw.exception.EntityExistException;
import com.topdraw.exception.EntityNotFoundException;
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.stereotype.Service;
import javax.validation.constraints.NotNull;
import java.util.Objects;
......@@ -39,25 +37,16 @@ public class MemberProfileOperationServiceImpl implements MemberProfileOperation
private MemberService memberService;
@AsyncMqSend
public void asyncMemberProfile(MemberProfileDTO memberProfileDTO){}
public void asyncUpdateMemberProfileAndSyncMember(MemberProfileAndMemberDTO memberProfileAndMemberDTO){}
@AsyncMqSend
public void asyncMemberProfileAndMember(MemberProfileAndMemberDTO memberProfileAndMemberDTO){}
@AsyncMqSend
public void asyncCreateMemberProfile(MemberProfileDTO memberProfileDTO) {}
@Override
public MemberProfileDTO update(MemberProfile resources) {
MemberProfileDTO memberProfileDTO = this.memberProfileService.update(resources);
memberProfileDTO.setMemberCode(resources.getMemberCode());
((MemberProfileOperationServiceImpl) AopContext.currentProxy()).asyncMemberProfile(memberProfileDTO);
return memberProfileDTO;
}
public void asyncCreateMemberProfileAndSyncMember(MemberProfileDTO memberProfileDTO) {}
@Override
public MemberProfileDTO updateMemberProfileAndMember(MemberProfile resources) {
Long id = resources.getId();
MemberProfileDTO _memberProfile = this.memberProfileService.findById(id);
Long memberId = _memberProfile.getMemberId();
MemberProfileDTO memberProfile = this.memberProfileService.findById(id);
Long memberId = memberProfile.getMemberId();
resources.setMemberId(memberId);
MemberDTO memberDTO = this.memberService.checkMember(resources.getMemberId(), resources.getMemberCode());
......@@ -68,7 +57,7 @@ public class MemberProfileOperationServiceImpl implements MemberProfileOperation
memberProfileDTO.setMemberCode(memberDTO.getCode());
((MemberProfileOperationServiceImpl)AopContext.currentProxy())
.asyncMemberProfileAndMember(new MemberProfileAndMemberDTO(memberProfileDTO, memberDTO));
.asyncUpdateMemberProfileAndSyncMember(new MemberProfileAndMemberDTO(memberProfileDTO, memberDTO));
return memberProfileDTO;
}
......@@ -88,7 +77,7 @@ public class MemberProfileOperationServiceImpl implements MemberProfileOperation
this.createMemberProfileAndSyncMember(memberProfileDTO, memberDTO);
((MemberProfileOperationServiceImpl) AopContext.currentProxy()).asyncCreateMemberProfile(memberProfileDTO);
((MemberProfileOperationServiceImpl) AopContext.currentProxy()).asyncCreateMemberProfileAndSyncMember(memberProfileDTO);
} else {
......@@ -111,12 +100,13 @@ public class MemberProfileOperationServiceImpl implements MemberProfileOperation
}
private void syncMember(MemberProfileDTO memberProfileDTO, MemberDTO memberDTO) {
memberDTO.setAvatarUrl(memberProfileDTO.getAvatarUrl());
memberDTO.setNickname(memberProfileDTO.getRealname());
memberDTO.setGender(memberProfileDTO.getGender());
Member member = new Member();
BeanUtils.copyProperties(memberDTO, member);
this.memberService.update(member);
member.setId(memberDTO.getId());
member.setCode(memberDTO.getCode());
member.setAvatarUrl(memberProfileDTO.getAvatarUrl());
member.setNickname(memberProfileDTO.getRealname());
member.setGender(memberProfileDTO.getGender());
this.memberService.doUpdateMemberAvatarUrlAndNicknameAndGender(member);
}
......
package com.topdraw.business.process.service.member;
import com.topdraw.business.module.member.address.service.dto.MemberAddressDTO;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.profile.service.dto.MemberProfileDTO;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.member.viphistory.domain.MemberVipHistory;
import com.topdraw.business.process.domian.member.MemberOperationBean;
import com.topdraw.business.process.domian.weixin.BuyVipBean;
import java.util.List;
public interface MemberOperationService {
/**
......@@ -31,64 +35,49 @@ public interface MemberOperationService {
MemberProfileDTO getMemberProfileAndCheckVip(Long memberId, String appid);
/**
*
* 修改会员
* @param resources
* @return
*/
MemberDTO buyVipByUserId(BuyVipBean resources);
MemberDTO update(Member resources);
/**
*
* @param resources
* @return
*/
MemberDTO buyVipByMemberId(BuyVipBean resources);
MemberDTO doInsertMember(Member resources);
/**
*
* @param memberVipHistory
*/
void createVipHistory(MemberVipHistory memberVipHistory);
/**
* 修改会员
* @param resources
*/
MemberDTO update(Member resources);
Integer doUpdateMemberExpAndLevel(Member resources);
/**
*
* @param resources
*/
MemberDTO doUpdateMember(Member resources);
Integer doUpdateMemberPoints(Member resources);
/**
*
* @param resources
*/
MemberDTO doInsertMember(Member resources);
Integer doUpdateMemberCoupon(Member resources);
/**
*
* @param resources
* @param member
*/
MemberDTO doUpdateMemberExpAndLevel(Member resources);
MemberDTO doUpdateMemberVipAndVipExpireTime(Member member);
/**
*
* @param resources
*/
MemberDTO doUpdateMemberPoints(Member resources);
MemberDTO doUpdateVipByMemberCode(MemberOperationBean resources);
/**
*
* @param resources
*/
MemberDTO doUpdateMemberCoupon(Member resources);
/**
*
* @param member
*/
MemberDTO updateMemberVip(Member member);
Integer doUpdateGroupsBatch(List<Member> resources);
MemberAddressDTO updateDefaultMemberAddressById(Long memberId);
}
......
......@@ -6,12 +6,6 @@ import com.topdraw.business.module.member.profile.service.dto.MemberProfileDTO;
public interface MemberProfileOperationService {
/**
* 修改
* @param resources
*/
MemberProfileDTO update(MemberProfile resources);
/**
* 修改会员属性并同步会员信息
* @param resources
*/
......
package com.topdraw.mq.config;
package com.topdraw.config;
import org.apache.commons.lang3.StringUtils;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
......@@ -12,35 +14,35 @@ public class RabbitMqConfig {
public static final String UCE_EXCHANGE = "uce.exchange";
public static final String UCE_QUEUE = "uce.queue";
@Value("${service.mq.exchange}")
private String exchange;
@Autowired
private RabbitTemplate rabbitTemplate;
@Value("${service.mq.queue}")
private String queue;
public String getExchange() {
public String getExchange(){
if (StringUtils.isEmpty(this.exchange)) {
this.exchange = UCE_EXCHANGE;
String exchange = this.rabbitTemplate.getExchange();
if (StringUtils.isNotBlank(exchange)) {
return exchange;
}
return this.exchange;
return UCE_EXCHANGE;
}
public String getQueue() {
if (StringUtils.isEmpty(this.queue)) {
this.queue = UCE_QUEUE;
String queue = this.rabbitTemplate.getRoutingKey();
if (StringUtils.isNotBlank(queue)) {
return queue;
}
return this.queue;
return UCE_QUEUE;
}
@Bean
DirectExchange directExchange(){
return ExchangeBuilder.directExchange(getExchange()).build();
return ExchangeBuilder.directExchange(this.getExchange()).build();
}
@Bean
Queue queue(){ return new Queue(getQueue()); }
Queue queue(){ return new Queue(this.getQueue()); }
@Bean
Binding binding(DirectExchange directExchange , Queue queue) {
......
package com.topdraw.config;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.stereotype.Component;
@Component
public class ScheduledTaskConfig {
}
package com.topdraw.config;
import cn.hutool.core.util.ObjectUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class ServiceEnvConfig {
// uc两侧部署,需配置位于哪一侧 mobile小屏侧 vis大屏侧
public static String UC_SERVICE_TYPE;
@Value("${uc.service.type:mobile}")
public void setUcServiceType(String ucServiceType) {
UC_SERVICE_TYPE = ucServiceType;
}
public static boolean isMobile() {
return ObjectUtil.equals(UC_SERVICE_TYPE, LocalConstants.ENV_MOBILE);
}
public static boolean isVis() {
return ObjectUtil.equals(UC_SERVICE_TYPE, LocalConstants.ENV_VIS);
}
}
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:16}")
private Integer corePoolSize;
@Value("${task.pool.core-pool-size:35}")
private Integer maxPoolSize;
@Value("${task.pool.keep-alive-seconds:10}")
private Integer keepAliveSeconds;
@Value("${task.pool.queue-capacity:300}")
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 cn.hutool.core.map.MapUtil;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.CollectionUtils;
import javax.naming.ConfigurationException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Configuration
@Data
@ConfigurationProperties(prefix = "wechat", ignoreInvalidFields = true)
public class WechatConfig {
private Map<String, String> miniprogram;
private Map<String, String> subscribe;
public List<Map<String, String>> getWechatAppList() throws ConfigurationException {
Map<String, String> miniprogram = this.miniprogram;
Map<String, String> subscribe = this.subscribe;
List<Map<String, String>> list = new ArrayList<>();
if (MapUtil.isNotEmpty(miniprogram)) {
list.add(miniprogram);
}
if (MapUtil.isNotEmpty(subscribe)) {
list.add(subscribe);
}
if (CollectionUtils.isEmpty(list)) {
throw new ConfigurationException("配置错误,未配置微信应用");
}
return list;
}
}
package com.topdraw.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.List;
import java.util.Map;
@Configuration
@Data
@ConfigurationProperties(prefix = "weixin")
public class WeixinInfoConfig {
private List<Map<String, String>> list;
}
......@@ -6,7 +6,6 @@ import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.sql.Timestamp;
import java.time.LocalDateTime;
/**
......@@ -23,38 +22,10 @@ public class DataSyncMsg implements Serializable {
// 具体事件 行为事件类型 1:登录;2:观影;3:参与活动;4:订购;10:跨屏绑定;11:积分转移;30:积分兑换商品;98:系统操作;99:其他
private Integer event;
//设备类型 1:大屏;2:小屏(微信)3.小屏(xx)
@NotNull
private Integer deviceType;
// 发送时间
private LocalDateTime time;
// 消息体
private String msgData;
/**
* 消息体
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class MsgData {
private String remarks; //备注
@NotNull
private Integer event; // 具体事件 行为事件类型 1:登录;2:观影;3:参与活动;4:订购;10:跨屏绑定;11:积分转移;30:积分兑换商品;98:系统操作;99:其他
@NotNull
private Long memberId; // 会员id
private Long userId; // 账户id
@NotNull
private Integer deviceType; //设备类型 1:大屏;2:小屏(微信)3.小屏(xx)
@NotNull
private String appCode; //用户对应的应用code
private String memberCode;
private Long accountId; // 账号id
private Long orderId;
private Long activityId;
private Long mediaId;
private Long itemId;
private String param;
private String description;
}
}
......
package com.topdraw.mq.producer;
import com.topdraw.business.process.service.impl.PointsOperationServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
......@@ -57,4 +59,5 @@ public class MessageProducer {
amqpTemplate.convertAndSend(exchange, queue, msg);
log.info("send sendMessage msg || exchange: {} || queue: {} || msg:{} ", exchange, queue, msg);
}
}
......
package com.topdraw.security;
package com.topdraw.util;
import com.alibaba.fastjson.JSONObject;
import com.topdraw.utils.StringUtils;
......
package com.topdraw.util;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Base64Utils;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.regex.Pattern;
public class Base64Util {
......@@ -10,10 +14,32 @@ public class Base64Util {
return name1;
}
public static boolean isBase64(String str) {
if (StringUtils.isBlank(str)) {
return false;
}
String base64Pattern = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$";
boolean matches = Pattern.matches(base64Pattern, str);
if (matches) {
String decodeBase64Str = new String(Base64Utils.decode(str.getBytes()));
String encodeBase64Str = Base64Utils.encodeToString(decodeBase64Str.getBytes());
if (str.equals(encodeBase64Str)) {
return true;
}
}
return false;
}
public static void main(String[] args) {
// String name = "test005@itv";
String name = "18580619168a@iptv";
String encode = encode(name);
System.out.println(encode);
// String name = "18580619168a@iptv";
// String encode = encode(name);
// System.out.println(encode);
boolean a = isBase64("fdsfdsf");
System.out.println(a);
}
}
......
package com.topdraw.util;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.temporal.TemporalAdjusters;
import java.time.temporal.TemporalUnit;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
......@@ -174,6 +174,29 @@ public class DateUtil {
return calendar.getTimeInMillis();
}
public static String getWeekFirstDay() {
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar1=Calendar.getInstance();
calendar1.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println("本周一: "+sdf.format(calendar1.getTime()));
return sdf.format(calendar1.getTime());
}
public static String getWeekLastDay() {
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar1=Calendar.getInstance();
calendar1.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
calendar1.add( Calendar.DAY_OF_MONTH,1);
System.out.println("本周日: "+sdf.format(calendar1.getTime()));
return sdf.format(calendar1.getTime());
}
/**
* 时间戳转字符串
*
......@@ -188,6 +211,10 @@ public class DateUtil {
}
public static void main(String[] args) {
String weekFirstDay = getWeekFirstDay();
System.out.println(weekFirstDay);
String weekLastDay = getWeekLastDay();
System.out.println(weekLastDay);
/*Long currentTime = System.currentTimeMillis();
System.out.println("Current Time : " + currentTime + " = " + timestampToStr(currentTime, "GMT+8"));
Long dailyStart = getDailyStartTime(currentTime, "GMT+8:00");
......@@ -201,7 +228,8 @@ public class DateUtil {
System.out.println("Month Start : " + monthStart + " = " + timestampToStr(monthStart, "GMT+8") + " Month End : " + monthEnd + " = " + timestampToStr(monthEnd, "GMT+8"));
System.out.println("Year Start : " + yearStart + " = " + timestampToStr(yearStart, "GMT+8") + " Year End : " + yearEnd + " = " + timestampToStr(yearEnd, "GMT+8"));
*/
LocalDateTime lastDateTimeCurrentYear = getLastDateTimeSecondYear();
// LocalDateTime lastDateTimeCurrentYear = getLastDateTimeSecondYear();
}
}
......
package com.topdraw.util;
/*
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.UUID;
import org.afflatus.utility.AppConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.aliyun.mns.client.CloudAccount;
import com.aliyun.mns.client.CloudTopic;
import com.aliyun.mns.client.MNSClient;
import com.aliyun.mns.common.ServiceException;
import com.aliyun.mns.model.BatchSmsAttributes;
import com.aliyun.mns.model.MessageAttributes;
import com.aliyun.mns.model.RawTopicMessage;
import com.aliyun.mns.model.TopicMessage;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
*/
public class MsgUtil {
// private static Logger log = LoggerFactory.getLogger(MsgUtil.class.getName());
/* private static final String ACCESSID = AppConfiguration.get("MESSAGE.ACCESSID");
private static final String ACCESSKEY = AppConfiguration.get("MESSAGE.ACCESSKEY");
private static final String MNSENDPOINT = AppConfiguration.get("MESSAGE.MNSENDPOINT");
private static final String TOPIC = AppConfiguration.get("MESSAGE.TOPIC");
private static final String SIGNNAME = AppConfiguration.get("MESSAGE.SIGNNAME");
private static final String TEMPLATECODE = AppConfiguration.get("MESSAGE.TEMPLATECODE");
private static final String REGION = AppConfiguration.get("MESSAGE.REGION");
public static String generateVerifyCodeAndSend(String verifyKey, String phone) {
String verifyCode;
try {
verifyCode = getRandom(4);
} catch (NoSuchAlgorithmException e) {
verifyCode = "8673";
}
// sendMsg(phone, ":" + verifyCode + ",序号:" + verifyKey);
sendMsg2(phone, verifyCode);
return verifyCode;
}*/
public static void sendMsg(String phone, String verifyCode) {
/**
* Step 1. 获取主题引用
*/
/*CloudAccount account = new CloudAccount(ACCESSID, ACCESSKEY, MNSENDPOINT);
MNSClient client = account.getMNSClient();
CloudTopic topic = client.getTopicRef(TOPIC);*/
/**
* Step 2. 设置SMS消息体(必须)
*
* 注:目前暂时不支持消息内容为空,需要指定消息内容,不为空即可。
*/
/*RawTopicMessage msg = new RawTopicMessage();
msg.setMessageBody("sms-message");*/
/**
* Step 3. 生成SMS消息属性
*/
/*MessageAttributes messageAttributes = new MessageAttributes();
BatchSmsAttributes batchSmsAttributes = new BatchSmsAttributes();
// 3.1 设置发送短信的签名(SMSSignName)
batchSmsAttributes.setFreeSignName(SIGNNAME);
// 3.2 设置发送短信使用的模板(SMSTempateCode)
batchSmsAttributes.setTemplateCode(TEMPLATECODE);
// 3.3 设置发送短信所使用的模板中参数对应的值(在短信模板中定义的,没有可以不用设置)
BatchSmsAttributes.SmsReceiverParams smsReceiverParams = new BatchSmsAttributes.SmsReceiverParams();
smsReceiverParams.setParam("code", verifyCode);
// 3.4 增加接收短信的号码
batchSmsAttributes.addSmsReceiver(phone, smsReceiverParams);
messageAttributes.setBatchSmsAttributes(batchSmsAttributes);*/
// try {
/**
* Step 4. 发布SMS消息
*/
/*TopicMessage ret = topic.publishMessage(msg, messageAttributes);
log.info("sendMsg | MessageId: " + ret.getMessageId() + " MessageMD5: " + ret.getMessageBodyMD5());
} catch (ServiceException se) {
System.out.println(se.getErrorCode() + se.getRequestId());
System.out.println(se.getMessage());
se.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
client.close();
}*/
}
public static void sendMsg2(String phone, String verifyCode) {
/*
try {
// 设置超时时间-可自行调整
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
// 初始化ascClient需要的几个参数
final String product = "Dysmsapi";// 短信API产品名称(短信产品名固定,无需修改)
final String domain = "dysmsapi.aliyuncs.com";// 短信API产品域名(接口地址固定,无需修改)
// 替换成你的AK
final String accessKeyId = ACCESSID;// 你的accessKeyId,参考本文档步骤2
final String accessKeySecret = ACCESSKEY;// 你的accessKeySecret,参考本文档步骤2
// 初始化ascClient,暂时不支持多region(请勿修改)
IClientProfile profile = DefaultProfile.getProfile(REGION, accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint(REGION, REGION, product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
// 组装请求对象
SendSmsRequest request = new SendSmsRequest();
// 使用post提交
request.setMethod(MethodType.POST);
// 必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
request.setPhoneNumbers(phone);
// 必填:短信签名-可在短信控制台中找到
request.setSignName(SIGNNAME);
// 必填:短信模板-可在短信控制台中找到
request.setTemplateCode(TEMPLATECODE);
// 可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
// 友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败
request.setTemplateParam("{\"code\":\"" + verifyCode + "\"}");
// 可选-上行短信扩展码(扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段)
// request.setSmsUpExtendCode("90997");
// 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
request.setOutId(UUID.randomUUID().toString().replaceAll("-", ""));
// 请求失败这里会抛ClientException异常
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
if (null != sendSmsResponse) {
log.info("sendMsg | RequestId: " + sendSmsResponse.getRequestId() + " Code: "
+ sendSmsResponse.getCode() + " Message: " + sendSmsResponse.getMessage());
}
if (sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
// 请求成功
}
} catch (Exception e) {
e.printStackTrace();
} finally {
}
*/
}
/*public static String getRandom(int count) throws NoSuchAlgorithmException {
StringBuilder sb = new StringBuilder();
String str = "0123456789";
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
for (int i = 0; i < count; i++) {
int num = sr.nextInt(str.length());
sb.append(str.charAt(num));
str = str.replace(("" + str.charAt(num)), "");
}
return sb.toString();
}
*/
}
package com.topdraw.util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/6/29 15:10
* @version: :
* @modified By:
* @since : modified in 2022/6/29 15:10
*/
public class RegexUtil {
public static boolean mobileRegex(String mobile){
// String pattern = "0?(13|14|15|17|18|19)[0-9]{9}";
String pattern = "^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}$";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(mobile);
return m.find();
}
public static boolean appPasswordRegex(String password) {
String pattern = "^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,25}$";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(password);
return m.find();
}
}
package com.topdraw.weixin.beans;
import lombok.Data;
@Data
public class ActionInfo {
private Scene scene;
}
package com.topdraw.weixin.beans;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
@Data
public class QrCode {
@JSONField(name = "action_name")
private String actionName;
@JSONField(name = "expire_seconds")
private Integer expireSeconds;
@JSONField(name = "action_info")
private ActionInfo actionInfo;
}
package com.topdraw.weixin.beans;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
@Data
public class Scene {
@JSONField(name = "scene_id")
private Long sceneId;
@JSONField(name = "scene_str")
private String sceneStr;
}
package com.topdraw.weixin.beans;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import java.util.Map;
@Data
public class WeiXinNotice {
@JSONField(serialize=false)
private String appid;
@JSONField(serialize=false)
private Long userId;
//目标用户
@JSONField(name = "touser")
private String toUser;
// 模板code
@JSONField(serialize=false)
private String code;
// 模板id
@JSONField(name = "template_id")
private String templateId;
// 点击通知跳转页面
private String page;
// 小程序版本
@JSONField(name = "miniprogram_state")
private String miniprogramState;
// 填充数据
private Map<String, Object> data;
}
package com.topdraw.weixin.service;
public class WeChatConstants {
// 订阅号
public static final String WX_SUBSCRIPTION = "subscription";
}
package com.topdraw.weixin.util;
public class WeChatConstants {
public static String HTTPS_AUTHORIZE_WITH_SNSAPI_USERINFO = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
public static final String HTTPS_TOKEN = "https://api.weixin.qq.com/cgi-bin/token";
public static final String HTTPS_TICKET_GETTICKET = "https://api.weixin.qq.com/cgi-bin/ticket/getticket";
public static final String HTTPS_SNS_OAUTH2_ACCESS_TOKEN = "https://api.weixin.qq.com/sns/oauth2/access_token";
public static final String HTTPS_SNS_USERINFO = "https://api.weixin.qq.com/sns/userinfo";
public static final String CODE2SESSION = "https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code";
/**
* 把媒体文件上传到微信服务器。目前仅支持图片。用于发送客服消息或被动回复用户消息。
*/
public static String UPLOAD_URL = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token={0}&type=image";
/**
* 获取客服消息内的临时素材。即下载临时的多媒体文件。
*/
public static String GET_MEDIA = "https://api.weixin.qq.com/cgi-bin/media/get?access_token={0}&media_id={1}";
/**
* 用于向微信服务端申请二维码的url
*/
public static String URL_QR_CODE = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token={0}";
/**
* 用于聊天时向用户发送消息的url
*/
public static String CUSTOM_SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={0}";
/**
* 发送小程序订阅消息
*/
public static final String SUBSCRIBE_SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token={0}";
/**
* 生成带参数二维码
*/
public static final String QR_CODE_URL = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={0}";
/**
* 获取用户基本信息
*/
public static final String GET_USER_INFO = "https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&openid={1}&lang=zh_CN";
// 批量获取关注者列表
public static final String GET_USER_LIST = "https://api.weixin.qq.com/cgi-bin/user/get?access_token={0}&next_openid={1}";
/**
* 成功
*/
public static String SUCCESS = "SUCCESS";
/**
* 微信系统错误
*/
public static String SYSTEMERROR = "SYSTEMERROR";
/**
* 失败 (注意:微信有的接口返回的失败用FAIL字符串表示,有的接口用FAILED表示)
*/
public static String FAIL = "FAIL";
/**
* 微信企业付款到个人失败 (注意:微信有的接口返回的失败用FAIL字符串表示,有的接口用FAILED表示)
*/
public static String FAILED = "FAILED";
public static String ACCESS_TOKEN = "access_token";
public static String ERR_CODE = "errcode";
/**
* 微信请求时,返回ACCESS_TOKEN错误码
*/
public static final String ACCESS_TOKEN_INVALID_CODE = "40001";
/**
* 文本消息
*/
public static String MSG_TYPE_TEXT = "text";
public static String MSG_TYPE_MINIPROGRAMPAGE = "miniprogrampage";
public static String MSG_TYPE_LINK = "link";
public static String MSG_TYPE_IMAGE = "image";
/**
* 事件消息
*/
public static String MSG_TYPE_EVENT = "event";
/**
* 二维码类型,临时的整型参数值
*/
public static String QR_SCENE = "QR_SCENE";
/**
* 二维码类型,临时的字符串参数值
*/
public static String QR_STR_SCENE = "QR_STR_SCENE";
/**
* 二维码类型,永久的整型参数值
*/
public static String QR_LIMIT_SCENE = "QR_LIMIT_SCENE";
/**
* 二维码类型,永久的字符串参数值
*/
public static String QR_LIMIT_STR_SCENE = "QR_LIMIT_STR_SCENE";
/******** 事件推送事件类型BEGIN********/
/**
* 取消订阅
*/
public static final String EVENT_UNSUBSCRIBE = "unsubscribe";
/**
* 订阅
*/
public static final String EVENT_SUBSCRIBE = "subscribe";
/**
* 扫描带参数二维码事件,用户已关注时的事件推送
*/
public static final String EVENT_SCAN = "SCAN";
/**
* 上报地理位置事件
*/
public static final String EVENT_LOCATION = "LOCATION";
/**
* 自定义菜单事件
*/
public static final String EVENT_CLICK = "CLICK";
/******** 事件推送事件类型END********/
/**
* 微信ACCESS_TOKEN缓存KEY
*/
public static final String TOKEN_KEY = "GLOBAL_WX_ACCESS_TOKEN_";
/**
* 微信临时素材缓存KEY
*/
public static final String WEIXIN_MEDIA_KEY = "WEIXIN_MEDIA_KEY_";
// 微信应用类型 小程序 服务号 订阅号
// 小程序
public static final String WX_APPLET = "applet";
// 服务号
public static final String WX_SERVICE = "service";
// 订阅号
public static final String WX_SUBSCRIPTION = "subscription";
}
package com.topdraw.weixin.util;
import com.topdraw.config.WeixinInfoConfig;
import com.topdraw.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@Component
@Slf4j
public class WeixinUtil {
private static WeixinInfoConfig WEIXININFOCONFIG;
@Autowired
public void setWeixinInfoConfig(WeixinInfoConfig weixinInfoConfig) {
WEIXININFOCONFIG = weixinInfoConfig;
}
public static Map<String, String> getWeixinInfoByAppid(String appid) {
if (StringUtils.isBlank(appid)) {
throw new RuntimeException("wxAppid can not be null");
}
List<Map<String, String>> list = WEIXININFOCONFIG.getList();
Optional<Map<String, String>> weixinInfoOptional = list.stream().filter(o -> o.get("appid").equals(appid)).findFirst();
if (!weixinInfoOptional.isPresent()) {
throw new RuntimeException("wxAppid error, appid is : " + appid);
}
return weixinInfoOptional.get();
}
public static Map<String, String> getWeixinInfoByIndex(Integer index) {
List<Map<String, String>> list = WEIXININFOCONFIG.getList();
if (list.size() < index + 1) {
throw new RuntimeException("wxinfo error, index out of range : {}" + index);
}
return list.get(index);
}
/**
* 使用SHA1算法对字符串数组进行加密
*
* @param strList
* @return
*/
public static String encodeUsingSHA1(String... strList) {
//将strList的值进行字典排序
Arrays.sort(strList);
StringBuilder content = new StringBuilder();
for (int i = 0; i < strList.length; i++) {
content.append(strList[i]);
}
return doEncodeUsingSHA1(content.toString());
}
/**
* SHA1实现
*
* @return sha1加密后的字符串
*/
private static String doEncodeUsingSHA1(String inStr) {
byte[] byteArray ;
try {
MessageDigest sha = MessageDigest.getInstance("SHA-1");
byteArray = sha.digest(inStr.getBytes("UTF-8"));
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("no sha-1 algorithm");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("unsupported utf-8 encoding");
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < byteArray.length; i++) {
sb.append(Integer.toString((byteArray[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
}
/**
* 公众号,小程序后台配置服务器,初次检验时使用
* @throws IOException
*/
public static void doGet(HttpServletRequest request, HttpServletResponse response, Map<String, String> weixinInfo) throws IOException {
log.info("doGet receive WeChat server request parameters:{}", request.getParameterMap());
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echoStr = request.getParameter("echostr");
String[] arr = new String[]{weixinInfo.get("token"), timestamp, nonce};
String encrypt = WeixinUtil.encodeUsingSHA1(arr);
if (encrypt.equals(signature)) {
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write(echoStr.getBytes());
outputStream.flush();
}
}
}
......@@ -2,12 +2,12 @@
spring:
datasource:
# 测试/演示库url:
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_admin_chongshu?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
# url: jdbc:log4jdbc:mysql://122.112.214.149:3306/tj_user_admin?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
# username: root
# password: Tjlh@2021
# password: root
url: jdbc:log4jdbc:mysql://139.196.145.150:3306/ucs_stage_admin?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
username: root
password: Tjlh@2021
driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
#Druid
......@@ -20,7 +20,7 @@ spring:
# 最大连接数
max-active: 15
# 获取连接超时时间
max-wait: 5000
max-wait: 5000000
# 连接有效性检测时间
time-between-eviction-runs-millis: 90000
# 最大空闲时间
......@@ -28,29 +28,39 @@ spring:
test-while-idle: true
test-on-borrow: false
test-on-return: false
validation-query: select 1
# 配置监控统计拦截的filters
filters: stat
stat-view-servlet:
url-pattern: /druid/*
reset-enable: false
web-stat-filter:
url-pattern: /*
exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
jackson:
time-zone: GMT+8
data:
redis:
repositories:
enabled: false
#配置 Jpa
jpa:
properties:
hibernate:
# 生产环境设置成 none,避免程序运行时自动更新数据库结构
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
ddl-auto: none
open-in-view: true
show-sql: false
servlet:
multipart:
file-size-threshold: 2KB
max-file-size: 100MB
max-request-size: 200MB
# redis
redis:
#数据库索引
......@@ -60,6 +70,7 @@ spring:
password: redis123
#连接超时时间
timeout: 5000
rabbitmq:
# host: 139.196.145.150 # rabbitmq的连接地址
# port: 5672 # rabbitmq的连接端口号
......@@ -73,72 +84,3 @@ spring:
username: guest # rabbitmq的用户名
password: guest # rabbitmq的密码
publisher-confirms: true #如果对异步消息需要回调必须设置为true
\ No newline at end of file
#jwt。依赖的common中有需要jwt的部分属性。
jwt:
header: Authorization
secret: mySecret
# token 过期时间/毫秒,6小时 1小时 = 3600000 毫秒
expiration: 7200000
# 在线用户key
online: online-token
# 验证码
codeKey: code-key
# token 续期检查时间范围(60分钟,单位毫秒),在token即将过期的一段时间内用户操作了,则给用户的token续期
detect: 3600000
# 续期时间,2小时,单位毫秒
renew: 7200000
#是否允许生成代码,生产环境设置为false
generator:
enabled: false
#是否开启 swagger-ui
swagger:
enabled: false
file:
path: system/file
avatar: system/avatar
upload: upload
# 文件大小 /M
maxSize: 100
avatarMaxSize: 5
service:
mq:
exchange: exchange.MemberInfoSync
queue: queue.MemberInfoSync
weixin:
list:
- appid: wxfaa765183a332521
secret: b5c1c39cb95b45b599a02fd68b5fcf17
token:
encodingAesKey:
imagePath:
content: 长按识别二维码,加入微信群。
miniprogramState: formal
# 点击模板卡片后的默认跳转页面
page: pages/index/main
# 生成带参数二维码的有效期
qrCodeExpireSeconds: 86400
env: dev
# 订阅号
- appid: wx5d88c7fe99f89f32
secret: b213afe99a469d4be576f330dad643b8
token: topdraw
encodingAesKey: g3mYB6yx2ZiebxwKcI1H2iw3LlYNBHb7PqsVYFHUQzi
# 应用类型 小程序 服务号 订阅号, 当前基于订阅号有特殊逻辑
appType: subscription
imagePath: /topdraw/app/user_center_service_te/upload/customer/weChat.png
content: 长按识别二维码,关注订阅号。
miniprogramState: formal
# 点击模板卡片后的默认跳转页面
page: pages/index/main
# 生成带参数二维码的有效期
qrCodeExpireSeconds: 300
env: dev
api:
uc-service: http://127.0.0.1:8446
\ No newline at end of file
......
......@@ -2,40 +2,45 @@ server:
port: 8447
spring:
application:
name: member-service
freemarker:
check-template-location: false
name: uc-engine
profiles:
active: dev
jackson:
time-zone: GMT+8
data:
redis:
repositories:
enabled: false
#配置 Jpa
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
open-in-view: true
# 微信
wechat:
# 小程序
miniprogram:
appid: wxfaa765183a332521
secret: b5c1c39cb95b45b599a02fd68b5fcf17
token:
encodingAesKey:
imagePath:
content: 长按识别二维码,加入微信群。
miniprogramState: formal
# 点击模板卡片后的默认跳转页面
page: pages/index/main
# 生成带参数二维码的有效期
qrCodeExpireSeconds: 86400
env: dev
# 订阅号
subscribe:
appid: wx5d88c7fe99f89f32
secret: b213afe99a469d4be576f330dad643b8
token: topdraw
encodingAesKey: g3mYB6yx2ZiebxwKcI1H2iw3LlYNBHb7PqsVYFHUQzi
# 应用类型 小程序 服务号 订阅号, 当前基于订阅号有特殊逻辑
appType: subscription
imagePath: /topdraw/app/user_center_service_te/upload/customer/weChat.png
content: 长按识别二维码,关注订阅号。
miniprogramState: formal
# 点击模板卡片后的默认跳转页面
page: pages/index/main
# 生成带参数二维码的有效期
qrCodeExpireSeconds: 300
env: dev
task:
pool:
# 核心线程池大小
core-pool-size: 10
# 最大线程数
max-pool-size: 30
# 活跃时间
keep-alive-seconds: 60
# 队列容量
queue-capacity: 50
#登录图形验证码有效时间/分钟
loginCode:
expiration: 2
#默认上传图片类型
default-image-type: -1
#第三方接口
api:
# ucs
uc-service: http://127.0.0.1:8446
\ No newline at end of file
......
......@@ -39,16 +39,16 @@ public class GeneratorCode extends BaseTest {
@Rollback(value = false)
@Transactional(rollbackFor = Exception.class)
public void generator() {
var dbName = "uc_wechat_subscribe_record";
var dbName = "uc_growth_report";
// 表名称,支持多表
var tableNames = Arrays.asList(dbName);
String[] s = dbName.split("_");
var pre = s[0];
var target1 = s[s.length-1];
var preRoute = "com.topdraw.weixin.";
var preRoute = "com.topdraw.business.module.user.iptv.growreport";
StringBuilder builder = new StringBuilder(preRoute);
builder.append("subscribe");
// builder.append("wechatshare");
// builder.append(target);
tableNames.forEach(tableName -> {
......
......@@ -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();
}
......@@ -154,7 +155,7 @@ public class TaskOperationControllerTest extends BaseTest {
task.setValidTime(TimestampUtil.now());
task.setPointsType(0);
task.setAttr("{\"value\":\"[1,2]\"}");
// task.setAttr("{\"value\":\"[1,2]\"}");
task.setTaskTemplateId(13L);
......@@ -168,7 +169,7 @@ public class TaskOperationControllerTest extends BaseTest {
Task task = new Task();
BeanUtils.copyProperties(taskDTO, task);
task.setName("testTask4455");
task.setAttr("{\"value\":\"[4,10]\"}");
// task.setAttr("{\"value\":\"[4,10]\"}");
this.taskOperationController.updateTask(task);
}
......@@ -179,6 +180,13 @@ public class TaskOperationControllerTest extends BaseTest {
this.taskOperationController.deleteTask(task);
}
@Test
public void dealTask() {
String content = "{\"deviceType\":1,\"event\":8,\"evt\":\"PLAY\",\"msgData\":\"{\\\"description\\\":\\\"{\\\\\\\"playDuration\\\\\\\":1,\\\\\\\"time\\\\\\\":\\\\\\\"2022-05-03 23:10:09\\\\\\\",\\\\\\\"mediaId\\\\\\\":432,\\\\\\\"mediaCode\\\\\\\":\\\\\\\"media_123\\\\\\\",\\\\\\\"mediaName\\\\\\\":\\\\\\\"白宫陷落\\\\\\\"}\\\",\\\"mediaId\\\":432,\\\"platformAccount\\\":\\\"6002110106@ITVP\\\",\\\"param\\\":\\\"{\\\\\\\"playDuration\\\\\\\":1}\\\"}\",\"time\":\"2022-06-17T13:07:16.433\"}\n";
TaskOperationQueryCriteria task = new TaskOperationQueryCriteria();
task.setContent(content);
this.taskOperationController.dealTask(task);
}
}
......
package com.topdraw.test.business.process.rest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.topdraw.BaseTest;
import com.topdraw.business.module.user.app.domain.UserApp;
import com.topdraw.business.module.user.iptv.domain.UserTv;
import com.topdraw.business.module.user.weixin.domain.UserWeixin;
import com.topdraw.business.process.domian.weixin.BindBean;
import com.topdraw.business.process.domian.weixin.SubscribeBean;
import com.topdraw.business.process.domian.weixin.TvUnBindBean;
import com.topdraw.business.process.domian.weixin.WeixinUnBindBean;
import com.topdraw.business.process.rest.UserOperationController;
import com.topdraw.common.ResultInfo;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Base64Utils;
import java.sql.Timestamp;
import java.util.HashMap;
public class UserOperationControllerTest extends BaseTest {
......@@ -60,8 +65,7 @@ public class UserOperationControllerTest extends BaseTest {
try {
WeixinUnBindBean bindBean = new WeixinUnBindBean();
// 小屏会员
bindBean.setMemberId(4L);
bindBean.setAutoModel(true);
bindBean.setMemberId(21821L);
ResultInfo weixinUserAndMember = this.userOperationController.minaUnbind(bindBean);
System.out.println(weixinUserAndMember);
} catch (Exception e) {
......@@ -151,6 +155,25 @@ public class UserOperationControllerTest extends BaseTest {
}
@Test
public void appRegister() {
try {
UserApp userApp = new UserApp();
userApp.setUsername("18271269120");
// 类型 0:苹果;1:安卓;-1:未知
userApp.setType(1);
userApp.setAccount("fdsfsdfsdfs");
userApp.setAccountType(3);
ResultInfo weixinUserAndMember = this.userOperationController.appRegister(userApp);
System.out.println(weixinUserAndMember);
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void createTvUserAndMember() {
try {
String a = "{\n" +
......
......@@ -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,39 +18,19 @@ public class MemberOperationServiceTest extends BaseTest {
@Autowired
MemberOperationService memberOperationService;
@Autowired
MemberService memberService;
@Test
public void findById() {
Long memberId = 2L;
this.memberOperationService.findById(memberId);
public void findMemberSimpleTest(){
MemberSimpleDTO memberSimpleDTO = this.memberService.findSimpleById(20718L);
System.out.println(memberSimpleDTO);
}
@Test
public void doUpdateMemberInfo() {
Member member = new Member();
member.setId(2L);
member.setCode(String.valueOf(IdWorker.generator()));
member.setType(1);
member.setStatus(1);
member.setNickname("nickname");
member.setDescription("description");
member.setGender(1);
member.setBirthday("birthday");
member.setAvatarUrl("avatarUrl");
member.setGroups("groups");
member.setTags("tags");
member.setVip(1);
member.setLevel(1);
member.setExp(10L);
member.setPoints(5L);
member.setDuePoints(0L);
member.setCouponAmount(1L);
member.setDueCouponAmount(0L);
member.setUserIptvId(1L);
member.setBindIptvPlatformType(0);
member.setUpdateTime(TimestampUtil.now());
String s = JSONObject.toJSONString(member);
this.memberOperationService.doUpdateMember(member);
public void findById() {
Long memberId = 2L;
this.memberOperationService.findById(memberId);
}
@Test
......
......@@ -19,13 +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.setEvent(1);
msgData.setRemarks("remark");
msgData.setMemberId(memberId);
msgData.setDeviceType(2);
msgData.setAppCode("WEI_XIN_GOLD_PANDA");
// dataSyncMsg.setMsgData(msgData);
String s = JSON.toJSONString(dataSyncMsg);
......
......@@ -22,12 +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();
msgData.setEvent(1);
/* DataSyncMsg.MsgData msgData = new DataSyncMsg.MsgData();
msgData.setRemarks("remark");
msgData.setMemberId(1L);
msgData.setDeviceType(2);
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);
......