Commit 28189ec9 28189ec98eb64cbb9838df78aa6da5b0cfb9c383 by xianghan

Merge branch '2'

# Conflicts:
#	src/main/java/com/topdraw/business/module/member/profile/service/impl/MemberProfileServiceImpl.java
#	src/main/java/com/topdraw/business/module/member/service/impl/MemberServiceImpl.java
#	src/main/java/com/topdraw/business/module/user/iptv/domain/UserTv.java
#	src/main/java/com/topdraw/business/module/user/iptv/service/dto/UserTvDTO.java
#	src/main/java/com/topdraw/business/module/user/weixin/service/impl/UserWeixinServiceImpl.java
#	src/main/java/com/topdraw/mq/consumer/WeiXinEventConsumer.java
#	src/main/resources/config/application-dev.yml
2 parents 4e1995d9 d9cadcfa
Showing 221 changed files with 8029 additions and 4894 deletions
......@@ -23,12 +23,12 @@
<dependencies>
<!--redisson-->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.16.3</version>
</dependency>
<!--wechat-util-->
<!--<dependency>
<groupId>com.topdraw</groupId>
<artifactId>wechat-util</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>-->
<!--代码生成器-->
<dependency>
......
package com.topdraw.business.module.common.domain;
import com.topdraw.business.module.common.validated.UpdateGroup;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
/**
* @author :
......@@ -16,9 +18,13 @@ import javax.persistence.Transient;
*/
@Data
@Accessors(chain = true)
public class DefaultAsyncMqModule {
public class AsyncMqModule {
@Transient
@NotNull(message = "memberCode can't be null" , groups = {UpdateGroup.class})
private String memberCode;
/** 运营商平台账号 */
@Transient
private String platformAccount;
}
......
package com.topdraw.business.module.common.validated;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/7 21:20
* @version: :
* @modified By:
* @since : modified in 2022/3/7 21:20
*/
public interface CreateGroup {
}
package com.topdraw.business.module.common.validated;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/7 21:20
* @version: :
* @modified By:
* @since : modified in 2022/3/7 21:20
*/
public interface UpdateGroup {
}
......@@ -12,6 +12,7 @@ import javax.persistence.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.time.LocalDateTime;
/**
* @author XiangHan
......@@ -24,94 +25,94 @@ import java.sql.Timestamp;
@Table(name="m_coupon")
public class Coupon implements Serializable {
// id
/** id */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 标识
/** 标识 */
@Column(name = "code", nullable = false)
private String code;
// 名称
/** 名称 */
@Column(name = "title", nullable = false)
private String title;
// 图片
/** 图片 */
@Column(name = "images")
private String images;
// 发行量,-1代表不限量
/** 发行量,-1代表不限量 */
@Column(name = "stock")
private Integer stock;
// 剩余量,-1代表不限量
/** 剩余量,-1代表不限量 */
@Column(name = "remain_stock")
private Integer remainStock;
// 优惠形式:1:现金;2:折扣
/** 优惠形式:1:现金;2:折扣 */
@Column(name = "use_type")
private Integer useType;
// 面额
/** 面额 */
@Column(name = "denomination")
private BigDecimal denomination;
// 折扣
/** 折扣 */
@Column(name = "discount")
private BigDecimal discount;
// 适用用户范围:1:新用户;2:全体用户
/** 适用用户范围:1:新用户;2:全体用户 */
@Column(name = "user_range")
private Integer userRange;
// 限领次数 -1:无限次; >0:具体次数
/** 限领次数 -1:无限次; >0:具体次数 */
@Column(name = "collect_limit")
private Integer collectLimit;
// 适用门槛:1:无门槛;2:满减形式
/** 适用门槛:1:无门槛;2:满减形式 */
@Column(name = "threshold_type")
private Integer thresholdType;
// 满减门槛
/** 满减门槛 */
@Column(name = "amount_threshold")
private BigDecimal amountThreshold;
// 产品范围:1:全部商品;2:指定商品
/** 产品范围:1:全部商品;2:指定商品 */
@Column(name = "item_range")
private Integer itemRange;
// 生效形式:1:固定日期;2:相对日期
/** 生效形式:1:固定日期;2:相对日期 */
@Column(name = "effect_type")
private Integer effectType;
// 生效时间
/** 生效时间 */
@Column(name = "start_time")
private Timestamp startTime;
// 过期时间
/** 过期时间 */
@Column(name = "expire_time")
private Timestamp expireTime;
private LocalDateTime expireTime;
// 自领取当日,几天内有效
/** 自领取当日,几天内有效 */
@Column(name = "valid_days")
private Integer validDays;
// 使用说明
/** 使用说明 */
@Column(name = "description")
private String description;
// 状态0:未开始,1:启用;2:停用
/** 状态0:未开始,1:启用;2:停用 */
@Column(name = "status")
private Integer status;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
......
package com.topdraw.business.module.coupon.domain;
import com.topdraw.business.module.coupon.service.dto.CouponDTO;
import com.topdraw.util.IdWorker;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.Objects;
/**
* 优惠券
*/
public class CouponBuilder {
public static Coupon build(CouponDTO couponDTO){
Coupon coupon = new Coupon();
BeanUtils.copyProperties(couponDTO,coupon);
return build(coupon.getId(),
coupon.getCode(),
coupon.getTitle(),coupon.getImages(),coupon.getStock(),coupon.getRemainStock(),coupon.getUseType(),
coupon.getDenomination(),coupon.getDiscount(),coupon.getUserRange(),coupon.getCollectLimit(),
coupon.getThresholdType(),coupon.getAmountThreshold(),coupon.getItemRange(),coupon.getEffectType(),
coupon.getStartTime(),coupon.getExpireTime(),coupon.getValidDays(),coupon.getDescription(),coupon.getStatus());
}
public static Coupon build(Coupon coupon){
return build(coupon.getId(),
coupon.getCode(),
coupon.getTitle(),coupon.getImages(),coupon.getStock(),coupon.getRemainStock(),coupon.getUseType(),
coupon.getDenomination(),coupon.getDiscount(),coupon.getUserRange(),coupon.getCollectLimit(),
coupon.getThresholdType(),coupon.getAmountThreshold(),coupon.getItemRange(),coupon.getEffectType(),
coupon.getStartTime(),coupon.getExpireTime(),coupon.getValidDays(),coupon.getDescription(),coupon.getStatus());
}
public static Coupon build(Long id , String code , String title,
String images,
Integer stock,
Integer remainStock,
Integer useType,
BigDecimal denomination,
BigDecimal discount,
Integer userRange,
Integer collectLimit,
Integer thresholdType,
BigDecimal amountThreshold,
Integer itemRange,
Integer effectType,
Timestamp startTime,
LocalDateTime expireTime,
Integer validDays,String description , Integer status){
Coupon coupon = new Coupon();
coupon.setId(id);
coupon.setCode(StringUtils.isBlank(code)? IdWorker.generatorCode("coupon"):code);
coupon.setTitle(StringUtils.isBlank(title)?null:title);
coupon.setImages(StringUtils.isBlank(images)?null:images);
coupon.setStock(Objects.isNull(stock)?null:stock);
coupon.setRemainStock(Objects.isNull(remainStock)?null:remainStock);
coupon.setUseType(Objects.isNull(useType)?null:useType);
coupon.setDenomination(Objects.isNull(denomination)?null:denomination);
coupon.setDiscount(Objects.isNull(discount)?null:discount);
coupon.setUserRange(Objects.isNull(userRange)?null:userRange);
coupon.setCollectLimit(collectLimit);
coupon.setThresholdType(Objects.isNull(thresholdType)?null:thresholdType);
coupon.setAmountThreshold(Objects.isNull(amountThreshold)?null:amountThreshold);
coupon.setItemRange(Objects.isNull(itemRange)?null:itemRange);
coupon.setEffectType(Objects.isNull(effectType)?null:effectType);
coupon.setStartTime(Objects.isNull(startTime)?null: startTime);
coupon.setExpireTime(Objects.isNull(expireTime)?null:expireTime);
coupon.setValidDays(validDays);
coupon.setDescription(StringUtils.isBlank(description)?"":description);
coupon.setStatus(Objects.nonNull(status)?status:0);
return coupon;
}
}
......@@ -10,7 +10,6 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import java.io.Serializable;
import java.sql.Timestamp;
import java.time.LocalDateTime;
/**
......@@ -24,54 +23,57 @@ import java.time.LocalDateTime;
@Table(name="m_coupon_history")
public class CouponHistory implements Serializable {
// 主键
@Transient
private String memberCode;
/** 主键 */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 优惠券id
/** 优惠券id */
@Column(name = "coupon_id")
private Long couponId;
// 领券用户id(对应账号)
/** 领券用户id(对应账号) */
@Column(name = "user_id")
private Long userId;
// 优惠券code
/** 优惠券code */
@Column(name = "coupon_code")
private String couponCode;
// 领取人昵称
/** 领取人昵称 */
@Column(name = "user_nickname")
private String userNickname;
// 领取时间
/** 领取时间 */
@Column(name = "receive_time")
private LocalDateTime receiveTime;
// 失效时间
/** 失效时间 */
@Column(name = "expire_time")
private LocalDateTime expireTime;
// 使用状态 0:未使用;1:已使用;-1:已过期
/** 使用状态 0:未使用;1:已使用;-1:已过期 */
@Column(name = "use_status")
private Integer useStatus;
// 使用时间
/** 使用时间 */
@Column(name = "use_time")
private LocalDateTime useTime;
// 订单详情id
/** 订单详情id */
@Column(name = "order_detail_id")
private Long orderDetailId;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private LocalDateTime createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private LocalDateTime updateTime;
......
package com.topdraw.business.module.coupon.history.domain;
import com.topdraw.business.module.coupon.domain.Coupon;
import org.apache.commons.lang3.StringUtils;
import java.time.LocalDateTime;
import java.util.Objects;
/**
* 优惠券
*/
public class CouponHistoryBuilder {
public static CouponHistory build(CouponHistory couponHistory){
return build(couponHistory.getId(),
couponHistory.getCouponId(),
couponHistory.getUserId(),
couponHistory.getCouponCode(),
couponHistory.getUserNickname(),
couponHistory.getReceiveTime(),
couponHistory.getExpireTime(),
couponHistory.getUseStatus(),
couponHistory.getUseTime(),
couponHistory.getOrderDetailId());
}
public static CouponHistory build(Coupon coupon, Long userId, String userNickname){
return build(coupon,userId,userNickname,null);
}
public static CouponHistory build(Coupon coupon, Long userId, String userNickname, Long orderDetailId){
return build(null,
coupon.getId(),userId,coupon.getCode(),userNickname,LocalDateTime.now(),
coupon.getExpireTime(),coupon.getStatus(),null,orderDetailId);
}
public static CouponHistory build(Long id , Long couponId , Long userId, String couponCode, String userNickname, LocalDateTime receiveTime,
LocalDateTime expireTime, Integer useStatus, LocalDateTime useTime,
Long orderDetailId) {
CouponHistory couponHistory = new CouponHistory();
couponHistory.setId(id);
couponHistory.setCouponId(Objects.isNull(couponId)?null:couponId);
couponHistory.setUserId(Objects.isNull(userId)?null:userId);
couponHistory.setCouponCode(StringUtils.isBlank(couponCode)?null:couponCode);
couponHistory.setUserNickname(StringUtils.isBlank(userNickname)?null:userNickname);
couponHistory.setReceiveTime(Objects.isNull(receiveTime)?null:receiveTime);
couponHistory.setExpireTime(Objects.isNull(expireTime)?null:expireTime);
couponHistory.setUseStatus(Objects.isNull(useStatus)?0:useStatus);
couponHistory.setUseTime(Objects.isNull(useTime)?null:useTime);
couponHistory.setOrderDetailId(Objects.isNull(orderDetailId)?null:orderDetailId);
return couponHistory;
}
}
......@@ -4,7 +4,6 @@ import com.topdraw.business.module.coupon.history.domain.CouponHistory;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.sql.Timestamp;
import java.time.LocalDateTime;
/**
......
......@@ -2,13 +2,8 @@ package com.topdraw.business.module.coupon.history.service;
import com.topdraw.business.module.coupon.history.domain.CouponHistory;
import com.topdraw.business.module.coupon.history.service.dto.CouponHistoryDTO;
import com.topdraw.business.module.coupon.history.service.dto.CouponHistoryQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -16,20 +11,6 @@ import java.util.Map;
*/
public interface CouponHistoryService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(CouponHistoryQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<CouponHistoryDTO>
*/
List<CouponHistoryDTO> queryAll(CouponHistoryQueryCriteria criteria);
/**
* 根据ID查询
......@@ -38,15 +19,33 @@ public interface CouponHistoryService {
*/
CouponHistoryDTO findById(Long id);
/**
*
* @param resources
*/
void create(CouponHistory resources);
void update(CouponHistory resources);
void delete(Long id);
/**
*
* @param userId
* @return
*/
Long countByUserId(Long userId);
/**
*
* @param userId
* @param now
* @return
*/
Long countByUserIdAndExpireTimeBefore(Long userId, LocalDateTime now);
/**
*
* @param userId
* @param now
* @param expireTime
* @return
*/
Long countByUserIdAndExpireTimeBetween(Long userId, LocalDateTime now, LocalDateTime expireTime);
}
......
......@@ -3,7 +3,6 @@ package com.topdraw.business.module.coupon.history.service.dto;
import lombok.Data;
import java.io.Serializable;
import java.sql.Timestamp;
import java.time.LocalDateTime;
......@@ -14,39 +13,39 @@ import java.time.LocalDateTime;
@Data
public class CouponHistoryDTO implements Serializable {
// 主键
/** 主键 */
private Long id;
// 优惠券id
/** 优惠券id */
private Long couponId;
// 领券用户id(对应账号)
/** 领券用户id(对应账号) */
private Long userId;
// 优惠券code
/** 优惠券code */
private String couponCode;
// 领取人昵称
/** 领取人昵称 */
private String userNickname;
// 领取时间
/** 领取时间 */
private LocalDateTime receiveTime;
// 失效时间
/** 失效时间 */
private LocalDateTime expireTime;
// 使用状态 0:未使用;1:已使用;-1:已过期
/** 使用状态 0:未使用;1:已使用;-1:已过期 */
private Integer useStatus;
// 使用时间
/** 使用时间 */
private LocalDateTime useTime;
// 订单详情id
/** 订单详情id */
private Long orderDetailId;
// 创建时间
/** 创建时间 */
private LocalDateTime createTime;
// 更新时间
/** 更新时间 */
private LocalDateTime updateTime;
}
......
package com.topdraw.business.module.coupon.history.service.impl;
import com.topdraw.business.module.coupon.history.domain.CouponHistory;
import com.topdraw.business.module.coupon.history.domain.CouponHistoryBuilder;
import com.topdraw.business.module.coupon.history.repository.CouponHistoryRepository;
import com.topdraw.business.module.coupon.history.service.CouponHistoryService;
import com.topdraw.business.module.coupon.history.service.dto.CouponHistoryDTO;
import com.topdraw.business.module.coupon.history.service.dto.CouponHistoryQueryCriteria;
import com.topdraw.business.module.coupon.history.service.mapper.CouponHistoryMapper;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.ValidationUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -32,67 +23,38 @@ import java.util.Map;
public class CouponHistoryServiceImpl implements CouponHistoryService {
@Autowired
private CouponHistoryRepository CouponHistoryRepository;
private CouponHistoryMapper couponHistoryMapper;
@Autowired
private CouponHistoryMapper CouponHistoryMapper;
@Override
public Map<String, Object> queryAll(CouponHistoryQueryCriteria criteria, Pageable pageable) {
Page<CouponHistory> page = CouponHistoryRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(CouponHistoryMapper::toDto));
}
private CouponHistoryRepository couponHistoryRepository;
@Override
public List<CouponHistoryDTO> queryAll(CouponHistoryQueryCriteria criteria) {
return CouponHistoryMapper.toDto(CouponHistoryRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
@Override
public CouponHistoryDTO findById(Long id) {
CouponHistory CouponHistory = CouponHistoryRepository.findById(id).orElseGet(CouponHistory::new);
ValidationUtil.isNull(CouponHistory.getId(),"CouponHistory","id",id);
return CouponHistoryMapper.toDto(CouponHistory);
CouponHistory couponHistory = this.couponHistoryRepository.findById(id).orElseGet(CouponHistory::new);
ValidationUtil.isNull(couponHistory.getId(),"CouponHistory","id",id);
return this.couponHistoryMapper.toDto(couponHistory);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(CouponHistory resources) {
CouponHistoryRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(CouponHistory resources) {
CouponHistory CouponHistory = CouponHistoryRepository.findById(resources.getId()).orElseGet(CouponHistory::new);
ValidationUtil.isNull( CouponHistory.getId(),"CouponHistory","id",resources.getId());
CouponHistory.copy(resources);
CouponHistoryRepository.save(CouponHistory);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
CouponHistory CouponHistory = CouponHistoryRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", CouponHistory.class, id), 1));
CouponHistoryRepository.delete(CouponHistory);
CouponHistory couponHistory = CouponHistoryBuilder.build(resources);
this.couponHistoryRepository.save(couponHistory);
}
@Override
public Long countByUserId(Long userId) {
return this.CouponHistoryRepository.countByUserId(userId);
return this.couponHistoryRepository.countByUserId(userId);
}
@Override
public Long countByUserIdAndExpireTimeBefore(Long userId, LocalDateTime now) {
return this.CouponHistoryRepository.countByUserIdAndExpireTimeBefore(userId,now);
return this.couponHistoryRepository.countByUserIdAndExpireTimeBefore(userId,now);
}
@Override
public Long countByUserIdAndExpireTimeBetween(Long userId, LocalDateTime now, LocalDateTime expireTime) {
return this.CouponHistoryRepository.countByUserIdAndExpireTimeBetween(userId,now,expireTime);
return this.couponHistoryRepository.countByUserIdAndExpireTimeBetween(userId,now,expireTime);
}
}
......
......@@ -13,4 +13,5 @@ import java.util.Optional;
public interface CouponRepository extends JpaRepository<Coupon, Long>, JpaSpecificationExecutor<Coupon> {
Optional<Coupon> findFirstByCode(String code);
}
......
package com.topdraw.business.module.coupon.service;
import com.topdraw.business.module.coupon.domain.Coupon;
import com.topdraw.business.module.coupon.service.dto.CouponDTO;
import com.topdraw.business.module.coupon.service.dto.CouponQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -15,37 +9,18 @@ import java.util.Map;
public interface CouponService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(CouponQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<CouponDTO>
*/
List<CouponDTO> queryAll(CouponQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return CouponDTO
*/
CouponDTO findById(Long id);
void create(Coupon resources);
void update(Coupon resources);
void delete(Long id);
/**
* Code校验
* @param code
* @return CouponDTO
*/
CouponDTO getByCode(String code);
}
......
......@@ -5,6 +5,7 @@ import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.time.LocalDateTime;
/**
......@@ -14,69 +15,69 @@ import java.sql.Timestamp;
@Data
public class CouponDTO implements Serializable {
// id
/** id */
private Long id;
// 标识
/** 标识 */
private String code;
// 名称
/** 名称 */
private String title;
// 图片
/** 图片 */
private String images;
// 发行量,-1代表不限量
/** 发行量,-1代表不限量 */
private Integer stock;
// 剩余量,-1代表不限量
/** 剩余量,-1代表不限量 */
private Integer remainStock;
// 优惠形式:1:现金;2:折扣
/** 优惠形式:1:现金;2:折扣 */
private Integer useType;
// 面额
/** 面额 */
private BigDecimal denomination;
// 折扣
/** 折扣 */
private BigDecimal discount;
// 适用用户范围:1:新用户;2:全体用户
/** 适用用户范围:1:新用户;2:全体用户 */
private Integer userRange;
// 限领次数 -1:无限次; >0:具体次数
/** 限领次数 -1:无限次; >0:具体次数 */
private Integer collectLimit;
// 适用门槛:1:无门槛;2:满减形式
/** 适用门槛:1:无门槛;2:满减形式 */
private Integer thresholdType;
// 满减门槛
/** 满减门槛 */
private BigDecimal amountThreshold;
// 产品范围:1:全部商品;2:指定商品
/** 产品范围:1:全部商品;2:指定商品 */
private Integer itemRange;
// 生效形式:1:固定日期;2:相对日期
/** 生效形式:1:固定日期;2:相对日期 */
private Integer effectType;
// 生效时间
/** 生效时间 */
private Timestamp startTime;
// 过期时间
private Timestamp expireTime;
/** 过期时间 */
private LocalDateTime expireTime;
// 自领取当日,几天内有效
/** 自领取当日,几天内有效 */
private Integer validDays;
// 使用说明
/** 使用说明 */
private String description;
// 状态0:未开始,1:启用;2:停用
/** 状态0:未开始,1:启用;2:停用 */
private Integer status;
// 创建时间
/** 创建时间 */
private Timestamp createTime;
// 更新时间
/** 更新时间 */
private Timestamp updateTime;
}
......
package com.topdraw.business.module.coupon.service.dto;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class CouponQueryCriteria{
}
......@@ -4,23 +4,16 @@ import com.topdraw.business.module.coupon.domain.Coupon;
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.dto.CouponQueryCriteria;
import com.topdraw.business.module.coupon.service.mapper.CouponMapper;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.exception.GlobeExceptionMsg;
import com.topdraw.utils.StringUtils;
import com.topdraw.utils.ValidationUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -30,58 +23,24 @@ import java.util.Map;
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class CouponServiceImpl implements CouponService {
@Autowired
private CouponRepository CouponRepository;
@Autowired
private CouponMapper CouponMapper;
@Override
public Map<String, Object> queryAll(CouponQueryCriteria criteria, Pageable pageable) {
Page<Coupon> page = CouponRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(CouponMapper::toDto));
}
@Override
public List<CouponDTO> queryAll(CouponQueryCriteria criteria) {
return CouponMapper.toDto(CouponRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
private CouponMapper couponMapper;
@Autowired
private CouponRepository couponRepository;
@Override
public CouponDTO findById(Long id) {
Coupon Coupon = CouponRepository.findById(id).orElseGet(Coupon::new);
ValidationUtil.isNull(Coupon.getId(),"Coupon","id",id);
return CouponMapper.toDto(Coupon);
}
Assert.notNull(id, GlobeExceptionMsg.COUPON_ID_IS_NULL);
@Override
@Transactional(rollbackFor = Exception.class)
public void create(Coupon resources) {
CouponRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(Coupon resources) {
Coupon Coupon = CouponRepository.findById(resources.getId()).orElseGet(Coupon::new);
ValidationUtil.isNull( Coupon.getId(),"Coupon","id",resources.getId());
Coupon.copy(resources);
CouponRepository.save(Coupon);
Coupon coupon = this.couponRepository.findById(id).orElseGet(Coupon::new);
ValidationUtil.isNull(coupon.getId(),"Coupon","id",id);
return this.couponMapper.toDto(coupon);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
Coupon Coupon = CouponRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", Coupon.class, id), 1));
CouponRepository.delete(Coupon);
}
@Override
public CouponDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? CouponMapper.toDto(CouponRepository.findFirstByCode(code).orElseGet(Coupon::new))
return StringUtils.isNotEmpty(code) ? this.couponMapper.toDto(this.couponRepository.findFirstByCode(code).orElseGet(Coupon::new))
: new CouponDTO();
}
}
......
......@@ -23,70 +23,73 @@ import java.sql.Timestamp;
@Table(name="uc_exp_detail")
public class ExpDetail implements Serializable {
// 主键
@Transient
private String memberCode;
/** 主键 */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 标识
/** 标识 */
@Column(name = "code", nullable = false)
private String code;
// 应用code
/** 应用code */
@Column(name = "app_code")
private String appCode;
// 会员id
/** 会员id */
@Column(name = "member_id", nullable = false)
private Long memberId;
// 账号id
/** 账号id */
@Column(name = "account_id")
private Long accountId;
// 原始成长值
/** 原始成长值 */
@Column(name = "original_exp", nullable = false)
private Long originalExp;
// 结果成长值
/** 结果成长值 */
@Column(name = "result_exp", nullable = false)
private Long resultExp;
// 成长值变化,一般为正数
/** 成长值变化,一般为正数 */
@Column(name = "exp", nullable = false)
private Long exp;
// 设备类型 1:大屏;2:小屏(微信)3.小屏(xx)
/** 设备类型 1:大屏;2:小屏(微信)3.小屏(xx) */
@Column(name = "device_type", nullable = false)
private Integer deviceType;
// 行为事件类型 1:登录;2:观影;3:参与活动;4:订购;10:跨屏绑定;98:系统操作;99:其他
/** 行为事件类型 1:登录;2:观影;3:参与活动;4:订购;10:跨屏绑定;98:系统操作;99:其他 */
@Column(name = "evt_type", nullable = false)
private Integer evtType;
// 订单id(针对订购操作)
/** 订单id(针对订购操作) */
@Column(name = "order_id")
private Long orderId;
// 节目id(针对观影操作)
/** 节目id(针对观影操作) */
@Column(name = "media_id")
private Long mediaId;
// 活动id(针对参与活动)
/** 活动id(针对参与活动) */
@Column(name = "activity_id")
private Long activityId;
// 成长值变化描述,用于管理侧显示
/** 成长值变化描述,用于管理侧显示 */
@Column(name = "description", nullable = false)
private String description;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
......
package com.topdraw.business.module.exp.detail.domain;
import com.topdraw.exception.GlobeExceptionMsg;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Assert;
import java.util.Objects;
public class ExpDetailBuilder {
public static ExpDetail build(Long memberId, Long originalExp, Long resultExp,
Integer deviceType, Integer evtType){
ExpDetail expDetail = new ExpDetail();
expDetail.setMemberId(memberId);
expDetail.setOriginalExp(originalExp);
expDetail.setResultExp(resultExp);
expDetail.setDeviceType(deviceType);
expDetail.setEvtType(evtType);
return build(expDetail);
}
public static ExpDetail build(ExpDetail expDetail){
return build(expDetail.getId(),
expDetail.getCode(),
expDetail.getAppCode(),
expDetail.getMemberId(),
expDetail.getAccountId(),
expDetail.getOriginalExp(),expDetail.getResultExp(),
expDetail.getExp(),expDetail.getDeviceType(),
expDetail.getEvtType(), expDetail.getOrderId(), expDetail.getMediaId(),
expDetail.getActivityId(),expDetail.getDescription());
}
public static ExpDetail build(Long id, String code,
String appCode, Long memberId, Long accountId,
Long originalExp, Long resultExp, Long exp,
Integer deviceType, Integer evtType, Long orderId,
Long mediaId, Long activityId, String description){
Assert.notNull(memberId, GlobeExceptionMsg.MEMBER_ID_IS_NULL);
ExpDetail expDetail = new ExpDetail();
expDetail.setId(Objects.isNull(id)?null:id);
expDetail.setCode(StringUtils.isBlank(code)?null:code);
expDetail.setAppCode(StringUtils.isBlank(appCode)?null:appCode);
expDetail.setMemberId(Objects.isNull(memberId)?null:memberId);
expDetail.setAccountId(Objects.isNull(accountId)?null:accountId);
expDetail.setOriginalExp(Objects.isNull(originalExp)?0:originalExp);
expDetail.setResultExp(Objects.isNull(resultExp)?0:resultExp);
expDetail.setExp(Objects.isNull(exp)?0:exp);
expDetail.setDeviceType(Objects.isNull(deviceType)?null:deviceType);
expDetail.setEvtType(Objects.isNull(evtType)?null:evtType);
expDetail.setOrderId(Objects.isNull(orderId)?null:orderId);
expDetail.setMediaId(Objects.isNull(mediaId)?null:mediaId);
expDetail.setActivityId(Objects.isNull(activityId)?null:activityId);
expDetail.setDescription(StringUtils.isBlank(description)?null:description);
return expDetail;
}
}
......@@ -2,11 +2,6 @@ package com.topdraw.business.module.exp.detail.service;
import com.topdraw.business.module.exp.detail.domain.ExpDetail;
import com.topdraw.business.module.exp.detail.service.dto.ExpDetailDTO;
import com.topdraw.business.module.exp.detail.service.dto.ExpDetailQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -15,31 +10,28 @@ import java.util.Map;
public interface ExpDetailService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(ExpDetailQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<ExpDetailDTO>
*/
List<ExpDetailDTO> queryAll(ExpDetailQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return ExpDetailDTO
*/
ExpDetailDTO findById(Long id);
/**
*
* @param resources
*/
void create(ExpDetail resources);
/**
*
* @param resources
*/
void update(ExpDetail resources);
/**
*
* @param id
*/
void delete(Long id);
/**
......
......@@ -13,51 +13,51 @@ import java.sql.Timestamp;
@Data
public class ExpDetailDTO implements Serializable {
// 主键
/** 主键 */
private Long id;
// 标识
/** 标识 */
private String code;
// 应用code
/** 应用code */
private String appCode;
// 会员id
/** 会员id */
private Long memberId;
// 账号id
/** 账号id */
private Long accountId;
// 原始成长值
/** 原始成长值 */
private Long originalExp;
// 结果成长值
/** 结果成长值 */
private Long resultExp;
// 成长值变化,一般为正数
/** 成长值变化,一般为正数 */
private Long exp;
// 设备类型 1:大屏;2:小屏(微信)3.小屏(xx)
/** 设备类型 1:大屏;2:小屏(微信)3.小屏(xx) */
private Integer deviceType;
// 行为事件类型 1:登录;2:观影;3:参与活动;4:订购;10:跨屏绑定;98:系统操作;99:其他
/** 行为事件类型 1:登录;2:观影;3:参与活动;4:订购;10:跨屏绑定;98:系统操作;99:其他 */
private Integer evtType;
// 订单id(针对订购操作)
/** 订单id(针对订购操作) */
private Long orderId;
// 节目id(针对观影操作)
/** 节目id(针对观影操作) */
private Long mediaId;
// 活动id(针对参与活动)
/** 活动id(针对参与活动) */
private Long activityId;
// 成长值变化描述,用于管理侧显示
/** 成长值变化描述,用于管理侧显示 */
private String description;
// 创建时间
/** 创建时间 */
private Timestamp createTime;
// 更新时间
/** 更新时间 */
private Timestamp updateTime;
}
......
package com.topdraw.business.module.exp.detail.service.dto;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class ExpDetailQueryCriteria{
}
package com.topdraw.business.module.exp.detail.service.impl;
import com.topdraw.business.module.exp.detail.domain.ExpDetail;
import com.topdraw.business.module.exp.detail.domain.ExpDetailBuilder;
import com.topdraw.business.module.exp.detail.repository.ExpDetailRepository;
import com.topdraw.business.module.exp.detail.service.ExpDetailService;
import com.topdraw.business.module.exp.detail.service.dto.ExpDetailDTO;
import com.topdraw.business.module.exp.detail.service.dto.ExpDetailQueryCriteria;
import com.topdraw.business.module.exp.detail.service.mapper.ExpDetailMapper;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.RedisUtils;
import com.topdraw.utils.StringUtils;
import com.topdraw.utils.ValidationUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -31,57 +26,56 @@ import java.util.Map;
public class ExpDetailServiceImpl implements ExpDetailService {
@Autowired
private ExpDetailRepository ExpDetailRepository;
private ExpDetailRepository expDetailRepository;
@Autowired
private ExpDetailMapper ExpDetailMapper;
@Override
public Map<String, Object> queryAll(ExpDetailQueryCriteria criteria, Pageable pageable) {
Page<ExpDetail> page = ExpDetailRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(ExpDetailMapper::toDto));
}
private ExpDetailMapper expDetailMapper;
@Override
public List<ExpDetailDTO> queryAll(ExpDetailQueryCriteria criteria) {
return ExpDetailMapper.toDto(ExpDetailRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
@Autowired
private RedisUtils redisUtils;
@Override
public ExpDetailDTO findById(Long id) {
ExpDetail ExpDetail = ExpDetailRepository.findById(id).orElseGet(ExpDetail::new);
ExpDetail ExpDetail = this.expDetailRepository.findById(id).orElseGet(com.topdraw.business.module.exp.detail.domain.ExpDetail::new);
ValidationUtil.isNull(ExpDetail.getId(),"ExpDetail","id",id);
return ExpDetailMapper.toDto(ExpDetail);
return this.expDetailMapper.toDto(ExpDetail);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(ExpDetail resources) {
ExpDetailRepository.save(resources);
ExpDetail expDetail = ExpDetailBuilder.build(resources);
this.expDetailRepository.save(expDetail);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(ExpDetail resources) {
ExpDetail ExpDetail = ExpDetailRepository.findById(resources.getId()).orElseGet(ExpDetail::new);
ValidationUtil.isNull( ExpDetail.getId(),"ExpDetail","id",resources.getId());
ExpDetail.copy(resources);
ExpDetailRepository.save(ExpDetail);
this.redisUtils.doLock("expDetail::memberId::" + resources.getMemberId());
try {
ExpDetail ExpDetail = this.expDetailRepository.findById(resources.getId()).orElseGet(com.topdraw.business.module.exp.detail.domain.ExpDetail::new);
ValidationUtil.isNull( ExpDetail.getId(),"ExpDetail","id",resources.getId());
ExpDetail.copy(resources);
this.expDetailRepository.save(ExpDetail);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
this.redisUtils.doUnLock("expDetail::memberId::" + resources.getMemberId());
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
ExpDetail ExpDetail = ExpDetailRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", ExpDetail.class, id), 1));
ExpDetailRepository.delete(ExpDetail);
ExpDetail ExpDetail = this.expDetailRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", com.topdraw.business.module.exp.detail.domain.ExpDetail.class, id), 1));
this.expDetailRepository.delete(ExpDetail);
}
@Override
public ExpDetailDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? ExpDetailMapper.toDto(ExpDetailRepository.findFirstByCode(code).orElseGet(ExpDetail::new))
return StringUtils.isNotEmpty(code) ? this.expDetailMapper.toDto(this.expDetailRepository.findFirstByCode(code).orElseGet(ExpDetail::new))
: new ExpDetailDTO();
}
}
......
package com.topdraw.business.module.exp.history.domain;
import com.topdraw.exception.GlobeExceptionMsg;
import com.topdraw.util.IdWorker;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Assert;
import java.util.Objects;
public class ExpHistoryBuilder {
public ExpHistory build(Long memberId, Long originalExp, Long resultExp, Long exp,Integer deviceType , Integer evtType) {
ExpHistory expHistory = new ExpHistory();
expHistory.setMemberId(memberId);
expHistory.setOriginalExp(originalExp);
expHistory.setResultExp(resultExp);
expHistory.setDeviceType(deviceType);
expHistory.setEvtType(evtType);
expHistory.setExp(exp);
return build(expHistory);
}
public ExpHistory build(ExpHistory expHistory) {
return build(expHistory.getId(),expHistory.getCode(),
expHistory.getMemberId(),expHistory.getAccountId(),
expHistory.getOriginalExp(),expHistory.getResultExp(),expHistory.getExp(),
expHistory.getDeviceType(),expHistory.getEvtType(),expHistory.getOrderId(),
expHistory.getMediaId(),expHistory.getActivityId(),expHistory.getDescription());
}
public ExpHistory build(Long id,String code,Long memberId,Long accountId,
Long originalExp,Long resultExp,Long exp,
Integer deviceType,Integer evtType,Long orderId,
Long mediaId,Long activityId,String description) {
Assert.notNull(memberId, GlobeExceptionMsg.MEMBER_ID_IS_NULL);
ExpHistory expHistory = new ExpHistory();
expHistory.setId(Objects.isNull(id)?null:id);
expHistory.setCode(StringUtils.isBlank(code)? IdWorker.generatorCode("exp") :code);
expHistory.setMemberId(memberId);
expHistory.setAccountId(Objects.isNull(accountId)?null:accountId);
expHistory.setOriginalExp(Objects.isNull(originalExp)?0L:originalExp);
expHistory.setResultExp(Objects.isNull(resultExp)?0L:resultExp);
expHistory.setExp(Objects.isNull(exp)?0L:exp);
expHistory.setDeviceType(Objects.isNull(deviceType)?4:deviceType);
expHistory.setEvtType(Objects.isNull(evtType)?98:evtType);
expHistory.setOrderId(Objects.isNull(orderId)?null:orderId);
expHistory.setMediaId(Objects.isNull(mediaId)?null:mediaId);
expHistory.setActivityId(Objects.isNull(activityId)?null:activityId);
expHistory.setDescription(StringUtils.isBlank(description)?null:description);
return expHistory;
}
}
......@@ -2,11 +2,6 @@ package com.topdraw.business.module.exp.history.service;
import com.topdraw.business.module.exp.history.domain.ExpHistory;
import com.topdraw.business.module.exp.history.service.dto.ExpHistoryDTO;
import com.topdraw.business.module.exp.history.service.dto.ExpHistoryQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -15,33 +10,18 @@ import java.util.Map;
public interface ExpHistoryService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(ExpHistoryQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<ExpHistoryDTO>
*/
List<ExpHistoryDTO> queryAll(ExpHistoryQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return ExpHistoryDTO
*/
ExpHistoryDTO findById(Long id);
/**
*
* @param resources
*/
void create(ExpHistory resources);
void update(ExpHistory resources);
void delete(Long id);
/**
* Code校验
* @param code
......
......@@ -4,23 +4,14 @@ import com.topdraw.business.module.exp.history.domain.ExpHistory;
import com.topdraw.business.module.exp.history.repository.ExpHistoryRepository;
import com.topdraw.business.module.exp.history.service.ExpHistoryService;
import com.topdraw.business.module.exp.history.service.dto.ExpHistoryDTO;
import com.topdraw.business.module.exp.history.service.dto.ExpHistoryQueryCriteria;
import com.topdraw.business.module.exp.history.service.mapper.ExpHistoryMapper;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.StringUtils;
import com.topdraw.utils.ValidationUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -31,57 +22,28 @@ import java.util.Map;
public class ExpHistoryServiceImpl implements ExpHistoryService {
@Autowired
private ExpHistoryRepository ExpHistoryRepository;
private ExpHistoryMapper expHistoryMapper;
@Autowired
private ExpHistoryMapper ExpHistoryMapper;
private ExpHistoryRepository expHistoryRepository;
@Override
public Map<String, Object> queryAll(ExpHistoryQueryCriteria criteria, Pageable pageable) {
Page<ExpHistory> page = ExpHistoryRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(ExpHistoryMapper::toDto));
}
@Override
public List<ExpHistoryDTO> queryAll(ExpHistoryQueryCriteria criteria) {
return ExpHistoryMapper.toDto(ExpHistoryRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
@Override
public ExpHistoryDTO findById(Long id) {
ExpHistory ExpHistory = ExpHistoryRepository.findById(id).orElseGet(ExpHistory::new);
ExpHistory ExpHistory = this.expHistoryRepository.findById(id).orElseGet(ExpHistory::new);
ValidationUtil.isNull(ExpHistory.getId(),"ExpHistory","id",id);
return ExpHistoryMapper.toDto(ExpHistory);
return this.expHistoryMapper.toDto(ExpHistory);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(ExpHistory resources) {
ExpHistoryRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(ExpHistory resources) {
ExpHistory ExpHistory = ExpHistoryRepository.findById(resources.getId()).orElseGet(ExpHistory::new);
ValidationUtil.isNull( ExpHistory.getId(),"ExpHistory","id",resources.getId());
ExpHistory.copy(resources);
ExpHistoryRepository.save(ExpHistory);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
ExpHistory ExpHistory = ExpHistoryRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", ExpHistory.class, id), 1));
ExpHistoryRepository.delete(ExpHistory);
this.expHistoryRepository.save(resources);
}
@Override
public ExpHistoryDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? ExpHistoryMapper.toDto(ExpHistoryRepository.findFirstByCode(code).orElseGet(ExpHistory::new))
return StringUtils.isNotEmpty(code) ? this.expHistoryMapper.toDto(this.expHistoryRepository.findFirstByCode(code).orElseGet(ExpHistory::new))
: new ExpHistoryDTO();
}
}
......
......@@ -2,6 +2,7 @@ package com.topdraw.business.module.member.address.domain;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.topdraw.business.module.common.domain.AsyncMqModule;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.CreatedDate;
......@@ -10,7 +11,7 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import java.io.Serializable;
import java.sql.Timestamp;
import java.time.LocalDateTime;
/**
* @author XiangHan
......@@ -21,78 +22,75 @@ import java.sql.Timestamp;
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_member_address")
public class MemberAddress implements Serializable {
public class MemberAddress extends AsyncMqModule implements Serializable {
// 主键
/** 主键 */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 会员id
/** 会员id */
@Column(name = "member_id", nullable = false)
private Long memberId;
@Transient
private String memberCode;
// 类型 1:家;2:公司;3:学校
/** 类型 1:家;2:公司;3:学校 */
@Column(name = "type", nullable = false)
private Integer type;
// 是否默认地址
/** 是否默认地址 */
@Column(name = "is_default", nullable = false)
private Integer isDefault;
// 显示顺序
/** 显示顺序 */
@Column(name = "sequence")
private Integer sequence;
// 状态 0:不可用;1-可用
/** 状态 0:不可用;1-可用 */
@Column(name = "status", nullable = false)
private Integer status;
// 联系人姓名
/** 联系人姓名 */
@Column(name = "contactor", nullable = false)
private String contactor;
// 联系人电话
/** 联系人电话 */
@Column(name = "cellphone", nullable = false)
private String cellphone;
// 国家
/** 国家 */
@Column(name = "country", nullable = false)
private String country;
// 省份
/** 省份 */
@Column(name = "province", nullable = false)
private String province;
// 城市
/** 城市 */
@Column(name = "city", nullable = false)
private String city;
// 区县
/** 区县 */
@Column(name = "district", nullable = false)
private String district;
// 地址
/** 地址 */
@Column(name = "address", nullable = false)
private String address;
// 邮编
/** 邮编 */
@Column(name = "zip_code")
private String zipCode;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
private LocalDateTime createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
private LocalDateTime updateTime;
public void copy(MemberAddress source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
......
package com.topdraw.business.module.member.address.domain;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.exception.GlobeExceptionMsg;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Assert;
import java.util.Objects;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/11 11:08
* @version: :
* @modified By:
* @since : modified in 2022/3/11 11:08
*/
public class MemberAddressBuilder {
private static final Integer DEFAULT_VALUE_0 = 0;
private static final Integer DEFAULT_VALUE_1 = 1;
public static MemberAddress build(MemberAddress memberAddress, Long memberId, String memberCode){
Long id = memberAddress.getId();
Integer type = memberAddress.getType();
Integer isDefault = memberAddress.getIsDefault();
Integer sequence = memberAddress.getSequence();
Integer status= memberAddress.getStatus();
String contactor = memberAddress.getContactor();
String cellphone = memberAddress.getCellphone();
String country = memberAddress.getCountry();
String province = memberAddress.getProvince();
String city = memberAddress.getCity();
String district = memberAddress.getDistrict();
String address = memberAddress.getAddress();
String zipCode = memberAddress.getZipCode();
return build(id,memberId,memberCode,type,isDefault,sequence,status,
contactor,cellphone,country,province,city,district,address,zipCode);
}
public static MemberAddress build(MemberAddress memberAddress, Member member){
Long id = memberAddress.getId();
Long memberId = member.getId();
String memberCode = member.getCode();
Integer type = memberAddress.getType();
Integer isDefault = memberAddress.getIsDefault();
Integer sequence = memberAddress.getSequence();
Integer status= memberAddress.getStatus();
String contactor = memberAddress.getContactor();
String cellphone = memberAddress.getCellphone();
String country = memberAddress.getCountry();
String province = memberAddress.getProvince();
String city = memberAddress.getCity();
String district = memberAddress.getDistrict();
String address = memberAddress.getAddress();
String zipCode = memberAddress.getZipCode();
return build(id,memberId,memberCode,type,isDefault,sequence,status,
contactor,cellphone,country,province,city,district,address,zipCode);
}
public static MemberAddress build(MemberAddress memberAddress){
Long id = memberAddress.getId();
Long memberId = memberAddress.getMemberId();
String memberCode = memberAddress.getMemberCode();
Integer type = memberAddress.getType();
Integer isDefault = memberAddress.getIsDefault();
Integer sequence = memberAddress.getSequence();
Integer status= memberAddress.getStatus();
String contactor = memberAddress.getContactor();
String cellphone = memberAddress.getCellphone();
String country = memberAddress.getCountry();
String province = memberAddress.getProvince();
String city = memberAddress.getCity();
String district = memberAddress.getDistrict();
String address = memberAddress.getAddress();
String zipCode = memberAddress.getZipCode();
return build(id,memberId,memberCode,type,isDefault,sequence,status,
contactor,cellphone,country,province,city,district,address,zipCode);
}
public static MemberAddress build(Long id , Long memberId, String memberCode,
Integer sequence, Integer type , Integer isDefault , Integer status,
String contactor, String cellphone,
String country, String province, String city,
String district, String address, String zipCode){
Assert.notNull(memberId, GlobeExceptionMsg.MEMBER_ID_IS_NULL);
MemberAddress memberAddress = new MemberAddress();
memberAddress.setId(Objects.nonNull(id)?null:id);
memberAddress.setMemberId(Objects.isNull(memberId)?null:memberId);
memberAddress.setMemberCode(stringIsNull(memberCode));
memberAddress.setSequence(Objects.nonNull(sequence)?null:DEFAULT_VALUE_1);
memberAddress.setType(Objects.isNull(type)?null:DEFAULT_VALUE_0);
memberAddress.setIsDefault(Objects.nonNull(isDefault)?null:DEFAULT_VALUE_0);
memberAddress.setStatus(Objects.isNull(status)?null:DEFAULT_VALUE_1);
memberAddress.setContactor(stringIsNull(contactor));
memberAddress.setCellphone(stringIsNull(cellphone));
memberAddress.setCountry(stringIsNull(country));
memberAddress.setProvince(stringIsNull(province));
memberAddress.setCity(stringIsNull(city));
memberAddress.setDistrict(stringIsNull(district));
memberAddress.setAddress(stringIsNull(address));
memberAddress.setZipCode(stringIsNull(zipCode));
return memberAddress;
}
private static String stringIsNull(String s){
return StringUtils.isBlank(s)?"":s;
}
}
......@@ -4,13 +4,12 @@ import com.topdraw.business.module.member.address.domain.MemberAddress;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.util.Optional;
/**
* @author XiangHan
* @date 2021-10-22
*/
public interface MemberAddressRepository extends JpaRepository<MemberAddress, Long>, JpaSpecificationExecutor<MemberAddress> {
Optional<MemberAddress> findByMemberIdAndSequence(Long memberId, Integer sequence);
MemberAddress findByMemberIdAndSequence(Long memberId, Integer sequence);
}
......
......@@ -2,11 +2,6 @@ package com.topdraw.business.module.member.address.service;
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.address.service.dto.MemberAddressQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -15,31 +10,35 @@ import java.util.Map;
public interface MemberAddressService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(MemberAddressQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<MemberAddressDTO>
*/
List<MemberAddressDTO> queryAll(MemberAddressQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @param resources ID
* @return MemberAddressDTO
*/
MemberAddressDTO findById(Long id);
MemberAddressDTO findById(Long resources);
void create(MemberAddress resources);
/**
* 保存会员地址
* @param resources
*/
MemberAddressDTO create(MemberAddress resources);
void update(MemberAddress resources);
/**
* 修改会员地址
* @param resources
*/
MemberAddressDTO update(MemberAddress resources);
void delete(Long id);
/**
* 通过id删除
* @param resources
*/
void delete(Long resources);
/**
*
* @param memberId
* @param sequence
* @return
*/
MemberAddressDTO findByMemberIdAndSequence(Long memberId, Integer sequence);
}
......
......@@ -3,7 +3,7 @@ package com.topdraw.business.module.member.address.service.dto;
import lombok.Data;
import java.io.Serializable;
import java.sql.Timestamp;
import java.time.LocalDateTime;
/**
......@@ -13,51 +13,54 @@ import java.sql.Timestamp;
@Data
public class MemberAddressDTO implements Serializable {
// 主键
/** 会员code */
private String memberCode;
/** 主键 */
private Long id;
// 会员id
/** 会员id */
private Long memberId;
// 类型 1:家;2:公司;3:学校
/** 类型 1:家;2:公司;3:学校 */
private Integer type;
// 是否默认地址
/** 是否默认地址 */
private Integer isDefault;
// 显示顺序
/** 显示顺序 */
private Integer sequence;
// 状态 0:不可用;1-可用
/** 状态 0:不可用;1-可用 */
private Integer status;
// 联系人姓名
/** 联系人姓名 */
private String contactor;
// 联系人电话
/** 联系人电话 */
private String cellphone;
// 国家
/** 国家 */
private String country;
// 省份
/** 省份 */
private String province;
// 城市
/** 城市 */
private String city;
// 区县
/** 区县 */
private String district;
// 地址
/** 地址 */
private String address;
// 邮编
/** 邮编 */
private String zipCode;
// 创建时间
private Timestamp createTime;
/** 创建时间 */
private LocalDateTime createTime;
// 更新时间
private Timestamp updateTime;
/** 更新时间 */
private LocalDateTime updateTime;
}
......
package com.topdraw.business.module.member.address.service.dto;
import com.topdraw.annotation.Query;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class MemberAddressQueryCriteria{
@Query
private Long memberId;
}
package com.topdraw.business.module.member.address.service.impl;
import com.topdraw.business.module.member.address.domain.MemberAddress;
import com.topdraw.business.module.member.address.domain.MemberAddressBuilder;
import com.topdraw.business.module.member.address.repository.MemberAddressRepository;
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.address.service.dto.MemberAddressQueryCriteria;
import com.topdraw.business.module.member.address.service.mapper.MemberAddressMapper;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.ValidationUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
@Slf4j
public class MemberAddressServiceImpl implements MemberAddressService {
@Autowired
private MemberAddressRepository MemberAddressRepository;
private MemberService memberService;
@Autowired
private MemberAddressMapper MemberAddressMapper;
private MemberAddressMapper memberAddressMapper;
@Autowired
private MemberService memberService;
@Override
public Map<String, Object> queryAll(MemberAddressQueryCriteria criteria, Pageable pageable) {
Page<MemberAddress> page = MemberAddressRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(MemberAddressMapper::toDto));
}
@Override
public List<MemberAddressDTO> queryAll(MemberAddressQueryCriteria criteria) {
return MemberAddressMapper.toDto(MemberAddressRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
private MemberAddressRepository memberAddressRepository;
@Override
public MemberAddressDTO findById(Long id) {
MemberAddress MemberAddress = MemberAddressRepository.findById(id).orElseGet(MemberAddress::new);
Assert.notNull(id,"id can't be null");
MemberAddress MemberAddress = this.memberAddressRepository.findById(id).orElseGet(MemberAddress::new);
ValidationUtil.isNull(MemberAddress.getId(),"MemberAddress","id",id);
return MemberAddressMapper.toDto(MemberAddress);
return this.memberAddressMapper.toDto(MemberAddress);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(MemberAddress resources) {
String memberCode = resources.getMemberCode();
MemberDTO memberDTO = this.memberService.getByCode(memberCode);
Long id = memberDTO.getId();
resources.setMemberId(id);
MemberAddressRepository.save(resources);
public MemberAddressDTO create(MemberAddress resources) {
log.info("MemberAddressServiceImpl ==>> create ==>> param ==>> [{}]",resources);
MemberAddress memberAddress = this.memberAddressRepository.save(resources);
log.info("MemberAddressServiceImpl ==>> create ==>> result ==>> [{}]",resources);
MemberAddressDTO memberAddressDTO = new MemberAddressDTO();
BeanUtils.copyProperties(memberAddress, memberAddressDTO);
return memberAddressDTO;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(MemberAddress resources) {
String memberCode = resources.getMemberCode();
MemberDTO memberDTO = this.memberService.getByCode(memberCode);
if (Objects.nonNull(memberDTO)) {
Long memberId = memberDTO.getId();
Integer sequence = resources.getSequence();
Assert.notNull(sequence,"sequence can't be null!");
Optional<MemberAddress> memberAddressOptional = MemberAddressRepository.findByMemberIdAndSequence(memberId,sequence);
if (memberAddressOptional.isPresent()) {
MemberAddress memberAddress = memberAddressOptional.get();
ValidationUtil.isNull(memberAddress.getId(),"MemberAddress","id",resources.getId());
resources.setId(memberAddress.getId());
memberAddress.copy(resources);
MemberAddressRepository.save(memberAddress);
}
public MemberAddressDTO update(MemberAddress resources) {
log.info("MemberAddressServiceImpl ==>> update ==>> param ==>> [{}]",resources);
Assert.notNull(resources.getId(),"id can't be null");
try {
MemberAddress _memberAddress = this.memberAddressRepository.findById(resources.getId()).orElseGet(MemberAddress::new);
ValidationUtil.isNull( _memberAddress.getId(),"MemberAddress","id",resources.getId());
_memberAddress.copy(resources);
MemberAddress memberAddress = this.memberAddressRepository.save(_memberAddress);
MemberAddressDTO memberAddressDTO = new MemberAddressDTO();
BeanUtils.copyProperties(memberAddress, memberAddressDTO);
return memberAddressDTO;
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
MemberAddress MemberAddress = MemberAddressRepository.findById(id).orElseThrow(
MemberAddress MemberAddress = this.memberAddressRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", MemberAddress.class, id), 1));
MemberAddressRepository.delete(MemberAddress);
this.memberAddressRepository.delete(MemberAddress);
}
@Override
public MemberAddressDTO findByMemberIdAndSequence(Long memberId, Integer sequence) {
MemberAddress memberAddress = this.memberAddressRepository.findByMemberIdAndSequence(memberId, sequence);
return this.memberAddressMapper.toDto(memberAddress);
}
/**
* 检查会员
* @param memberAddress
* @return
*/
private MemberDTO checkMember(MemberAddress memberAddress){
Long memberId = memberAddress.getMemberId();
String memberCode = memberAddress.getMemberCode();
return this.checkMember(memberId,memberCode);
}
/**
* 检查会员
* @param memberId 会员id
* @param memberCode 会员code
* @return
*/
private MemberDTO checkMember(Long memberId, String memberCode) {
return this.memberService.checkMember(memberId, memberCode);
}
}
......
......@@ -2,6 +2,7 @@ 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;
......@@ -9,8 +10,8 @@ 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;
import java.time.LocalDateTime;
/**
......@@ -24,115 +25,116 @@ import java.time.LocalDateTime;
@Table(name="uc_member")
public class Member implements Serializable {
// 运营商平台账号
/** 运营商平台账号 */
@Transient
private String platformAccount;
// 会员过期时间
/** 会员过期时间 */
@Column(name = "vip_expire_time", nullable = false)
private LocalDateTime vipExpireTime;
// 主键
/** 主键 */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
@NotNull(message = "id can't be null!!",groups = {UpdateGroup.class})
private Long id;
// 标识
/** 标识 */
@Column(name = "code", nullable = false)
private String code;
// 类型 1:大屏;2:小屏
/** 类型 1:大屏;2:小屏 */
@Column(name = "`type`", nullable = false)
private Integer type;
// 状态 0:不可用;1:可用
/** 状态 0:不可用;1:可用 */
@Column(name = "`status`", nullable = false)
private Integer status;
// 昵称 base64
/** 昵称 base64 */
@Column(name = "nickname")
private String nickname;
// 描述
/** 描述 */
@Column(name = "description")
private String description;
// 性别 0:女;1:男;-1:未知
/** 性别 0:女;1:男;-1:未知 */
@Column(name = "gender", nullable = false)
private Integer gender;
// 生日
/** 生日 */
@Column(name = "birthday")
private String birthday;
// 头像
/** 头像 */
@Column(name = "avatar_url")
private String avatarUrl;
// 分组信息
/** 分组信息 */
@Column(name = "`groups`")
private String groups;
// 标签
/** 标签 */
@Column(name = "tags")
private String tags;
// 是否会员 0:非会员;1:会员
/** 是否会员 0:非会员;1:会员 */
@Column(name = "vip", nullable = false)
private Integer vip;
// 会员等级(对应level表的level字段,非id)
/** 会员等级(对应level表的level字段,非id) */
@Column(name = "`level`", nullable = false)
private Integer level;
// 成长值
/** 成长值 */
@Column(name = "`exp`")
private Long exp;
// 当前积分
/** 当前积分 */
@Column(name = "`points`")
private Long points;
// 即将到期积分(一个月内)
/** 即将到期积分(一个月内) */
@Column(name = "due_points")
private Long duePoints;
// 优惠券数量
/** 优惠券数量 */
@Column(name = "coupon_amount")
private Long couponAmount;
// 即将过期优惠券数量
/** 即将过期优惠券数量 */
@Column(name = "due_coupon_amount")
private Long dueCouponAmount;
// iptv账号id
/** iptv账号id */
@Column(name = "user_iptv_id")
private Long userIptvId;
// 绑定IPTV平台 0:未知;1:电信;2:移动;3:联通
/** 绑定IPTV平台 0:未知;1:电信;2:移动;3:联通 */
@Column(name = "bind_iptv_platform_type")
private Integer bindIptvPlatformType;
// iptv账号绑定时间
/** iptv账号绑定时间 */
@Column(name = "bind_iptv_time")
private LocalDateTime bindIptvTime;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private LocalDateTime createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private LocalDateTime updateTime;
// 是否在黑名单 1:是;0否
/** 是否在黑名单 1:是;0否 */
@Column(name = "black_status")
private Long blackStatus;
public void copy(Member source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(false));
}
}
......
package com.topdraw.business.module.member.domain;
import com.topdraw.util.IdWorker;
import org.apache.commons.lang3.StringUtils;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.Objects;
/**
* @author XiangHan
* @date 2021-10-22
*/
public class MemberBuilder {
private static final Long DEFAULT_VALUE = 0L;
private static final Integer DEFAULT_VALUE_1 = 1;
private static final Integer DEFAULT_VALUE_ = -1;
public static Member build(Member member){
Member _member = checkMemberData(member);
return _member;
}
private static Member checkMemberData(Member member) {
String code = member.getCode();
member.setCode(StringUtils.isEmpty(code)?String.valueOf(IdWorker.generator()):code);
Integer gender = member.getGender();
member.setGender(Objects.nonNull(gender) ? gender : DEFAULT_VALUE_);
Integer type = member.getType();
member.setType(Objects.nonNull(type) ? type:DEFAULT_VALUE_);
Integer status = member.getStatus();
member.setStatus(Objects.nonNull(status) ? status:DEFAULT_VALUE_1);
Integer vip = member.getVip();
member.setVip(Objects.nonNull(vip) ? vip:0);
Integer level = member.getLevel();
member.setLevel(Objects.nonNull(level) ? level:DEFAULT_VALUE_1);
member.setExp(DEFAULT_VALUE);
member.setPoints(DEFAULT_VALUE);
member.setDuePoints(DEFAULT_VALUE);
member.setCouponAmount(DEFAULT_VALUE);
member.setDueCouponAmount(DEFAULT_VALUE);
member.setBlackStatus(DEFAULT_VALUE);
member.setBirthday(StringUtils.isBlank(member.getBirthday())?"1900-01-01":member.getBirthday());
String nickname = member.getNickname();
if (StringUtils.isNotEmpty(nickname)) {
// String base64Nickname = new String(Base64.getEncoder().encode(nickname.getBytes(StandardCharsets.UTF_8)));
member.setNickname(nickname);
}
return member;
}
public static Member build(Integer type, String avatarUrl, String nickname, int vip){
// todo 原型模式
Member member = new Member();
member.setType(type);
member.setAvatarUrl(avatarUrl);
member.setNickname(nickname);
member.setVip(vip);
Member _member = checkMemberData(member);
return _member;
}
}
package com.topdraw.business.module.member.group.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 luerlong
* @date 2021-09-27
*/
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_group")
public class Group implements Serializable {
/** ID */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
/** CODE */
@Column(name = "code")
private String code;
/** 名称 */
@Column(name = "name")
private String name;
/** 状态 0-下线 1-上线 */
@Column(name = "status")
private Integer status;
/** 权限 0-测试分组 1-鉴权通过(白名单) 2-不允许精准(黑名单)3-可以精准(金名单) */
@Column(name = "permission_type")
private Integer permissionType;
public void copy(Group source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}
}
package com.topdraw.business.module.member.group.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 2021-11-17
*/
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_member_group")
public class MemberGroup implements Serializable {
/** ID */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
/** 分组ID */
@Column(name = "group_id")
private Long groupId;
/** 会员ID */
@Column(name = "member_id")
private Long memberId;
/** 运营商平台账号 */
@Column(name = "platform_account")
private String platformAccount;
/** 手机号 */
@Column(name = "cellphone")
private String cellphone;
/** 设备 */
@Column(name = "stb_id")
private String stbId;
/** 有线MAC地址 */
@Column(name = "eth_mac")
private String ethMac;
/** 无线MAC地址 */
@Column(name = "wifi_mac")
private String wifiMac;
/** 描述 */
@Column(name = "description")
private String description;
/** 创建者 */
@Column(name = "create_by")
private String createBy;
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
/** 更新者 */
@Column(name = "update_by")
private String updateBy;
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
public void copy(MemberGroup source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}
}
package com.topdraw.business.module.member.group.repository;
import com.topdraw.business.module.member.group.domain.Group;
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;
/**
* @author luerlong
* @date 2021-09-27
*/
public interface GroupRepository extends JpaRepository<Group, Long>, JpaSpecificationExecutor<Group> {
Optional<Group> findFirstByCode(String code);
List<Group> findByName(String name);
@Query(value = "select t1.id from uc_group t1 left join uc_user__group t2 on t1.id = t2.group_id where t2.user_id = ?1 and t1.permission_type = ?2 ", nativeQuery = true)
List<Map<String, Object>> findByUserIdAndPermissionType(Long userId, Integer type);
}
package com.topdraw.business.module.member.group.repository;
import com.topdraw.business.module.member.group.domain.MemberGroup;
import com.topdraw.business.module.member.group.service.dto.MemberGroupDTO;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.util.List;
/**
* @author XiangHan
* @date 2021-11-17
*/
public interface MemberGroupRepository extends JpaRepository<MemberGroup, Long>, JpaSpecificationExecutor<MemberGroup> {
List<MemberGroupDTO> findByMemberId(Long memberId);
}
package com.topdraw.business.module.member.group.service;
import com.topdraw.business.module.member.group.service.dto.GroupDTO;
/**
* @author luerlong
* @date 2021-09-27
*/
public interface GroupService {
/**
* 根据ID查询
* @param id ID
* @return GroupDTO
*/
GroupDTO findById(Long id);
/**
* Code校验
* @param code
* @return GroupDTO
*/
GroupDTO getByCode(String code);
}
package com.topdraw.business.module.member.group.service;
import com.topdraw.business.module.member.group.service.dto.MemberGroupDTO;
import java.util.List;
/**
* @author XiangHan
* @date 2021-11-17
*/
public interface MemberGroupService {
/**
* 通过会员id获取会员分组列表
* @param memberId
* @return
*/
List<MemberGroupDTO> findByMemberId(Long memberId);
/**
* 根据ID查询
* @param id ID
* @return MemberGroupDTO
*/
MemberGroupDTO findById(Long id);
}
package com.topdraw.business.module.member.group.service.dto;
import lombok.Data;
import java.io.Serializable;
/**
* @author luerlong
* @date 2021-09-27
*/
@Data
public class GroupDTO implements Serializable {
/** ID */
private Long id;
/** CODE */
private String code;
/** 名称 */
private String name;
/** 状态 0-下线 1-上线 */
private Integer status;
/** 权限 0-测试分组 1-鉴权通过(白名单) 2-不允许精准(黑名单)3-可以精准(金名单) */
private Integer permissionType;
}
package com.topdraw.business.module.member.group.service.dto;
import lombok.Data;
import java.io.Serializable;
import java.sql.Timestamp;
/**
* @author XiangHan
* @date 2021-11-17
*/
@Data
public class MemberGroupDTO implements Serializable {
/** ID */
private Long id;
/** 分组ID */
private Long groupId;
/** 会员ID */
private Long memberId;
/** 运营商平台账号 */
private String platformAccount;
/** 手机号 */
private String cellphone;
/** 设备 */
private String stbId;
/** 有线MAC地址 */
private String ethMac;
/** 无线MAC地址 */
private String wifiMac;
/** 描述 */
private String description;
/** 创建者 */
private String createBy;
/** 创建时间 */
private Timestamp createTime;
/** 更新者 */
private String updateBy;
/** 更新时间 */
private Timestamp updateTime;
}
package com.topdraw.business.module.member.group.service.impl;
import com.topdraw.business.module.member.group.domain.Group;
import com.topdraw.business.module.member.group.repository.GroupRepository;
import com.topdraw.business.module.member.group.service.GroupService;
import com.topdraw.business.module.member.group.service.dto.GroupDTO;
import com.topdraw.business.module.member.group.service.mapper.GroupMapper;
import com.topdraw.utils.StringUtils;
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;
/**
* @author luerlong
* @date 2021-09-27
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class GroupServiceImpl implements GroupService {
@Autowired
private GroupRepository groupRepository;
@Autowired
private GroupMapper groupMapper;
@Override
public GroupDTO findById(Long id) {
Group group = groupRepository.findById(id).orElseGet(Group::new);
ValidationUtil.isNull(group.getId(),"Group","id",id);
return groupMapper.toDto(group);
}
@Override
public GroupDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? groupMapper.toDto(groupRepository.findFirstByCode(code).orElseGet(Group::new))
: new GroupDTO();
}
}
package com.topdraw.business.module.member.group.service.impl;
import com.topdraw.business.module.member.group.domain.MemberGroup;
import com.topdraw.business.module.member.group.repository.MemberGroupRepository;
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.group.service.mapper.MemberGroupMapper;
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 java.util.List;
/**
* @author XiangHan
* @date 2021-11-17
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class MemberGroupServiceImpl implements MemberGroupService {
@Autowired
private MemberGroupRepository memberGroupRepository;
@Autowired
private MemberGroupMapper memberGroupMapper;
@Override
public List<MemberGroupDTO> findByMemberId(Long memberId) {
return this.memberGroupRepository.findByMemberId(memberId);
}
@Override
public MemberGroupDTO findById(Long id) {
MemberGroup memberGroup = this.memberGroupRepository.findById(id).orElseGet(MemberGroup::new);
ValidationUtil.isNull(memberGroup.getId(),"MemberGroup","id",id);
return this.memberGroupMapper.toDto(memberGroup);
}
}
package com.topdraw.business.module.member.group.service.mapper;
import com.topdraw.base.BaseMapper;
import com.topdraw.business.module.member.group.domain.Group;
import com.topdraw.business.module.member.group.service.dto.GroupDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
/**
* @author luerlong
* @date 2021-09-27
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface GroupMapper extends BaseMapper<GroupDTO, Group> {
}
package com.topdraw.business.module.member.group.service.mapper;
import com.topdraw.base.BaseMapper;
import com.topdraw.business.module.member.group.domain.MemberGroup;
import com.topdraw.business.module.member.group.service.dto.MemberGroupDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
/**
* @author XiangHan
* @date 2021-11-17
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface MemberGroupMapper extends BaseMapper<MemberGroupDTO, MemberGroup> {
}
......@@ -2,6 +2,8 @@ package com.topdraw.business.module.member.level.domain;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
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;
......@@ -9,6 +11,8 @@ import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.sql.Timestamp;
......@@ -23,50 +27,53 @@ import java.sql.Timestamp;
@Table(name="uc_member_level")
public class MemberLevel 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", nullable = false)
private String code;
// 名称
/** 名称 */
@Column(name = "name", nullable = false)
private String name;
// 状态 0:未启用;1:启用
/** 状态 0:未启用;1:启用 */
@Column(name = "status", nullable = false)
private Integer status;
// 对应成长值
/** 对应成长值 */
@Column(name = "exp_value", nullable = false)
private Long expValue;
// 等级(不可重复,数字越大等级越高)
/** 等级(不可重复,数字越大等级越高) */
@Column(name = "level", nullable = false)
@Min(message = "level can't less then 1" , value = 1)
@NotNull(message = "level can't be null" , groups = {CreateGroup.class,UpdateGroup.class})
private Integer level;
// 会员徽标
/** 会员徽标 */
@Column(name = "icon_url")
private String iconUrl;
// 描述
/** 描述 */
@Column(name = "description")
private String description;
// 对应任务id,通过此字段可获得该等级所对应的权益
/** 对应任务id,通过此字段可获得该等级所对应的权益 */
@Column(name = "task_id")
private Long taskId;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
......
package com.topdraw.business.module.member.level.service;
import com.topdraw.business.module.member.level.domain.MemberLevel;
import com.topdraw.business.module.member.level.service.dto.MemberLevelDTO;
import com.topdraw.business.module.member.level.service.dto.MemberLevelQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -15,33 +11,12 @@ import java.util.Map;
public interface MemberLevelService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(MemberLevelQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<MemberLevelDTO>
*/
List<MemberLevelDTO> queryAll(MemberLevelQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return MemberLevelDTO
*/
MemberLevelDTO findById(Long id);
void create(MemberLevel resources);
void update(MemberLevel resources);
void delete(Long id);
/**
* Code校验
* @param code
......@@ -49,5 +24,13 @@ public interface MemberLevelService {
*/
MemberLevelDTO getByCode(String code);
/**
* 通过等级和状态检索
* @param i
* @param status
* @return
*/
List<MemberLevelDTO> findLevelAndStatus(Integer i, Integer status);
}
......
......@@ -13,36 +13,36 @@ import java.sql.Timestamp;
@Data
public class MemberLevelDTO implements Serializable {
// 主键
/** 主键 */
private Long id;
// 标识
/** 标识 */
private String code;
// 名称
/** 名称 */
private String name;
// 状态 0:未启用;1:启用
/** 状态 0:未启用;1:启用 */
private Integer status;
// 对应成长值
/** 对应成长值 */
private Long expValue;
// 等级(不可重复,数字越大等级越高)
/** 等级(不可重复,数字越大等级越高) */
private Integer level;
// 会员徽标
/** 会员徽标 */
private String iconUrl;
// 描述
/** 描述 */
private String description;
// 对应任务id,通过此字段可获得该等级所对应的权益
/** 对应任务id,通过此字段可获得该等级所对应的权益 */
private Long taskId;
// 创建时间
/** 创建时间 */
private Timestamp createTime;
// 更新时间
/** 更新时间 */
private Timestamp updateTime;
}
......
package com.topdraw.business.module.member.level.service.dto;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class MemberLevelQueryCriteria{
}
......@@ -4,23 +4,15 @@ import com.topdraw.business.module.member.level.domain.MemberLevel;
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.dto.MemberLevelQueryCriteria;
import com.topdraw.business.module.member.level.service.mapper.MemberLevelMapper;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.StringUtils;
import com.topdraw.utils.ValidationUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -31,62 +23,27 @@ import java.util.Map;
public class MemberLevelServiceImpl implements MemberLevelService {
@Autowired
private MemberLevelRepository MemberLevelRepository;
private MemberLevelRepository memberLevelRepository;
@Autowired
private MemberLevelMapper MemberLevelMapper;
@Override
public Map<String, Object> queryAll(MemberLevelQueryCriteria criteria, Pageable pageable) {
Page<MemberLevel> page = MemberLevelRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(MemberLevelMapper::toDto));
}
@Override
public List<MemberLevelDTO> queryAll(MemberLevelQueryCriteria criteria) {
return MemberLevelMapper.toDto(MemberLevelRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
private MemberLevelMapper memberLevelMapper;
@Override
public MemberLevelDTO findById(Long id) {
MemberLevel MemberLevel = MemberLevelRepository.findById(id).orElseGet(MemberLevel::new);
MemberLevel MemberLevel = this.memberLevelRepository.findById(id).orElseGet(MemberLevel::new);
ValidationUtil.isNull(MemberLevel.getId(),"MemberLevel","id",id);
return MemberLevelMapper.toDto(MemberLevel);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(MemberLevel resources) {
MemberLevelRepository.save(resources);
return this.memberLevelMapper.toDto(MemberLevel);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(MemberLevel resources) {
MemberLevel MemberLevel = MemberLevelRepository.findById(resources.getId()).orElseGet(MemberLevel::new);
ValidationUtil.isNull( MemberLevel.getId(),"MemberLevel","id",resources.getId());
MemberLevel.copy(resources);
MemberLevelRepository.save(MemberLevel);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
MemberLevel MemberLevel = MemberLevelRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", MemberLevel.class, id), 1));
MemberLevelRepository.delete(MemberLevel);
}
@Override
public MemberLevelDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? MemberLevelMapper.toDto(MemberLevelRepository.findFirstByCode(code).orElseGet(MemberLevel::new))
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 MemberLevelMapper.toDto(MemberLevelRepository.findByLevelAndStatus(level,status));
return this.memberLevelMapper.toDto(this.memberLevelRepository.findByLevelAndStatus(level,status));
}
}
......
......@@ -2,6 +2,8 @@ package com.topdraw.business.module.member.profile.domain;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
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;
......@@ -9,6 +11,7 @@ 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;
......@@ -23,73 +26,80 @@ import java.sql.Timestamp;
@Table(name="uc_member_profile")
public class MemberProfile implements Serializable {
// 主键
/** 会员code */
@Transient
@NotNull(message = "memberCode not be null!!" , groups = {CreateGroup.class, UpdateGroup.class})
private String memberCode;
/** 头像 */
@Transient
private String avatarUrl;
/** 主键 */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
@NotNull(message = "id not be null!!" , groups = UpdateGroup.class)
private Long id;
// 手机号
@Column(name = "phone")
private String phone;
// 会员id
/** 会员id */
@Column(name = "member_id", nullable = false)
private Long memberId;
@Transient
private String memberCode;
// 姓名
/** 姓名 */
@Column(name = "realname")
private String realname;
// 性别 0:女; 1:男 -1:未知
/** 性别 0:女; 1:男 -1:未知 */
@Column(name = "gender", nullable = false)
private Integer gender;
// 生日
/** 生日 */
@Column(name = "birthday", nullable = false)
private Timestamp birthday;
private String birthday;
/** 手机号 */
@Column(name = "phone")
private String phone;
// 星座
/** 星座 */
@Column(name = "constellation")
private String constellation;
// 身份证
/** 身份证 */
@Column(name = "id_card", nullable = false)
private String idCard;
// 电子邮件
/** 电子邮件 */
@Column(name = "email")
private String email;
// 国家
/** 国家 */
@Column(name = "country")
private String country;
// 省份
/** 省份 */
@Column(name = "province")
private String province;
// 城市
/** 城市 */
@Column(name = "city")
private String city;
// 区县
/** 区县 */
@Column(name = "district")
private String district;
// 描述
/** 描述 */
@Column(name = "description")
private String description;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
......
package com.topdraw.business.module.member.profile.domain;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.exception.GlobeExceptionMsg;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Assert;
public class MemberProfileBuilder {
public static MemberProfile build(Member member){
MemberProfile memberProfile = build(member.getId(),member.getCode(),member.getNickname(),member.getGender(),"","","","","","",
"","","",member.getBirthday());
return memberProfile;
}
public static MemberProfile build(Long memberId){
MemberProfile memberProfile = build(memberId,"","",-1,"","","","","","",
"","","","");
return memberProfile;
}
public static MemberProfile build(Long memberId ,String memberCode, String realname , Integer gender, String birthday){
MemberProfile memberProfile = build(memberId,memberCode,realname,gender,"","","","","","",
"","","",birthday);
return memberProfile;
}
public static MemberProfile build(Long memberId,String memberCode, String realName, Integer sex,
String country, String district, String city, String idCard, String province,
String email, String description, String phone, String constellation,
String birthday) {
Assert.notNull(memberId, GlobeExceptionMsg.MEMBER_ID_IS_NULL);
MemberProfile memberProfile = new MemberProfile();
memberProfile.setMemberId(memberId);
memberProfile.setMemberCode(memberCode);
memberProfile.setRealname(stringIsNull(realName));
memberProfile.setGender(sex == null ? 0 : sex);
memberProfile.setCountry(StringUtils.isBlank(country)?"中国":birthday);
memberProfile.setDistrict(stringIsNull(district));
memberProfile.setCity(stringIsNull(city));
memberProfile.setIdCard(StringUtils.isBlank(idCard)?"000000000000000000":idCard);
memberProfile.setProvince(stringIsNull(province));
memberProfile.setEmail(stringIsNull(email));
memberProfile.setDescription(stringIsNull(description));
memberProfile.setPhone(stringIsNull(phone));
memberProfile.setConstellation(stringIsNull(constellation));
memberProfile.setBirthday(StringUtils.isBlank(birthday)?"1900-01-01":birthday);
return memberProfile;
}
private static String stringIsNull(String s){
return StringUtils.isBlank(s)?"":s;
}
public static MemberProfile build(MemberProfile resources) {
if (resources.getMemberId() == null)
throw new NullPointerException("memberId is null");
MemberProfile memberProfile = new MemberProfile();
memberProfile.setId(resources.getId());
memberProfile.setMemberId(resources.getMemberId());
memberProfile.setRealname(stringIsNull(resources.getRealname()));
memberProfile.setGender(resources.getGender() == null ? -1 : resources.getGender());
memberProfile.setCountry(stringIsNull(resources.getCountry()));
memberProfile.setDistrict(stringIsNull(resources.getDistrict()));
memberProfile.setCity(stringIsNull(resources.getCity()));
memberProfile.setIdCard(StringUtils.isBlank(resources.getIdCard())?"000000000000000000":resources.getIdCard());
memberProfile.setProvince(stringIsNull(resources.getProvince()));
memberProfile.setEmail(stringIsNull(resources.getEmail()));
memberProfile.setDescription(stringIsNull(resources.getDescription()));
memberProfile.setPhone(stringIsNull(resources.getPhone()));
memberProfile.setConstellation(stringIsNull(resources.getConstellation()));
memberProfile.setBirthday(stringIsNull(resources.getBirthday()));
return memberProfile;
}
}
......@@ -12,5 +12,7 @@ import java.util.Optional;
*/
public interface MemberProfileRepository extends JpaRepository<MemberProfile, Long>, JpaSpecificationExecutor<MemberProfile> {
MemberProfile findByMemberId(Long memberId);
Optional<MemberProfile> findByMemberId(Long memberId);
Optional<MemberProfile> findFirstByMemberId(Long memberId);
}
......
package com.topdraw.business.module.member.profile.service;
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.dto.MemberProfileDTO;
import com.topdraw.business.module.member.profile.service.dto.MemberProfileQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.List;
import java.util.Map;
import com.topdraw.business.module.member.service.dto.MemberDTO;
/**
* @author XiangHan
......@@ -15,31 +12,69 @@ import java.util.Map;
public interface MemberProfileService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(MemberProfileQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<MemberProfileDTO>
*/
List<MemberProfileDTO> queryAll(MemberProfileQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return MemberProfileDTO
*/
MemberProfileDTO findById(Long id);
/**
* 保存
* @param resources 会员基本信息
* @return
*/
MemberProfile create(MemberProfile resources);
void update(MemberProfile resources);
/**
* 默认属性
* @param resources
* @return
*/
MemberProfile createDefault(MemberProfile resources);
/**
* 通过会员创建默认属性
* @param resources
* @return
*/
MemberProfile createDefault(Member resources);
/**
* 通过会员id创建默认属性
* @param resources
* @return
*/
MemberProfile createDefaultByMemberId(Long resources);
/**
* 修改
* @param resources
*/
MemberProfileDTO update(MemberProfile resources);
/**
* 删除
* @param id
*/
void delete(Long id);
/**
* 通过会员id查询
* @param memberId
* @return
*/
MemberProfileDTO findByMemberId(Long memberId);
/**
* 通过会员code查询
* @param memberCode
* @return
*/
MemberProfileDTO findByMemberCode(String memberCode);
/**
* 修改会员属性并同步会员信息
* @param resources
*/
MemberProfileDTO updateMemberProfileAndMember(MemberProfile resources, MemberDTO memberDTO);
}
......
......@@ -13,51 +13,64 @@ import java.sql.Timestamp;
@Data
public class MemberProfileDTO implements Serializable {
// 主键
/** 会员code */
private String memberCode;
/** 主键 */
private Long id;
// 会员id
/** 会员id */
private Long memberId;
// 手机号
private String phone;
// 姓名
/** 姓名 */
private String realname;
// 性别 0:女; 1:男 -1:未知
/** 性别 0:女; 1:男 -1:未知 */
private Integer gender;
// 生日
private Timestamp birthday;
/** 生日 */
private String birthday;
/** 电话 */
private String phone;
// 星座
/** 星座 */
private String constellation;
// 身份证
/** 身份证 */
private String idCard;
// 电子邮件
/** 电子邮件 */
private String email;
// 国家
/** 国家 */
private String country;
// 省份
/** 省份 */
private String province;
// 城市
/** 城市 */
private String city;
// 区县
/** 区县 */
private String district;
// 描述
/** 描述 */
private String description;
// 创建时间
/** 创建时间 */
private Timestamp createTime;
// 更新时间
/** 更新时间 */
private Timestamp updateTime;
/** vip */
private Integer vip;
/** vip过期时间 */
private Long vipExpireTime;
/** 头像 */
private String avatarUrl;
}
......
package com.topdraw.business.module.member.profile.service.dto;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class MemberProfileQueryCriteria{
}
package com.topdraw.business.module.member.profile.service.impl;
import com.topdraw.business.module.member.domain.Member;
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.repository.MemberProfileRepository;
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.profile.service.dto.MemberProfileQueryCriteria;
import com.topdraw.business.module.member.profile.service.mapper.MemberProfileMapper;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.util.Base64Util;
import com.topdraw.utils.RedisUtils;
import com.topdraw.utils.StringUtils;
import com.topdraw.utils.ValidationUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
@Slf4j
public class MemberProfileServiceImpl implements MemberProfileService {
@Autowired
private MemberProfileRepository MemberProfileRepository;
private MemberService memberService;
@Autowired
private MemberProfileMapper MemberProfileMapper;
private MemberProfileMapper memberProfileMapper;
@Autowired
private MemberService memberService;
private MemberProfileRepository memberProfileRepository;
@Override
public Map<String, Object> queryAll(MemberProfileQueryCriteria criteria, Pageable pageable) {
Page<MemberProfile> page = MemberProfileRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(MemberProfileMapper::toDto));
public MemberProfileDTO findById(Long id) {
MemberProfile MemberProfile = this.memberProfileRepository.findById(id).orElseGet(MemberProfile::new);
ValidationUtil.isNull(MemberProfile.getId(),"MemberProfile","id",id);
return this.memberProfileMapper.toDto(MemberProfile);
}
@Override
public List<MemberProfileDTO> queryAll(MemberProfileQueryCriteria criteria) {
return MemberProfileMapper.toDto(MemberProfileRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
public MemberProfileDTO findByMemberId(Long memberId) {
log.info("MemberProfileDTO ==>> findByMemberId ==>> resources ===>> [{}]",memberId);
MemberProfile memberProfile = this.memberProfileRepository.findByMemberId(memberId).orElseGet(MemberProfile::new);
return this.memberProfileMapper.toDto(memberProfile);
}
@Override
public MemberProfileDTO findById(Long id) {
MemberProfile MemberProfile = MemberProfileRepository.findById(id).orElseGet(MemberProfile::new);
ValidationUtil.isNull(MemberProfile.getId(),"MemberProfile","id",id);
return MemberProfileMapper.toDto(MemberProfile);
public MemberProfileDTO findByMemberCode(String memberCode) {
log.info("MemberProfileDTO ==>> findByMemberCode ==>> resources ===>> [{}]",memberCode);
MemberDTO memberDTO = this.memberService.findByCode(memberCode);
log.info("MemberProfileDTO ==>> findByMemberCode ==>> result ===>> [{}]",memberDTO);
return this.findByMemberId(memberDTO.getId());
}
@Override
@Transactional(rollbackFor = Exception.class)
public MemberProfile create(MemberProfile resources) {
String memberCode = resources.getMemberCode();
MemberDTO memberDTO = this.memberService.getByCode(memberCode);
if (Objects.nonNull(memberDTO)) {
String code = memberDTO.getCode();
if (StringUtils.isNotEmpty(code)) {
resources.setMemberCode(code);
resources.setMemberId(memberDTO.getId());
resources.setId(null);
MemberProfileRepository.save(resources);
}
}
log.info("MemberProfileServiceImpl ==>> update ==>> resources ===>> [{}]",resources);
// 检查会员
this.checkMember(resources);
this.memberProfileRepository.save(resources);
return resources;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(MemberProfile resources) {
public MemberProfile createDefault(MemberProfile resources) {
MemberProfile memberProfile = MemberProfileBuilder.build(resources);
return this.create(memberProfile);
}
@Override
@Transactional(rollbackFor = Exception.class)
public MemberProfile createDefault(Member resources) {
MemberProfile memberProfile = MemberProfileBuilder.build(resources);
return this.create(memberProfile);
}
@Override
public MemberProfile createDefaultByMemberId(Long resources) {
MemberProfile memberProfile = MemberProfileBuilder.build(resources);
return this.create(memberProfile);
}
private MemberDTO checkMember(MemberProfile resources){
Long memberId = resources.getMemberId();
String memberCode = resources.getMemberCode();
MemberDTO memberDTO = this.memberService.getByCode(memberCode);
if (Objects.nonNull(memberDTO)) {
Long memberId = memberDTO.getId();
MemberProfile memberProfile = MemberProfileRepository.findByMemberId(memberId);
if (Objects.nonNull(memberProfile)) {
ValidationUtil.isNull( memberProfile.getId(),"MemberProfile","id",memberProfile.getId());
resources.setId(memberProfile.getId());
} else {
resources.setId(null);
}
resources.setMemberId(memberId);
memberProfile.copy(resources);
MemberProfileRepository.save(memberProfile);
log.info("checkMember ==>> memberId ==>> {} || memberCode ==>> {}", memberId, memberCode);
return this.memberService.checkMember(memberId,memberCode);
}
@Override
@Transactional(rollbackFor = Exception.class)
public MemberProfileDTO update(MemberProfile resources) {
log.info("MemberProfileServiceImpl ==>> update ==>> resources ===>> [{}]",resources);
// 检查会员是否存在
MemberDTO memberDTO = this.checkMember(resources);
MemberProfileDTO _memberProfileDTO = this.findByMemberId(memberDTO.getId());
if (Objects.nonNull(_memberProfileDTO.getId())) {
resources.setId(_memberProfileDTO.getId());
resources.setCreateTime(_memberProfileDTO.getCreateTime());
}
resources.setMemberId(memberDTO.getId());
log.info("memberProfileServiceImpl ==>> update ==>> memberId ==>> {} || resources =>> {}", memberDTO.getId(), resources);
MemberProfile _memberProfile = this.memberProfileRepository.save(resources);
MemberProfileDTO memberProfileDTO = new MemberProfileDTO();
BeanUtils.copyProperties(_memberProfile, memberProfileDTO);
return memberProfileDTO;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
MemberProfile MemberProfile = MemberProfileRepository.findById(id).orElseThrow(
MemberProfile MemberProfile = this.memberProfileRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", MemberProfile.class, id), 1));
MemberProfileRepository.delete(MemberProfile);
this.memberProfileRepository.delete(MemberProfile);
}
@Override
@Transactional(rollbackFor = Exception.class)
public MemberProfileDTO updateMemberProfileAndMember(MemberProfile resources, MemberDTO memberDTO) {
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);
memberDTO.setId(resources.getMemberId());
memberDTO.setCode(resources.getMemberCode());
memberDTO.setNickname(resources.getRealname());
memberDTO.setGender(resources.getGender());
memberDTO.setBirthday(resources.getBirthday());
memberDTO.setAvatarUrl(resources.getAvatarUrl());
Member member = new Member();
BeanUtils.copyProperties(memberDTO,member);
this.memberService.update(member);
}
}
......
......@@ -2,6 +2,8 @@ package com.topdraw.business.module.member.relatedinfo.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.UpdateGroup;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.CreatedDate;
......@@ -9,8 +11,10 @@ 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;
import java.time.LocalDate;
/**
* @author XiangHan
......@@ -21,47 +25,53 @@ import java.sql.Timestamp;
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_member_related_info")
public class MemberRelatedInfo implements Serializable {
public class MemberRelatedInfo extends AsyncMqModule implements Serializable {
// ID
/** ID */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
@NotNull(message = "id can't be null" , groups = {UpdateGroup.class})
private Long id;
// 会员id
/** 会员id */
@Column(name = "member_id", nullable = false)
private Long memberId;
@Transient
private String memberCode;
// 人物关系 0:子女;1:父母
/** 人物关系 0:子女;1:父母 */
@Column(name = "type")
private Integer type;
// 手机号
/** 手机号 */
@Column(name = "cellphone")
private String cellphone;
// 身份证号
/** 身份证号 */
@Column(name = "id_card")
private String idCard;
// 姓名
/** 姓名 */
@Column(name = "name")
private String name;
// 性别 0:女;1:男;-1:未知
/** 性别 0:女;1:男;-1:未知 */
@Column(name = "sex")
private Integer sex;
// 创建时间
/** 生日 */
@Column(name = "birthday")
private LocalDate birthday;
/** 头像地址 */
@Column(name = "avatar_url")
private String avatarUrl;
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
......
package com.topdraw.business.module.member.relatedinfo.domain;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.exception.GlobeExceptionMsg;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Assert;
import java.time.LocalDate;
import java.util.Objects;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/11 13:56
* @version: :
* @modified By:
* @since : modified in 2022/3/11 13:56
*/
public class MemberRelatedInfoBuilder {
private static final Integer DEFAULT_VALUE_ = -1;
private static final Integer DEFAULT_VALUE_0 = 0;
public static MemberRelatedInfo build(MemberRelatedInfo memberRelatedInfo){
return build(memberRelatedInfo.getMemberId(),memberRelatedInfo.getMemberCode(),memberRelatedInfo.getId(),memberRelatedInfo.getName(),memberRelatedInfo.getSex(),
memberRelatedInfo.getCellphone(),memberRelatedInfo.getIdCard(),memberRelatedInfo.getBirthday(),memberRelatedInfo.getAvatarUrl(),memberRelatedInfo.getType());
}
public static MemberRelatedInfo build(Member member , MemberRelatedInfo memberRelatedInfo){
return build(member.getId(),member.getCode(),memberRelatedInfo.getId(),memberRelatedInfo.getName(),memberRelatedInfo.getSex(),
memberRelatedInfo.getCellphone(),memberRelatedInfo.getIdCard(),memberRelatedInfo.getBirthday(),memberRelatedInfo.getAvatarUrl(),memberRelatedInfo.getType());
}
public static MemberRelatedInfo build(Long memberId , String memberCode , Long id , String name , Integer sex ,
String cellphone , String idCard, LocalDate birthday , String avatarUrl , Integer type){
Assert.notNull(memberId, GlobeExceptionMsg.MEMBER_ID_IS_NULL);
MemberRelatedInfo memberRelatedInfo = new MemberRelatedInfo();
memberRelatedInfo.setMemberId(memberId);
memberRelatedInfo.setMemberCode(memberCode);
memberRelatedInfo.setId(id);
memberRelatedInfo.setName(stringIsNull(name));
memberRelatedInfo.setSex(Objects.isNull(sex)?DEFAULT_VALUE_:sex);
memberRelatedInfo.setCellphone(stringIsNull(cellphone));
memberRelatedInfo.setIdCard(StringUtils.isBlank(idCard)?"000000000000000000":idCard);
memberRelatedInfo.setBirthday(Objects.isNull(birthday)? LocalDate.of(1990,01,01):birthday);
memberRelatedInfo.setAvatarUrl(stringIsNull(avatarUrl));
memberRelatedInfo.setType(Objects.isNull(type)?DEFAULT_VALUE_0:type);
return memberRelatedInfo;
}
private static String stringIsNull(String s){
return StringUtils.isBlank(s)?"":s;
}
}
......@@ -4,7 +4,6 @@ import com.topdraw.business.module.member.relatedinfo.domain.MemberRelatedInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.util.List;
/**
* @author XiangHan
......@@ -12,5 +11,10 @@ import java.util.List;
*/
public interface MemberRelatedInfoRepository extends JpaRepository<MemberRelatedInfo, Long>, JpaSpecificationExecutor<MemberRelatedInfo> {
List<MemberRelatedInfo> findByMemberIdAndIdCard(Long memberDTOId,String idCard);
MemberRelatedInfo findByIdCard(String idCard);
MemberRelatedInfo findByMemberIdAndIdCard(Long memberId, String idCard);
MemberRelatedInfo findByIdOrIdCard(Long id, String idCard);
}
......
package com.topdraw.business.module.member.relatedinfo.service;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.relatedinfo.domain.MemberRelatedInfo;
import com.topdraw.business.module.member.relatedinfo.service.dto.MemberRelatedInfoDTO;
import com.topdraw.business.module.member.relatedinfo.service.dto.MemberRelatedInfoQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -15,31 +11,72 @@ import java.util.Map;
public interface MemberRelatedInfoService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(MemberRelatedInfoQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<MemberRelatedInfoDTO>
*/
List<MemberRelatedInfoDTO> queryAll(MemberRelatedInfoQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return MemberRelatedInfoDTO
*/
MemberRelatedInfoDTO findById(Long id);
void create(MemberRelatedInfo resources);
/**
* 新增
* @param resources
*/
MemberRelatedInfoDTO create(MemberRelatedInfo resources);
void update(MemberRelatedInfo resources);
/**
* 修改
* @param resources
*/
MemberRelatedInfoDTO update(MemberRelatedInfo resources);
/**
* 删除
* @param id
*/
void delete(Long id);
/**
* 通过身份证查询
* @param resources
* @return
*/
MemberRelatedInfoDTO findByIdCard(MemberRelatedInfo resources);
/**
* 通过身份证查询
* @param idCard 身份证
* @return
*/
MemberRelatedInfoDTO findByIdCard(String idCard);
/**
*
* @param memberId
* @param idCard
* @return
*/
MemberRelatedInfoDTO findByMemberIdAndIdCard(Long memberId, String idCard);
/**
*
* @param memberCode
* @param idCard
* @return
*/
MemberRelatedInfoDTO findByMemberCodeAndIdCard(String memberCode, String idCard);
/**
*
* @param resources
* @return
*/
MemberRelatedInfoDTO findByMemberIdAndIdCard(MemberRelatedInfo resources);
/**
*
* @param member
* @param resources
* @return
*/
MemberRelatedInfoDTO findByMemberIdAndIdCard(Member member, MemberRelatedInfo resources);
}
......
......@@ -4,6 +4,7 @@ import lombok.Data;
import java.io.Serializable;
import java.sql.Timestamp;
import java.time.LocalDate;
/**
......@@ -34,6 +35,12 @@ public class MemberRelatedInfoDTO implements Serializable {
// 性别 0:女;1:男;-1:未知
private Integer sex;
// 生日
private LocalDate birthday;
// 头像地址
private String avatarUrl;
// 创建时间
private Timestamp createTime;
......
package com.topdraw.business.module.member.relatedinfo.service.dto;
import com.topdraw.annotation.Query;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class MemberRelatedInfoQueryCriteria{
@Query
private Long memberId;
}
package com.topdraw.business.module.member.relatedinfo.service.impl;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.relatedinfo.domain.MemberRelatedInfo;
import com.topdraw.business.module.member.relatedinfo.domain.MemberRelatedInfoBuilder;
import com.topdraw.business.module.member.relatedinfo.repository.MemberRelatedInfoRepository;
import com.topdraw.business.module.member.relatedinfo.service.MemberRelatedInfoService;
import com.topdraw.business.module.member.relatedinfo.service.dto.MemberRelatedInfoDTO;
import com.topdraw.business.module.member.relatedinfo.service.dto.MemberRelatedInfoQueryCriteria;
import com.topdraw.business.module.member.relatedinfo.service.mapper.MemberRelatedInfoMapper;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.exception.BadRequestException;
import com.topdraw.exception.GlobeExceptionMsg;
import com.topdraw.util.Base64Util;
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.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
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.CollectionUtils;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
......@@ -31,60 +31,93 @@ import java.util.Objects;
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
@Slf4j
public class MemberRelatedInfoServiceImpl implements MemberRelatedInfoService {
@Autowired
private MemberRelatedInfoRepository MemberRelatedInfoRepository;
private MemberService memberService;
@Autowired
private MemberRelatedInfoMapper MemberRelatedInfoMapper;
private MemberRelatedInfoMapper memberRelatedInfoMapper;
@Autowired
private MemberService memberService;
private MemberRelatedInfoRepository memberRelatedInfoRepository;
private static final String DEFAULT_IDCARD = "000000000000000000";
@Override
public Map<String, Object> queryAll(MemberRelatedInfoQueryCriteria criteria, Pageable pageable) {
Page<MemberRelatedInfo> page = MemberRelatedInfoRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(MemberRelatedInfoMapper::toDto));
public MemberRelatedInfoDTO findById(Long id) {
log.info("MemberRelatedInfoServiceImpl ==>> findById ==>> param ==>> [{}]",id);
MemberRelatedInfo memberRelatedInfo = this.memberRelatedInfoRepository.findById(id).orElseGet(MemberRelatedInfo::new);
ValidationUtil.isNull(memberRelatedInfo.getId(),"MemberRelatedInfo","id",id);
return this.memberRelatedInfoMapper.toDto(memberRelatedInfo);
}
@Override
public List<MemberRelatedInfoDTO> queryAll(MemberRelatedInfoQueryCriteria criteria) {
return MemberRelatedInfoMapper.toDto(MemberRelatedInfoRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
@Transactional(rollbackFor = Exception.class)
public MemberRelatedInfoDTO create(MemberRelatedInfo resources) {
log.info("MemberRelatedInfoServiceImpl ==>> create ==>> param ==>> [{}]",resources);
String idCard = resources.getIdCard();
Long memberId = resources.getMemberId();
if (Objects.nonNull(memberId) && StringUtils.isNotBlank(idCard) && !idCard.equalsIgnoreCase(DEFAULT_IDCARD) ) {
MemberRelatedInfoDTO memberRelatedInfo = this.findByMemberIdAndIdCard(resources);
if (Objects.nonNull(memberRelatedInfo))
// 数据已存在
throw new BadRequestException(GlobeExceptionMsg.ENTITY_ALREADY_EXISTS);
}
this.checkMemberAndEncodeRealname(resources);
MemberRelatedInfo memberRelatedInfo = MemberRelatedInfoBuilder.build(resources);
this.memberRelatedInfoRepository.save(memberRelatedInfo);
log.info("MemberRelatedInfoServiceImpl ==>> create ==>> result ==>> [{}]",memberRelatedInfo);
return this.memberRelatedInfoMapper.toDto(memberRelatedInfo);
}
@Override
public MemberRelatedInfoDTO findById(Long id) {
MemberRelatedInfo MemberRelatedInfo = MemberRelatedInfoRepository.findById(id).orElseGet(MemberRelatedInfo::new);
ValidationUtil.isNull(MemberRelatedInfo.getId(),"MemberRelatedInfo","id",id);
return MemberRelatedInfoMapper.toDto(MemberRelatedInfo);
/**
* 检查会员是否存在,加密真实姓名
* @param resources
*/
private void checkMemberAndEncodeRealname(MemberRelatedInfo resources) {
// 检查会员是否存在
this.checkMember(resources);
// 加密真实姓名
this.encodeRealname(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(MemberRelatedInfo resources) {
MemberRelatedInfoRepository.save(resources);
/**
* 加密真实姓名
* @param resources
* @return
*/
private void encodeRealname(MemberRelatedInfo resources){
String name = resources.getName();
if (StringUtils.isNotBlank(name)) {
String nickNameEncode = Base64Util.encode(name);
if (!nickNameEncode.equalsIgnoreCase(name))
resources.setName(nickNameEncode);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(MemberRelatedInfo resources) {
String memberCode = resources.getMemberCode();
Assert.notNull(memberCode,"memberCode can't be null!");
MemberDTO memberDTO = this.memberService.getByCode(memberCode);
if (Objects.nonNull(memberDTO)) {
Long memberDTOId = memberDTO.getId();
String idCard = resources.getIdCard();
List<MemberRelatedInfo> memberRelatedInfoDTOS = MemberRelatedInfoRepository.findByMemberIdAndIdCard(memberDTOId,idCard);
if (!CollectionUtils.isEmpty(memberRelatedInfoDTOS)) {
for (MemberRelatedInfo memberRelatedInfoDTO : memberRelatedInfoDTOS) {
ValidationUtil.isNull( memberRelatedInfoDTO.getId(),"MemberRelatedInfo","id",memberRelatedInfoDTO.getId());
resources.setId(memberRelatedInfoDTO.getId());
resources.setMemberId(memberDTOId);
memberRelatedInfoDTO.copy(resources);
MemberRelatedInfoRepository.save(memberRelatedInfoDTO);
}
}
public MemberRelatedInfoDTO update(MemberRelatedInfo resources) {
log.info("MemberRelatedInfoServiceImpl ==>> update ==>> param ==>> [{}]",resources);
try {
this.checkMemberAndEncodeRealname(resources);
MemberRelatedInfo memberRelatedInfo = this.memberRelatedInfoRepository.findById(resources.getId()).orElseGet(MemberRelatedInfo::new);
ValidationUtil.isNull(memberRelatedInfo.getId(), "MemberRelatedInfo", "id", resources.getId());
memberRelatedInfo.copy(resources);
this.memberRelatedInfoRepository.save(memberRelatedInfo);
log.info("MemberRelatedInfoServiceImpl ==>> update ==>> param ==>> [{}]", resources);
return this.memberRelatedInfoMapper.toDto(memberRelatedInfo);
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
......@@ -92,10 +125,74 @@ public class MemberRelatedInfoServiceImpl implements MemberRelatedInfoService {
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
MemberRelatedInfo MemberRelatedInfo = MemberRelatedInfoRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", MemberRelatedInfo.class, id), 1));
MemberRelatedInfoRepository.delete(MemberRelatedInfo);
MemberRelatedInfo MemberRelatedInfo = this.memberRelatedInfoRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", com.topdraw.business.module.member.relatedinfo.domain.MemberRelatedInfo.class, id), 1));
this.memberRelatedInfoRepository.delete(MemberRelatedInfo);
}
@Override
public MemberRelatedInfoDTO findByIdCard(MemberRelatedInfo resources){
log.info("MemberRelatedInfoServiceImpl ==>> findByIdCard ==>> param ==>> [{}]",resources);
String idCard = resources.getIdCard();
Assert.notNull(idCard,"idCard can't be null");
if (!idCard.equalsIgnoreCase(DEFAULT_IDCARD)) {
MemberRelatedInfoDTO memberRelatedInfoDTO = this.findByIdCard(idCard);
ValidationUtil.isNull(memberRelatedInfoDTO.getId(),"MemberRelatedInfo","id",resources.getId());
log.info("MemberRelatedInfoServiceImpl ==>> findByIdCard ==>> result ==>> [{}]",memberRelatedInfoDTO);
return memberRelatedInfoDTO;
}
return null;
}
@Override
public MemberRelatedInfoDTO findByIdCard(String idCard) {
log.info("MemberRelatedInfoServiceImpl ==>> findByIdCard ==>> param ==>> [{}]",idCard);
MemberRelatedInfo memberRelatedInfo = this.memberRelatedInfoRepository.findByIdCard(idCard);
log.info("MemberRelatedInfoServiceImpl ==>> findByIdCard ==>> result ==>> [{}]",memberRelatedInfo);
return this.memberRelatedInfoMapper.toDto(memberRelatedInfo);
}
@Override
public MemberRelatedInfoDTO findByMemberCodeAndIdCard(String memberCode, String idCard) {
Assert.notNull(memberCode,"memberCode can't be null");
Assert.notNull(idCard,"idCard can't be null");
MemberDTO memberDTO = this.checkMember(null, memberCode);
return this.findByMemberIdAndIdCard(memberDTO.getId(),idCard);
}
@Override
public MemberRelatedInfoDTO findByMemberIdAndIdCard(Long memberId, String idCard) {
log.info("MemberRelatedInfoServiceImpl ==>> findByMemberIdAndIdCard ==>> param ==>> [{}]",memberId+","+idCard);
MemberRelatedInfo memberRelatedInfo = this.memberRelatedInfoRepository.findByMemberIdAndIdCard(memberId, idCard);
log.info("MemberRelatedInfoServiceImpl ==>> findByMemberIdAndIdCard ==>> result ==>> [{}]",memberRelatedInfo);
return this.memberRelatedInfoMapper.toDto(memberRelatedInfo);
}
@Override
public MemberRelatedInfoDTO findByMemberIdAndIdCard(MemberRelatedInfo resources) {
Long memberId = resources.getMemberId();
String idCard = resources.getIdCard();
return this.findByMemberIdAndIdCard(memberId,idCard);
}
@Override
public MemberRelatedInfoDTO findByMemberIdAndIdCard(Member member, MemberRelatedInfo resources) {
Long memberId = member.getId();
String idCard = resources.getIdCard();
return this.findByMemberIdAndIdCard(memberId,idCard);
}
private MemberDTO checkMember(MemberRelatedInfo resources){
Long memberId = resources.getMemberId();
String code = resources.getMemberCode();
return this.memberService.checkMember(memberId, code);
}
private MemberDTO checkMember(Long memberId , String memberCode){
return this.memberService.checkMember(memberId, memberCode);
}
}
......
......@@ -3,9 +3,8 @@ package com.topdraw.business.module.member.repository;
import com.topdraw.business.module.member.domain.Member;
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.List;
import java.util.Optional;
/**
......@@ -16,10 +15,7 @@ public interface MemberRepository extends JpaRepository<Member, Long>, JpaSpecif
Optional<Member> findFirstByCode(String code);
Optional<Member> findByCode(String code);
List<Member> findByUserIptvId(Long id);
@Modifying
@Query(value = "update uc_member set `points` = ?2 , `due_points` = ?3 where id = ?1 ",nativeQuery = true)
void updateMemberPoints(Long id, Long points, Long duePoints);
Optional<Member> findByIdOrCode(Long id, String code);
}
......
......@@ -2,13 +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.MemberQueryCriteria;
import com.topdraw.business.module.user.iptv.domain.UserTv;
import org.springframework.data.domain.Pageable;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -16,20 +11,7 @@ import java.util.Map;
*/
public interface MemberService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(MemberQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<MemberDTO>
*/
List<MemberDTO> queryAll(MemberQueryCriteria criteria);
/**
* 根据ID查询
......@@ -38,24 +20,67 @@ public interface MemberService {
*/
MemberDTO findById(Long id);
Long create(Member resources);
/**
* 通过code查询会员
* @param code 会员编码
* @return MemberDTO
*/
MemberDTO findByCode(String code);
void unbind(Member resources);
/**
* 保存
* @param resources
* @return Long id
*/
MemberDTO create(Member resources);
/**
* 创建并返回会员
* @param resources 会员
* @return Member
*/
MemberDTO createAndReturnMember(Member resources);
/**
* 修改会员
* @param resources
*/
MemberDTO update(Member resources);
void update(Member resources);
/**
* 修改会员积分
* @param member 会员
*/
MemberDTO doUpdateMemberPoints(Member member);
void delete(Long id);
/**
* 查询绑定了大屏会员列表
* @param id 条件参数
* @return Map<String,Object>
*/
List<MemberDTO> findByUserIptvId(Long id);
/**
* Code校验
* @param code
* @return MemberDTO
*/
MemberDTO getByCode(String code);
* 检查会员信息
* @param id 会员id
* @param memberCode 会员编码
*/
MemberDTO checkMember(Long id, String memberCode);
boolean createMemberByUserTv(UserTv resources);
/**
* 检查会员信息
* @param member 会员
*/
MemberDTO checkMember(Member member);
/**
*
* @param resources
*/
MemberDTO doUpdateMemberExpAndLevel(Member resources);
MemberDTO unbindUserIpTv(Member member);
void doUpdateMemberPoints(Member member);
Member createAndReturnMember(Member resources);
void unbind(Member resources);
}
......
......@@ -3,7 +3,6 @@ package com.topdraw.business.module.member.service.dto;
import lombok.Data;
import java.io.Serializable;
import java.sql.Timestamp;
import java.time.LocalDateTime;
......@@ -14,7 +13,12 @@ import java.time.LocalDateTime;
@Data
public class MemberDTO implements Serializable {
// 会员过期时间
private String platformAccount;
// iptv绑定的主会员 0:否 1:是
private Integer iptvMajor;
// vip过期时间
private LocalDateTime vipExpireTime;
// 主键
......@@ -87,5 +91,5 @@ public class MemberDTO implements Serializable {
private LocalDateTime updateTime;
// 是否在黑名单 1:是;0否
// private Integer blackStatus;
private Long blackStatus;
}
......
package com.topdraw.business.module.member.service.dto;
import com.topdraw.annotation.Query;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class MemberQueryCriteria{
@Query(type = Query.Type.LEFT_LIKE)
private String code;
// 类型 1:大屏;2:小屏
@Query(type = Query.Type.EQUAL)
private Integer type;
// 状态 0:不可用;1:可用
@Query(type = Query.Type.EQUAL)
private Integer status;
// 昵称 base64
@Query(type = Query.Type.LEFT_LIKE)
private String nickname;
// 性别 0:女;1:男;-1:未知
@Query(type = Query.Type.EQUAL)
private Integer gender;
// 分组信息
@Query(type = Query.Type.EQUAL)
private String groups;
// 标签
@Query(type = Query.Type.IN)
private String tags;
// 是否会员 0:非会员;1:会员
@Query(type = Query.Type.EQUAL)
private Integer vip;
// 会员等级(对应level表的level字段,非id)
@Query(type = Query.Type.EQUAL)
private Integer level;
// iptv账号id
@Query(type = Query.Type.EQUAL)
private Long userIptvId;
// 绑定IPTV平台 0:未知;1:电信;2:移动;3:联通
@Query(type = Query.Type.IN)
private Integer bindIptvPlatformType;
}
package com.topdraw.business.module.member.service.impl;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.domain.MemberBuilder;
import com.topdraw.business.module.member.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.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.member.service.dto.MemberQueryCriteria;
import com.topdraw.business.module.member.service.mapper.MemberMapper;
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.config.LocalConstants;
import com.topdraw.util.IdWorker;
import com.topdraw.util.RedissonUtil;
import com.topdraw.util.TimestampUtil;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.StringUtils;
import com.topdraw.exception.BadRequestException;
import com.topdraw.exception.GlobeExceptionMsg;
import com.topdraw.utils.ValidationUtil;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Slf4j
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
@Slf4j
public class MemberServiceImpl implements MemberService {
@Autowired
private MemberRepository memberRepository;
private UserTvService userTvService;
@Autowired
private MemberMapper memberMapper;
@Autowired
private com.topdraw.business.module.user.iptv.service.UserTvService UserTvService;
private MemberRepository memberRepository;
@Autowired
private MemberProfileService memberProfileService;
// @Autowired
// private RedissonClient redissonClient;
@Override
public Map<String, Object> queryAll(MemberQueryCriteria criteria, Pageable pageable) {
Page<Member> page = memberRepository.findAll((root, criteriaQuery, criteriaBuilder)
-> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(memberMapper::toDto));
public MemberDTO findById(Long id) {
Member member = this.memberRepository.findById(id).orElseGet(Member::new);
ValidationUtil.isNull(member.getId(),"Member","id",id);
return this.memberMapper.toDto(member);
}
@Override
public List<MemberDTO> queryAll(MemberQueryCriteria criteria) {
return memberMapper.toDto(memberRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
public MemberDTO findByCode(String code) {
Member member = this.memberRepository.findFirstByCode(code).orElseGet(Member::new);
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
public MemberDTO findById(Long id) {
Member member = memberRepository.findById(id).orElseGet(Member::new);
ValidationUtil.isNull(member.getId(),"Member","id",id);
return memberMapper.toDto(member);
public List<MemberDTO> findByUserIptvId(Long id) {
List<Member> memberList = this.memberRepository.findByUserIptvId(id);
return this.memberMapper.toDto(memberList);
}
@Override
public MemberDTO checkMember(Long id, String memberCode) {
if(Objects.isNull(id) && StringUtils.isBlank(memberCode))
throw new BadRequestException(GlobeExceptionMsg.MEMBER_ID_AND_CODE_ARE_NULL);
if (StringUtils.isNotBlank(memberCode)) {
MemberDTO memberDTO = this.findByCode(memberCode);
log.info("checkMember ==>> findByCode result memberDTO id ==>> {}", memberDTO.getId());
return memberDTO;
} else if (Objects.nonNull(id)) {
MemberDTO memberDTO = this.findById(id);
log.info("checkMember ==>> findById result memberDTO id ==>> {}", memberDTO.getId());
return memberDTO;
}
log.info("checkMember ==>> result is null ==>> id ==>> {} || memberCode ==>> {}" ,id, memberCode);
return null;
}
@Override
public MemberDTO checkMember(Member member) {
String memberCode = member.getCode();
Long memberId = member.getId();
return this.checkMember(memberId,memberCode);
}
@Override
public MemberDTO doUpdateMemberExpAndLevel(Member resources) {
MemberDTO memberDTO = this.update(resources);
return memberDTO;
}
@Override
public MemberDTO unbindUserIpTv(Member member) {
Member _member = this.save(member);
return this.memberMapper.toDto(_member);
}
@Override
@Transactional(rollbackFor = Exception.class)
public Long create(Member resources) {
Member member = this.checkMemberData(resources);
memberRepository.save(member);
return resources.getId();
public MemberDTO create(Member resources) {
Member member = MemberBuilder.build(resources);
Member _member = this.save(member);
if (Objects.nonNull(_member.getId())) {
MemberProfile memberProfile = MemberProfileBuilder.build(_member);
// 保存会员属性
this.memberProfileService.create(memberProfile);
}
return this.memberMapper.toDto(_member);
}
private Member checkMemberData(Member member) {
Long defaultValue = 0L;
String code = member.getCode();
member.setCode(StringUtils.isEmpty(code)?String.valueOf(IdWorker.generator()):code);
Integer gender = member.getGender();
member.setGender(Objects.nonNull(gender) ? gender : 0);
Integer type = member.getType();
member.setType(Objects.nonNull(type) ? type:-1);
Integer status = member.getStatus();
member.setStatus(Objects.nonNull(status) ? status:1);
Integer vip = member.getVip();
member.setVip(Objects.nonNull(vip) ? vip:0);
Integer level = member.getLevel();
member.setLevel(Objects.nonNull(level) ? level:0);
member.setExp(defaultValue);
member.setPoints(defaultValue);
member.setDuePoints(defaultValue);
member.setCouponAmount(defaultValue);
member.setDueCouponAmount(defaultValue);
member.setBlackStatus(0L);
return member;
@Override
@Transactional(rollbackFor = Exception.class)
public MemberDTO createAndReturnMember(Member resources) {
MemberDTO memberDTO = this.create(MemberBuilder.build(resources));
return memberDTO;
}
@Override
......@@ -111,7 +153,7 @@ public class MemberServiceImpl implements MemberService {
public void unbind(Member resources) {
try {
String code = resources.getCode();
MemberDTO memberDTO = this.getByCode(code);
MemberDTO memberDTO = this.findByCode(code);
// Member member = memberRepository.findById(resources.getId()).orElseGet(Member::new);
ValidationUtil.isNull(memberDTO.getId(), "Member", "id", resources.getId());
Member member = new Member();
......@@ -129,138 +171,60 @@ public class MemberServiceImpl implements MemberService {
@Override
@Transactional(rollbackFor = Exception.class)
public void update(Member resources) {
public MemberDTO update(Member resources) {
log.info("MemberServiceImpl ==>> update ==>> resources ==>> [{}]" , resources);
try {
Member member = memberRepository.findByCode(resources.getCode()).orElseGet(Member::new);
if (Objects.nonNull(member.getId())) {
Long id = member.getId();
resources.setId(id);
String platformAccount = resources.getPlatformAccount();
if (StringUtils.isNotEmpty(platformAccount)) {
resources.setUserIptvId(null);
UserTvDTO userTvDTO = this.UserTvService.findByPlatformAccount(platformAccount);
if (Objects.nonNull(userTvDTO)) {
Long userIptvId = userTvDTO.getId();
resources.setUserIptvId(userIptvId);
resources.setBindIptvPlatformType(1);
resources.setBindIptvTime(LocalDateTime.now());
}
} else {
resources.setUserIptvId(member.getUserIptvId());
resources.setBindIptvPlatformType(member.getBindIptvPlatformType());
resources.setBindIptvTime(member.getBindIptvTime());
}
MemberDTO memberDTO = this.checkMember(resources);
resources.setId(memberDTO.getId());
resources.setCode(memberDTO.getCode());
resources.setCreateTime(memberDTO.getCreateTime());
String platformAccount = resources.getPlatformAccount();
if (StringUtils.isNotBlank(platformAccount)) {
if (Objects.nonNull(resources.getUserIptvId())){
UserTvDTO userTvDTO = this.userTvService.findByPlatformAccount(platformAccount);
resources.setUserIptvId(userTvDTO.getId());
}
} else {
resources.setUserIptvId(memberDTO.getUserIptvId());
}
member.copy(resources);
log.info("memberService ==>> update ==>> [{}]",member);
memberRepository.save(member);
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
Member _member = this.save(resources);
return this.memberMapper.toDto(_member);
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
// RLock rLock = this.redissonClient.getLock("Member::delete::code" + id);
try {
// RedissonUtil.lock(rLock);
Member member = memberRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", Member.class, id), 1));
memberRepository.delete(member);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
// RedissonUtil.unlock(rLock);
}
}
}
@Override
public MemberDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? memberMapper.toDto(memberRepository.findFirstByCode(code).orElseGet(Member::new))
: new MemberDTO();
public Member save(Member member){
return this.memberRepository.save(member);
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean createMemberByUserTv(UserTv resources) {
String platformAccount = resources.getPlatformAccount();
UserTvDTO userTvDTO = this.UserTvService.findByPlatformAccount(platformAccount);
if (Objects.isNull(userTvDTO)) {
Member member = new Member();
// 大屏
member.setType(LocalConstants.MEMBER_PLATFORM_TYPE_VIS);
Member member12 = this.checkMemberData(member);
Long memberId = this.create(member12);
if (Objects.nonNull(memberId)) {
UserTv userTv = new UserTv();
BeanUtils.copyProperties(resources,userTv);
userTv.setPlatformAccount(platformAccount);
userTv.setMemberCode(member12.getCode());
Long userIptvId = UserTvService.create(userTv);
if (Objects.nonNull(userIptvId)) {
member.setId(memberId);
member.setUserIptvId(userIptvId);
member.setBindIptvTime(LocalDateTime.now());
this.bindIptvId(member);
}
}
public MemberDTO doUpdateMemberPoints(Member resources) {
try {
} else {
return false;
}
Member member = this.memberRepository.findById(resources.getId()).orElseGet(Member::new);
ValidationUtil.isNull(member.getId(), "Member", "id", resources.getId());
member.copy(resources);
return true;
}
Member _member = this.save(member);
return this.memberMapper.toDto(_member);
@Override
@Transactional(rollbackFor = Exception.class)
public void doUpdateMemberPoints(Member member) {
try {
Long id = member.getId();
Long points = member.getPoints();
Long duePoints = member.getDuePoints();
memberRepository.updateMemberPoints(id,points,duePoints);
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public Member createAndReturnMember(Member resources) {
Member member = this.checkMemberData(resources);
memberRepository.save(member);
return resources;
}
private void save(Member member){
memberRepository.save(member);
}
public void bindIptvId(Member resources) {
try {
Member member = memberRepository.findFirstByCode(resources.getCode()).orElseGet(Member::new);
if (member==null) {
ValidationUtil.isNull(member.getId(), "Member", "id", resources.getId());
member.copy(resources);
}
this.save(member);
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
}
......
......@@ -2,6 +2,7 @@ package com.topdraw.business.module.member.viphistory.domain;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.topdraw.business.module.common.domain.AsyncMqModule;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.CreatedDate;
......@@ -22,10 +23,7 @@ import java.time.LocalDateTime;
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_member_vip_history")
public class MemberVipHistory implements Serializable {
@Transient
private String memberCode;
public class MemberVipHistory extends AsyncMqModule implements Serializable {
// 主键
@Id
......
package com.topdraw.business.module.member.viphistory.domain;
import com.topdraw.business.module.member.domain.Member;
import java.time.LocalDateTime;
import java.util.Objects;
public class MemberVipHistoryBuilder {
public static MemberVipHistory build(Member member , Integer beforeVip) {
Long id = member.getId();
Integer vip = member.getVip();
LocalDateTime vipExpireTime = member.getVipExpireTime();
MemberVipHistory memberVipHistory = new MemberVipHistory();
memberVipHistory.setMemberId(Objects.isNull(id)? null:id);
memberVipHistory.setVip(Objects.isNull(vip)? null:vip);
memberVipHistory.setBeforeVip(Objects.isNull(beforeVip)? null:beforeVip);
memberVipHistory.setVipExpireTime(Objects.isNull(vipExpireTime)? null:vipExpireTime);
return build(memberVipHistory);
}
public static MemberVipHistory build(Long memberId, Integer vip, Integer beforeVip, LocalDateTime vipExpireTime ) {
MemberVipHistory memberVipHistory = new MemberVipHistory();
memberVipHistory.setMemberId(Objects.isNull(memberId)? null:memberId);
memberVipHistory.setVip(Objects.isNull(vip)? null:vip);
memberVipHistory.setBeforeVip(Objects.isNull(beforeVip)? null:beforeVip);
memberVipHistory.setVipExpireTime(Objects.isNull(vipExpireTime)? null:vipExpireTime);
return build(memberVipHistory);
}
public static MemberVipHistory build(MemberVipHistory memberVipHistory) {
return build(memberVipHistory.getId(),
memberVipHistory.getMemberId(),
memberVipHistory.getVip(),
memberVipHistory.getBeforeVip(),
memberVipHistory.getVipExpireTime(),
memberVipHistory.getStatus());
}
public static MemberVipHistory build(Long id, Long memberId , Integer vip , Integer beforeVip , LocalDateTime vipExpireTime, Integer status){
MemberVipHistory memberVipHistory = new MemberVipHistory();
memberVipHistory.setId(Objects.isNull(id)? null:id);
memberVipHistory.setMemberId(Objects.isNull(memberId)? null:memberId) ;
memberVipHistory.setVip(Objects.isNull(vip)? null:vip);
memberVipHistory.setBeforeVip(Objects.isNull(beforeVip)? null:beforeVip);
memberVipHistory.setVipExpireTime(Objects.isNull(vipExpireTime)? null:vipExpireTime);
memberVipHistory.setStatus(Objects.isNull(status)? 1:status);
return memberVipHistory;
}
}
package com.topdraw.business.module.member.viphistory.service;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.viphistory.domain.MemberVipHistory;
import com.topdraw.business.module.member.viphistory.service.dto.MemberVipHistoryDTO;
import com.topdraw.business.module.member.viphistory.service.dto.MemberVipHistoryQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
/**
* @author luerlong
......@@ -16,32 +13,42 @@ import java.util.Map;
public interface MemberVipHistoryService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(MemberVipHistoryQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<MemberVipHistoryDTO>
*/
List<MemberVipHistoryDTO> queryAll(MemberVipHistoryQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return MemberVipHistoryDTO
*/
MemberVipHistoryDTO findById(Long id);
/**
*
* @param resources
*/
void create(MemberVipHistory resources);
/**
*
* @param member
*/
void create(Member member, Integer beforeVip);
/**
*
* @param resources
*/
void update(MemberVipHistory resources);
/**
*
* @param id
*/
void delete(Long id);
/**
*
* @param id
* @param nowTime
* @return
*/
MemberVipHistory findByTime(Long id, LocalDateTime nowTime);
}
......
package com.topdraw.business.module.member.viphistory.service.impl;
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.member.viphistory.domain.MemberVipHistory;
import com.topdraw.business.module.member.viphistory.domain.MemberVipHistoryBuilder;
import com.topdraw.business.module.member.viphistory.repository.MemberVipHistoryRepository;
import com.topdraw.business.module.member.viphistory.service.MemberVipHistoryService;
import com.topdraw.business.module.member.viphistory.service.dto.MemberVipHistoryDTO;
import com.topdraw.business.module.member.viphistory.service.dto.MemberVipHistoryQueryCriteria;
import com.topdraw.business.module.member.viphistory.service.mapper.MemberVipHistoryMapper;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.ValidationUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* @author luerlong
......@@ -37,61 +31,54 @@ import java.util.Objects;
public class MemberVipHistoryServiceImpl implements MemberVipHistoryService {
@Autowired
private MemberVipHistoryRepository memberVipHistoryRepository;
private MemberService memberService;
@Autowired
private MemberVipHistoryMapper memberVipHistoryMapper;
@Autowired
private MemberService memberService;
@Override
public Map<String, Object> queryAll(MemberVipHistoryQueryCriteria criteria, Pageable pageable) {
Page<MemberVipHistory> page = memberVipHistoryRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(memberVipHistoryMapper::toDto));
}
@Override
public List<MemberVipHistoryDTO> queryAll(MemberVipHistoryQueryCriteria criteria) {
return memberVipHistoryMapper.toDto(memberVipHistoryRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
private MemberVipHistoryRepository memberVipHistoryRepository;
@Override
public MemberVipHistoryDTO findById(Long id) {
MemberVipHistory memberVipHistory = memberVipHistoryRepository.findById(id).orElseGet(MemberVipHistory::new);
log.info("MemberVipHistoryServiceImpl ==>> findById ==>> param ==>> [{}]",id);
MemberVipHistory memberVipHistory = this.memberVipHistoryRepository.findById(id).orElseGet(MemberVipHistory::new);
ValidationUtil.isNull(memberVipHistory.getId(),"MemberVipHistory","id",id);
return memberVipHistoryMapper.toDto(memberVipHistory);
log.info("MemberVipHistoryServiceImpl ==>> findById ==>> result ==>> [{}]",memberVipHistory);
return this.memberVipHistoryMapper.toDto(memberVipHistory);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(MemberVipHistory resources) {
log.info("MemberVipHistoryServiceImpl ==>> create ==>> resources ==>> [{}]",resources);
String memberCode = resources.getMemberCode();
Assert.notNull(resources.getMemberCode(),"memberCode can't be null !!");
MemberDTO byCode = memberService.getByCode(memberCode);
if (Objects.nonNull(byCode.getCode())) {
Long id = byCode.getId();
resources.setMemberId(id);
memberVipHistoryRepository.save(resources);
}
log.info("MemberVipHistoryServiceImpl ==>> MemberVipHistoryServiceImpl ==>> param ==>> [{}]",resources);
MemberDTO memberDTO = this.memberService.findByCode(resources.getMemberCode());
resources.setMemberId(memberDTO.getId());
this.memberVipHistoryRepository.save(resources);
}
@Override
public void create(Member member, Integer beforeVip) {
this.checkMember(member);
MemberVipHistory memberVipHistory = MemberVipHistoryBuilder.build(member, beforeVip);
this.memberVipHistoryRepository.save(memberVipHistory);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(MemberVipHistory resources) {
MemberVipHistory memberVipHistory = memberVipHistoryRepository.findById(resources.getId()).orElseGet(MemberVipHistory::new);
MemberVipHistory memberVipHistory = this.memberVipHistoryRepository.findById(resources.getId()).orElseGet(MemberVipHistory::new);
ValidationUtil.isNull( memberVipHistory.getId(),"MemberVipHistory","id",resources.getId());
memberVipHistory.copy(resources);
memberVipHistoryRepository.save(memberVipHistory);
this.memberVipHistoryRepository.save(memberVipHistory);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
MemberVipHistory memberVipHistory = memberVipHistoryRepository.findById(id).orElseThrow(
MemberVipHistory memberVipHistory = this.memberVipHistoryRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", MemberVipHistory.class, id), 1));
memberVipHistoryRepository.delete(memberVipHistory);
this.memberVipHistoryRepository.delete(memberVipHistory);
}
@Override
......@@ -100,5 +87,16 @@ public class MemberVipHistoryServiceImpl implements MemberVipHistoryService {
return memberVipHistory;
}
private MemberDTO checkMember(MemberVipHistory resources){
Long memberId = resources.getMemberId();
String code = resources.getMemberCode();
return this.memberService.checkMember(memberId, code);
}
private MemberDTO checkMember(Member resources){
Long memberId = resources.getId();
String code = resources.getCode();
return this.memberService.checkMember(memberId, code);
}
}
......
......@@ -2,6 +2,8 @@ package com.topdraw.business.module.points.available.domain;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.topdraw.business.module.common.domain.AsyncMqModule;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.CreatedDate;
......@@ -24,53 +26,49 @@ import java.time.LocalDateTime;
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_points_available")
public class PointsAvailable implements Serializable {
public class PointsAvailable extends AsyncMqModule implements Serializable {
/** 会员编号 */
@Transient
private String memberCode;
// 主键
/** 主键 */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 标识
/** 标识 */
@Column(name = "code")
private String code;
// 积分类型 0:通用型
/** 积分类型 0:通用型 */
@Column(name = "points_type")
private Integer pointsType;
// 设备类型 1:大屏;2:小屏(微信)3.小屏(xx)
/** 设备类型 1:大屏;2:小屏(微信)3.小屏(xx) */
@Column(name = "device_type")
private Integer deviceType;
// 会员id
/** 会员id */
@Column(name = "member_id", nullable = false)
private Long memberId;
// 积分值
/** 积分值 */
@Column(name = "points")
private Long points;
// 过期时间
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
/** 过期时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",locale = "")
@Column(name = "expire_time")
private LocalDateTime expireTime;
// 描述
/** 描述 */
@Column(name = "description")
private String description;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
......
......@@ -25,7 +25,7 @@ public interface PointsAvailableRepository extends JpaRepository<PointsAvailable
List<PointsAvailableDTO> findByMemberId(Long memberId);
List<PointsAvailable> findByMemberIdAndExpireTimeBefore(Long memberId , LocalDateTime now);
List<PointsAvailable> findByMemberIdAndExpireTimeBefore(Long memberId, LocalDateTime now);
/**
* 即将过期的积分
......
package com.topdraw.business.module.points.available.rest;
/**
* @author XiangHan
* @date 2021-10-23
*/
//@Api(tags = "PointsAvailable管理")
//@RestController
//@RequestMapping("/api/PointsAvailable")
public class PointsAvailableController {
/*@Autowired
private PointsAvailableService PointsAvailableService;
@GetMapping
@ApiOperation("查询PointsAvailable")
public ResultInfo getPointsAvailables(PointsAvailableQueryCriteria criteria, Pageable pageable) {
return ResultInfo.successPage(PointsAvailableService.queryAll(criteria,pageable));
}
@GetMapping(value = "/all")
@ApiOperation("查询所有PointsAvailable")
public ResultInfo getPointsAvailables(PointsAvailableQueryCriteria criteria) {
return ResultInfo.success(PointsAvailableService.queryAll(criteria));
}
@Log
@PostMapping
@ApiOperation("新增PointsAvailable")
public ResultInfo create(@Validated @RequestBody PointsAvailable resources) {
PointsAvailableService.create(resources);
return ResultInfo.success();
}
@Log
@PutMapping
@ApiOperation("修改PointsAvailable")
public ResultInfo update(@Validated @RequestBody PointsAvailable resources) {
PointsAvailableService.update(resources);
return ResultInfo.success();
}
@Log
@DeleteMapping(value = "/{id}")
@ApiOperation("删除PointsAvailable")
public ResultInfo delete(@PathVariable Long id) {
PointsAvailableService.delete(id);
return ResultInfo.success();
}
@GetMapping(value = "/getByCode/{code}")
@ApiOperation(value = "根据标识查询")
public ResultInfo getByCode(@PathVariable String code) {
return ResultInfo.success(PointsAvailableService.getByCode(code));
}*/
}
......@@ -2,12 +2,9 @@ package com.topdraw.business.module.points.available.service;
import com.topdraw.business.module.points.available.domain.PointsAvailable;
import com.topdraw.business.module.points.available.service.dto.PointsAvailableDTO;
import com.topdraw.business.module.points.available.service.dto.PointsAvailableQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -16,21 +13,6 @@ import java.util.Map;
public interface PointsAvailableService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(PointsAvailableQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<PointsAvailableDTO>
*/
List<PointsAvailableDTO> queryAll(PointsAvailableQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return PointsAvailableDTO
......@@ -41,13 +23,13 @@ public interface PointsAvailableService {
*
* @param resources
*/
void create(PointsAvailable resources);
PointsAvailableDTO create(PointsAvailable resources);
/**
*
* @param resources
*/
void update(PointsAvailable resources);
PointsAvailableDTO update(PointsAvailable resources);
/**
*
......@@ -55,8 +37,6 @@ public interface PointsAvailableService {
*/
void delete(Long id);
void delete4Custom(Long id);
/**
*
* @param id
......@@ -84,7 +64,7 @@ public interface PointsAvailableService {
* @param factor 阈值
* @return
*/
Long findSoonExpireTime(Long memberId,Integer factor);
Long findSoonExpireTime(Long memberId, Integer factor);
/**
*
......@@ -107,6 +87,15 @@ public interface PointsAvailableService {
*/
long findTotalPointsByMemberId(Long memberId);
void create4Custom(PointsAvailable pointsAvailable);
/**
*
* @param id
*/
void delete4Custom(Long id);
/**
*
* @param pointsAvailable
*/
PointsAvailableDTO create4Custom(PointsAvailable pointsAvailable);
}
......
......@@ -14,33 +14,33 @@ import java.time.LocalDateTime;
@Data
public class PointsAvailableDTO implements Serializable {
// 主键
/** 主键 */
private Long id;
// 标识
/** 标识 */
private String code;
// 积分类型 0:通用型
/** 积分类型 0:通用型 */
private Integer pointsType;
// 设备类型 1:大屏;2:小屏(微信)3.小屏(xx)
/** 设备类型 1:大屏;2:小屏(微信)3.小屏(xx) */
private Integer deviceType;
// 会员id
/** 会员id */
private Long memberId;
// 积分值
/** 积分值 */
private Long points;
// 过期时间
/** 过期时间 */
private LocalDateTime expireTime;
// 描述
/** 描述 */
private String description;
// 创建时间
/** 创建时间 */
private Timestamp createTime;
// 更新时间
/** 更新时间 */
private Timestamp updateTime;
}
......
package com.topdraw.business.module.points.available.service.impl;
import com.topdraw.business.module.member.service.MemberService;
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.repository.PointsAvailableRepository;
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.available.service.dto.PointsAvailableQueryCriteria;
import com.topdraw.business.module.points.available.service.mapper.PointsAvailableMapper;
import com.topdraw.util.RedissonUtil;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.RedisUtils;
import com.topdraw.utils.StringUtils;
import com.topdraw.utils.ValidationUtil;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
......@@ -26,7 +17,6 @@ import org.springframework.util.Assert;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
......@@ -38,147 +28,149 @@ import java.util.Objects;
public class PointsAvailableServiceImpl implements PointsAvailableService {
@Autowired
private PointsAvailableRepository PointsAvailableRepository;
private PointsAvailableRepository pointsAvailableRepository;
@Autowired
private PointsAvailableMapper PointsAvailableMapper;
private PointsAvailableMapper pointsAvailableMapper;
@Autowired
private MemberService memberService;
@Override
public Map<String, Object> queryAll(PointsAvailableQueryCriteria criteria, Pageable pageable) {
Page<PointsAvailable> page = PointsAvailableRepository.findAll((root, criteriaQuery, criteriaBuilder) ->
QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(PointsAvailableMapper::toDto));
}
private RedisUtils redisUtils;
@Override
public List<PointsAvailableDTO> findByMemberIdOrderByExpireTime(Long memberId) {
return PointsAvailableMapper.toDto(PointsAvailableRepository.findByMemberIdOrderByExpireTime(memberId));
}
@Override
public List<PointsAvailableDTO> queryAll(PointsAvailableQueryCriteria criteria) {
return PointsAvailableMapper.toDto(PointsAvailableRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
return this.pointsAvailableMapper.toDto(this.pointsAvailableRepository.findByMemberIdOrderByExpireTime(memberId));
}
@Override
public PointsAvailableDTO findById(Long id) {
PointsAvailable PointsAvailable = PointsAvailableRepository.findById(id).orElseGet(PointsAvailable::new);
ValidationUtil.isNull(PointsAvailable.getId(),"PointsAvailable","id",id);
return PointsAvailableMapper.toDto(PointsAvailable);
PointsAvailable pointsAvailable = this.pointsAvailableRepository.findById(id).orElseGet(PointsAvailable::new);
ValidationUtil.isNull(pointsAvailable.getId(),"PointsAvailable","id",id);
return this.pointsAvailableMapper.toDto(pointsAvailable);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(PointsAvailable resources) {
String memberCode = resources.getMemberCode();
if (StringUtils.isNotEmpty(memberCode)) {
MemberDTO memberDTO = this.memberService.getByCode(memberCode);
if (Objects.nonNull(memberDTO)) {
Long memberId = memberDTO.getId();
resources.setMemberId(memberId);
}
}
public PointsAvailableDTO create(PointsAvailable resources) {
try {
PointsAvailableRepository.save(resources);
}
this.redisUtils.doLock("PointsAvailable::create::id"+resources.getMemberId().toString());
PointsAvailable pointsAvailable = this.pointsAvailableRepository.save(resources);
@Override
@Transactional(rollbackFor = Exception.class)
public void update(PointsAvailable resources) {
try {
PointsAvailable PointsAvailable = PointsAvailableRepository.findById(resources.getId()).orElseGet(PointsAvailable::new);
ValidationUtil.isNull( PointsAvailable.getId(),"PointsAvailable","id",resources.getId());
PointsAvailable.copy(resources);
PointsAvailableRepository.save(PointsAvailable);
return this.pointsAvailableMapper.toDto(pointsAvailable);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
this.redisUtils.doUnLock("PointsAvailable::create::id"+resources.getMemberId().toString());
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
public PointsAvailableDTO update(PointsAvailable resources) {
try {
PointsAvailable PointsAvailable = PointsAvailableRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", PointsAvailable.class, id), 1));
PointsAvailableRepository.delete(PointsAvailable);
this.redisUtils.doLock("PointsAvailable::update::id"+resources.getMemberId().toString());
PointsAvailable pointsAvailable = this.pointsAvailableRepository.findById(resources.getId()).orElseGet(PointsAvailable::new);
ValidationUtil.isNull(pointsAvailable.getId(),"PointsAvailable","id",resources.getId());
pointsAvailable.copy(resources);
PointsAvailable _pointsAvailable = this.pointsAvailableRepository.save(pointsAvailable);
return this.pointsAvailableMapper.toDto(_pointsAvailable);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
this.redisUtils.doUnLock("PointsAvailable::update::id"+resources.getMemberId().toString());
}
}
@Override
public void delete4Custom(Long id) {
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
this.redisUtils.doLock("PointsAvailable::delete::id"+id);
try {
PointsAvailable PointsAvailable = PointsAvailableRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", PointsAvailable.class, id), 1));
PointsAvailableRepository.delete(PointsAvailable);
PointsAvailable PointsAvailable = this.pointsAvailableRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", com.topdraw.business.module.points.available.domain.PointsAvailable.class, id), 1));
this.pointsAvailableRepository.delete(PointsAvailable);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
this.redisUtils.doLock("PointsAvailable::delete::id"+id);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteBatchByIds(List<Long> id) {
this.redisUtils.doLock("PointsAvailable::create::id"+id);
try {
PointsAvailableRepository.deleteBatchByIds(id);
this.pointsAvailableRepository.deleteBatchByIds(id);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
this.redisUtils.doUnLock("PointsAvailable::create::id"+id);
}
}
@Override
public PointsAvailableDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? PointsAvailableMapper.toDto(PointsAvailableRepository.findFirstByCode(code).orElseGet(PointsAvailable::new))
return StringUtils.isNotEmpty(code) ? this.pointsAvailableMapper.toDto(this.pointsAvailableRepository.findFirstByCode(code).orElseGet(PointsAvailable::new))
: new PointsAvailableDTO();
}
@Override
public List<PointsAvailableDTO> findByMemberIdAndExpireTimeBefore(Long memberId, LocalDateTime timestamp) {
return Objects.nonNull(memberId)?
PointsAvailableMapper.toDto(PointsAvailableRepository.findByMemberIdAndExpireTimeBefore(memberId, timestamp))
this.pointsAvailableMapper.toDto(this.pointsAvailableRepository.findByMemberIdAndExpireTimeBefore(memberId, timestamp))
:null;
}
@Override
public Long findSoonExpireTime(Long memberId, Integer factor) {
return PointsAvailableRepository.findSoonExpireTime(memberId, factor);
return this.pointsAvailableRepository.findSoonExpireTime(memberId, factor);
}
@Override
public long findAvailablePointsByMemberId(long memberId) {
Long availablePoints = this.PointsAvailableRepository.findAvailablePointsByMemberId(memberId);
Long availablePoints = this.pointsAvailableRepository.findAvailablePointsByMemberId(memberId);
return availablePoints == null ? 0L : availablePoints;
}
@Override
public long findTotalPointsByMemberId(Long memberId) {
return this.PointsAvailableRepository.findTotalCountByMemberId(memberId);
return this.pointsAvailableRepository.findTotalCountByMemberId(memberId);
}
@Override
public void create4Custom(PointsAvailable resources) {
String memberCode = resources.getMemberCode();
if (StringUtils.isNotEmpty(memberCode)) {
MemberDTO memberDTO = this.memberService.getByCode(memberCode);
if (Objects.nonNull(memberDTO)) {
Long memberId = memberDTO.getId();
resources.setMemberId(memberId);
}
public void delete4Custom(Long id) {
Assert.notNull(id, "The given id must not be null!");
this.redisUtils.doLock("PointsAvailable::delete::id"+id);
try {
PointsAvailable PointsAvailable = this.pointsAvailableRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", com.topdraw.business.module.points.available.domain.PointsAvailable.class, id), 1));
this.pointsAvailableRepository.delete(PointsAvailable);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
this.redisUtils.doUnLock("PointsAvailable::delete::id"+id);
}
}
PointsAvailableRepository.save(resources);
@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());
}
}
}
......
package com.topdraw.business.module.points.detail.detailhistory.service.impl;
import com.topdraw.business.module.points.detail.detailhistory.domain.PointsDetailHistory;
import com.topdraw.business.module.points.detail.detailhistory.repository.PointsDetailHistoryRepository;
import com.topdraw.business.module.points.detail.detailhistory.service.PointsDetailHistoryService;
import com.topdraw.business.module.points.detail.detailhistory.service.dto.PointsDetailHistoryDTO;
import com.topdraw.business.module.points.detail.detailhistory.service.dto.PointsDetailHistoryQueryCriteria;
import com.topdraw.business.module.points.detail.detailhistory.service.mapper.PointsDetailHistoryMapper;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.StringUtils;
......@@ -31,10 +29,10 @@ import java.util.Map;
public class PointsDetailHistoryServiceImpl implements PointsDetailHistoryService {
@Autowired
private PointsDetailHistoryRepository PointsDetailHistoryRepository;
private com.topdraw.business.module.points.detail.detailhistory.repository.PointsDetailHistoryRepository PointsDetailHistoryRepository;
@Autowired
private PointsDetailHistoryMapper PointsDetailHistoryMapper;
private com.topdraw.business.module.points.detail.detailhistory.service.mapper.PointsDetailHistoryMapper PointsDetailHistoryMapper;
@Override
public Map<String, Object> queryAll(PointsDetailHistoryQueryCriteria criteria, Pageable pageable) {
......@@ -49,7 +47,7 @@ public class PointsDetailHistoryServiceImpl implements PointsDetailHistoryServic
@Override
public PointsDetailHistoryDTO findById(Long id) {
PointsDetailHistory PointsDetailHistory = PointsDetailHistoryRepository.findById(id).orElseGet(PointsDetailHistory::new);
PointsDetailHistory PointsDetailHistory = PointsDetailHistoryRepository.findById(id).orElseGet(com.topdraw.business.module.points.detail.detailhistory.domain.PointsDetailHistory::new);
ValidationUtil.isNull(PointsDetailHistory.getId(),"PointsDetailHistory","id",id);
return PointsDetailHistoryMapper.toDto(PointsDetailHistory);
}
......@@ -63,7 +61,7 @@ public class PointsDetailHistoryServiceImpl implements PointsDetailHistoryServic
@Override
@Transactional(rollbackFor = Exception.class)
public void update(PointsDetailHistory resources) {
PointsDetailHistory PointsDetailHistory = PointsDetailHistoryRepository.findById(resources.getId()).orElseGet(PointsDetailHistory::new);
PointsDetailHistory PointsDetailHistory = PointsDetailHistoryRepository.findById(resources.getId()).orElseGet(com.topdraw.business.module.points.detail.detailhistory.domain.PointsDetailHistory::new);
ValidationUtil.isNull( PointsDetailHistory.getId(),"PointsDetailHistory","id",resources.getId());
PointsDetailHistory.copy(resources);
PointsDetailHistoryRepository.save(PointsDetailHistory);
......@@ -74,7 +72,7 @@ public class PointsDetailHistoryServiceImpl implements PointsDetailHistoryServic
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
PointsDetailHistory PointsDetailHistory = PointsDetailHistoryRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", PointsDetailHistory.class, id), 1));
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", com.topdraw.business.module.points.detail.detailhistory.domain.PointsDetailHistory.class, id), 1));
PointsDetailHistoryRepository.delete(PointsDetailHistory);
}
......
......@@ -84,6 +84,10 @@ public class PointsDetail implements Serializable {
@Column(name = "description", nullable = false)
private String description;
// 商品id
@Column(name = "item_id")
private Long itemId;
// 创建时间
@CreatedDate
@Column(name = "create_time")
......
......@@ -2,11 +2,8 @@ package com.topdraw.business.module.points.detail.service;
import com.topdraw.business.module.points.detail.domain.PointsDetail;
import com.topdraw.business.module.points.detail.service.dto.PointsDetailDTO;
import com.topdraw.business.module.points.detail.service.dto.PointsDetailQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -15,33 +12,30 @@ import java.util.Map;
public interface PointsDetailService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(PointsDetailQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<PointsDetailDTO>
*/
List<PointsDetailDTO> queryAll(PointsDetailQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return PointsDetailDTO
*/
PointsDetailDTO findById(Long id);
void create(PointsDetail resources);
void create4Custom(PointsDetail resources);
/**
*
* @param resources
* @return
*/
PointsDetailDTO create(PointsDetail resources);
void update(PointsDetail resources);
/**
*
* @param resources
* @return
*/
PointsDetailDTO update(PointsDetail resources);
/**
*
* @param id
*/
void delete(Long id);
/**
......@@ -51,13 +45,23 @@ public interface PointsDetailService {
*/
PointsDetailDTO getByCode(String code);
/**
*
* @param memberId
* @return
*/
List<PointsDetailDTO> loadListExpirePointsByMemberId(Long memberId);
/**
* 已过期的积分
* @param memberId
* @return
*/
List<PointsDetailDTO> findByMemberId(Long memberId);
/**
*
* @param pointsDetail
*/
void create4Custom(PointsDetail pointsDetail);
}
......
......@@ -55,6 +55,9 @@ public class PointsDetailDTO implements Serializable {
// 积分变化描述,用于管理侧显示
private String description;
// 商品id
private Long itemId;
// 创建时间
private Timestamp createTime;
......
package com.topdraw.business.module.points.detail.service.dto;
import com.topdraw.annotation.Query;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class PointsDetailQueryCriteria{
@Query(type = Query.Type.EQUAL)
private Long memberId;
@Query(type = Query.Type.EQUAL)
private Long accountId;
}
package com.topdraw.business.module.points.detail.service.impl;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.points.detail.domain.PointsDetail;
import com.topdraw.business.module.points.detail.repository.PointsDetailRepository;
import com.topdraw.business.module.points.detail.service.PointsDetailService;
import com.topdraw.business.module.points.detail.service.dto.PointsDetailDTO;
import com.topdraw.business.module.points.detail.service.dto.PointsDetailQueryCriteria;
import com.topdraw.business.module.points.detail.service.mapper.PointsDetailMapper;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.StringUtils;
import com.topdraw.utils.ValidationUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
......@@ -34,81 +26,47 @@ import java.util.Objects;
public class PointsDetailServiceImpl implements PointsDetailService {
@Autowired
private PointsDetailRepository PointsDetailRepository;
@Autowired
private MemberService memberService;
private PointsDetailRepository pointsDetailRepository;
@Autowired
private PointsDetailMapper PointsDetailMapper;
@Override
public Map<String, Object> queryAll(PointsDetailQueryCriteria criteria, Pageable pageable) {
Page<PointsDetail> page = PointsDetailRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(PointsDetailMapper::toDto));
}
@Override
public List<PointsDetailDTO> queryAll(PointsDetailQueryCriteria criteria) {
return PointsDetailMapper.toDto(PointsDetailRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
private PointsDetailMapper pointsDetailMapper;
@Override
public PointsDetailDTO findById(Long id) {
PointsDetail PointsDetail = PointsDetailRepository.findById(id).orElseGet(PointsDetail::new);
ValidationUtil.isNull(PointsDetail.getId(),"PointsDetail","id",id);
return PointsDetailMapper.toDto(PointsDetail);
PointsDetail pointsDetail = this.pointsDetailRepository.findById(id).orElseGet(PointsDetail::new);
ValidationUtil.isNull(pointsDetail.getId(),"PointsDetail","id",id);
return this.pointsDetailMapper.toDto(pointsDetail);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(PointsDetail resources) {
String memberCode = resources.getMemberCode();
if (StringUtils.isNotEmpty(memberCode)) {
MemberDTO memberDTO = this.memberService.getByCode(memberCode);
if (Objects.nonNull(memberDTO)) {
Long memberId = memberDTO.getId();
resources.setMemberId(memberId);
}
}
PointsDetailRepository.save(resources);
}
@Override
public void create4Custom(PointsDetail resources) {
String memberCode = resources.getMemberCode();
if (StringUtils.isNotEmpty(memberCode)) {
MemberDTO memberDTO = this.memberService.getByCode(memberCode);
if (Objects.nonNull(memberDTO)) {
Long memberId = memberDTO.getId();
resources.setMemberId(memberId);
}
}
PointsDetailRepository.save(resources);
public PointsDetailDTO create(PointsDetail resources) {
PointsDetail pointsDetail = this.pointsDetailRepository.save(resources);
return this.pointsDetailMapper.toDto(pointsDetail);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(PointsDetail resources) {
PointsDetail PointsDetail = PointsDetailRepository.findById(resources.getId()).orElseGet(PointsDetail::new);
ValidationUtil.isNull( PointsDetail.getId(),"PointsDetail","id",resources.getId());
PointsDetail.copy(resources);
PointsDetailRepository.save(PointsDetail);
public PointsDetailDTO update(PointsDetail resources) {
PointsDetail pointsDetail = this.pointsDetailRepository.findById(resources.getId()).orElseGet(PointsDetail::new);
ValidationUtil.isNull( pointsDetail.getId(),"PointsDetail","id",resources.getId());
pointsDetail.copy(resources);
PointsDetail _pointsDetail = this.pointsDetailRepository.save(pointsDetail);
return this.pointsDetailMapper.toDto(_pointsDetail);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
PointsDetail PointsDetail = PointsDetailRepository.findById(id).orElseThrow(
PointsDetail pointsDetail = this.pointsDetailRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", PointsDetail.class, id), 1));
PointsDetailRepository.delete(PointsDetail);
this.pointsDetailRepository.delete(pointsDetail);
}
@Override
public PointsDetailDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? PointsDetailMapper.toDto(PointsDetailRepository.findFirstByCode(code).orElseGet(PointsDetail::new))
return StringUtils.isNotEmpty(code) ? this.pointsDetailMapper.toDto(this.pointsDetailRepository.findFirstByCode(code).orElseGet(PointsDetail::new))
: new PointsDetailDTO();
}
......@@ -120,7 +78,12 @@ public class PointsDetailServiceImpl implements PointsDetailService {
@Override
public List<PointsDetailDTO> findByMemberId(Long memberId) {
return Objects.nonNull(memberId)?
PointsDetailMapper.toDto(PointsDetailRepository.findByMemberId(memberId))
this.pointsDetailMapper.toDto(this.pointsDetailRepository.findByMemberId(memberId))
:null;
}
@Override
public void create4Custom(PointsDetail pointsDetail) {
this.pointsDetailRepository.save(pointsDetail);
}
}
......
......@@ -24,38 +24,41 @@ import java.sql.Timestamp;
public class Points implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
/** 账号id */
@Column(name = "user_id")
private Long userId;
// 积分类型,通用,绑定, 区分大小屏
/** 积分类型:10:通用积分(跨屏) 11:定向积分(跨屏,绑定用途)20:通用积分(大屏)
21:定向积分(大屏,绑定用途)30:通用积分(小屏) 31:定向积分(小屏,绑定用途)*/
@Column(name = "point_type")
private Integer pointType;
// 绑定对应的实体, 如何描述?
/** 绑定对应的实体, 如何描述? */
@Column(name = "target_no")
private String targetNo;
// 本月期初积分值
/** 本月期初积分值 */
@Column(name = "begin_points")
private Integer beginPoints;
// 当前积分余额
/** 当前积分余额 */
@Column(name = "current_points")
private Integer currentPoints;
// 本月到期积分
/** 本月到期积分 */
@Column(name = "expire_points")
private Integer expirePoints;
// 积分类型:10:通用积分(跨屏) 11:定向积分(跨屏,绑定用途)20:通用积分(大屏) 21:定向积分(大屏,绑定用途)30:通用积分(小屏) 31:定向积分(小屏,绑定用途)
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 最后修改时间
/** 最后修改时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
......
......@@ -2,11 +2,6 @@ package com.topdraw.business.module.points.service;
import com.topdraw.business.module.points.domain.Points;
import com.topdraw.business.module.points.service.dto.PointsDTO;
import com.topdraw.business.module.points.service.dto.PointsQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -15,31 +10,28 @@ import java.util.Map;
public interface PointsService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(PointsQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<PointsDTO>
*/
List<PointsDTO> queryAll(PointsQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return PointsDTO
*/
PointsDTO findById(Long id);
void create(Points resources);
/**
*
* @param resources
*/
PointsDTO create(Points resources);
void update(Points resources);
/**
*
* @param resources
*/
PointsDTO update(Points resources);
/**
*
* @param id
*/
void delete(Long id);
}
......
......@@ -19,26 +19,30 @@ public class PointsDTO implements Serializable {
@JsonSerialize(using= ToStringSerializer.class)
private Long id;
/** 账号id */
private Long userId;
// 积分类型,通用,绑定, 区分大小屏 todo
/** 积分类型:10:通用积分(跨屏) 11:定向积分(跨屏,绑定用途)20:通用积分(大屏)
21:定向积分(大屏,绑定用途)30:通用积分(小屏) 31:定向积分(小屏,绑定用途)*/
private Integer pointType;
// 绑定对应的实体, 如何描述?
/** 绑定对应的实体, 如何描述? */
private String targetNo;
// 本月期初积分值
/** 本月期初积分值 */
private Integer beginPoints;
// 当前积分余额
/** 当前积分余额 */
private Integer currentPoints;
// 本月到期积分
/** 本月到期积分 */
private Integer expirePoints;
// 积分类型:10:通用积分(跨屏) 11:定向积分(跨屏,绑定用途)20:通用积分(大屏) 21:定向积分(大屏,绑定用途)30:通用积分(小屏) 31:定向积分(小屏,绑定用途)
/** 积分类型:10:通用积分(跨屏) 11:定向积分(跨屏,绑定用途)20:通用积分(大屏)
* 21:定向积分(大屏,绑定用途)30:通用积分(小屏) 31:定向积分(小屏,绑定用途)
*/
private Timestamp createTime;
// 最后修改时间
/** 最后修改时间 */
private Timestamp updateTime;
}
......
package com.topdraw.business.module.points.service.dto;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class PointsQueryCriteria{
}
package com.topdraw.business.module.points.service.impl;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import com.topdraw.business.module.points.domain.Points;
import com.topdraw.business.module.points.repository.PointsRepository;
import com.topdraw.business.module.points.service.PointsService;
import com.topdraw.business.module.points.service.dto.PointsDTO;
import com.topdraw.business.module.points.service.dto.PointsQueryCriteria;
import com.topdraw.business.module.points.service.mapper.PointsMapper;
import com.topdraw.util.RedissonUtil;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.RedisUtils;
import com.topdraw.utils.ValidationUtil;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -35,48 +24,44 @@ import java.util.Map;
public class PointsServiceImpl implements PointsService {
@Autowired
private PointsRepository PointsRepository;
private PointsRepository pointsRepository;
@Autowired
private PointsMapper PointsMapper;
@Override
public Map<String, Object> queryAll(PointsQueryCriteria criteria, Pageable pageable) {
Page<Points> page = PointsRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(PointsMapper::toDto));
}
@Override
public List<PointsDTO> queryAll(PointsQueryCriteria criteria) {
return PointsMapper.toDto(PointsRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
private PointsMapper pointsMapper;
@Autowired
private RedisUtils redisUtils;
@Override
public PointsDTO findById(Long id) {
Points Points = PointsRepository.findById(id).orElseGet(Points::new);
Points Points = this.pointsRepository.findById(id).orElseGet(Points::new);
ValidationUtil.isNull(Points.getId(),"Points","id",id);
return PointsMapper.toDto(Points);
return this.pointsMapper.toDto(Points);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(Points resources) {
Snowflake snowflake = IdUtil.createSnowflake(1, 1);
resources.setId(snowflake.nextId());
PointsRepository.save(resources);
public PointsDTO create(Points resources) {
Points points = this.pointsRepository.save(resources);
return this.pointsMapper.toDto(points);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(Points resources) {
public PointsDTO update(Points resources) {
this.redisUtils.doLock("Points::update::userId"+resources.getUserId().toString());
try {
Points Points = PointsRepository.findById(resources.getId()).orElseGet(Points::new);
ValidationUtil.isNull(Points.getId(), "Points", "id", resources.getId());
Points.copy(resources);
PointsRepository.save(Points);
Points points = this.pointsRepository.findById(resources.getId()).orElseGet(Points::new);
ValidationUtil.isNull(points.getId(), "Points", "id", resources.getId());
points.copy(resources);
this.pointsRepository.save(points);
return this.pointsMapper.toDto(points);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
this.redisUtils.doUnLock("Points::update::userId"+resources.getUserId().toString());
}
}
......@@ -84,9 +69,9 @@ public class PointsServiceImpl implements PointsService {
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
Points Points = PointsRepository.findById(id).orElseThrow(
Points Points = this.pointsRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", Points.class, id), 1));
PointsRepository.delete(Points);
this.pointsRepository.delete(Points);
}
......
package com.topdraw.business.module.points.standingbook.repository;
import com.topdraw.business.module.points.standingbook.domain.PointsStandingBook;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
/**
* @author XiangHan
* @date 2021-10-29
*/
public interface PointsStandingBookRepository extends JpaRepository<PointsStandingBook, Long>, JpaSpecificationExecutor<PointsStandingBook> {
}
package com.topdraw.business.module.points.standingbook.service;
import com.topdraw.business.module.points.standingbook.domain.PointsStandingBook;
import com.topdraw.business.module.points.standingbook.service.dto.PointsStandingBookDTO;
import com.topdraw.business.module.points.standingbook.service.dto.PointsStandingBookQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
* @date 2021-10-29
*/
public interface PointsStandingBookService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(PointsStandingBookQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<PointsStandingBookDTO>
*/
List<PointsStandingBookDTO> queryAll(PointsStandingBookQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return PointsStandingBookDTO
*/
PointsStandingBookDTO findById(Long id);
void create(PointsStandingBook resources);
void update(PointsStandingBook resources);
void delete(Long id);
}
package com.topdraw.business.module.points.standingbook.service.dto;
import lombok.Data;
import java.io.Serializable;
import java.sql.Timestamp;
/**
* @author XiangHan
* @date 2021-10-29
*/
@Data
public class PointsStandingBookDTO implements Serializable {
// 主键
private Long id;
// 积分生产
private Long pointsProduce;
// 积分消耗
private Long pointsConsume;
// 可用总积分
private Long pointsAvailable;
// 积分过期
private Long pointsExpire;
// 日期
private String day;
// 创建时间
private Timestamp createTime;
// 创建时间
private Timestamp updateTime;
}
package com.topdraw.business.module.points.standingbook.service.dto;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-29
*/
@Data
public class PointsStandingBookQueryCriteria{
}
package com.topdraw.business.module.points.standingbook.service.impl;
import com.topdraw.business.module.points.standingbook.domain.PointsStandingBook;
import com.topdraw.business.module.points.standingbook.repository.PointsStandingBookRepository;
import com.topdraw.business.module.points.standingbook.service.PointsStandingBookService;
import com.topdraw.business.module.points.standingbook.service.dto.PointsStandingBookDTO;
import com.topdraw.business.module.points.standingbook.service.dto.PointsStandingBookQueryCriteria;
import com.topdraw.business.module.points.standingbook.service.mapper.PointsStandingBookMapper;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.ValidationUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
* @date 2021-10-29
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class PointsStandingBookServiceImpl implements PointsStandingBookService {
@Autowired
private PointsStandingBookRepository PointsStandingBookRepository;
@Autowired
private PointsStandingBookMapper PointsStandingBookMapper;
@Override
public Map<String, Object> queryAll(PointsStandingBookQueryCriteria criteria, Pageable pageable) {
Page<PointsStandingBook> page = PointsStandingBookRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(PointsStandingBookMapper::toDto));
}
@Override
public List<PointsStandingBookDTO> queryAll(PointsStandingBookQueryCriteria criteria) {
return PointsStandingBookMapper.toDto(PointsStandingBookRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
@Override
public PointsStandingBookDTO findById(Long id) {
PointsStandingBook PointsStandingBook = PointsStandingBookRepository.findById(id).orElseGet(PointsStandingBook::new);
ValidationUtil.isNull(PointsStandingBook.getId(),"PointsStandingBook","id",id);
return PointsStandingBookMapper.toDto(PointsStandingBook);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(PointsStandingBook resources) {
PointsStandingBookRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(PointsStandingBook resources) {
PointsStandingBook PointsStandingBook = PointsStandingBookRepository.findById(resources.getId()).orElseGet(PointsStandingBook::new);
ValidationUtil.isNull( PointsStandingBook.getId(),"PointsStandingBook","id",resources.getId());
PointsStandingBook.copy(resources);
PointsStandingBookRepository.save(PointsStandingBook);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
PointsStandingBook PointsStandingBook = PointsStandingBookRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", PointsStandingBook.class, id), 1));
PointsStandingBookRepository.delete(PointsStandingBook);
}
}
package com.topdraw.business.module.rights.constant;
public class RightsType {
public static String TYPE_1 = "1";
Integer TYPE_2 = 2;
Integer TYPE_3 = 3;
}
......@@ -23,63 +23,63 @@ import java.sql.Timestamp;
@Table(name="tr_rights")
public class Rights implements Serializable {
// 主键
/** 主键 */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 标识
/** 标识 */
@Column(name = "code", nullable = false)
private String code;
// 权益名称
// @Column(name = "name")
// private String name;
/** 权益名称 */
@Column(name = "name")
private String name;
// 类型 1:实体类 (预留字段)
/** 类型 1:实体类 (预留字段) */
@Column(name = "type", nullable = false)
private Integer type;
// 终端类型 0:大屏;1:微信小程序/公众号;2:App
/** 终端类型 0:大屏;1:微信小程序/公众号;2:App */
@Column(name = "device_type", nullable = false)
private Integer deviceType;
// 权益的实体类型 1:积分;2成长值;3优惠券
/** 权益的实体类型 1:积分;2成长值;3优惠券 */
@Column(name = "entity_type", nullable = false)
private String entityType;
// 实体id
/** 实体id */
@Column(name = "entity_id", nullable = false)
private Long entityId;
// 生效时间,为null表示获取后立即生效,不为空时,表示特定的生效时间
/** 生效时间,为null表示获取后立即生效,不为空时,表示特定的生效时间 */
@Column(name = "valid_time")
private Timestamp validTime;
// 失效时间,空为不失效,否则为获得权益后直到失效的毫秒数
/** 失效时间,空为不失效,否则为获得权益后直到失效的毫秒数 */
@Column(name = "expire_time")
private Long expireTime;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
// 图片
/** 图片 */
@Column(name = "image")
private String image;
// 图片
/** 图片 */
@Column(name = "images")
private String images;
// 描述
/** 描述 */
@Column(name = "description")
private String description;
......
......@@ -2,7 +2,7 @@ package com.topdraw.business.module.rights.history.domain;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.topdraw.business.module.common.domain.DefaultAsyncMqModule;
import com.topdraw.business.module.common.domain.AsyncMqModule;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.CreatedDate;
......@@ -23,7 +23,7 @@ import java.time.LocalDateTime;
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="tr_rights_histroy")
public class RightsHistory extends DefaultAsyncMqModule implements Serializable {
public class RightsHistory extends AsyncMqModule implements Serializable {
// 主键id
@Id
......@@ -52,7 +52,7 @@ public class RightsHistory extends DefaultAsyncMqModule implements Serializable
// 发放时间
@Column(name = "send_time")
private LocalDateTime sendTime;
private Timestamp sendTime;
// 失效时间
@Column(name = "expire_time")
......@@ -60,11 +60,11 @@ public class RightsHistory extends DefaultAsyncMqModule implements Serializable
@CreatedDate
@Column(name = "create_time")
private LocalDateTime createTime;
private Timestamp createTime;
@LastModifiedDate
@Column(name = "update_time")
private LocalDateTime updateTime;
private Timestamp updateTime;
public void copy(RightsHistory source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
......
package com.topdraw.business.module.rights.history.repository;
import com.topdraw.business.module.rights.history.domain.RightsHistory;
import com.topdraw.business.module.rights.history.service.dto.RightsHistoryDTO;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.util.List;
/**
* @author XiangHan
* @date 2021-10-22
*/
public interface RightsHistoryRepository extends JpaRepository<RightsHistory, Long>, JpaSpecificationExecutor<RightsHistory> {
List<RightsHistoryDTO> findByMemberId(Long memberId);
}
......
......@@ -2,11 +2,8 @@ package com.topdraw.business.module.rights.history.service;
import com.topdraw.business.module.rights.history.domain.RightsHistory;
import com.topdraw.business.module.rights.history.service.dto.RightsHistoryDTO;
import com.topdraw.business.module.rights.history.service.dto.RightsHistoryQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -15,19 +12,12 @@ import java.util.Map;
public interface RightsHistoryService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(RightsHistoryQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<RightsHistoryDTO>
*/
List<RightsHistoryDTO> queryAll(RightsHistoryQueryCriteria criteria);
*
* @param memberId
* @param memberCode
* @return
*/
List<RightsHistoryDTO> findByMemberIdOrMemberCode(Long memberId, String memberCode);
/**
* 根据ID查询
......
......@@ -30,12 +30,12 @@ public class RightsHistoryDTO implements Serializable {
private String operatorName;
// 发放时间
private LocalDateTime sendTime;
private Timestamp sendTime;
// 失效时间
private LocalDateTime expireTime;
private LocalDateTime createTime;
private Timestamp createTime;
private LocalDateTime updateTime;
private Timestamp updateTime;
}
......
......@@ -6,23 +6,16 @@ import com.topdraw.business.module.rights.history.domain.RightsHistory;
import com.topdraw.business.module.rights.history.repository.RightsHistoryRepository;
import com.topdraw.business.module.rights.history.service.RightsHistoryService;
import com.topdraw.business.module.rights.history.service.dto.RightsHistoryDTO;
import com.topdraw.business.module.rights.history.service.dto.RightsHistoryQueryCriteria;
import com.topdraw.business.module.rights.history.service.mapper.RightsHistoryMapper;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.ValidationUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -33,60 +26,49 @@ import java.util.Map;
public class RightsHistoryServiceImpl implements RightsHistoryService {
@Autowired
private RightsHistoryRepository RightsHistoryRepository;
@Autowired
private MemberService memberService;
@Autowired
private RightsHistoryMapper RightsHistoryMapper;
private RightsHistoryMapper rightsHistoryMapper;
@Autowired
private RightsHistoryRepository rightsHistoryRepository;
@Override
public Map<String, Object> queryAll(RightsHistoryQueryCriteria criteria, Pageable pageable) {
Page<RightsHistory> page = RightsHistoryRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(RightsHistoryMapper::toDto));
}
@Override
public List<RightsHistoryDTO> queryAll(RightsHistoryQueryCriteria criteria) {
return RightsHistoryMapper.toDto(RightsHistoryRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
public List<RightsHistoryDTO> findByMemberIdOrMemberCode(Long memberId, String memberCode) {
MemberDTO memberDTO = this.memberService.checkMember(memberId, memberCode);
List<RightsHistoryDTO> rightsHistoryDTOList = this.rightsHistoryRepository.findByMemberId(memberDTO.getId());
return rightsHistoryDTOList;
}
@Override
public RightsHistoryDTO findById(Long id) {
RightsHistory RightsHistory = RightsHistoryRepository.findById(id).orElseGet(RightsHistory::new);
RightsHistory RightsHistory = this.rightsHistoryRepository.findById(id).orElseGet(com.topdraw.business.module.rights.history.domain.RightsHistory::new);
ValidationUtil.isNull(RightsHistory.getId(),"RightsHistory","id",id);
return RightsHistoryMapper.toDto(RightsHistory);
return this.rightsHistoryMapper.toDto(RightsHistory);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(RightsHistory resources) {
String memberCode = resources.getMemberCode();
if (StringUtils.isNotBlank(memberCode)) {
MemberDTO memberDTO = this.memberService.getByCode(memberCode);
Long id = memberDTO.getId();
resources.setMemberId(id);
}
RightsHistoryRepository.save(resources);
this.rightsHistoryRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(RightsHistory resources) {
RightsHistory RightsHistory = RightsHistoryRepository.findById(resources.getId()).orElseGet(RightsHistory::new);
ValidationUtil.isNull( RightsHistory.getId(),"RightsHistory","id",resources.getId());
RightsHistory RightsHistory = this.rightsHistoryRepository.findById(resources.getId()).orElseGet(com.topdraw.business.module.rights.history.domain.RightsHistory::new);
ValidationUtil.isNull(RightsHistory.getId(),"RightsHistory","id",resources.getId());
RightsHistory.copy(resources);
RightsHistoryRepository.save(RightsHistory);
this.rightsHistoryRepository.save(RightsHistory);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
RightsHistory RightsHistory = RightsHistoryRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", RightsHistory.class, id), 1));
RightsHistoryRepository.delete(RightsHistory);
RightsHistory RightsHistory = this.rightsHistoryRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", com.topdraw.business.module.rights.history.domain.RightsHistory.class, id), 1));
this.rightsHistoryRepository.delete(RightsHistory);
}
......
......@@ -24,58 +24,58 @@ import java.sql.Timestamp;
@Table(name="uc_permanent_rights")
public class PermanentRights implements Serializable {
// ID
/** ID */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 标识
/** 标识 */
@Column(name = "code", nullable = false)
private String code;
// 名称
/** 名称 */
@Column(name = "name", nullable = false)
private String name;
// 永久权益类型 0:vip;1:会员等级
/** 永久权益类型 0:vip;1:会员等级 */
@Column(name = "type")
private Integer type;
// 等级(当权益类型为vip时,对应vip值,当权益类型为会员等级时,对应等级index)
/** 等级(当权益类型为vip时,对应vip值,当权益类型为会员等级时,对应等级index) */
@Column(name = "level")
private Integer level;
// 商品折扣,10代表10% off,范围为0-100
/** 商品折扣,10代表10% off,范围为0-100 */
@Column(name = "item_discount", nullable = false)
private BigDecimal itemDiscount;
// 额外积分比率,范围为0-1000
/** 额外积分比率,范围为0-1000 */
@Column(name = "extra_points", nullable = false)
private BigDecimal extraPoints;
// 免广告
/** 免广告 */
@Column(name = "ad_disabled", nullable = false)
private Integer adDisabled;
// 额外活动参与机会
/** 额外活动参与机会 */
@Column(name = "extra_activity_ticket", nullable = false)
private Integer extraActivityTicket;
// 免费试看
/** 免费试看 */
@Column(name = "free_trial", nullable = false)
private Integer freeTrial;
// 上电视专区权益
/** 上电视专区权益 */
@Column(name = "zone_sds", nullable = false)
private Integer zoneSds;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
......
......@@ -13,4 +13,6 @@ import java.util.Optional;
public interface PermanentRightsRepository extends JpaRepository<PermanentRights, Long>, JpaSpecificationExecutor<PermanentRights> {
Optional<PermanentRights> findFirstByCode(String code);
PermanentRights findByLevel(Integer level);
}
......
package com.topdraw.business.module.rights.permanentrights.service;
import com.topdraw.business.module.rights.permanentrights.domain.PermanentRights;
import com.topdraw.business.module.rights.permanentrights.service.dto.PermanentRightsDTO;
import com.topdraw.business.module.rights.permanentrights.service.dto.PermanentRightsQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -15,37 +9,23 @@ import java.util.Map;
public interface PermanentRightsService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(PermanentRightsQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<PermanentRightsDTO>
*/
List<PermanentRightsDTO> queryAll(PermanentRightsQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return PermanentRightsDTO
*/
PermanentRightsDTO findById(Long id);
void create(PermanentRights resources);
void update(PermanentRights resources);
void delete(Long id);
/**
* Code校验
* @param code
* @return PermanentRightsDTO
*/
PermanentRightsDTO getByCode(String code);
/**
* 通过会员等级获取对应的永久权益
* @param level
* @return
*/
PermanentRightsDTO findByLevel(Integer level);
}
......
......@@ -14,42 +14,42 @@ import java.sql.Timestamp;
@Data
public class PermanentRightsDTO implements Serializable {
// ID
/** ID */
private Long id;
// 标识
/** 标识 */
private String code;
// 名称
/** 名称 */
private String name;
// 永久权益类型 0:vip;1:会员等级
/** 永久权益类型 0:vip;1:会员等级 */
private Integer type;
// 等级(当权益类型为vip时,对应vip值,当权益类型为会员等级时,对应等级index)
/** 等级(当权益类型为vip时,对应vip值,当权益类型为会员等级时,对应等级index) */
private Integer level;
// 商品折扣,10代表10% off,范围为0-100
/** 商品折扣,10代表10% off,范围为0-100 */
private BigDecimal itemDiscount;
// 额外积分比率,范围为0-1000
/** 额外积分比率,范围为0-1000 */
private BigDecimal extraPoints;
// 免广告
/** 免广告 */
private Integer adDisabled;
// 额外活动参与机会
/** 额外活动参与机会 */
private Integer extraActivityTicket;
// 免费试看
/** 免费试看 */
private Integer freeTrial;
// 上电视专区权益
/** 上电视专区权益 */
private Integer zoneSds;
// 创建时间
/** 创建时间 */
private Timestamp createTime;
// 更新时间
/** 更新时间 */
private Timestamp updateTime;
}
......
package com.topdraw.business.module.rights.permanentrights.service.dto;
import com.topdraw.annotation.Query;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class PermanentRightsQueryCriteria{
@Query(type = Query.Type.EQUAL)
private Integer level;
}
......@@ -4,23 +4,13 @@ import com.topdraw.business.module.rights.permanentrights.domain.PermanentRights
import com.topdraw.business.module.rights.permanentrights.repository.PermanentRightsRepository;
import com.topdraw.business.module.rights.permanentrights.service.PermanentRightsService;
import com.topdraw.business.module.rights.permanentrights.service.dto.PermanentRightsDTO;
import com.topdraw.business.module.rights.permanentrights.service.dto.PermanentRightsQueryCriteria;
import com.topdraw.business.module.rights.permanentrights.service.mapper.PermanentRightsMapper;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.StringUtils;
import com.topdraw.utils.ValidationUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -31,57 +21,27 @@ import java.util.Map;
public class PermanentRightsServiceImpl implements PermanentRightsService {
@Autowired
private PermanentRightsRepository PermanentRightsRepository;
private PermanentRightsRepository permanentRightsRepository;
@Autowired
private PermanentRightsMapper PermanentRightsMapper;
@Override
public Map<String, Object> queryAll(PermanentRightsQueryCriteria criteria, Pageable pageable) {
Page<PermanentRights> page = PermanentRightsRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(PermanentRightsMapper::toDto));
}
@Override
public List<PermanentRightsDTO> queryAll(PermanentRightsQueryCriteria criteria) {
return PermanentRightsMapper.toDto(PermanentRightsRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
private PermanentRightsMapper permanentRightsMapper;
@Override
public PermanentRightsDTO findById(Long id) {
PermanentRights PermanentRights = PermanentRightsRepository.findById(id).orElseGet(PermanentRights::new);
PermanentRights PermanentRights = this.permanentRightsRepository.findById(id).orElseGet(com.topdraw.business.module.rights.permanentrights.domain.PermanentRights::new);
ValidationUtil.isNull(PermanentRights.getId(),"PermanentRights","id",id);
return PermanentRightsMapper.toDto(PermanentRights);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(PermanentRights resources) {
PermanentRightsRepository.save(resources);
return this.permanentRightsMapper.toDto(PermanentRights);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(PermanentRights resources) {
PermanentRights PermanentRights = PermanentRightsRepository.findById(resources.getId()).orElseGet(PermanentRights::new);
ValidationUtil.isNull( PermanentRights.getId(),"PermanentRights","id",resources.getId());
PermanentRights.copy(resources);
PermanentRightsRepository.save(PermanentRights);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
PermanentRights PermanentRights = PermanentRightsRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", PermanentRights.class, id), 1));
PermanentRightsRepository.delete(PermanentRights);
public PermanentRightsDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? this.permanentRightsMapper.toDto(this.permanentRightsRepository.findFirstByCode(code).orElseGet(PermanentRights::new))
: new PermanentRightsDTO();
}
@Override
public PermanentRightsDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? PermanentRightsMapper.toDto(PermanentRightsRepository.findFirstByCode(code).orElseGet(PermanentRights::new))
: new PermanentRightsDTO();
public PermanentRightsDTO findByLevel(Integer level) {
PermanentRights PermanentRights = this.permanentRightsRepository.findByLevel(level);
return this.permanentRightsMapper.toDto(PermanentRights);
}
}
......
package com.topdraw.business.module.rights.service;
import com.topdraw.business.module.rights.domain.Rights;
import com.topdraw.business.module.rights.service.dto.RightsDTO;
import com.topdraw.business.module.rights.service.dto.RightsQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -15,21 +9,6 @@ import java.util.Map;
public interface RightsService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(RightsQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<RightsDTO>
*/
List<RightsDTO> queryAll(RightsQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return RightsDTO
......@@ -37,19 +16,6 @@ public interface RightsService {
RightsDTO findById(Long id);
/**
* 批量查询
* @param ids
* @return
*/
List<RightsDTO> findBatchByIds(Long... ids);
void create(Rights resources);
void update(Rights resources);
void delete(Long id);
/**
* Code校验
* @param code
* @return RightsDTO
......
......@@ -13,44 +13,45 @@ import java.sql.Timestamp;
@Data
public class RightsDTO implements Serializable {
// 主键
/** 主键 */
private Long id;
// 标识
/** 标识 */
private String code;
// 权益名称
// private String name;
// 终端类型 0:大屏;1:微信小程序/公众号;2:App
/** 权益名称 */
private String name;
/** 终端类型 0:大屏;1:微信小程序/公众号;2:App */
private Integer deviceType;
// 类型 1:实体类 (预留字段)
/** 类型 1:实体类 (预留字段) */
private Integer type;
// 权益的实体类型 1:积分;2成长值;3优惠券
/** 权益的实体类型 1:积分;2成长值;3优惠券 */
private String entityType;
// 实体id
/** 实体id */
private Long entityId;
// 生效时间,为null表示获取后立即生效,不为空时,表示特定的生效时间
/** 生效时间,为null表示获取后立即生效,不为空时,表示特定的生效时间 */
private Timestamp validTime;
// 失效时间,空为不失效,否则为获得权益后直到失效的毫秒数
/** 失效时间,空为不失效,否则为获得权益后直到失效的毫秒数 */
private Long expireTime;
// 创建时间
/** 创建时间 */
private Timestamp createTime;
// 更新时间
/** 更新时间 */
private Timestamp updateTime;
// 图片
/** 图片 */
private String image;
// 图片
/** 图片 */
private String images;
// 描述
/** 描述 */
private String description;
}
......
package com.topdraw.business.module.rights.service.dto;
import com.topdraw.annotation.Query;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class RightsQueryCriteria{
@Query
private Long memberId;
private RightsQueryType queryType;
}
package com.topdraw.business.module.rights.service.dto;
public enum RightsQueryType {
// 全部
ALL,
// 可用
AVAILABLE_ONLY
}
......@@ -4,24 +4,13 @@ import com.topdraw.business.module.rights.domain.Rights;
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.dto.RightsQueryCriteria;
import com.topdraw.business.module.rights.service.mapper.RightsMapper;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.StringUtils;
import com.topdraw.utils.ValidationUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
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.CollectionUtils;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -32,63 +21,20 @@ import java.util.Map;
public class RightsServiceImpl implements RightsService {
@Autowired
private RightsRepository RightsRepository;
private RightsRepository rightsRepository;
@Autowired
private RightsMapper RightsMapper;
@Override
public Map<String, Object> queryAll(RightsQueryCriteria criteria, Pageable pageable) {
Page<Rights> page = RightsRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(RightsMapper::toDto));
}
@Override
public List<RightsDTO> queryAll(RightsQueryCriteria criteria) {
return RightsMapper.toDto(RightsRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
private RightsMapper rightsMapper;
@Override
public RightsDTO findById(Long id) {
Rights Rights = RightsRepository.findById(id).orElseGet(Rights::new);
Rights Rights = this.rightsRepository.findById(id).orElseGet(com.topdraw.business.module.rights.domain.Rights::new);
ValidationUtil.isNull(Rights.getId(),"Rights","id",id);
return RightsMapper.toDto(Rights);
}
@Override
public List<RightsDTO> findBatchByIds(Long... ids) {
List<Rights> rightsList = this.RightsRepository.findBatchByIds(ids);
return !CollectionUtils.isEmpty(rightsList) ? RightsMapper.toDto(rightsList) : null;
return this.rightsMapper.toDto(Rights);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(Rights resources) {
RightsRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(Rights resources) {
Rights Rights = RightsRepository.findById(resources.getId()).orElseGet(Rights::new);
ValidationUtil.isNull( Rights.getId(),"Rights","id",resources.getId());
Rights.copy(resources);
RightsRepository.save(Rights);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
Rights Rights = RightsRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", Rights.class, id), 1));
RightsRepository.delete(Rights);
}
@Override
public RightsDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? RightsMapper.toDto(RightsRepository.findFirstByCode(code).orElseGet(Rights::new))
return StringUtils.isNotEmpty(code) ? this.rightsMapper.toDto(this.rightsRepository.findFirstByCode(code).orElseGet(Rights::new))
: new RightsDTO();
}
}
......
package com.topdraw.business.module.task.attribute.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-01-13
*/
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="tr_task_attr")
public class TaskAttr implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
/** 任务id(关联task主键) */
@Column(name = "task_id")
private Long taskId;
/** 任务属性字符串 */
@Column(name = "attr_str")
private String attrStr;
public void copy(TaskAttr source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}
}
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 java.util.Optional;
/**
* @author XiangHan
* @date 2022-01-13
*/
public interface TaskAttrRepository extends JpaRepository<TaskAttr, Long>, JpaSpecificationExecutor<TaskAttr> {
Optional<TaskAttr> findByTaskId(Long taskId);
}
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;
/**
* @author XiangHan
* @date 2022-01-13
*/
public interface TaskAttrService {
/**
* 根据ID查询
* @param id ID
* @return TaskAttrDTO
*/
TaskAttrDTO findById(Long id);
/**
*
* @param resources
*/
void create(TaskAttr resources);
/**
*
* @param resources
*/
void update(TaskAttr resources);
/**
*
* @param id
*/
void delete(Long id);
/**
*
* @param taskId
* @return
*/
TaskAttrDTO findByTaskId(Long taskId);
}
package com.topdraw.business.module.coupon.history.service.dto;
package com.topdraw.business.module.task.attribute.service.dto;
import lombok.Data;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2021-10-23
* @date 2022-01-13
*/
@Data
public class CouponHistoryQueryCriteria{
public class TaskAttrDTO implements Serializable {
private Long id;
/** 任务id(关联task主键) */
private Long taskId;
/** 任务属性字符串 */
private String attrStr;
}
......
package com.topdraw.business.module.task.attribute.service.impl;
import com.topdraw.business.module.task.attribute.domain.TaskAttr;
import com.topdraw.business.module.task.attribute.repository.TaskAttrRepository;
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.attribute.service.mapper.TaskAttrMapper;
import com.topdraw.utils.ValidationUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
/**
* @author XiangHan
* @date 2022-01-13
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class TaskAttrServiceImpl implements TaskAttrService {
@Autowired
private TaskAttrMapper taskAttrMapper;
@Autowired
private TaskAttrRepository taskAttrRepository;
@Override
public TaskAttrDTO findById(Long id) {
TaskAttr TaskAttr = this.taskAttrRepository.findById(id).orElseGet(TaskAttr::new);
ValidationUtil.isNull(TaskAttr.getId(),"TaskAttr","id",id);
return this.taskAttrMapper.toDto(TaskAttr);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(TaskAttr resources) {
this.taskAttrRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(TaskAttr resources) {
TaskAttr TaskAttr = this.taskAttrRepository.findById(resources.getId()).orElseGet(TaskAttr::new);
ValidationUtil.isNull( TaskAttr.getId(),"TaskAttr","id",resources.getId());
TaskAttr.copy(resources);
this.taskAttrRepository.save(TaskAttr);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
TaskAttr TaskAttr = this.taskAttrRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", TaskAttr.class, id), 1));
this.taskAttrRepository.delete(TaskAttr);
}
@Override
public TaskAttrDTO findByTaskId(Long taskId) {
TaskAttr TaskAttr = this.taskAttrRepository.findByTaskId(taskId).orElseGet(TaskAttr::new);
return this.taskAttrMapper.toDto(TaskAttr);
}
}
package com.topdraw.business.module.points.standingbook.service.mapper;
package com.topdraw.business.module.task.attribute.service.mapper;
import com.topdraw.base.BaseMapper;
import com.topdraw.business.module.points.standingbook.domain.PointsStandingBook;
import com.topdraw.business.module.points.standingbook.service.dto.PointsStandingBookDTO;
import com.topdraw.business.module.task.attribute.domain.TaskAttr;
import com.topdraw.business.module.task.attribute.service.dto.TaskAttrDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
/**
* @author XiangHan
* @date 2021-10-29
* @date 2022-01-13
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface PointsStandingBookMapper extends BaseMapper<PointsStandingBookDTO, PointsStandingBook> {
public interface TaskAttrMapper extends BaseMapper<TaskAttrDTO, TaskAttr> {
}
......
......@@ -11,6 +11,7 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import java.io.Serializable;
import java.sql.Timestamp;
import java.time.LocalDateTime;
/**
* @author XiangHan
......@@ -28,104 +29,126 @@ public class Task implements Serializable {
@Column(name = "id")
private Long id;
// 任务模板id
/** 任务模板id */
@Column(name = "task_template_id", nullable = false)
private Long taskTemplateId;
// 任务重复类型,-1:不限次;1:单次;>1:多次
@Transient
private String taskTemplateCode;
/** 任务重复类型,-1:不限次;1:单次;>1:多次 */
@Column(name = "task_repeat_type", nullable = false)
private Integer taskRepeatType;
// 任务每日重置 0:不重置;1:重置
/** 任务每日重置 0:不重置;1:重置 */
@Column(name = "task_daily_reset", nullable = false)
private Integer taskDailyReset;
// 行为量(完成此任务需要多少次相同行为的触发)
/** 行为量(完成此任务需要多少次相同行为的触发) */
@Column(name = "action_amount", nullable = false)
private Integer actionAmount;
// 任务生效时间
/** 任务生效时间 */
@Column(name = "valid_time")
private Timestamp validTime;
// 任务失效时间
/** 任务失效时间 */
@Column(name = "expire_time")
private Timestamp expireTime;
private LocalDateTime expireTime;
// 显示顺序
/** 显示顺序 */
@Column(name = "sequence")
private Integer sequence;
// 获得成长值
/** 获得成长值 */
@Column(name = "reward_exp", nullable = false)
private Long rewardExp;
// 获得积分
/** 获得积分 */
@Column(name = "reward_points", nullable = false)
private Long rewardPoints;
// 积分过期时间(空为不过期)
/** 积分过期时间(空为不过期) */
@Column(name = "reward_points_expire_time")
private Long rewardPointsExpireTime;
// 积分获取类型 0:定值;1:随机
/** 积分获取类型 0:定值;1:随机 */
@Column(name = "points_type")
private Integer pointsType;
// 随机积分最大值
/** 随机积分最大值 */
@Column(name = "reward_max_points")
private Integer rewardMaxPoints;
// 能够获取该任务的用户分组,为空则都能获取
/** 能够获取该任务的用户分组,为空则都能获取 */
@Column(name = "groups")
private String groups;
// 权益发放策略 0:立即发放;1:次日发放;2:次月发放
/** 权益发放策略 0:立即发放;1:次日发放;2:次月发放 */
@Column(name = "rights_send_strategy", nullable = false)
private Integer rightsSendStrategy;
// 会员等级门槛(0表示无门槛)
/** 会员等级门槛(0表示无门槛) */
@Column(name = "member_level", nullable = false)
private Integer memberLevel;
// 会员vip门槛(0表示没有门槛)
/** 会员vip门槛(0表示没有门槛) */
@Column(name = "member_vip")
private Integer memberVip;
// 权益id
/** 权益id */
@Column(name = "rights_id")
private Long rightsId;
// 权益数量(活动机会次数、优惠券数量、奖品数量)
/** 权益数量(活动机会次数、优惠券数量、奖品数量) */
@Column(name = "rights_amount")
private Integer rightsAmount;
// 权益2id
/** 权益2id */
@Column(name = "rights2_id")
private Long rights2Id;
// 权益2数量
/** 权益2数量 */
@Column(name = "rights2_amount")
private Integer rights2Amount;
// 权益3id
/** 权益3id */
@Column(name = "rights3_id")
private Long rights3Id;
// 权益3数量
/** 权益3数量 */
@Column(name = "rights3_amount")
private Integer rights3Amount;
// 状态 0:失效;1:生效
/** 会员专享 0:会员专享 1:非会员专享 */
@Column(name = "member_exclusive")
private Integer memberExclusive;
/** 状态 0:失效;1:生效 */
@Column(name = "status", nullable = false)
private Integer status;
// 创建时间
/** 任务名称 */
@Column(name = "name", nullable = false)
private String name;
/** 编号 */
@Column(name = "code", nullable = false)
private String code;
/** 任务描述 */
@Column(name = "description", nullable = false)
private String description;
@Transient
private String attr;
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
......
package com.topdraw.business.module.points.standingbook.domain;
package com.topdraw.business.module.task.progress.domain;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
......@@ -14,52 +16,55 @@ import java.sql.Timestamp;
/**
* @author XiangHan
* @date 2021-10-29
* @date 2021-11-02
*/
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_points_standing_book")
public class PointsStandingBook implements Serializable {
@Table(name="uc_tr_task_progress")
@AllArgsConstructor
@NoArgsConstructor
public class TrTaskProgress implements Serializable {
// 主键
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 积分生产
@Column(name = "points_produce", nullable = false)
private Long pointsProduce;
/** 用户id */
@Column(name = "member_id", nullable = false)
private Long memberId;
// 积分消耗
@Column(name = "points_consume", nullable = false)
private Long pointsConsume;
/** 任务id */
@Column(name = "task_id")
private Long taskId;
// 可用总积分
@Column(name = "points_available", nullable = false)
private Long pointsAvailable;
/** 已完成的行为量 */
@Column(name = "current_action_amount")
private Integer currentActionAmount;
// 积分过期
@Column(name = "points_expire", nullable = false)
private Long pointsExpire;
/** 目标行为量 */
@Column(name = "target_action_amount")
private Integer targetActionAmount;
// 日期
@Column(name = "day")
private String day;
/** 状态 0:未完成;1:已完成 */
@Column(name = "status")
private Integer status;
/** 完成时间 */
@Column(name = "completion_time")
private Timestamp completionTime;
// 创建时间
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 创建时间
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
public void copy(PointsStandingBook source){
public void copy(TrTaskProgress source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}
}
......
package com.topdraw.business.module.task.progress.repository;
import com.topdraw.business.module.task.progress.domain.TrTaskProgress;
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;
/**
* @author XiangHan
* @date 2021-11-02
*/
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" +
" and task_id = ?2 and Date(completion_time) = ?3 ",nativeQuery = true)
List<TrTaskProgress> findByMemberIdAndTaskIdAndCompletionTime(Long memberId, Long taskId, String time1);
}
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.util.List;
/**
* @author XiangHan
* @date 2021-11-02
*/
public interface TrTaskProgressService {
/**
* 根据ID查询
* @param id ID
* @return TrTaskProgressDTO
*/
TrTaskProgressDTO findById(Long id);
/**
*
* @param resources
*/
void create(TrTaskProgress resources);
/**
*
* @param resources
*/
void update(TrTaskProgress resources);
/**
*
* @param id
*/
void delete(Long id);
/**
*
* @param memberId
* @param taskId
* @param time1
* @return
*/
List<TrTaskProgressDTO> findByMemberIdAndTaskIdAndCompletionTime(Long memberId, Long taskId, String time1);
}
package com.topdraw.business.module.task.progress.service.dto;
import lombok.Data;
import java.io.Serializable;
import java.sql.Timestamp;
/**
* @author XiangHan
* @date 2021-11-02
*/
@Data
public class TrTaskProgressDTO implements Serializable {
private Long id;
/** 用户id */
private Long memberId;
/** 任务id */
private Long taskId;
/** 已完成的行为量 */
private Integer currentActionAmount;
/** 目标行为量 */
private Integer targetActionAmount;
/** 状态 0:未完成;1:已完成 */
private Integer status;
/** 完成时间 */
private Timestamp completionTime;
private Timestamp createTime;
private Timestamp updateTime;
}
package com.topdraw.business.module.task.progress.service.impl;
import com.topdraw.business.module.task.progress.domain.TrTaskProgress;
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 com.topdraw.utils.ValidationUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.util.List;
/**
* @author XiangHan
* @date 2021-11-02
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class TrTaskProgressServiceImpl implements TrTaskProgressService {
@Autowired
private TrTaskProgressRepository trTaskProgressRepository;
@Autowired
private TrTaskProgressMapper trTaskProgressMapper;
@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);
}
@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);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
TrTaskProgress TrTaskProgress = this.trTaskProgressRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", TrTaskProgress.class, id), 1));
this.trTaskProgressRepository.delete(TrTaskProgress);
}
@Override
public List<TrTaskProgressDTO> findByMemberIdAndTaskIdAndCompletionTime(Long memberId, Long taskId, String time1) {
return this.trTaskProgressMapper.toDto(this.trTaskProgressRepository.findByMemberIdAndTaskIdAndCompletionTime(memberId,taskId,time1));
}
}
package com.topdraw.business.module.task.progress.service.mapper;
import com.topdraw.base.BaseMapper;
import com.topdraw.business.module.task.progress.domain.TrTaskProgress;
import com.topdraw.business.module.task.progress.service.dto.TrTaskProgressDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
/**
* @author XiangHan
* @date 2021-11-02
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface TrTaskProgressMapper extends BaseMapper<TrTaskProgressDTO, TrTaskProgress> {
}
......@@ -3,8 +3,12 @@ package com.topdraw.business.module.task.repository;
import com.topdraw.business.module.task.domain.Task;
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.transaction.annotation.Transactional;
import java.util.List;
import java.util.Optional;
/**
* @author XiangHan
......@@ -14,5 +18,10 @@ public interface TaskRepository extends JpaRepository<Task, Long>, JpaSpecificat
List<Task> findByTaskTemplateId(Long taskTemplateId);
// List<Task> findByTemplateId(Long taskTemplateId);
Optional<Task> findByCode(String code);
@Modifying
@Transactional
@Query(value = "UPDATE `tr_task` SET `delete_mark` = 1 , `update_time` = now() WHERE `id` = ?1", nativeQuery = true)
void updateDeleteMark(Long id);
}
......
......@@ -2,11 +2,8 @@ package com.topdraw.business.module.task.service;
import com.topdraw.business.module.task.domain.Task;
import com.topdraw.business.module.task.service.dto.TaskDTO;
import com.topdraw.business.module.task.service.dto.TaskQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -15,32 +12,47 @@ import java.util.Map;
public interface TaskService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(TaskQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<TaskDTO>
*/
List<TaskDTO> queryAll(TaskQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return TaskDTO
*/
TaskDTO findById(Long id);
void create(Task resources);
/**
*
* @param taskTemplateId
* @return
*/
List<Task> findByTemplateId(Long taskTemplateId);
void update(Task resources);
/**
*
* @param code
* @return
*/
TaskDTO findByCode(String code);
void delete(Long id);
/**
*
* @param task
*/
TaskDTO create(Task task);
List<Task> findByTemplateId(Long taskTemplateId);
/**
*
* @param task
*/
TaskDTO update(Task task);
/**
*
* @param task
*/
void delete(Task task);
/**
*
* @param id
*/
void delete(Long id);
}
......
......@@ -4,6 +4,7 @@ import lombok.Data;
import java.io.Serializable;
import java.sql.Timestamp;
import java.time.LocalDateTime;
/**
......@@ -15,69 +16,84 @@ public class TaskDTO implements Serializable {
private Long id;
// 任务模板id
/** 任务模板id */
private Long taskTemplateId;
// 任务重复类型,-1:不限次;1:单次;>1:多次
/** 任务重复类型,-1:不限次;1:单次;>1:多次 */
private Integer taskRepeatType;
// 任务每日重置 0:不重置;1:重置
/** 任务每日重置 0:不重置;1:重置 */
private Integer taskDailyReset;
// 行为量(完成此任务需要多少次相同行为的触发)
/** 行为量(完成此任务需要多少次相同行为的触发) */
private Integer actionAmount;
// 任务生效时间
/** 任务生效时间 */
private Timestamp validTime;
// 任务失效时间
private Timestamp expireTime;
/** 任务失效时间 */
private LocalDateTime expireTime;
// 显示顺序
/** 显示顺序 */
private Integer sequence;
// 获得成长值
/** 获得成长值 */
private Long rewardExp;
// 获得积分
/** 获得积分 */
private Long rewardPoints;
// 积分过期时间(空为不过期)
/** 积分过期时间(空为不过期) */
private Long rewardPointsExpireTime;
// 能够获取该任务的用户分组,为空则都能获取
/** 能够获取该任务的用户分组,为空则都能获取 */
private String groups;
// 会员等级门槛(0表示无门槛)
/** 会员等级门槛(0表示无门槛) */
private Integer memberLevel;
// 会员vip门槛(0表示没有门槛)
/** 会员vip门槛(0表示没有门槛) */
private Integer memberVip;
// 权益id
/** 权益id */
private Long rightsId;
// 权益数量(活动机会次数、优惠券数量、奖品数量)
/** 权益数量(活动机会次数、优惠券数量、奖品数量) */
private Integer rightsAmount;
// 权益2id
/** 权益2id */
private Long rights2Id;
// 权益2数量
/** 权益2数量 */
private Integer rights2Amount;
// 权益3id
/** 权益3id */
private Long rights3Id;
// 权益3数量
/** 权益3数量 */
private Integer rights3Amount;
// 状态 0:失效;1:生效
/** 会员专享 0:会员专享 1:非会员专享 */
private Integer memberExclusive;
/** 状态 0:失效;1:生效 */
private Integer status;
// 创建时间
/** 任务名称 */
private String name;
/** 编号 */
private String code;
/** 任务描述 */
private String description;
/** 属性 */
private String attr;
/** 创建时间 */
private Timestamp createTime;
// 更新时间
/** 更新时间 */
private Timestamp updateTime;
}
......
package com.topdraw.business.module.task.service.dto;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class TaskQueryCriteria{
}
......@@ -4,22 +4,14 @@ 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.dto.TaskQueryCriteria;
import com.topdraw.business.module.task.service.mapper.TaskMapper;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.ValidationUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
......@@ -31,57 +23,50 @@ import java.util.Objects;
public class TaskServiceImpl implements TaskService {
@Autowired
private TaskRepository TaskRepository;
private TaskMapper taskMapper;
@Autowired
private TaskMapper TaskMapper;
private TaskRepository taskRepository;
@Override
public Map<String, Object> queryAll(TaskQueryCriteria criteria, Pageable pageable) {
Page<Task> page = TaskRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(TaskMapper::toDto));
public TaskDTO findById(Long id) {
Task Task = this.taskRepository.findById(id).orElseGet(Task::new);
ValidationUtil.isNull(Task.getId(),"Task","id",id);
return this.taskMapper.toDto(Task);
}
@Override
public List<TaskDTO> queryAll(TaskQueryCriteria criteria) {
return TaskMapper.toDto(TaskRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
public List<Task> findByTemplateId(Long taskTemplateId) {
return Objects.nonNull(taskTemplateId) ? this.taskRepository.findByTaskTemplateId(taskTemplateId) : null;
}
@Override
public TaskDTO findById(Long id) {
Task Task = TaskRepository.findById(id).orElseGet(Task::new);
ValidationUtil.isNull(Task.getId(),"Task","id",id);
return TaskMapper.toDto(Task);
public TaskDTO findByCode(String code) {
Task task = this.taskRepository.findByCode(code).orElseGet(Task::new);
return this.taskMapper.toDto(task);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(Task resources) {
TaskRepository.save(resources);
public TaskDTO create(Task task) {
Task save = this.taskRepository.save(task);
return this.taskMapper.toDto(save);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(Task resources) {
Task Task = TaskRepository.findById(resources.getId()).orElseGet(Task::new);
ValidationUtil.isNull( Task.getId(),"Task","id",resources.getId());
Task.copy(resources);
TaskRepository.save(Task);
public TaskDTO update(Task task) {
Task save = this.taskRepository.save(task);
return this.taskMapper.toDto(save);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
Task Task = TaskRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", Task.class, id), 1));
TaskRepository.delete(Task);
public void delete(Task task) {
Long id = task.getId();
this.delete(id);
}
@Override
public List<Task> findByTemplateId(Long taskTemplateId) {
return Objects.nonNull(taskTemplateId) ? this.TaskRepository.findByTaskTemplateId(taskTemplateId) : null;
public void delete(Long id) {
this.taskRepository.updateDeleteMark(id);
}
}
......
......@@ -28,34 +28,38 @@ public class TaskTemplate implements Serializable {
@Column(name = "id")
private Long id;
// 标识
/** 标识 */
@Column(name = "code")
private String code;
// 名称
/** 名称 */
@Column(name = "name")
private String name;
// 关注事件(和MQ topic相关)
/** 关注事件(和MQ topic相关) */
@Column(name = "event")
private String event;
// 描述
/** 描述 */
@Column(name = "description")
private String description;
// 状态 0:失效;1:生效
/** 状态 0:失效;1:生效 */
@Column(name = "status")
private Integer status;
// 类型 0:活动任务模板
/** 类型 0:活动任务模板 */
@Column(name = "type")
private Integer type;
// 模板参数,json
/** 模板参数,json */
@Column(name = "params")
private String params;
/** 删除标识 0:正常;1:已删除; */
@Column(name = "delete_mark")
private Integer deleteMark;
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
......
......@@ -3,6 +3,9 @@ package com.topdraw.business.module.task.template.repository;
import com.topdraw.business.module.task.template.domain.TaskTemplate;
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.transaction.annotation.Transactional;
import java.util.Optional;
......@@ -14,5 +17,12 @@ public interface TaskTemplateRepository extends JpaRepository<TaskTemplate, Long
Optional<TaskTemplate> findFirstByCode(String code);
TaskTemplate findByEvent(String event);
Optional<TaskTemplate> findByEvent(String event);
Optional<TaskTemplate> findByType(Integer event);
@Modifying
@Transactional
@Query(value = "UPDATE `tr_task_template` SET `delete_mark` = 1 , `update_time` = now() WHERE `id` = ?1", nativeQuery = true)
void updateDeleteMark(Long id);
}
......
......@@ -2,11 +2,8 @@ package com.topdraw.business.module.task.template.service;
import com.topdraw.business.module.task.template.domain.TaskTemplate;
import com.topdraw.business.module.task.template.service.dto.TaskTemplateDTO;
import com.topdraw.business.module.task.template.service.dto.TaskTemplateQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -15,31 +12,28 @@ import java.util.Map;
public interface TaskTemplateService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(TaskTemplateQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<TaskTemplateDTO>
*/
List<TaskTemplateDTO> queryAll(TaskTemplateQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return TaskTemplateDTO
*/
TaskTemplateDTO findById(Long id);
void create(TaskTemplate resources);
/**
*
* @param resources
*/
TaskTemplateDTO create(TaskTemplate resources);
void update(TaskTemplate resources);
/**
*
* @param resources
*/
TaskTemplateDTO update(TaskTemplate resources);
/**
*
* @param id
*/
void delete(Long id);
/**
......@@ -47,7 +41,19 @@ public interface TaskTemplateService {
* @param code
* @return TaskTemplateDTO
*/
TaskTemplateDTO getByCode(String code);
TaskTemplateDTO findByCode(String code);
/**
*
* @param event
* @return
*/
TaskTemplateDTO findByEvent(String event);
TaskTemplate findByEvent(String event);
/**
*
* @param event
* @return
*/
TaskTemplateDTO findByType(Integer event);
}
......
......@@ -2,6 +2,7 @@ package com.topdraw.business.module.task.template.service.dto;
import lombok.Data;
import javax.persistence.Column;
import java.io.Serializable;
import java.sql.Timestamp;
......@@ -15,27 +16,30 @@ public class TaskTemplateDTO implements Serializable {
private Long id;
// 标识
/** 标识 */
private String code;
// 名称
/** 名称 */
private String name;
// 关注事件(和MQ topic相关)
/** 关注事件(和MQ topic相关) */
private String event;
// 描述
/** 描述 */
private String description;
// 状态 0:失效;1:生效
/** 状态 0:失效;1:生效 */
private Integer status;
// 类型 0:活动任务模板
/** 类型 0:活动任务模板 */
private Integer type;
// 模板参数,json
/** 模板参数,json */
private String params;
/** 删除标识 0:正常;1:已删除; */
private Integer deleteMark;
private Timestamp createTime;
private Timestamp updateTime;
......
package com.topdraw.business.module.task.template.service.dto;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class TaskTemplateQueryCriteria{
}
......@@ -4,23 +4,18 @@ import com.topdraw.business.module.task.template.domain.TaskTemplate;
import com.topdraw.business.module.task.template.repository.TaskTemplateRepository;
import com.topdraw.business.module.task.template.service.TaskTemplateService;
import com.topdraw.business.module.task.template.service.dto.TaskTemplateDTO;
import com.topdraw.business.module.task.template.service.dto.TaskTemplateQueryCriteria;
import com.topdraw.business.module.task.template.service.mapper.TaskTemplateMapper;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.StringUtils;
import com.topdraw.utils.ValidationUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* @author XiangHan
......@@ -31,62 +26,59 @@ import java.util.Map;
public class TaskTemplateServiceImpl implements TaskTemplateService {
@Autowired
private TaskTemplateRepository TaskTemplateRepository;
private TaskTemplateRepository taskTemplateRepository;
@Autowired
private TaskTemplateMapper TaskTemplateMapper;
@Override
public Map<String, Object> queryAll(TaskTemplateQueryCriteria criteria, Pageable pageable) {
Page<TaskTemplate> page = TaskTemplateRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(TaskTemplateMapper::toDto));
}
@Override
public List<TaskTemplateDTO> queryAll(TaskTemplateQueryCriteria criteria) {
return TaskTemplateMapper.toDto(TaskTemplateRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
private TaskTemplateMapper taskTemplateMapper;
@Override
public TaskTemplateDTO findById(Long id) {
TaskTemplate TaskTemplate = TaskTemplateRepository.findById(id).orElseGet(TaskTemplate::new);
ValidationUtil.isNull(TaskTemplate.getId(),"TaskTemplate","id",id);
return TaskTemplateMapper.toDto(TaskTemplate);
TaskTemplate taskTemplate = this.taskTemplateRepository.findById(id).orElseGet(TaskTemplate::new);
ValidationUtil.isNull(taskTemplate.getId(),"TaskTemplate","id",id);
return this.taskTemplateMapper.toDto(taskTemplate);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(TaskTemplate resources) {
TaskTemplateRepository.save(resources);
public TaskTemplateDTO create(TaskTemplate resources) {
TaskTemplate taskTemplate = this.taskTemplateRepository.save(resources);
return this.taskTemplateMapper.toDto(taskTemplate);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(TaskTemplate resources) {
TaskTemplate TaskTemplate = TaskTemplateRepository.findById(resources.getId()).orElseGet(TaskTemplate::new);
ValidationUtil.isNull( TaskTemplate.getId(),"TaskTemplate","id",resources.getId());
TaskTemplate.copy(resources);
TaskTemplateRepository.save(TaskTemplate);
public TaskTemplateDTO update(TaskTemplate resources) {
TaskTemplate taskTemplate = this.taskTemplateRepository.findById(resources.getId()).orElseGet(TaskTemplate::new);
ValidationUtil.isNull(taskTemplate.getId(),"TaskTemplate","id",resources.getId());
taskTemplate.copy(resources);
TaskTemplate template = this.taskTemplateRepository.save(taskTemplate);
return this.taskTemplateMapper.toDto(template);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
TaskTemplate TaskTemplate = TaskTemplateRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", TaskTemplate.class, id), 1));
TaskTemplateRepository.delete(TaskTemplate);
this.taskTemplateRepository.updateDeleteMark(id);
}
@Override
public TaskTemplateDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? TaskTemplateMapper.toDto(TaskTemplateRepository.findFirstByCode(code).orElseGet(TaskTemplate::new))
public TaskTemplateDTO findByCode(String code) {
return StringUtils.isNotEmpty(code) ? this.taskTemplateMapper.toDto(this.taskTemplateRepository.findFirstByCode(code).orElseGet(TaskTemplate::new))
: new TaskTemplateDTO();
}
@Override
public TaskTemplateDTO findByEvent(String event) {
return StringUtils.isNotEmpty(event) ?
this.taskTemplateMapper.toDto(this.taskTemplateRepository.findByEvent(event).orElseGet(TaskTemplate::new)) : null;
}
@Override
public TaskTemplate findByEvent(String event) {
return StringUtils.isNotEmpty(event) ? this.TaskTemplateRepository.findByEvent(event) : null;
public TaskTemplateDTO findByType(Integer event) {
return Objects.nonNull(event) ?
this.taskTemplateMapper.toDto(this.taskTemplateRepository.findByType(event).orElseGet(TaskTemplate::new)) : null;
}
}
......
......@@ -2,6 +2,9 @@ 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;
......@@ -9,9 +12,9 @@ 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;
import java.time.LocalDateTime;
/**
* @author XiangHan
......@@ -22,112 +25,110 @@ import java.time.LocalDateTime;
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_user_tv")
public class UserTv implements Serializable {
public class UserTv extends AsyncMqModule implements Serializable {
@NotNull(message = "visUserId can't be null !",groups = {CreateGroup.class})
@Column(name = "vis_user_id")
private Long visUserId;
/** 绑定的小屏账户会员编码 */
@Column(name = "priority_member_code")
private String priorityMemberCode;
@Transient
private String memberCode;
// vis_user表主键
@Column(name = "vis_user_id")
private Long visUserId;
// ID
/** ID */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 人ID
@Column(name = "`person_id`")
/** 人ID */
@Column(name = "person_id")
private Long personId;
// 运营商平台
@Column(name = "`platform`")
/** 运营商平台 */
@Column(name = "platform")
private String platform;
// 运营商平台账号
@Column(name = "`platform_account`")
/** 运营商平台账号 */
@Column(name = "platform_account")
@NotNull(message = "platformAccount can't be null !",groups = {CreateGroup.class, UpdateGroup.class})
private String platformAccount;
// 手机号
@Column(name = "`cellphone`")
/** 手机号 */
@Column(name = "cellphone")
private String cellphone;
// 用户名
@Column(name = "`username`")
/** 用户名 */
@Column(name = "username")
private String username;
// 密码 MD5
@Column(name = "`password`")
/** 密码 MD5 */
@Column(name = "password")
private String password;
// 昵称 Base64
@Column(name = "`nickname`")
/** 昵称 Base64 */
@Column(name = "nickname")
private String nickname;
// 头像
@Column(name = "`image`")
/** 头像 */
@Column(name = "image")
private String image;
// 登录天数(总天数)
@Column(name = "`login_days`")
/** 登录天数(总天数) */
@Column(name = "login_days")
private Integer loginDays;
// 连续登录天数
@Column(name = "`continue_days`")
/** 连续登录天数 */
@Column(name = "continue_days")
private Integer continueDays;
// 活跃时间
@Column(name = "`active_time`")
private LocalDateTime activeTime;
/** 活跃时间 */
@Column(name = "active_time")
private Timestamp activeTime;
// 分组 分组ID用逗号分隔
@Column(name = "`groups`")
/** 分组 分组ID用逗号分隔 */
@Column(name = "groups")
private String groups;
// 标签 标签用逗号分隔
@Column(name = "`tags`")
/** 标签 标签用逗号分隔 */
@Column(name = "tags")
private String tags;
// 登录类型 1-运营商隐式登录 2-手机验证登录 3-微信登录 4-QQ登录 5-微博登录 6-苹果登录
@Column(name = "`login_type`")
/** 登录类型 1-运营商隐式登录 2-手机验证登录 3-微信登录 4-QQ登录 5-微博登录 6-苹果登录 */
@Column(name = "login_type")
private Integer loginType;
// 状态 0-下线 1-上线
@Column(name = "`status`")
/** 状态 0-下线 1-上线 */
@Column(name = "status")
private Integer status;
// 描述
@Column(name = "`description`")
/** 描述 */
@Column(name = "description")
private String description;
// 创建者
@Column(name = "`create_by`")
/** 创建者 */
@Column(name = "create_by")
private String createBy;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "`create_time`")
private LocalDateTime createTime;
@Column(name = "create_time")
private Timestamp createTime;
// 更新者
@Column(name = "`update_by`")
/** 更新者 */
@Column(name = "update_by")
private String updateBy;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "`update_time`")
private LocalDateTime updateTime;
@Column(name = "update_time")
private Timestamp updateTime;
// 会员id
@Column(name = "`member_id`")
/** 会员id */
@Column(name = "member_id")
private Long memberId;
public void copy(UserTv source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(false));
}
}
......
package com.topdraw.business.module.user.iptv.domain;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.exception.GlobeExceptionMsg;
import com.topdraw.util.TimestampUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Assert;
import java.util.Objects;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/14 14:36
* @version: :
* @modified By:
* @since : modified in 2022/3/14 14:36
*/
public class UserTvBuilder {
private static final Integer DEFAULT_VALUE = 1;
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());
}
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){
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);
Assert.notNull(platformAccount, GlobeExceptionMsg.VIS_USER_ID_IS_NULL);
// todo 原型模式
UserTv userTv = new UserTv();
userTv.setId(id);
userTv.setPlatformAccount(platformAccount);
userTv.setMemberCode(memberCode);
userTv.setMemberId(memberId);
userTv.setNickname(StringUtils.isBlank(nickname)?platformAccount:nickname);
userTv.setUsername(StringUtils.isBlank(username)?platformAccount:username);
userTv.setLoginDays(Objects.nonNull(loginDays)?loginDays:DEFAULT_VALUE);
userTv.setLoginType(DEFAULT_VALUE);
userTv.setStatus(Objects.nonNull(status)?status:DEFAULT_VALUE);
userTv.setActiveTime(TimestampUtil.now());
userTv.setContinueDays(Objects.nonNull(continueDays)?loginDays:DEFAULT_VALUE);
userTv.setCreateBy(StringUtils.isBlank(createBy)?DEFAULT_CREATE_BY:createBy);
userTv.setUpdateBy(StringUtils.isBlank(updateBy)?DEFAULT_UPDATE_BY:updateBy);
userTv.setVisUserId(visUserId);
return userTv;
}
}
......@@ -13,4 +13,9 @@ import java.util.Optional;
public interface UserTvRepository extends JpaRepository<UserTv, Long>, JpaSpecificationExecutor<UserTv> {
Optional<UserTv> findByPlatformAccount(String platformAccount);
Optional<UserTv> findByPriorityMemberCode(String memberCode);
Optional<UserTv> findByMemberId(Long memberId);
}
......
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.UserTvQueryCriteria;
import org.springframework.data.domain.Pageable;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinDTO;
/**
* @author XiangHan
......@@ -16,35 +12,72 @@ import java.util.Map;
public interface UserTvService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(UserTvQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<UserTvDTO>
*/
List<UserTvDTO> queryAll(UserTvQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return UserTvDTO
*/
UserTvDTO findById(Long id);
Long create(UserTv resources);
/**
*
* @param resources
* @return
*/
UserTvDTO create(UserTv resources);
/**
*
* @param resources
*/
UserTvDTO update(UserTv resources);
void update(UserTv resources);
@Transactional(rollbackFor = Exception.class)
/**
*
* @param resources
*/
void unbindPriorityMemberCode(UserTv resources);
/**
*
* @param id
*/
void delete(Long id);
/**
*
* @param platformAccount
* @return
*/
UserTvDTO findByPlatformAccount(String platformAccount);
/**
*
* @param memberCode
* @return
*/
UserTvDTO findByPriorityMemberCode(String memberCode);
/**
* 通过会员
* @param memberId
* @return
*/
UserTvDTO findByMemberId(Long memberId);
/**
* 检查会员是否是主账号
* @param memberId
* @param memberCode
* @return
*/
boolean checkPriorityMemberByMemberIdOrMemberCode(Long memberId, String memberCode);
/**
*
* @param platformAccount
* @return
*/
MemberDTO findMemberByPlatformAccount(String platformAccount);
}
......
......@@ -4,7 +4,6 @@ import lombok.Data;
import java.io.Serializable;
import java.sql.Timestamp;
import java.time.LocalDateTime;
/**
......@@ -16,70 +15,75 @@ public class UserTvDTO implements Serializable {
private Long visUserId;
// ID
private String memberCode;
/** 绑定的小屏账户会员编码 */
private String priorityMemberCode;
/** ID */
private Long id;
// 人ID
/** 人ID */
private Long personId;
// 运营商平台
/** 运营商平台 */
private String platform;
// 运营商平台账号
/** 运营商平台账号 */
private String platformAccount;
// 手机号
/** 手机号 */
private String cellphone;
// 用户名
/** 用户名 */
private String username;
// 密码 MD5
/** 密码 MD5 */
private String password;
// 昵称 Base64
/** 昵称 Base64 */
private String nickname;
// 头像
/** 头像 */
private String image;
// 登录天数(总天数)
/** 登录天数(总天数) */
private Integer loginDays;
// 连续登录天数
/** 连续登录天数 */
private Integer continueDays;
// 活跃时间
private LocalDateTime activeTime;
/** 活跃时间 */
private Timestamp activeTime;
// 分组 分组ID用逗号分隔
/** 分组 分组ID用逗号分隔 */
private String groups;
// 标签 标签用逗号分隔
/** 标签 标签用逗号分隔 */
private String tags;
// 登录类型 1-运营商隐式登录 2-手机验证登录 3-微信登录 4-QQ登录 5-微博登录 6-苹果登录
/** 登录类型 1-运营商隐式登录 2-手机验证登录 3-微信登录 4-QQ登录 5-微博登录 6-苹果登录 */
private Integer loginType;
// 状态 0-下线 1-上线
/** 状态 0-下线 1-上线 */
private Integer status;
// 描述
/** 描述 */
private String description;
// 创建者
/** 创建者 */
private String createBy;
// 创建时间
private LocalDateTime createTime;
/** 创建时间 */
private Timestamp createTime;
// 更新者
/** 更新者 */
private String updateBy;
// 更新时间
private LocalDateTime updateTime;
/** 更新时间 */
private Timestamp updateTime;
// 会员id
/** 会员id */
private Long memberId;
}
......
package com.topdraw.business.module.user.iptv.service.dto;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-12-16
*/
@Data
public class UserTvQueryCriteria{
}
......@@ -6,24 +6,20 @@ import com.topdraw.business.module.user.iptv.domain.UserTv;
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.dto.UserTvQueryCriteria;
import com.topdraw.business.module.user.iptv.service.mapper.UserTvMapper;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.exception.EntityNotFoundException;
import com.topdraw.exception.GlobeExceptionMsg;
import com.topdraw.utils.ValidationUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import javax.validation.constraints.NotNull;
import java.util.Objects;
import java.util.Optional;
......@@ -35,95 +31,159 @@ import java.util.Optional;
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class UserTvServiceImpl implements UserTvService {
@Autowired
private UserTvRepository UserTvRepository;
@Autowired
private UserTvMapper UserTvMapper;
private UserTvMapper userTvMapper;
@Autowired
private MemberService memberService;
@Autowired
private UserTvRepository userTvRepository;
/**
* 获取大屏账户对应的会员
* <Waring>
* 如果绑定了小屏,则获取对应主账号对应的会员信息,如果没有绑定小屏会员则默认获取大屏自己的会员(x_member)
* </Waring>
* @param platformAccount
* @return
*/
@Override
public Map<String, Object> queryAll(UserTvQueryCriteria criteria, Pageable pageable) {
Page<UserTv> page = UserTvRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(UserTvMapper::toDto));
public MemberDTO findMemberByPlatformAccount(String platformAccount){
// 大屏账户
UserTvDTO userTvDTO = this.findByPlatformAccount(platformAccount);
if (Objects.nonNull(userTvDTO)) {
// 主账号会员code
String priorityMemberCode = userTvDTO.getPriorityMemberCode();
if (StringUtils.isNotBlank(priorityMemberCode))
return this.findMemberByMemberCode(priorityMemberCode);
else
return this.findMemberByMemberId(userTvDTO.getMemberId());
}
throw new EntityNotFoundException(UserTvDTO.class,"platformAccount", GlobeExceptionMsg.IPTV_IS_NULL);
}
@Override
public List<UserTvDTO> queryAll(UserTvQueryCriteria criteria) {
return UserTvMapper.toDto(UserTvRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
private MemberDTO findMemberByMemberCode(String memberCode) {
return this.memberService.findByCode(memberCode);
}
private MemberDTO findMemberByMemberId(Long memberId) {
return this.memberService.findById(memberId);
}
@Override
public UserTvDTO findById(Long id) {
UserTv UserTv = UserTvRepository.findById(id).orElseGet(UserTv::new);
UserTv UserTv = this.userTvRepository.findById(id).orElseGet(com.topdraw.business.module.user.iptv.domain.UserTv::new);
ValidationUtil.isNull(UserTv.getId(),"UserTv","id",id);
return UserTvMapper.toDto(UserTv);
return this.userTvMapper.toDto(UserTv);
}
@Override
@Transactional(rollbackFor = Exception.class)
public Long create(UserTv resources) {
MemberDTO memberDTO = memberService.getByCode(resources.getMemberCode());
public UserTvDTO create(UserTv resources) {
MemberDTO memberDTO = memberService.findByCode(resources.getMemberCode());
if (Objects.nonNull(memberDTO)) {
Long id = memberDTO.getId();
resources.setMemberId(id);
UserTvRepository.save(resources);
return resources.getId();
UserTv userTv = this.userTvRepository.save(resources);
return this.userTvMapper.toDto(userTv);
}
return null;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(UserTv resources) {
public UserTvDTO update(UserTv resources) {
String platformAccount = resources.getPlatformAccount();
UserTvDTO userTvDTO = this.findByPlatformAccount(platformAccount);
ValidationUtil.isNull(userTvDTO.getId(),"UserTv","id",resources.getId());
UserTv userTv = new UserTv();
BeanUtils.copyProperties(resources,userTv);
BeanUtils.copyProperties(userTvDTO, userTv);
userTv.setId(userTvDTO.getId());
userTv.setPlatformAccount(userTvDTO.getPlatformAccount());
userTv.setMemberId(userTvDTO.getMemberId());
userTv.setUpdateTime(LocalDateTime.now());
UserTvRepository.save(userTv);
}
String priorityMemberCode = resources.getPriorityMemberCode();
if (StringUtils.isNotBlank(priorityMemberCode)){
userTv.setPriorityMemberCode(priorityMemberCode);
} else {
userTv.setPriorityMemberCode(userTvDTO.getPriorityMemberCode());
}
UserTv _userTv = this.userTvRepository.save(userTv);
return this.userTvMapper.toDto(_userTv);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void unbindPriorityMemberCode(UserTv resources) {
String platformAccount = resources.getPlatformAccount();
UserTvDTO userTvDTO = this.findByPlatformAccount(platformAccount);
// UserTv UserTv = UserTvRepository.findById(resources.getId()).orElseGet(UserTv::new);
ValidationUtil.isNull( userTvDTO.getId(),"UserTv","id",resources.getId());
//UserTv.copy(resources);
UserTv userTv = new UserTv();
BeanUtils.copyProperties(userTvDTO,userTv);
userTv.setPriorityMemberCode(null);
UserTvRepository.save(userTv);
if (StringUtils.isNotBlank(platformAccount)) {
UserTvDTO userTvDTO = this.findByPlatformAccount(platformAccount);
Long id = userTvDTO.getId();
resources.setId(id);
resources.setMemberId(userTvDTO.getMemberId());
}
this.userTvRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
UserTv UserTv = UserTvRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", UserTv.class, id), 1));
UserTvRepository.delete(UserTv);
UserTv UserTv = this.userTvRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", com.topdraw.business.module.user.iptv.domain.UserTv.class, id), 1));
this.userTvRepository.delete(UserTv);
}
@Override
public UserTvDTO findByPlatformAccount(String platformAccount) {
Optional<UserTv> userTv = UserTvRepository.findByPlatformAccount(platformAccount);
Optional<UserTv> userTv = this.userTvRepository.findByPlatformAccount(platformAccount);
if (userTv.isPresent()) {
ValidationUtil.isNull( userTv.get().getId(),"UserTv","id",userTv.get().getId());
return UserTvMapper.toDto(userTv.get());
return this.userTvMapper.toDto(userTv.get());
}
return null;
}
@Override
public UserTvDTO findByPriorityMemberCode(String memberCode) {
Optional<UserTv> userTv = this.userTvRepository.findByPriorityMemberCode(memberCode);
if (userTv.isPresent()) {
ValidationUtil.isNull( userTv.get().getId(),"UserTv","id",userTv.get().getId());
return this.userTvMapper.toDto(userTv.get());
}
return null;
}
@Override
public UserTvDTO findByMemberId(Long memberId) {
Optional<UserTv> userTv = this.userTvRepository.findByMemberId(memberId);
if (userTv.isPresent()) {
ValidationUtil.isNull( userTv.get().getId(),"UserTv","id",userTv.get().getId());
return this.userTvMapper.toDto(userTv.get());
}
return null;
}
@Override
public boolean checkPriorityMemberByMemberIdOrMemberCode(Long memberId, String memberCode) {
// 检查会员是否存在
this.checkMember(memberId, memberCode);
UserTvDTO userTvDTO = this.findByPriorityMemberCode(memberCode);
if (Objects.nonNull(userTvDTO)) {
return true;
}
return false;
}
private void checkMember(Long memberId, String memberCode){
this.memberService.checkMember(memberId, memberCode);
}
}
......
......@@ -23,38 +23,38 @@ import java.sql.Timestamp;
@Table(name="uc_user_collection")
public class UserCollection implements Serializable {
// ID
/** ID */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 应用ID
/** 应用ID */
@Column(name = "app_id")
private Long appId;
// 用户ID
/** 用户ID */
@Column(name = "user_id")
private Long userId;
// 收藏夹类型:1-收藏 2-播放记录 3-播放列表 4-评分 5-点赞/关注/订阅
/** 收藏夹类型:1-收藏 2-播放记录 3-播放列表 4-评分 5-点赞/关注/订阅 */
@Column(name = "type")
private Integer type;
// 收藏夹名称
/** 收藏夹名称 */
@Column(name = "name")
private String name;
// 数量
/** 数量 */
@Column(name = "count")
private Integer count;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
......
......@@ -25,89 +25,89 @@ public class UserCollectionDetail implements Serializable {
@JoinColumn(name = "user_collection_id", insertable = false, updatable = false)
private UserCollection userCollection;
// ID
/** ID */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 收藏夹ID
/** 收藏夹ID */
@Column(name = "user_collection_id")
private Long userCollectionId;
// 自定义收藏内容的类型CODE,默认:DEFAULT
/** 自定义收藏内容的类型CODE,默认:DEFAULT */
@Column(name = "detail_folder_code")
private String detailFolderCode;
// 收藏内容的类型:MEDIA|EPISODE|CATEGORY|SUBJECT|ARTICLE|ARTIST|SCHOOL
/** 收藏内容的类型:MEDIA|EPISODE|CATEGORY|SUBJECT|ARTICLE|ARTIST|SCHOOL */
@Column(name = "detail_type")
private String detailType;
// 收藏内容的ID
/** 收藏内容的ID */
@Column(name = "detail_id")
private Long detailId;
// 收藏内容的CODE
/** 收藏内容的CODE */
@Column(name = "detail_code")
private String detailCode;
// 收藏内容的剧集ID
/** 收藏内容的剧集ID */
@Column(name = "detail_episode_id")
private Long detailEpisodeId;
// 收藏内容的剧集CODE
/** 收藏内容的剧集CODE */
@Column(name = "detail_episode_code")
private String detailEpisodeCode;
// 收藏内容的名称
/** 收藏内容的名称 */
@Column(name = "detail_name")
private String detailName;
// 收藏内容的标记
/** 收藏内容的标记 */
@Column(name = "detail_mark")
private Integer detailMark;
// 收藏内容的图片
/** 收藏内容的图片 */
@Column(name = "detail_img")
private String detailImg;
// 收藏内容的剧集序号
/** 收藏内容的剧集序号 */
@Column(name = "detail_index")
private Integer detailIndex;
// 收藏内容的剧集总数
/** 收藏内容的剧集总数 */
@Column(name = "detail_total_index")
private Integer detailTotalIndex;
// 收藏内容的播放时间
/** 收藏内容的播放时间 */
@Column(name = "detail_play_time")
private Integer detailPlayTime;
// 收藏内容的总时间
/** 收藏内容的总时间 */
@Column(name = "detail_total_time")
private Integer detailTotalTime;
// 收藏内容在同一folder中的顺序
/** 收藏内容在同一folder中的顺序 */
@Column(name = "detail_sequence")
private Integer detailSequence;
// 收藏内容的评分
/** 收藏内容的评分 */
@Column(name = "detail_score")
private Float detailScore;
// 收藏内容(根据文件夹和类型的不同)的点赞/关注/订阅
/** 收藏内容(根据文件夹和类型的不同)的点赞/关注/订阅 */
@Column(name = "detail_like")
private Integer detailLike;
// 收藏内容的扩展数据
/** 收藏内容的扩展数据 */
@Column(name = "detail_ext_data")
private String detailExtData;
// 创建时间
/** 创建时间 */
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@Column(name = "update_time")
private Timestamp updateTime;
......
......@@ -6,7 +6,6 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.util.List;
import java.util.Optional;
/**
* @author pengmengqing
......@@ -14,8 +13,6 @@ import java.util.Optional;
*/
public interface UserCollectionRepository extends JpaRepository<UserCollection, Long>, JpaSpecificationExecutor<UserCollection> {
Optional<UserCollection> findFirstByUserIdAndTypeAndName(Long userId, Integer type, String name);
List<UserCollection> findByUserIdAndType(Long userId, Integer type);
}
......
......@@ -2,11 +2,8 @@ package com.topdraw.business.module.user.weixin.collection.service;
import com.topdraw.business.module.user.weixin.collection.domain.UserCollectionDetail;
import com.topdraw.business.module.user.weixin.collection.service.dto.UserCollectionDetailDTO;
import com.topdraw.business.module.user.weixin.collection.service.dto.UserCollectionDetailQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.List;
import java.util.Map;
/**
* @author pengmengqing
......@@ -15,27 +12,40 @@ import java.util.Map;
public interface UserCollectionDetailService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(UserCollectionDetailQueryCriteria criteria, Pageable pageable);
/**
* 根据ID查询
* @param id ID
* @return UserCollectionDetailDTO
*/
UserCollectionDetailDTO findById(Long id);
/**
*
* @param resources
* @return
*/
UserCollectionDetailDTO create(UserCollectionDetail resources);
/**
*
* @param resources
*/
void update(UserCollectionDetail resources);
/**
*
* @param id
*/
void delete(Long id);
/**
*
* @param id
*/
void deleteAllByUserCollectionId(Long id);
/**
*
* @param userCollectionDetailOptional
*/
void deleteAll(List<UserCollectionDetail> userCollectionDetailOptional);
}
......
......@@ -2,13 +2,10 @@ package com.topdraw.business.module.user.weixin.collection.service;
import com.topdraw.business.module.user.weixin.collection.domain.UserCollection;
import com.topdraw.business.module.user.weixin.collection.service.dto.UserCollectionDTO;
import com.topdraw.business.module.user.weixin.collection.service.dto.UserCollectionQueryCriteria;
import org.springframework.data.domain.Pageable;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
......@@ -18,38 +15,60 @@ import java.util.Optional;
public interface UserCollectionService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(UserCollectionQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<UserCollectionDTO>
*/
List<UserCollectionDTO> queryAll(UserCollectionQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return UserCollectionDTO
*/
UserCollectionDTO findById(Long id);
/**
*
* @param resources
* @return
*/
UserCollectionDTO create(UserCollection resources);
/**
*
* @param resources
*/
void update(UserCollection resources);
/**
*
* @param id
*/
void delete(Long id);
/**
*
* @param all
* @param response
* @throws IOException
*/
void download(List<UserCollectionDTO> all, HttpServletResponse response) throws IOException;
/**
*
* @param id
* @param type
* @return
*/
List<UserCollection> findByUserIdAndType(Long id, Integer type);
/**
*
* @param id
* @param type
* @param name
* @return
*/
Optional<UserCollection> findFirstByUserIdAndTypeAndName(Long id, Integer type, String name);
/**
*
* @param userCollection
* @return
*/
UserCollection save(UserCollection userCollection);
}
......
......@@ -13,27 +13,27 @@ import java.sql.Timestamp;
@Data
public class UserCollectionDTO implements Serializable {
// ID
/** ID */
private Long id;
// 应用ID
/** 应用ID */
private Long appId;
// 用户ID
/** 用户ID */
private Long userId;
// 收藏夹类型:1-收藏 2-播放记录 3-播放列表 4-评分 5-点赞/关注/订阅
/** 收藏夹类型:1-收藏 2-播放记录 3-播放列表 4-评分 5-点赞/关注/订阅 */
private Integer type;
// 收藏夹名称
/** 收藏夹名称 */
private String name;
// 数量
/** 数量 */
private Integer count;
// 创建时间
/** 创建时间 */
private Timestamp createTime;
// 更新时间
/** 更新时间 */
private Timestamp updateTime;
}
......
......@@ -14,71 +14,71 @@ import java.sql.Timestamp;
@Data
public class UserCollectionDetailDTO implements Serializable {
// ID
/** ID */
private Long id;
// 收藏夹ID
/** 收藏夹ID */
private Long userCollectionId;
// 自定义收藏内容的类型CODE,默认:DEFAULT
/** 自定义收藏内容的类型CODE,默认:DEFAULT */
private String detailFolderCode;
// 收藏内容的类型:MEDIA|EPISODE|CATEGORY|SUBJECT|ARTICLE|ARTIST|SCHOOL
/** 收藏内容的类型:MEDIA|EPISODE|CATEGORY|SUBJECT|ARTICLE|ARTIST|SCHOOL */
private String detailType;
// 收藏内容的ID
/** 收藏内容的ID */
private Long detailId;
// 收藏内容的CODE
/** 收藏内容的CODE */
private String detailCode;
// 收藏内容的剧集ID
/** 收藏内容的剧集ID */
private Long detailEpisodeId;
// 收藏内容的剧集CODE
/** 收藏内容的剧集CODE */
private String detailEpisodeCode;
// 收藏内容的名称
/** 收藏内容的名称 */
private String detailName;
// 收藏内容的标记
/** 收藏内容的标记 */
private Integer detailMark;
// 收藏内容的图片
/** 收藏内容的图片 */
private String detailImg;
// 收藏内容的剧集序号
/** 收藏内容的剧集序号 */
private Integer detailIndex;
// 收藏内容的剧集总数
/** 收藏内容的剧集总数 */
private Integer detailTotalIndex;
// 收藏内容的播放时间
/** 收藏内容的播放时间 */
private Integer detailPlayTime;
// 收藏内容的总时间
/** 收藏内容的总时间 */
private Integer detailTotalTime;
// 收藏内容在同一folder中的顺序
/** 收藏内容在同一folder中的顺序 */
private Integer detailSequence;
// 收藏内容的评分
/** 收藏内容的评分 */
private Float detailScore;
// 收藏内容(根据文件夹和类型的不同)的点赞/关注/订阅
/** 收藏内容(根据文件夹和类型的不同)的点赞/关注/订阅 */
private Integer detailLike;
// 收藏内容的扩展数据
/** 收藏内容的扩展数据 */
private String detailExtData;
// 创建时间
/** 创建时间 */
@JsonFormat(
pattern = "MM月dd日 HH:mm",
timezone = "GMT+8"
)
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@JsonFormat(
pattern = "MM月dd日 HH:mm",
timezone = "GMT+8"
......
package com.topdraw.business.module.user.weixin.collection.service.dto;
import com.topdraw.annotation.Query;
import lombok.Data;
import javax.persistence.criteria.JoinType;
/**
* @author pengmengqing
* @date 2021-04-02
*/
@Data
public class UserCollectionDetailQueryCriteria{
private Long userWeixinId;
@Query(joinType = JoinType.INNER, joinName = "userCollection")
private Long userId;
@Query(joinType = JoinType.INNER, joinName = "userCollection")
private Integer type;
private String detailType;
private String detailFolderCode = "DEFAULT";
private Long detailId;
}
package com.topdraw.business.module.user.weixin.collection.service.dto;
import lombok.Data;
/**
* @author pengmengqing
* @date 2021-04-02
*/
@Data
public class UserCollectionQueryCriteria{
}
......@@ -4,22 +4,16 @@ import com.topdraw.business.module.user.weixin.collection.domain.UserCollectionD
import com.topdraw.business.module.user.weixin.collection.repository.UserCollectionDetailRepository;
import com.topdraw.business.module.user.weixin.collection.service.UserCollectionDetailService;
import com.topdraw.business.module.user.weixin.collection.service.dto.UserCollectionDetailDTO;
import com.topdraw.business.module.user.weixin.collection.service.dto.UserCollectionDetailQueryCriteria;
import com.topdraw.business.module.user.weixin.collection.service.mapper.UserCollectionDetailMapper;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.ValidationUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.util.List;
import java.util.Map;
/**
* @author pengmengqing
......@@ -31,15 +25,9 @@ public class UserCollectionDetailServiceImpl implements UserCollectionDetailServ
@Autowired
private UserCollectionDetailRepository userCollectionDetailRepository;
@Autowired
private UserCollectionDetailMapper userCollectionDetailMapper;
@Override
public Map<String, Object> queryAll(UserCollectionDetailQueryCriteria criteria, Pageable pageable) {
Page<UserCollectionDetail> page = userCollectionDetailRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(userCollectionDetailMapper::toDto));
}
@Override
public UserCollectionDetailDTO findById(Long id) {
......
......@@ -4,16 +4,11 @@ import com.topdraw.business.module.user.weixin.collection.domain.UserCollection;
import com.topdraw.business.module.user.weixin.collection.repository.UserCollectionRepository;
import com.topdraw.business.module.user.weixin.collection.service.UserCollectionService;
import com.topdraw.business.module.user.weixin.collection.service.dto.UserCollectionDTO;
import com.topdraw.business.module.user.weixin.collection.service.dto.UserCollectionQueryCriteria;
import com.topdraw.business.module.user.weixin.collection.service.mapper.UserCollectionMapper;
import com.topdraw.utils.FileUtil;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.ValidationUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
......@@ -37,19 +32,6 @@ public class UserCollectionServiceImpl implements UserCollectionService {
@Autowired
private UserCollectionMapper userCollectionMapper;
@Override
public Map<String, Object> queryAll(UserCollectionQueryCriteria criteria, Pageable pageable) {
Page<UserCollection> page = userCollectionRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(userCollectionMapper::toDto));
}
@Override
public List<UserCollectionDTO> queryAll(UserCollectionQueryCriteria criteria) {
return userCollectionMapper.toDto(userCollectionRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
@Override
public UserCollectionDTO findById(Long id) {
UserCollection userCollection = userCollectionRepository.findById(id).orElseGet(UserCollection::new);
......
......@@ -2,7 +2,9 @@ package com.topdraw.business.module.user.weixin.domain;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.topdraw.business.module.common.domain.DefaultAsyncMqModule;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.topdraw.business.module.common.domain.AsyncMqModule;
import com.topdraw.business.module.common.validated.CreateGroup;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.CreatedDate;
......@@ -10,9 +12,9 @@ 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;
import java.time.LocalDateTime;
/**
* @author XiangHan
......@@ -23,115 +25,119 @@ import java.time.LocalDateTime;
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_user_weixin")
public class UserWeixin extends DefaultAsyncMqModule implements Serializable {
public class UserWeixin extends AsyncMqModule implements Serializable {
// ID
/** ID */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 用户ID
/** 用户ID */
@Column(name = "member_id")
private Long memberId;
// 微信unionid,针对开发者
/** 微信unionid,针对开发者 */
@Column(name = "unionid")
@NotNull(message = "unionid can't be null",groups = {CreateGroup.class})
private String unionid;
// 微信appid
/** 微信appid */
@Column(name = "appid")
@NotNull(message = "appid can't be null",groups = {CreateGroup.class})
private String appid;
// 微信openid,针对微信app
/** 微信openid,针对微信app */
@Column(name = "openid")
@NotNull(message = "openid can't be null",groups = {CreateGroup.class})
private String openid;
// 关注状态 0 -未关注 1 - 已关注
/** 关注状态 0 -未关注 1 - 已关注 */
@Column(name = "status")
private Integer status;
// 关注同步状态 0-未同步,1-已同步
/** 关注同步状态 0-未同步,1-已同步 */
@Column(name = "sync_status")
private Integer syncStatus;
// 昵称
/** 昵称 */
@Column(name = "nickname")
private String nickname;
// 头像地址
/** 头像地址 */
@Column(name = "headimgurl")
private String headimgurl;
// 特权信息
/** 特权信息 */
@Column(name = "privilege")
private String privilege;
// 刷新凭据
/** 刷新凭据 */
@Column(name = "refresh_token")
private String refreshToken;
// 凭据
/** 凭据 */
@Column(name = "access_token")
private String accessToken;
// 超时(秒)
/** 超时(秒) */
@Column(name = "expires_in")
private Integer expiresIn;
// 超时时间
/** 超时时间 */
@Column(name = "expires_time")
private LocalDateTime expiresTime;
private Timestamp expiresTime;
// 描述
/** 描述 */
@Column(name = "description")
private String description;
// 创建者
/** 创建者 */
@Column(name = "create_by")
private String createBy;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private LocalDateTime createTime;
private Timestamp createTime;
// 更新者
/** 更新者 */
@Column(name = "update_by")
private String updateBy;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private LocalDateTime updateTime;
private Timestamp updateTime;
// 来源类型
/** 来源类型 */
@Column(name = "source_type")
private String sourceType;
// 来源id
/** 来源id */
@Column(name = "source_id")
private String sourceId;
// 来源id
/** 来源id */
@Column(name = "source_desc")
private String sourceDesc;
// 人id
/** 人id */
@Column(name = "person_id")
private Long personId;
// 来源用户id
/** 来源用户id */
@Column(name = "source_user")
private Long sourceUser;
// 来源实体:活动-activity/商品-item
/** 来源实体:活动-activity/商品-item */
@Column(name = "source_entity")
private String sourceEntity;
// 授权时间
/** 授权时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@Column(name = "auth_time")
private LocalDateTime authTime;
private Timestamp authTime;
@Column(name = "sex")
private Integer sex;
......
package com.topdraw.business.module.user.weixin.domain;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.exception.BadRequestException;
import com.topdraw.exception.GlobeExceptionMsg;
import com.topdraw.util.TimestampUtil;
import org.apache.commons.lang3.StringUtils;
import java.sql.Timestamp;
import java.util.Objects;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/14 17:02
* @version: :
* @modified By:
* @since : modified in 2022/3/14 17:02
*/
public class UserWeixinBuilder {
public static UserWeixin build(Long memberId,String appId,String openId,String unionId,String nickname,String headimgurl){
UserWeixin userWeixin = new UserWeixin();
userWeixin.setAppid(appId);
userWeixin.setOpenid(openId);
userWeixin.setUnionid(unionId);
userWeixin.setNickname(nickname);
userWeixin.setHeadimgurl(headimgurl);
return build(memberId,userWeixin);
}
public static UserWeixin build(Long memberId,String appId,String openId,String unionId){
UserWeixin userWeixin = new UserWeixin();
userWeixin.setAppid(appId);
userWeixin.setOpenid(openId);
userWeixin.setUnionid(unionId);
return build(memberId,userWeixin);
}
public static UserWeixin build(UserWeixin userWeixin){
return build(userWeixin.getId(),
userWeixin.getMemberId(),
userWeixin.getMemberCode(),
userWeixin.getUnionid(),userWeixin.getAppid(),userWeixin.getOpenid(),
userWeixin.getStatus(),userWeixin.getSyncStatus(),
userWeixin.getNickname(),userWeixin.getHeadimgurl(),
userWeixin.getPrivilege(), userWeixin.getRefreshToken(),userWeixin.getAccessToken(),
userWeixin.getExpiresIn(),userWeixin.getExpiresTime(),userWeixin.getDescription(),
userWeixin.getCreateBy(),userWeixin.getUpdateBy(),userWeixin.getSourceType(),userWeixin.getSourceId(),
userWeixin.getSourceDesc(),userWeixin.getSourceUser(),userWeixin.getSourceEntity(),userWeixin.getCountry(),userWeixin.getProvince(),
userWeixin.getCity(),userWeixin.getSex());
}
public static UserWeixin build(Long memberId , String memberCode, UserWeixin userWeixin){
return build(userWeixin.getId(),
memberId,
memberCode,
userWeixin.getUnionid(),userWeixin.getAppid(),userWeixin.getOpenid(),
userWeixin.getStatus(),userWeixin.getSyncStatus(),
userWeixin.getNickname(),userWeixin.getHeadimgurl(),
userWeixin.getPrivilege(), userWeixin.getRefreshToken(),userWeixin.getAccessToken(),
userWeixin.getExpiresIn(),userWeixin.getExpiresTime(),userWeixin.getDescription(),
userWeixin.getCreateBy(),userWeixin.getUpdateBy(),userWeixin.getSourceType(),userWeixin.getSourceId(),
userWeixin.getSourceDesc(),userWeixin.getSourceUser(),userWeixin.getSourceEntity(),userWeixin.getCountry(),userWeixin.getProvince(),
userWeixin.getCity(),userWeixin.getSex());
}
public static UserWeixin build(Long memberId , UserWeixin userWeixin){
return build(userWeixin.getId(),
memberId,
userWeixin.getMemberCode(),
userWeixin.getUnionid(),userWeixin.getAppid(),userWeixin.getOpenid(),
userWeixin.getStatus(),userWeixin.getSyncStatus(),
userWeixin.getNickname(),userWeixin.getHeadimgurl(),
userWeixin.getPrivilege(), userWeixin.getRefreshToken(),userWeixin.getAccessToken(),
userWeixin.getExpiresIn(),userWeixin.getExpiresTime(),userWeixin.getDescription(),
userWeixin.getCreateBy(),userWeixin.getUpdateBy(),userWeixin.getSourceType(),userWeixin.getSourceId(),
userWeixin.getSourceDesc(),userWeixin.getSourceUser(),userWeixin.getSourceEntity(),userWeixin.getCountry(),userWeixin.getProvince(),
userWeixin.getCity(),userWeixin.getSex());
}
public static UserWeixin build(Member member , UserWeixin userWeixin) {
return build(userWeixin.getId(),
member.getId(),
member.getCode(),
userWeixin.getUnionid(),userWeixin.getAppid(),userWeixin.getOpenid(),
userWeixin.getStatus(),userWeixin.getSyncStatus(),
userWeixin.getNickname(),userWeixin.getHeadimgurl(),
userWeixin.getPrivilege(), userWeixin.getRefreshToken(),userWeixin.getAccessToken(),
userWeixin.getExpiresIn(),userWeixin.getExpiresTime(),userWeixin.getDescription(),
userWeixin.getCreateBy(),userWeixin.getUpdateBy(),userWeixin.getSourceType(),userWeixin.getSourceId(),
userWeixin.getSourceDesc(),userWeixin.getSourceUser(),userWeixin.getSourceEntity(),userWeixin.getCountry(),userWeixin.getProvince(),
userWeixin.getCity(),userWeixin.getSex());
}
public static UserWeixin build(Long id ,
Long memberId,
String memberCode,
String unionId, String appId,String openId,
Integer status, Integer syncStatus,
String nickname,String headimgurl,
String privilege,String refreshToken,
String accessToken,Integer expiresIn,Timestamp expiresTime,String description,
String createBy,String updateBy,
String sourceType,String sourceId,
String sourceDesc,
Long sourceUser,String sourceEntity,
String country,String province,String city,
Integer sex){
if (Objects.isNull(memberId)) {
throw new BadRequestException(GlobeExceptionMsg.MEMBER_ID_IS_NULL);
}
UserWeixin userWeixin = new UserWeixin();
userWeixin.setId(Objects.nonNull(id)?id:null);
userWeixin.setMemberId(memberId);
userWeixin.setMemberCode(memberCode);
userWeixin.setUnionid(StringUtils.isNotBlank(unionId)?unionId:"");
userWeixin.setAppid(StringUtils.isNotBlank(appId)?appId:"");
userWeixin.setOpenid(StringUtils.isNotBlank(openId)?openId:"");
userWeixin.setStatus(Objects.nonNull(status)?status:0);
userWeixin.setSyncStatus(Objects.nonNull(syncStatus)?syncStatus:0);
userWeixin.setNickname(StringUtils.isNotBlank(nickname)?nickname:"");
userWeixin.setHeadimgurl(StringUtils.isNotBlank(headimgurl)?headimgurl:"");
userWeixin.setPrivilege(StringUtils.isNotBlank(privilege)?privilege:"");
userWeixin.setRefreshToken(StringUtils.isNotBlank(refreshToken)?refreshToken:"");
userWeixin.setAccessToken(StringUtils.isNotBlank(accessToken)?accessToken:"");
userWeixin.setExpiresIn(expiresIn);
userWeixin.setExpiresTime(expiresTime);
userWeixin.setDescription(StringUtils.isNotBlank(description)?description:"");
userWeixin.setCreateBy(StringUtils.isNotBlank(createBy)?createBy:"system");
userWeixin.setUpdateBy(StringUtils.isNotBlank(updateBy)?updateBy:"system");
userWeixin.setSourceType(StringUtils.isNotBlank(sourceType)?sourceType:"");
userWeixin.setSourceId(StringUtils.isNotBlank(sourceId)?sourceId:"");
userWeixin.setSourceDesc(StringUtils.isNotBlank(sourceDesc)?sourceId:"");
userWeixin.setSourceUser(Objects.nonNull(sourceUser)?sourceUser:0L);
userWeixin.setSourceEntity(StringUtils.isNotBlank(sourceEntity)?sourceEntity:"");
// userWeixin.setAuthTime(TimestampUtil.now());
userWeixin.setCountry(StringUtils.isNotBlank(country)?country:"");
userWeixin.setProvince(StringUtils.isNotBlank(province)?province:"");
userWeixin.setCity(StringUtils.isNotBlank(city)?city:"");
userWeixin.setSex(Objects.nonNull(sex)?sex:-1);
return userWeixin;
}
}
......@@ -16,10 +16,18 @@ import java.util.Optional;
*/
public interface UserWeixinRepository extends JpaRepository<UserWeixin, Long>, JpaSpecificationExecutor<UserWeixin> {
Optional<UserWeixin> findFirstByMemberIdAndAppid(Long memberId, String appid);
Optional<UserWeixin> findFirstByUnionidAndAppidAndOpenid(String unionId, String appId, String openId);
Optional<UserWeixin> findFirstByAppidAndOpenid(String appId, String openId);
Optional<UserWeixin> findFirstByUnionid(String unionid);
Optional<UserWeixin> findFirstByUnionidAndAppid(String unionid, String appId);
@Modifying
@Transactional
@Query(value = "update uc_user_weixin set update_time = :#{#resources.updateTime} where appid = :#{#resources.appid} and openid = :#{#resources.openid}" , nativeQuery = true)
@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);
}
......
......@@ -2,11 +2,6 @@ package com.topdraw.business.module.user.weixin.service;
import com.topdraw.business.module.user.weixin.domain.UserWeixin;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinDTO;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.List;
import java.util.Map;
/**
* @author XiangHan
......@@ -15,35 +10,74 @@ import java.util.Map;
public interface UserWeixinService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(UserWeixinQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<UserWeixinDTO>
*/
List<UserWeixinDTO> queryAll(UserWeixinQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return UserWeixinDTO
*/
UserWeixinDTO findById(Long id);
void updateTime(UserWeixin resources);
void create(UserWeixin resources);
/**
*
* @param resources
* @return
*/
UserWeixin create(UserWeixin resources);
/**
*
* @param resources
*/
void update(UserWeixin resources);
/**
*
* @param resources
*/
void updateTime(UserWeixin resources);
/**
*
* @param id
*/
void delete(Long id);
/**
*
* @param memberId
* @param appid
* @return
*/
UserWeixinDTO findFirstByMemberIdAndAppid(Long memberId, String appid);
/**
*
* @param unionId
* @param appId
* @param openId
* @return
*/
UserWeixinDTO findFirstByUnionIdAndAppIdAndOpenId(String unionId, String appId, String openId);
/**
*
* @param appId
* @param openId
* @return
*/
UserWeixinDTO findFirstByAppIdAndOpenId(String appId, String openId);
/**
*
* @param unionid
* @return
*/
UserWeixinDTO findFirstByUnionId(String unionid);
/**
*
* @param unionid
* @param appId
* @return
*/
UserWeixinDTO findFirstByUnionidAndAppid(String unionid, String appId);
}
......
......@@ -4,7 +4,6 @@ import lombok.Data;
import java.io.Serializable;
import java.sql.Timestamp;
import java.time.LocalDateTime;
/**
......@@ -14,89 +13,93 @@ import java.time.LocalDateTime;
@Data
public class UserWeixinDTO implements Serializable {
// ID
private String memberCode;
/** ID */
private Long id;
// 用户ID
/** 用户ID */
private Long memberId;
// 微信unionid,针对开发者
/** 微信unionid,针对开发者 */
private String unionid;
// 微信appid
/** 微信appid */
private String appid;
// 微信openid,针对微信app
/** 微信openid,针对微信app */
private String openid;
// 关注状态 0 -未关注 1 - 已关注
/** 关注状态 0 -未关注 1 - 已关注 */
private Integer status;
// 关注同步状态 0-未同步,1-已同步
/** 关注同步状态 0-未同步,1-已同步 */
private Integer syncStatus;
// 昵称
/** 昵称 */
private String nickname;
// 头像地址
/** 头像地址 */
private String headimgurl;
// 特权信息
/** 特权信息 */
private String privilege;
// 刷新凭据
/** 刷新凭据 */
private String refreshToken;
// 凭据
/** 凭据 */
private String accessToken;
// 超时(秒)
/** 超时(秒) */
private Integer expiresIn;
// 超时时间
private LocalDateTime expiresTime;
/** 超时时间 */
private Timestamp expiresTime;
// 描述
/** 描述 */
private String description;
// 创建者
/** 创建者 */
private String createBy;
// 创建时间
private LocalDateTime createTime;
/** 创建时间 */
private Timestamp createTime;
// 更新者
/** 更新者 */
private String updateBy;
// 更新时间
private LocalDateTime updateTime;
/** 更新时间 */
private Timestamp updateTime;
// 来源类型
/** 来源类型 */
private String sourceType;
// 来源id
/** 来源id */
private String sourceId;
// 来源id
/** 来源id */
private String sourceDesc;
// 人id
/** 人id */
private Long personId;
// 来源用户id
/** 来源用户id */
private Long sourceUser;
// 来源实体:活动-activity/商品-item
/** 来源实体:活动-activity/商品-item */
private String sourceEntity;
// 授权时间
private LocalDateTime authTime;
/** 授权时间 */
private Timestamp authTime;
private Integer sex;
private Integer gender;
private String country;
private String province;
private String city;
private Integer sex;
}
......
package com.topdraw.business.module.user.weixin.service.dto;
import com.topdraw.annotation.Query;
import lombok.Data;
/**
......@@ -8,4 +9,8 @@ import lombok.Data;
*/
@Data
public class UserWeixinQueryCriteria{
@Query()
private String unionId;
}
......
......@@ -3,30 +3,20 @@ package com.topdraw.business.module.user.weixin.service.impl;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.user.weixin.domain.UserWeixin;
import com.topdraw.business.module.user.weixin.domain.UserWeixinBuilder;
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.service.mapper.UserWeixinMapper;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.ValidationUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.sql.Time;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import javax.validation.constraints.NotNull;
import java.util.Objects;
/**
......@@ -35,97 +25,94 @@ import java.util.Objects;
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
@Slf4j
public class UserWeixinServiceImpl implements UserWeixinService {
@Autowired
private UserWeixinRepository UserWeixinRepository;
private MemberService memberService;
@Autowired
private UserWeixinMapper UserWeixinMapper;
private UserWeixinRepository userWeixinRepository;
@Autowired
private MemberService memberService;
@Override
public Map<String, Object> queryAll(UserWeixinQueryCriteria criteria, Pageable pageable) {
Page<UserWeixin> page = UserWeixinRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(UserWeixinMapper::toDto));
}
@Override
public List<UserWeixinDTO> queryAll(UserWeixinQueryCriteria criteria) {
return UserWeixinMapper.toDto(UserWeixinRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
private UserWeixinMapper userWeixinMapper;
@Override
public UserWeixinDTO findById(Long id) {
UserWeixin UserWeixin = UserWeixinRepository.findById(id).orElseGet(UserWeixin::new);
UserWeixin UserWeixin = this.userWeixinRepository.findById(id).orElseGet(com.topdraw.business.module.user.weixin.domain.UserWeixin::new);
ValidationUtil.isNull(UserWeixin.getId(),"UserWeixin","id",id);
return UserWeixinMapper.toDto(UserWeixin);
return this.userWeixinMapper.toDto(UserWeixin);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateTime(UserWeixin resources) {
log.info("updateTime ==>> resources ==>> [{}]", resources);
String appid = resources.getAppid();
String openid = resources.getOpenid();
UserWeixin userWeixin = UserWeixinRepository.findFirstByAppidAndOpenid(appid,openid).orElseGet(UserWeixin::new);
ValidationUtil.isNull( userWeixin.getId(),"UserWeixin","id",resources.getId());
userWeixin.setUpdateTime(LocalDateTime.now());
log.info("userWeixin ==>> userWeixin ==>> [{}]",userWeixin);
UserWeixinRepository.updateTime(userWeixin);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(UserWeixin resources) {
resources.setMemberId(null);
String memberCode = resources.getMemberCode();
MemberDTO memberDTO = this.memberService.getByCode(memberCode);
resources.setMemberId(memberDTO.getId());
UserWeixinRepository.save(resources);
public UserWeixin create(UserWeixin resources) {
MemberDTO memberDTO = memberService.findByCode(resources.getMemberCode());
if (Objects.nonNull(memberDTO)) {
Long id = memberDTO.getId();
resources.setMemberId(id);
}
UserWeixin build = UserWeixinBuilder.build(resources);
this.userWeixinRepository.save(build);
return resources;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(UserWeixin resources) {
log.info("update ==>> resources ==>> [{}]",resources);
String appid = resources.getAppid();
String openid = resources.getOpenid();
UserWeixin userWeixin = UserWeixinRepository.findFirstByAppidAndOpenid(appid,openid).orElseGet(UserWeixin::new);
if (Objects.isNull(userWeixin.getId())) {
this.create(resources);
} else {
if (Objects.isNull(userWeixin.getMemberId())) {
String memberCode = resources.getMemberCode();
MemberDTO memberDTO = this.memberService.getByCode(memberCode);
resources.setMemberId(memberDTO.getId());
} else {
resources.setMemberId(userWeixin.getMemberId());
}
resources.setId(userWeixin.getId());
BeanUtils.copyProperties(resources,userWeixin);
log.info("update ==>>userWeixin ==>> resources ==>> [{}]",resources);
UserWeixinRepository.save(resources);
}
UserWeixinDTO userWeixinDTO = this.findFirstByAppIdAndOpenId(appid, openid);
resources.setId(userWeixinDTO.getId());
resources.setMemberId(userWeixinDTO.getMemberId());
UserWeixin UserWeixin = this.userWeixinRepository.findById(resources.getId()).orElseGet(UserWeixin::new);
ValidationUtil.isNull( UserWeixin.getId(),"UserWeixin","id",resources.getId());
UserWeixin.copy(resources);
this.userWeixinRepository.save(UserWeixin);
}
@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!");
UserWeixin UserWeixin = UserWeixinRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", UserWeixin.class, id), 1));
UserWeixinRepository.delete(UserWeixin);
UserWeixin UserWeixin = this.userWeixinRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", com.topdraw.business.module.user.weixin.domain.UserWeixin.class, id), 1));
this.userWeixinRepository.delete(UserWeixin);
}
@Override
public UserWeixinDTO findFirstByMemberIdAndAppid(Long memberId, String appid) {
UserWeixin userWeixin = this.userWeixinRepository.findFirstByMemberIdAndAppid(memberId, appid).orElseGet(UserWeixin::new);
ValidationUtil.isNull(userWeixin.getId(),"UserWeixin","id",memberId);
return this.userWeixinMapper.toDto(userWeixin);
}
@Override
public UserWeixinDTO findFirstByUnionIdAndAppIdAndOpenId(String unionId, String appId, String openId) {
UserWeixin userWeixin = this.userWeixinRepository.findFirstByUnionidAndAppidAndOpenid(unionId, appId,openId).orElseGet(UserWeixin::new);
return this.userWeixinMapper.toDto(userWeixin);
}
@Override
public UserWeixinDTO findFirstByAppIdAndOpenId(String appId, String openId) {
UserWeixin userWeixin = this.UserWeixinRepository.findFirstByAppidAndOpenid(appId,openId).orElseGet(UserWeixin::new);
return UserWeixinMapper.toDto(userWeixin);
UserWeixin userWeixin = this.userWeixinRepository.findFirstByAppidAndOpenid(appId,openId).orElseGet(UserWeixin::new);
return this.userWeixinMapper.toDto(userWeixin);
}
@Override
public UserWeixinDTO findFirstByUnionId(String unionid) {
UserWeixin userWeixin = this.userWeixinRepository.findFirstByUnionid(unionid).orElseGet(UserWeixin::new);
return this.userWeixinMapper.toDto(userWeixin);
}
@Override
public UserWeixinDTO findFirstByUnionidAndAppid(String unionid, String appId) {
UserWeixin userWeixin = this.userWeixinRepository.findFirstByUnionidAndAppid(unionid,appId).orElseGet(UserWeixin::new);
return this.userWeixinMapper.toDto(userWeixin);
}
}
......
package com.topdraw.business.process.service;
import com.topdraw.business.process.domian.TempCoupon;
import java.util.List;
/**
* @description 权益操作接口
* @author XiangHan
......@@ -12,15 +8,4 @@ import java.util.List;
public interface CouponOperationService {
/**
* 基于已完成的任务发放优惠券
* @param tempCouponList
*/
void grantCouponThroughTempCoupon(List<TempCoupon> tempCouponList);
/**
* 系统手动发放优惠券
* @param tempCouponList
*/
void grantCouponByManual(List<TempCoupon> tempCouponList);
}
......
......@@ -11,20 +11,5 @@ import java.util.List;
*/
public interface ExpOperationService {
/**
* 任务完成后自动发放成长值
* @param tempExpList
*/
void grantPointsThroughTempExp(List<TempExp> tempExpList);
/**
* 系统手动发放优惠券
* @param memberId
* @param userId
* @param tempExpList
*/
void grantExpByManual(Long memberId, Long userId, List<TempExp> tempExpList);
void grantExpByManual(List<TempExp> tempExpList);
}
......
package com.topdraw.business.process.service;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.service.dto.MemberDTO;
public interface MemberOperationService {
void doUpdateMemberInfo(Member member);
void doInsertMember(Member member);
MemberDTO findById(Long memberId);
void doUpdateMemberExp(Member member);
void doUpdateMemberPoints(Member member);
void doUpdateMemberCoupon(Member member);
}
package com.topdraw.business.process.service;
import com.topdraw.business.process.domian.TempPoints;
import java.util.List;
/**
* @description 积分操作接口
* @author XiangHan
......@@ -11,38 +7,4 @@ import java.util.List;
*/
public interface PointsOperationService {
/**
* 手动发放积分
* @param memberId 会员id
* @param tempPoints 积分详情
*/
void grantPointsByManual(Long memberId , TempPoints tempPoints);
/**
*
* @param tempPoints
*/
void grantPointsByManualByTempPoints(TempPoints tempPoints);
/**
* 积分扣减
* @param tempPoints 积分对象
*/
boolean customPoints(TempPoints tempPoints);
/**
* 积分发放,基于已获得的权益
* @param tempPointsList 已获得的权益
*/
void grantPointsThroughTempRightsList(List<TempPoints> tempPointsList);
/**
* 清理过期并计算可用总积分
* @param memberId
* @return
*/
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.RightType;
import java.util.List;
import java.util.Map;
/**
* @description 权益操作接口
* @author XiangHan
* @date 2021.10.22
*/
public interface RightsOperationService {
/**
* 系统手动发放权益
* @param rightsHistories
*/
void grantRightsByManual(List<RightsHistory> rightsHistories);
/**
* 任务完成自动发放权益
* @param tempRightsMap
*/
void grantRights(Map<RightType, Object> tempRightsMap);
}
package com.topdraw.business.process.service;
public interface TaskOperationService {
}
package com.topdraw.business.process.service;
import com.topdraw.business.module.task.template.service.dto.TaskTemplateDTO;
/**
* @description 权益操作接口
* @author XiangHan
* @date 2021.10.22
*/
public interface TaskTemplateOperationService {
TaskTemplateDTO findByCode(String code);
}
package com.topdraw.business.process.service;
public interface UserOperationService {
}
package com.topdraw.business.process.service.dto;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.user.iptv.service.dto.UserTvDTO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/23 9:48
* @version: :
* @modified By:
* @since : modified in 2022/3/23 9:48
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MemberAndUserTvDTO implements Serializable {
private MemberDTO memberDTO;
private UserTvDTO userTvDTO;
}
package com.topdraw.business.process.service.dto;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinDTO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/23 9:48
* @version: :
* @modified By:
* @since : modified in 2022/3/23 9:48
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MemberAndWeixinUserDTO implements Serializable {
private MemberDTO memberDTO;
private UserWeixinDTO userWeixinDTO;
}
package com.topdraw.business.process.service.dto;
import com.topdraw.business.module.member.profile.service.dto.MemberProfileDTO;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/23 9:48
* @version: :
* @modified By:
* @since : modified in 2022/3/23 9:48
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MemberProfileAndMemberDTO implements Serializable {
private MemberProfileDTO memberProfileDTO;
private MemberDTO memberDTO;
}
......@@ -6,196 +6,33 @@ import com.topdraw.business.module.coupon.service.CouponService;
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.process.domian.TempCoupon;
import com.topdraw.business.process.service.CouponOperationService;
import com.topdraw.business.process.service.MemberOperationService;
import com.topdraw.business.process.service.RightsOperationService;
import com.topdraw.util.RedissonUtil;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import com.topdraw.business.process.service.member.MemberOperationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
@Service
public class CouponOperationServiceImpl implements CouponOperationService {
private static final Logger LOG = LoggerFactory.getLogger(CouponOperationServiceImpl.class);
@Autowired
CouponService couponService;
@Autowired
CouponHistoryService couponHistoryService;
@Autowired
MemberOperationService memberOperationService;
private CouponHistoryService couponHistoryService;
@Autowired
RightsOperationService rightsOperationService;
private MemberOperationService memberOperationService;
@Autowired
MemberService memberService;
@Autowired
ThreadPoolTaskExecutor threadPoolTaskExecutor;
// 过期阀值(默认一个月)
private static final Integer EXPIRE_FACTOR_DAY = 30;
@Override
public void grantCouponThroughTempCoupon(List<TempCoupon> tempCouponList) {
// 优惠券领取、使用历史记录表
for (TempCoupon tempCoupon : tempCouponList) {
this.refresh(tempCoupon);
}
}
/**
* 手动发放优惠券
* @param tempCouponList
*/
@Override
public void grantCouponByManual(List<TempCoupon> tempCouponList) {
// 优惠券领取、使用历史记录表
for (TempCoupon tempCoupon : tempCouponList) {
this.refresh(tempCoupon);
}
}
/**
* 优惠券领取历史记录表
*
* @param tempCoupon 领取的优惠券
*/
private void refresh(TempCoupon tempCoupon) {
// 1.更新会员优惠券数量
this.refreshMemberCoupon(tempCoupon);
// 2.保存优惠券领取、使用历史记录表
this.doInsertCouponHistory(tempCoupon);
}
private MemberService memberService;
/**
* 更新会员优惠券信息
* @param tempCoupon 账号id
*/
private void refreshMemberCoupon(TempCoupon tempCoupon) {
// Long userId = tempCoupon.getUserId();
Long memberId = tempCoupon.getMemberId();
Integer rightsAmount = tempCoupon.getRightsAmount();
try {
// 1.历史总优惠券数量
Long historyCouponCount = this.getTotalHistoryCoupon(memberId);
// 1.当前总优惠券数量
Long totalCouponCount = this.getTotalCoupon(historyCouponCount,rightsAmount);
// 2.获取已过期的优惠券数量
Long expireCouponCount = this.getTotalExpireCoupon(memberId);
// 3.即将过期的优惠券数量
Long expireSoonCouponCount = this.getTotalExpireSoonCoupon(memberId,EXPIRE_FACTOR_DAY);
// 4.当前优惠券数量 = 总优惠券-已过期的优惠券
Long currentCoupon = this.getCurrentCoupon(totalCouponCount,expireCouponCount);
// 5.更新用户信息(优惠券数量、即将过期的优惠券数量)
this.doUpdateMemberInfo(memberId,currentCoupon,expireSoonCouponCount);
} catch (Exception e) {
e.printStackTrace();
throw e;
}
public void asyncMemberCoupon(Member member) {
String memberCode = member.getCode();
MemberDTO memberDTO = this.memberService.findByCode(memberCode);
member.setId(memberDTO.getId());
this.memberOperationService.doUpdateMember(member);
}
private Long getTotalCoupon(Long historyCouponCount, Integer rightsAmount) {
return (Objects.nonNull(historyCouponCount) ? historyCouponCount: 0L) + (Objects.nonNull(rightsAmount) ? rightsAmount: 0L);
}
/**
* 更新当前用户优惠券信息
* @param memberId
* @param currentCoupon
* @param expireSoonCouponCount
*/
private void doUpdateMemberInfo(Long memberId, Long currentCoupon, Long expireSoonCouponCount) {
MemberDTO memberDTO = this.findMemberByMemberId(memberId);
public void asyncCouponHistory(CouponHistory couponHistory) {
String memberCode = couponHistory.getMemberCode();
MemberDTO memberDTO = this.memberService.findByCode(memberCode);
couponHistory.setUserId(memberDTO.getId());
Member member = new Member();
BeanUtils.copyProperties(memberDTO,member);
member.setCouponAmount(currentCoupon);
member.setDueCouponAmount(expireSoonCouponCount);
member.setUpdateTime(LocalDateTime.now());
this.memberOperationService.doUpdateMemberInfo(member);
}
private MemberDTO findMemberByMemberId(Long memberId) {
MemberDTO memberDTO = this.memberService.findById(memberId);
return memberDTO;
}
/**
* 当前优惠券数量 = 总优惠券-已过期的优惠券
* @param totalCouponCount 总数
* @param expireCouponCount 已过期总数
* @return
*/
private Long getCurrentCoupon(Long totalCouponCount, Long expireCouponCount) {
return (Objects.nonNull(totalCouponCount)?totalCouponCount:0L)-(Objects.nonNull(expireCouponCount)?expireCouponCount:0L);
}
/**
* 即将过期的优惠券数量
* @param expireFactor
* @return
*/
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);
}
/**
* 优惠券领取、使用历史记录表
* @param tempCoupon 优惠券
*/
private void doInsertCouponHistory(TempCoupon tempCoupon) {
CouponHistory couponHistory = new CouponHistory();
BeanUtils.copyProperties(tempCoupon,couponHistory);
couponHistory.setId(null);
couponHistory.setCouponId(tempCoupon.getId());
couponHistory.setUserId(tempCoupon.getMemberId());
couponHistory.setCouponCode(tempCoupon.getCode());
couponHistory.setUserNickname(tempCoupon.getUserNickname());
couponHistory.setOrderDetailId(tempCoupon.getOrderId());
couponHistory.setReceiveTime(LocalDateTime.now());
couponHistory.setUseStatus(Objects.nonNull(couponHistory.getUseStatus()) ? couponHistory.getUseStatus():0);
this.couponHistoryService.create(couponHistory);
}
}
......
......@@ -4,28 +4,13 @@ import com.topdraw.business.module.exp.detail.domain.ExpDetail;
import com.topdraw.business.module.exp.detail.service.ExpDetailService;
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.process.domian.TempExp;
import com.topdraw.business.process.service.ExpOperationService;
import com.topdraw.business.process.service.MemberOperationService;
import com.topdraw.util.IdWorker;
import com.topdraw.util.RedissonUtil;
import com.topdraw.utils.StringUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import com.topdraw.business.process.service.member.MemberOperationService;
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.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
/**
*
......@@ -33,180 +18,30 @@ import java.util.Objects;
@Service
public class ExpOperationServiceImpl implements ExpOperationService {
private static final Logger LOG = LoggerFactory.getLogger(ExpOperationServiceImpl.class);
@Autowired
ExpDetailService expDetailService;
private ExpDetailService expDetailService;
@Autowired
MemberOperationService memberOperationService;
private MemberOperationService memberOperationService;
@Autowired
MemberLevelService memberLevelService;
private MemberLevelService memberLevelService;
@Autowired
MemberService memberService;
private MemberService memberService;
@Autowired
ThreadPoolTaskExecutor threadPoolTaskExecutor;
@Override
public void grantPointsThroughTempExp(List<TempExp> tempExpList) {
for (TempExp tempExp : tempExpList) {
this.refresh(tempExp);
}
}
@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);
}
}
/**
*
* @param tempExp
*/
private void refresh(TempExp tempExp) {
String memberCode = tempExp.getMemberCode();
MemberDTO memberDTO = this.memberService.getByCode(memberCode);
Long id = memberDTO.getId();
tempExp.setId(id);
try {
// 原始积分
long originExp = this.getExpByMemberId(tempExp);
// 总积分
long totalExp = this.calculateTotalExp(originExp, tempExp);
// 1.添加成长值记录
// this.threadPoolTaskExecutor.execute(() -> this.doInsertExpDetail(tempExp, originExp, totalExp));
// 2.更新成长值与等级
this.refreshMemberExpAndLevel(tempExp,totalExp);
this.doInsertExpDetail(tempExp, originExp, totalExp);
public void asyncMemberExpAndLevel(Member member) {
String code = member.getCode();
MemberDTO memberDTO = this.memberService.findByCode(code);
member.setId(memberDTO.getId());
} catch (Exception e) {
e.printStackTrace();
throw e;
}
this.memberService.doUpdateMemberExpAndLevel(member);
}
private long calculateTotalExp(long originalExp, TempExp tempExp) {
Long rewardExp = tempExp.getRewardExp();
return rewardExp + originalExp;
}
public void asyncExpDetail(ExpDetail expDetail) {
String code = expDetail.getMemberCode();
MemberDTO memberDTO = this.memberService.findByCode(code);
expDetail.setMemberId(memberDTO.getId());
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;
}
return 0L;
}
/**
* 更新成长值与等级
*
* @param tempExp 成长值列表
*/
private void refreshMemberExpAndLevel(TempExp tempExp, long totalExp) {
Long memberId = tempExp.getMemberId();
// 1.获取当前成长值
MemberDTO memberDTO = this.getMemberInfoByMemberId(memberId);
// 2.获取下一级需要的成长值
MemberLevelDTO memberLevelDTO = this.getNextLevelExp(memberDTO.getLevel() + 1, 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);
Member member = new Member();
BeanUtils.copyProperties(memberDTO,member);
member.setExp(totalExp);
member.setLevel(level);
member.setUpdateTime(LocalDateTime.now());
this.memberOperationService.doUpdateMemberInfo(member);
}
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)) {
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;
}
/**
* 添加成长值记录
*
* @param tempExp 成长值列表
*/
private void 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()));
// 原始积分
expDetail.setOriginalExp(originalExp);
// 总积分
expDetail.setResultExp(totalExp);
// 获得的积分
expDetail.setExp(rewardExp);
if (StringUtils.isEmpty(expDetail.getDescription())) {
expDetail.setDescription("#");
}
this.expDetailService.create(expDetail);
}
}
......
package com.topdraw.business.process.service.impl;
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.process.service.MemberOperationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import java.util.Objects;
@Service
public class MemberOperationServiceImpl implements MemberOperationService {
@Autowired
MemberService memberService;
@Override
public void doUpdateMemberInfo(Member member) {
Long id = member.getId();
Assert.notNull(id,"ERROR MSG: MemberOperationServiceImpl -> doUpdateMemberInfo -> id not be null!!");
this.memberService.update(member);
}
@Override
public void doInsertMember(Member member) {
this.memberService.create(member);
}
@Override
public MemberDTO findById(Long memberId) {
return Objects.nonNull(memberId) ? this.memberService.findById(memberId) : null;
}
@Override
public void doUpdateMemberExp(Member member) {
this.doUpdateMemberInfo(member);
}
@Override
public void doUpdateMemberPoints(Member member) {
this.memberService.doUpdateMemberPoints(member);
}
@Override
public void doUpdateMemberCoupon(Member member) {
this.doUpdateMemberInfo(member);
}
}
......@@ -12,17 +12,12 @@ 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.process.domian.TempPoints;
import com.topdraw.business.process.service.MemberOperationService;
import com.topdraw.business.process.service.PointsOperationService;
import com.topdraw.business.process.service.member.MemberOperationService;
import com.topdraw.util.IdWorker;
import com.topdraw.util.RedissonUtil;
import com.topdraw.util.TimestampUtil;
import com.topdraw.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
......@@ -31,7 +26,7 @@ import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.sql.Timestamp;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
......@@ -44,535 +39,39 @@ import java.util.stream.Collectors;
@Slf4j
public class PointsOperationServiceImpl implements PointsOperationService {
private static final Logger LOG = LoggerFactory.getLogger(PointsOperationServiceImpl.class);
@Autowired
PointsService pointsService;
@Autowired
PointsDetailService pointsDetailService;
@Autowired
PointsAvailableService pointsAvailableService;
private PointsDetailService pointsDetailService;
@Autowired
PointsDetailHistoryService pointsDetailHistoryService;
private PointsAvailableService pointsAvailableService;
@Autowired
MemberOperationService memberOperationService;
@Autowired
MemberService memberService;
// 过期阈值 30天
private static final Integer EXPIRE_FACTOR = 30;
private static final String DELETE_AVAILABLE_POINTS = "delete";
private static final String INSERT_AVAILABLE_POINTS = "insert";
private MemberService memberService;
@Autowired
ThreadPoolTaskExecutor threadPoolTaskExecutor;
@Override
@Transactional(rollbackFor = Exception.class)
public void grantPointsByManual(Long memberId,TempPoints tempPoints){
if (Objects.nonNull(tempPoints) && Objects.nonNull(tempPoints.getPoints())) {
this.refresh(tempPoints);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void grantPointsByManualByTempPoints(TempPoints tempPoints) {
if (Objects.nonNull(tempPoints) && Objects.nonNull(tempPoints.getPoints())) {
String memberCode = tempPoints.getMemberCode();
MemberDTO memberDTO = this.memberService.getByCode(memberCode);
if (Objects.nonNull(memberDTO)) {
Long memberId = memberDTO.getId();
tempPoints.setMemberId(memberId);
this.refresh(tempPoints);
}
}
}
/**
* 积分消耗
* @param tempPoints 任务对象
* @return true: 满足 false:不满足
*/
@Override
@Transactional(rollbackFor = Exception.class)
public boolean customPoints(TempPoints tempPoints) {
String memberCode = tempPoints.getMemberCode();
MemberDTO memberDTO = this.memberService.getByCode(memberCode);
if (Objects.nonNull(memberDTO)) {
Long memberId = memberDTO.getId();
tempPoints.setMemberId(memberId);
try {
//1.删除过期的积分
this.cleanInvalidAvailablePointsByMemberId(memberId);
// 1.判断可用积分是否够用
boolean b = this.checkAvailablePoints(tempPoints);
log.info("customPoints-->>> 当前可用总积分大于待兑换的积分--->>" + b);
if (b) {
// 2.可用积分表,按照过期时间进行升序排列
List<PointsAvailableDTO> pointsAvailableDTOS = this.findByMemberIdOrderByExpireTime(tempPoints);
// 3.当前可用总积分
long currentPoints = this.findAvailablePointsByMemberId(memberId);
// 2.优先使用即将过期的积分,累加到超过需兑换积分时,需要进行拆分
Map<String, List<PointsAvailableDTO>> customAvailablePointsMap = this.customAvailablePoints(tempPoints, pointsAvailableDTOS);
// 3.添加积分明细
this.doInsertTrPointsDetailByAvailablePointsMap(tempPoints, customAvailablePointsMap, currentPoints);
// 4.更新可用积分表,超过的删除,剩余的新增
long totalPoints = this.doFreshTrPointsAvailableByAvailablePointsMap(customAvailablePointsMap, currentPoints);
// 5.即将过期的积分
long soonExpirePoints = this.getSoonExpirePoints(memberId, tempPoints);
// 6.更新会员积分信息
this.freshMemberCurrentPoints(memberId, totalPoints,soonExpirePoints,tempPoints);
return true;
}
}catch (Exception e) {
e.printStackTrace();
throw e;
}
}
return false;
}
/**
* 更新可用积分表
* @param customAvailablePointsMap
*/
private long doFreshTrPointsAvailableByAvailablePointsMap(
Map<String, List<PointsAvailableDTO>> customAvailablePointsMap,long currentPoints) {
long totalCustomAvailablePoints = 0L;
if (customAvailablePointsMap != null) {
// 需要删除的
List<PointsAvailableDTO> pointsAvailableDTOS1 = customAvailablePointsMap.get(DELETE_AVAILABLE_POINTS);
if (!CollectionUtils.isEmpty(pointsAvailableDTOS1)) {
for (PointsAvailableDTO pointsAvailableDTO : pointsAvailableDTOS1) {
totalCustomAvailablePoints = (totalCustomAvailablePoints+pointsAvailableDTO.getPoints());
this.pointsAvailableService.delete(pointsAvailableDTO.getId());
}
}
// 需要添加的
List<PointsAvailableDTO> pointsAvailableDTOS2 = customAvailablePointsMap.get(INSERT_AVAILABLE_POINTS);
if (!CollectionUtils.isEmpty(pointsAvailableDTOS2)) {
PointsAvailableDTO pointsAvailableDTO = pointsAvailableDTOS2.get(0);
PointsAvailable pointsAvailable = new PointsAvailable();
BeanUtils.copyProperties(pointsAvailableDTO,pointsAvailable);
pointsAvailable.setId(null);
pointsAvailable.setCode(String.valueOf(IdWorker.generator()));
this.pointsAvailableService.create4Custom(pointsAvailable);
}
}
return currentPoints - totalCustomAvailablePoints;
}
/**
* 优先使用即将过期的积分,注意拆分
* @param customAvailablePointsMap
*/
private void doInsertTrPointsDetailByAvailablePointsMap(TempPoints tempPoints,
Map<String, List<PointsAvailableDTO>> customAvailablePointsMap,
long currentPoints) {
// 兑换的积分
Long points = tempPoints.getPoints();
List<PointsAvailableDTO> pointsAvailableDTOS = customAvailablePointsMap.get(DELETE_AVAILABLE_POINTS);
if (!CollectionUtils.isEmpty(pointsAvailableDTOS)) {
PointsAvailableDTO pointsAvailableDTO = pointsAvailableDTOS.get(0);
Long memberId = pointsAvailableDTO.getMemberId();
TempPoints tempPoints1 = new TempPoints();
BeanUtils.copyProperties(pointsAvailableDTO,tempPoints1);
BeanUtils.copyProperties(tempPoints,tempPoints1);
tempPoints1.setPoints(-(Math.abs(points)));
Long totalPoints = this.calculateTotalPoints(tempPoints1, currentPoints);
this.doInsertTrPointsDetail(memberId,tempPoints1,currentPoints,totalPoints);
}
}
/**
* 消耗过期的积分
* @param tempPoints 需要消耗的积分
* @param pointsAvailableDTOS 可用积分列表
* @return List<PointsAvailableDTO> 已消耗的可用积分列表
*/
private Map<String,List<PointsAvailableDTO>> customAvailablePoints(TempPoints tempPoints, List<PointsAvailableDTO> pointsAvailableDTOS) {
// 兑换的积分
Long points = tempPoints.getPoints();
Long points1_ = 0L;
List<PointsAvailableDTO> pointsAvailableDTOS1 = new ArrayList<>();
List<PointsAvailableDTO> pointsAvailableDTOS2 = new ArrayList<>();
Map<String,List<PointsAvailableDTO>> map = new HashMap<>();
for (PointsAvailableDTO pointsAvailableDTO : pointsAvailableDTOS) {
Long points1 = pointsAvailableDTO.getPoints();
points1_ = (points1_ + points1);
// 不够
if (points1_ < points) {
pointsAvailableDTOS1.add(pointsAvailableDTO);
continue;
}
// 刚好
if (points1_ == points) {
pointsAvailableDTOS1.add(pointsAvailableDTO);
break;
}
// 超了,拆分
if (points1_ > points) {
// 超过的
long beyond = points1_ - points;
// 新增
PointsAvailableDTO pointsAvailableDTO2 = new PointsAvailableDTO();
BeanUtils.copyProperties(pointsAvailableDTO,pointsAvailableDTO2);
pointsAvailableDTO2.setPoints(beyond);
pointsAvailableDTOS2.add(pointsAvailableDTO2);
// 剩余的
long suit = points1 - beyond;
// 扣除
PointsAvailableDTO pointsAvailableDTO1 = new PointsAvailableDTO();
BeanUtils.copyProperties(pointsAvailableDTO,pointsAvailableDTO1);
pointsAvailableDTO1.setPoints(suit);
pointsAvailableDTOS1.add(pointsAvailableDTO1);
break;
}
}
map.put(DELETE_AVAILABLE_POINTS,pointsAvailableDTOS1);
map.put(INSERT_AVAILABLE_POINTS,pointsAvailableDTOS2);
return map;
}
/**
* 可用积分表,按照过期时间进行升序排列
* @param tempPoints
* @return
*/
private List<PointsAvailableDTO> findByMemberIdOrderByExpireTime(TempPoints tempPoints) {
return this.pointsAvailableService.findByMemberIdOrderByExpireTime(tempPoints.getMemberId());
}
/**
* 检查当前用户可用积分是否足够
* @param tempPoints
* @return true : 满足 false: 不满足
*/
private boolean checkAvailablePoints(TempPoints tempPoints) {
Long memberId = tempPoints.getMemberId();
// 可用积分
long currentPoints = this.findAvailablePointsByMemberId(memberId);
long points1 = tempPoints.getPoints();
if (currentPoints > 0 && points1 > 0 && (currentPoints - Math.abs(points1) >= 0)) {
return true;
}
return false;
}
/**
* 积分发放,基于已获得的权益
*
* @param tempPointsList 已获得的权益
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void grantPointsThroughTempRightsList(List<TempPoints> tempPointsList){
log.info("------->>grantPointsThroughTempRightsList start1");
for (TempPoints tempPoints : tempPointsList){
log.info("------->>grantPointsThroughTempRightsList start");
this.refresh(tempPoints);
}
}
/**
* 清理过期积分
* @param memberId
*/
private void cleanInvalidAvailablePointsByMemberId(Long memberId) {
List<PointsAvailableDTO> pointsAvailableDTOS =
pointsAvailableService.findByMemberIdAndExpireTimeBefore(memberId,LocalDateTime.now());
if (!CollectionUtils.isEmpty(pointsAvailableDTOS)) {
//1.获取原始积分
for (PointsAvailableDTO pointsAvailableDTO : pointsAvailableDTOS) {
// 添加积分明细 uc_points_detail
this.doCreatePointsDetail(pointsAvailableDTO);
// 删除已过期的积分
this.doDeleteInvalidAvailablePoints(pointsAvailableDTO);
}
}
}
@Override
public Long cleanInvalidPointsAndCalculateCurrentPoints(Long memberId) {
// 清理当前用户的过期积分
this.cleanInvalidAvailablePointsByMemberId(memberId);
// 获取当前用户的可用总积分
long currentPoints = this.findAvailablePointsByMemberId(memberId);
// 即将过期的积分
long soonExpirePoints = this.getSoonExpirePoints(memberId, null);
// 更新会员信息
this.doUpdateMemberPoints(memberId,currentPoints,soonExpirePoints);
return currentPoints;
public void asyncMemberPoint(Member member) {
String code = member.getCode();
MemberDTO memberDTO = this.memberService.findByCode(code);
member.setId(memberDTO.getId());
this.memberService.doUpdateMemberPoints(member);
}
/**
* 获取可用总积分
* @param memberId
* @return
*/
private long findAvailablePointsByMemberId(Long memberId){
return this.pointsAvailableService.findAvailablePointsByMemberId(memberId);
public void asyncPointsAvailable(PointsAvailable pointsAvailable) {
String memberCode = pointsAvailable.getMemberCode();
MemberDTO memberDTO = this.memberService.findByCode(memberCode);
pointsAvailable.setMemberId(memberDTO.getId());
this.pointsAvailableService.create4Custom(pointsAvailable);
}
/**
* 修改会员信息
* @param memberId
* @param currentPoints
*/
private void doUpdateMemberPoints(Long memberId, long currentPoints,long soonExpirePoints) {
Member member = new Member();
member.setId(memberId);
member.setPoints(currentPoints);
member.setDuePoints(soonExpirePoints);
this.memberOperationService.doUpdateMemberPoints(member);
}
/**
*
* @param pointsAvailableDTOS
*/
private void doDeleteBatchInvalidAvailablePoints(List<PointsAvailableDTO> pointsAvailableDTOS) {
List<Long> collect = pointsAvailableDTOS.stream().map(pointsAvailableDTO -> pointsAvailableDTO.getId()).collect(Collectors.toList());
this.pointsAvailableService.deleteBatchByIds(collect);
public void asyncPointsDetail(PointsDetail pointsDetail) {
String memberCode = pointsDetail.getMemberCode();
MemberDTO memberDTO = this.memberService.findByCode(memberCode);
pointsDetail.setMemberId(memberDTO.getId());
this.pointsDetailService.create4Custom(pointsDetail);
}
/**
*
* @param pointsAvailableDTO
*/
private void doDeleteInvalidAvailablePoints(PointsAvailableDTO pointsAvailableDTO) {
public void asyncDeletePointsAvailable(PointsAvailable pointsAvailable) {
String code = pointsAvailable.getCode();
PointsAvailableDTO pointsAvailableDTO = this.pointsAvailableService.getByCode(code);
this.pointsAvailableService.delete(pointsAvailableDTO.getId());
}
/**
* 可用积分
* @param pointsAvailableDTO
*/
private void doCreatePointsDetail(PointsAvailableDTO pointsAvailableDTO) {
Long memberId = pointsAvailableDTO.getMemberId();
// 原始积分
long availablePoints = this.pointsAvailableService.findTotalPointsByMemberId(memberId);//this.findAvailablePointsByMemberId(memberId);
// 过期积分
long l = pointsAvailableDTO.getPoints();
// 结果积分
long resultPoints = availablePoints - l;
PointsDetail pointsDetail = new PointsDetail();
BeanUtils.copyProperties(pointsAvailableDTO,pointsDetail);
pointsDetail.setId(null);
pointsDetail.setPoints(-Math.abs(l));
pointsDetail.setCode(String.valueOf(IdWorker.generator()));
pointsDetail.setOriginalPoints(availablePoints);
pointsDetail.setResultPoints(resultPoints);
pointsDetail.setDescription("过期积分");
pointsDetail.setEvtType(99);
pointsDetail.setCreateTime(TimestampUtil.now());
pointsDetail.setUpdateTime(TimestampUtil.now());
this.doInsertPointsDetail(pointsDetail);
}
/**
* 模板方法,提供更新积分的总体流程
*
* @param tempPoints 积分
*/
private void refresh(TempPoints tempPoints) {
Long memberId = tempPoints.getMemberId();
log.info("----------->> points refresh start");
log.info("----------->> rLock --->> start" );
try {
log.info("----------->> refresh findAvailablePointsByMemberId start");
// 1.可用总积分
Long currentPoints = this.findAvailablePointsByMemberId(memberId);
log.info("----------->> refresh findAvailablePointsByMemberId currentPoints " + currentPoints);
// 2.计算总积分
Long totalPoints = this.calculateTotalPoints(tempPoints, currentPoints);
log.info("----------->> refresh findAvailablePointsByMemberId totalPoints " + totalPoints);
// 3.添加积分明细,并计算总积分
this.doInsertTrPointsDetail(memberId, tempPoints, currentPoints, totalPoints);
log.info(Thread.currentThread().getName() + "----------->> refresh doInsertTrPointsDetail end ");
// 4.添加可用积分
log.info("----------->> refresh doInsertTrPointsAvailable start ");
this.doInsertTrPointsAvailable(tempPoints);
log.info("----------->> refresh doInsertTrPointsAvailable end ");
// 即将过期的积分
long soonExpirePoints = this.getSoonExpirePoints(memberId, tempPoints);
// 6.更新会员的总积分
log.info("----------->> refresh freshMemberCurrentPoints start ");
this.freshMemberCurrentPoints(memberId, totalPoints,soonExpirePoints,tempPoints);
log.info("----------->> refresh freshMemberCurrentPoints end ");
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
/**
* 获取总积分
* @param tempPoints
* @param currentPoints
* @return
*/
private Long calculateTotalPoints(TempPoints tempPoints, Long currentPoints) {
// 获取的积分
Long rewardPoints = tempPoints.getPoints();
// 总积分
Long totalPoints = currentPoints + rewardPoints;
return totalPoints;
}
/**
* 获取即将过期的积分
* @param memberId
* @return
*/
private long getSoonExpirePoints(Long memberId,TempPoints tempPoints) {
// 计算即将过期的天数
Integer factor = this.calculateExpireFactor(tempPoints);
if (Objects.isNull(factor)) {
factor = EXPIRE_FACTOR;
}
Long soonExpireTime = this.pointsAvailableService.findSoonExpireTime(memberId, factor);
return Objects.nonNull(soonExpireTime) ? soonExpireTime : 0L;
}
/**
* 如果过期时间和过期天数同时存在,则以过期时间为准
* @param tempPoints
* @return
*/
private Integer calculateExpireFactor(TempPoints tempPoints) {
// TODO 计算过期的相对时间
return null;
}
/**
* 更新会员总积分
* @param memberId 会员Id
* @param currentPoints 当前总积分
*/
private void freshMemberCurrentPoints(Long memberId, Long currentPoints,long duePoints,TempPoints tempPoints) {
Member member = new Member();
member.setId(memberId);
member.setPoints(Objects.nonNull(currentPoints)?currentPoints:0);
member.setDuePoints(duePoints);
member.setUpdateTime(LocalDateTime.now());
member.setCode(tempPoints.getMemberCode());
try {
this.memberOperationService.doUpdateMemberPoints(member);
} catch (Exception e){
throw e;
}
}
/**
* 计算当前总积分
* @param memberId 会员id
* @return
*/
private Long findAvailablePointsByMemberId(long memberId){
Long availablePoints = this.pointsAvailableService.findAvailablePointsByMemberId(memberId);
return Objects.nonNull(availablePoints) ? availablePoints : 0L;
}
/**
* 更新可用积分表
* @param tempPoints
*/
private void doInsertTrPointsAvailable(TempPoints tempPoints){
PointsAvailable pointsAvailable = new PointsAvailable();
BeanUtils.copyProperties(tempPoints,pointsAvailable);
String description = pointsAvailable.getDescription();
pointsAvailable.setCode(String.valueOf(IdWorker.generator()));
pointsAvailable.setDescription(StringUtils.isEmpty(description)?"#":description);
LocalDateTime timestamp = tempPoints.getExpireTime();
if (Objects.nonNull(timestamp)) {
pointsAvailable.setExpireTime(timestamp);
}
// 添加可用积分记录
this.doInsertTrPointsAvailable(pointsAvailable);
}
/**
* 添加可用积分记录
* @param pointsAvailable 可用积分
*/
private void doInsertTrPointsAvailable(PointsAvailable pointsAvailable) {
this.pointsAvailableService.create(pointsAvailable);
}
/**
* 添加积分明细
* @param memberId 会员Id
* @param tempPoints 积分
* @return Integer 总积分
*/
private void doInsertTrPointsDetail(Long memberId, TempPoints tempPoints,Long currentPoints,Long totalPoints){
PointsDetail pointsDetail = new PointsDetail();
BeanUtils.copyProperties(tempPoints,pointsDetail);
pointsDetail.setId(null);
pointsDetail.setMemberId(memberId);
pointsDetail.setCode(String.valueOf(IdWorker.generator()));
pointsDetail.setPoints(tempPoints.getPoints());
pointsDetail.setOriginalPoints(currentPoints);
pointsDetail.setResultPoints(totalPoints);
pointsDetail.setCreateTime(null);
pointsDetail.setUpdateTime(null);
String description = pointsDetail.getDescription();
if (StringUtils.isEmpty(description)) {
pointsDetail.setDescription("#");
}
// 保存积分流水
this.doInsertPointsDetail(pointsDetail);
}
/**
*
* @param pointsDetail
*/
private void doInsertPointsDetail(PointsDetail pointsDetail){
this.pointsDetailService.create4Custom(pointsDetail);
}
}
......
package com.topdraw.business.process.service.impl;
import cn.hutool.core.date.LocalDateTimeUtil;
import com.topdraw.business.module.coupon.service.CouponService;
import com.topdraw.business.module.coupon.service.dto.CouponDTO;
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.*;
import com.topdraw.business.process.service.CouponOperationService;
import com.topdraw.business.process.service.ExpOperationService;
import com.topdraw.business.process.service.PointsOperationService;
import com.topdraw.business.process.service.RightsOperationService;
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.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 权益处理
*
* @author XiangHan
* @date 2021.10.23
*/
@Service
@Slf4j
public class RightsOperationServiceImpl implements RightsOperationService {
private static final Logger LOG = LoggerFactory.getLogger(RightsOperationServiceImpl.class);
@Autowired
RightsHistoryService rightsHistoryService;
@Autowired
CouponOperationService couponOperationService;
@Autowired
RightsService rightsService;
@Autowired
ExpOperationService expOperationService;
@Autowired
PointsOperationService pointsOperationService;
@Autowired
CouponService couponService;
// @Autowired
// ThreadPoolTaskExecutor threadPoolTaskExecutor;
private ExecutorService threadPoolTaskExecutor = Executors.newFixedThreadPool(10);
/**
* 系统手动发放
* 实现步骤:
* 1.当前权益只有实体券
* @param rightsList
*/
@Override
public void grantRightsByManual(List<RightsHistory> rightsList) {
// 1.权益区分
Map<RightType,Object> tempRightsMap = this.distinguishRight(rightsList);
// 2.权益下发
this.refresh(tempRightsMap);
// 3.保存权益历史
this.doInsertTrRightHistory(rightsList);
}
/**
* 权益发放
* @param tempRightsMap 权益类型
*/
@Override
public void grantRights(Map<RightType, Object> tempRightsMap) {
// this.threadPoolTaskExecutor.execute(()-> {
// 2.创建权益历史对象
List<RightsHistory> rightsList = this.getRightHistory(tempRightsMap);
// 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<>();
values.forEach(value -> {
RightsHistory rightsHistory = new RightsHistory();
rightsHistory.setSendTime(LocalDateTime.now());
rightsHistory.setRightsId(value.getId());
rightsHistory.setMemberId(value.getMemberId());
rightsHistory.setExpireTime(value.getExpireTime());
String memberCode = value.getMemberCode();
rightsHistory.setMemberCode(memberCode);
rightsHistoryList.add(rightsHistory);
});
return rightsHistoryList;
}
/**
* 成长值发放,基于已获得的权益
* @param tempExpList 权益列表
*/
private void grantExp(List<TempExp> tempExpList) {
if (!CollectionUtils.isEmpty(tempExpList))
this.expOperationService.grantPointsThroughTempExp(tempExpList);
}
/**
* 发放积分,基于已获得的权益
*
* @param tempPointsList 权益列表
*/
private void grantPoint(List<TempPoints> tempPointsList) {
if (!CollectionUtils.isEmpty(tempPointsList))
this.pointsOperationService.grantPointsThroughTempRightsList(tempPointsList);
}
/**
* 发放优惠券,基于已获得的权益
*
* @param tempCouponList 优惠券
*/
private void grantCoupon(List<TempCoupon> tempCouponList) {
// 发放优惠券
if (!CollectionUtils.isEmpty(tempCouponList))
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));
});*/
/*this.threadPoolTaskExecutor.execute(() -> {
log.info(Thread.currentThread().getName() + "=========>> start");
// 积分
this.grantPoint((List<TempPoints>) tempRightsMap.get(RightType.POINTS));
log.info(Thread.currentThread().getName() + "=========>> end");
});*/
List<TempPoints> tempPointsList = (List<TempPoints>) tempRightsMap.get(RightType.POINTS);
if (!CollectionUtils.isEmpty(tempPointsList)) {
// 积分
this.grantPoint(tempPointsList);
}
List<TempExp> tempExpList = (List<TempExp>) tempRightsMap.get(RightType.EXP);
if (!CollectionUtils.isEmpty(tempExpList)) {
// 成长值
this.grantExp(tempExpList);
}
List<TempCoupon> tempCouponList = (List<TempCoupon>) tempRightsMap.get(RightType.COUPON);
if (!CollectionUtils.isEmpty(tempCouponList)) {
// 优惠券
this.grantCoupon(tempCouponList);
}
}
/**
* 区分权益
* @param rightsList
* @return
*/
private Map<RightType, Object> distinguishRight(List<RightsHistory> rightsList) {
Map<RightType,Object> map = new HashMap<>();
// 优惠券
List<TempCoupon> tempCouponList = new ArrayList<>();
for (RightsHistory right : rightsList) {
Long rightId = right.getRightsId();
Long memberId = right.getMemberId();
Long userId = right.getUserId();
// 权益类型
RightsDTO rightsDTO = this.getRights(rightId);
// 权益的实体类型 1:积分;2成长值;3优惠券
String type = rightsDTO.getEntityType();
Long expireTime = rightsDTO.getExpireTime();
switch (type) {
// 优惠券
case "1":
Long entityId = rightsDTO.getEntityId();
CouponDTO couponDTO = this.findCouponById(entityId);
if (Objects.nonNull(couponDTO)) {
TempCoupon tempCoupon = new TempCoupon();
tempCoupon.setId(couponDTO.getId());
tempCoupon.setMemberId(memberId);
tempCoupon.setUserId(userId);
tempCoupon.setRightsAmount(1);
tempCoupon.setRightsSendStrategy(0);
tempCoupon.setCode(couponDTO.getCode());
if (Objects.nonNull(expireTime))
tempCoupon.setExpireTime(LocalDateTimeUtil.of(expireTime));
tempCouponList.add(tempCoupon);
}
break;
// 观影券
case "2":
break;
// 活动参与机会
case "3":
break;
default:
break;
}
}
// 优惠券
if (!CollectionUtils.isEmpty(tempCouponList))
map.put(RightType.COUPON,tempCouponList);
return map;
}
/**
* 获取优惠券信息
* @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
*/
private void doInsertTrRightHistory(List<RightsHistory> rightsHistories) {
if (!CollectionUtils.isEmpty(rightsHistories)) {
for (RightsHistory rightsHistory : rightsHistories) {
Long operatorId = rightsHistory.getOperatorId();
String operatorName = rightsHistory.getOperatorName();
rightsHistory.setSendTime(LocalDateTime.now());
rightsHistory.setOperatorId(Objects.nonNull(operatorId)?operatorId:0);
rightsHistory.setOperatorName(!StringUtils.isEmpty(operatorName)?operatorName:"系统发放");
this.rightsHistoryService.create(rightsHistory);
}
}
}
}
package com.topdraw.business.process.service.impl;
import com.topdraw.business.module.task.attribute.domain.TaskAttr;
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.service.TaskService;
import com.topdraw.business.module.task.service.dto.TaskDTO;
import com.topdraw.business.module.task.template.service.dto.TaskTemplateDTO;
import com.topdraw.business.process.service.TaskOperationService;
import com.topdraw.business.process.service.TaskTemplateOperationService;
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.stereotype.Service;
import java.util.Objects;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/4/25 15:48
* @version: :
* @modified By:
* @since : modified in 2022/4/25 15:48
*/
@Service
@Slf4j
public class TaskOperationServiceImpl implements TaskOperationService {
@Autowired
private TaskService taskService;
@Autowired
private TaskAttrService taskAttrService;
@Autowired
private TaskTemplateOperationService taskTemplateOperationService;
public void asyncCreateTask(Task task) {
String taskTemplateCode = task.getTaskTemplateCode();
TaskTemplateDTO taskTemplateDTO = this.taskTemplateOperationService.findByCode(taskTemplateCode);
Long id = taskTemplateDTO.getId();
task.setTaskTemplateId(id);
this.create(task);
}
private void create(Task task) {
String code = task.getCode();
TaskDTO taskDTO = this.findByCode(code);
if (Objects.isNull(taskDTO.getId())) {
TaskDTO taskDTO_ = this.taskService.create(task);
if (Objects.nonNull(taskDTO_.getId())) {
task.setId(taskDTO_.getId());
this.createTaskAttr(task);
}
}
}
/**
*
* @param task_
*/
private void createTaskAttr(Task task_) {
TaskAttr taskAttr = new TaskAttr();
taskAttr.setAttrStr(task_.getAttr());
taskAttr.setTaskId(task_.getId());
this.taskAttrService.create(taskAttr);
}
public void asyncUpdateTask(Task task) {
String code = task.getCode();
TaskDTO taskDTO = this.findByCode(code);
if (Objects.nonNull(taskDTO.getId())) {
Long id = taskDTO.getId();
task.setId(id);
String taskTemplateCode = task.getTaskTemplateCode();
TaskTemplateDTO taskTemplateDTO = this.taskTemplateOperationService.findByCode(taskTemplateCode);
Long templateId = taskTemplateDTO.getId();
task.setTaskTemplateId(templateId);
TaskDTO update = this.update(task);
if (Objects.nonNull(update)) {
this.updateTaskAttr(task);
}
}
}
/**
*
* @param task_
*/
private void updateTaskAttr(Task task_) {
TaskAttrDTO taskAttrDTO = this.findTaskAttrByTaskId(task_.getId());
if (Objects.nonNull(taskAttrDTO.getId())) {
TaskAttr taskAttr = new TaskAttr();
BeanUtils.copyProperties(taskAttrDTO, taskAttr);
taskAttr.setAttrStr(task_.getAttr());
this.taskAttrService.update(taskAttr);
}
}
private TaskAttrDTO findTaskAttrByTaskId(Long taskId) {
return this.taskAttrService.findByTaskId(taskId);
}
private TaskDTO update(Task task) {
return this.taskService.update(task);
}
public void asyncDeleteTask(Task task) {
String code = task.getCode();
TaskDTO taskDTO = this.findByCode(code);
if (Objects.nonNull(taskDTO.getId())) {
Long id = taskDTO.getId();
task.setId(id);
this.delete(task);
}
}
private void delete(Task task) {
this.taskService.delete(task);
}
private TaskDTO findByCode(String code){
TaskDTO taskDTO = this.taskService.findByCode(code);
return taskDTO;
}
}
package com.topdraw.business.process.service.impl;
import com.topdraw.business.module.task.template.domain.TaskTemplate;
import com.topdraw.business.module.task.template.service.TaskTemplateService;
import com.topdraw.business.module.task.template.service.dto.TaskTemplateDTO;
import com.topdraw.business.process.service.TaskTemplateOperationService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Objects;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/4/25 22:27
* @version: :
* @modified By:
* @since : modified in 2022/4/25 22:27
*/
@Service
@Slf4j
public class TaskTemplateOperationServiceImpl implements TaskTemplateOperationService {
@Autowired
private TaskTemplateService taskTemplateService;
public void asyncCreate(TaskTemplate resources) {
this.create(resources);
}
public void asyncUpdate(TaskTemplate resources) {
this.update(resources);
}
public void asyncDelete(TaskTemplate resources) {
this.delete(resources);
}
private void create(TaskTemplate resources) {
String code = resources.getCode();
TaskTemplateDTO taskTemplateDTO = this.findByCode(code);
if (Objects.isNull(taskTemplateDTO.getId())) {
this.taskTemplateService.create(resources);
}
}
private void update(TaskTemplate resources) {
String code = resources.getCode();
TaskTemplateDTO taskTemplateDTO = this.findByCode(code);
if (Objects.nonNull(taskTemplateDTO.getId())) {
Long id = taskTemplateDTO.getId();
resources.setId(id);
this.taskTemplateService.update(resources);
}
}
private void delete(TaskTemplate resources) {
String code = resources.getCode();
TaskTemplateDTO taskTemplateDTO = this.findByCode(code);
if (Objects.nonNull(taskTemplateDTO.getId())) {
Long id = taskTemplateDTO.getId();
this.taskTemplateService.delete(id);
}
}
private void delete(Long id) {
TaskTemplateDTO taskTemplateDTO = this.findById(id);
this.taskTemplateService.delete(id);
TaskTemplate taskTemplate = new TaskTemplate();
BeanUtils.copyProperties(taskTemplateDTO, taskTemplate);
taskTemplate.setDeleteMark(1);
}
@Override
public TaskTemplateDTO findByCode(String code) {
return this.taskTemplateService.findByCode(code);
}
private TaskTemplateDTO findById(Long id) {
return this.taskTemplateService.findById(id);
}
}
package com.topdraw.business.process.service.impl;
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.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.module.user.weixin.domain.UserWeixin;
import com.topdraw.business.module.user.weixin.service.UserWeixinService;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinDTO;
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.exception.EntityNotFoundException;
import com.topdraw.exception.GlobeExceptionMsg;
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.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.Objects;
@Service
@Slf4j
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class UserOperationServiceImpl implements UserOperationService {
@Autowired
private MemberService memberService;
@Autowired
private UserTvService userTvService;
@Autowired
private UserWeixinService userWeixinService;
@Transactional(propagation = Propagation.SUPPORTS, rollbackFor = Exception.class)
public void asyncMemberAndUserWeixin4Iptv(MemberAndWeixinUserDTO memberAndWeixinUserDTO) {
UserWeixinDTO userWeixinDTO = memberAndWeixinUserDTO.getUserWeixinDTO();
String openid = userWeixinDTO.getOpenid();
String unionid = userWeixinDTO.getUnionid();
String appid = userWeixinDTO.getAppid();
UserWeixinDTO _userWeixinDTO = this.userWeixinService.findFirstByAppIdAndOpenId(appid, openid);
// 无账号
if (Objects.isNull(_userWeixinDTO.getId())) {
// 是否存在会员
UserWeixinDTO userWeixinDTO1 = this.userWeixinService.findFirstByUnionId(unionid);
if (Objects.nonNull(userWeixinDTO1.getId())) {
Long memberId = userWeixinDTO1.getMemberId();
if (Objects.nonNull(memberId)) {
userWeixinDTO.setMemberId(memberId);
MemberDTO memberDTO = this.memberService.findById(memberId);
MemberDTO memberDTO1 = memberAndWeixinUserDTO.getMemberDTO();
this.updateMember(memberDTO, memberDTO1);
} else {
MemberDTO memberDTO1 = memberAndWeixinUserDTO.getMemberDTO();
String memberCode = memberDTO1.getCode();
if (StringUtils.isNotBlank(memberCode)) {
Member member = new Member();
member.setCode(memberCode);
MemberDTO _memberDTO1 = this.memberService.create(member);
userWeixinDTO.setMemberId(_memberDTO1.getId());
}
}
// 无会员
} else {
MemberDTO memberDTO = memberAndWeixinUserDTO.getMemberDTO();
Member member = new Member();
BeanUtils.copyProperties(memberDTO, member);
member.setId(null);
MemberDTO memberDTO1 = this.memberService.create(member);
userWeixinDTO.setMemberId(memberDTO1.getId());
}
userWeixinDTO.setId(null);
this.createWeixin(userWeixinDTO);
} else {
// 会员存在
if(Objects.nonNull(_userWeixinDTO.getMemberId())) {
// 账号存在,修改账号和会员
this.updateWeixin(_userWeixinDTO, userWeixinDTO);
MemberDTO _memberDTO = this.memberService.findById(_userWeixinDTO.getMemberId());
MemberDTO memberDTO = memberAndWeixinUserDTO.getMemberDTO();
this.updateMember(_memberDTO, memberDTO);
// 有账号无会员
} else {
// 是否存在会员
UserWeixinDTO userWeixinDTO1 = this.userWeixinService.findFirstByUnionId(unionid);
// 有其他账号
if (Objects.nonNull(userWeixinDTO1.getId())) {
Long memberId = userWeixinDTO1.getMemberId();
if (Objects.nonNull(memberId)) {
userWeixinDTO.setMemberId(memberId);
MemberDTO memberDTO = this.memberService.findById(memberId);
MemberDTO memberDTO1 = memberAndWeixinUserDTO.getMemberDTO();
this.updateMember(memberDTO, memberDTO1);
} else {
MemberDTO memberDTO1 = memberAndWeixinUserDTO.getMemberDTO();
Member member = new Member();
BeanUtils.copyProperties(memberDTO1, member);
member.setId(null);
MemberDTO _memberDTO1 = this.memberService.create(member);
userWeixinDTO.setMemberId(_memberDTO1.getId());
}
}
this.updateWeixin(_userWeixinDTO, userWeixinDTO);
}
}
}
@Transactional(propagation = Propagation.SUPPORTS, rollbackFor = Exception.class)
public void asyncMemberAndUserTv4Iptv(MemberAndUserTvDTO memberAndUserTvDTO) {
UserTvDTO userTvDTO = memberAndUserTvDTO.getUserTvDTO();
MemberDTO memberDTO = memberAndUserTvDTO.getMemberDTO();
String platformAccount = userTvDTO.getPlatformAccount();
UserTvDTO _userTvDTO = this.userTvService.findByPlatformAccount(platformAccount);
if (Objects.isNull(_userTvDTO)) {
memberDTO.setId(null);
// 创建大屏会员
MemberDTO _memberDTO = this.createMember(memberDTO);
userTvDTO.setMemberId(_memberDTO.getId());
// 创建大屏账号
this.createUserTv(userTvDTO);
} else {
String code = memberDTO.getCode();
MemberDTO _memberDTO = this.memberService.findByCode(code);
if (Objects.nonNull(_memberDTO.getId())) {
this.updateMember(_memberDTO, memberDTO);
} else {
memberDTO.setId(null);
MemberDTO _memberDTO0 = this.createMember(memberDTO);
userTvDTO.setMemberId(_memberDTO0.getId());
}
this.updateUserTv(_userTvDTO, userTvDTO);
}
}
@Transactional(propagation = Propagation.SUPPORTS, rollbackFor = Exception.class)
public void asyncAppletBind(MemberAndUserTvDTO memberAndUserTvDTO) {
UserTvDTO userTvDTO = memberAndUserTvDTO.getUserTvDTO();
MemberDTO memberDTO = memberAndUserTvDTO.getMemberDTO();
String platformAccount = userTvDTO.getPlatformAccount();
UserTvDTO _userTvDTO = this.userTvService.findByPlatformAccount(platformAccount);
if (Objects.nonNull(_userTvDTO)) {
//
this.updateUserTv(_userTvDTO, userTvDTO);
String code = memberDTO.getCode();
MemberDTO _memberDTO = this.memberService.findByCode(code);
memberDTO.setUserIptvId(_userTvDTO.getId());
this.updateMember(_memberDTO, memberDTO);
} else {
throw new EntityNotFoundException(UserTvDTO.class, "id", GlobeExceptionMsg.IPTV_IS_NULL);
}
}
@Transactional(propagation = Propagation.SUPPORTS, rollbackFor = Exception.class)
public void asyncUnbind(MemberAndUserTvDTO memberAndUserTvDTO) {
UserTvDTO userTvDTO = memberAndUserTvDTO.getUserTvDTO();
MemberDTO memberDTO = memberAndUserTvDTO.getMemberDTO();
String platformAccount = userTvDTO.getPlatformAccount();
UserTvDTO _userTvDTO = this.userTvService.findByPlatformAccount(platformAccount);
_userTvDTO.setPriorityMemberCode(null);
//
this.unbindPriorityMemberCode(_userTvDTO);
String code = memberDTO.getCode();
MemberDTO _memberDTO = this.memberService.findByCode(code);
this.unbindUserIpTv(_memberDTO);
}
private void unbindUserIpTv(MemberDTO memberDTO) {
memberDTO.setUserIptvId(null);
memberDTO.setBindIptvPlatformType(null);
memberDTO.setBindIptvTime(null);
Member member = new Member();
BeanUtils.copyProperties(memberDTO, member);
this.memberService.unbindUserIpTv(member);
}
private void unbindPriorityMemberCode(UserTvDTO userTvDTO) {
UserTv userTv = new UserTv();
BeanUtils.copyProperties(userTvDTO, userTv);
this.userTvService.unbindPriorityMemberCode(userTv);
}
@Transactional(propagation = Propagation.SUPPORTS, rollbackFor = Exception.class)
public void asyncWeixin(UserWeixinDTO userWeixinDTO) {
String openid = userWeixinDTO.getOpenid();
String unionid = userWeixinDTO.getUnionid();
String appid = userWeixinDTO.getAppid();
UserWeixinDTO _userWeixinDTO = this.userWeixinService.findFirstByAppIdAndOpenId(appid, openid);
if (Objects.nonNull(_userWeixinDTO.getId())) {
if(Objects.nonNull(_userWeixinDTO.getMemberId())) {
if (StringUtils.isNotBlank(_userWeixinDTO.getUnionid())) {
UserWeixinDTO userWeixinDTO1 = this.userWeixinService.findFirstByUnionId(_userWeixinDTO.getUnionid());
if (Objects.nonNull(userWeixinDTO1)) {
Long memberId = userWeixinDTO1.getMemberId();
if (Objects.nonNull(memberId)) {
userWeixinDTO.setMemberId(memberId);
} else {
String memberCode = userWeixinDTO.getMemberCode();
if (StringUtils.isNotBlank(memberCode)) {
Member member = new Member();
member.setCode(memberCode);
MemberDTO memberDTO1 = this.memberService.create(member);
userWeixinDTO.setMemberId(memberDTO1.getId());
}
}
}
} else {
String memberCode = userWeixinDTO.getMemberCode();
if (StringUtils.isNotBlank(memberCode)) {
Member member = new Member();
member.setCode(memberCode);
MemberDTO memberDTO1 = this.memberService.create(member);
userWeixinDTO.setMemberId(memberDTO1.getId());
}
}
} else {
String memberCode = userWeixinDTO.getMemberCode();
if (StringUtils.isNotBlank(memberCode)) {
Member member = new Member();
member.setCode(memberCode);
MemberDTO memberDTO1 = this.memberService.create(member);
userWeixinDTO.setMemberId(memberDTO1.getId());
}
}
userWeixinDTO.setId(_userWeixinDTO.getId());
this.updateWeixin(_userWeixinDTO, userWeixinDTO);
} else {
userWeixinDTO.setId(null);
String memberCode = userWeixinDTO.getMemberCode();
Long memberId = null;
if (StringUtils.isNotBlank(memberCode)) {
MemberDTO memberDTO = this.memberService.findByCode(memberCode);
if (Objects.isNull(memberDTO.getId())) {
Member member = new Member();
member.setCode(memberCode);
MemberDTO memberDTO1 = this.memberService.create(member);
memberId = memberDTO1.getId();
} else {
memberId = memberDTO.getId();
}
userWeixinDTO.setMemberId(memberId);
this.createWeixin(userWeixinDTO);
}
}
}
@Transactional(propagation = Propagation.SUPPORTS, rollbackFor = Exception.class)
public void asyncUserTv(UserTvDTO userTvDTO) {
log.info("asyncUserTv ==>> userTvDTO ==>> {}", userTvDTO);
String platformAccount = userTvDTO.getPlatformAccount();
UserTvDTO _userTvDTO = this.userTvService.findByPlatformAccount(platformAccount);
log.info("db result ==>> _userTvDTO ==>> {}", _userTvDTO);
this.updateUserTv(_userTvDTO, userTvDTO);
}
@Transactional(propagation = Propagation.SUPPORTS, rollbackFor = Exception.class)
public void asyncMember(MemberDTO memberDTO) {
String code = memberDTO.getCode();
if (StringUtils.isNotBlank(code)) {
MemberDTO _memberDTO = this.memberService.findByCode(code);
if (Objects.nonNull(_memberDTO)) {
Long id = _memberDTO.getId();
memberDTO.setId(id);
this.updateMember(_memberDTO, memberDTO);
}
}
}
@Transactional(propagation = Propagation.SUPPORTS, rollbackFor = Exception.class)
public void asyncSubscribe(MemberAndWeixinUserDTO memberAndWeixinUserDTO) {
UserWeixinDTO userWeixinDTO = memberAndWeixinUserDTO.getUserWeixinDTO();
String openid = userWeixinDTO.getOpenid();
String unionid = userWeixinDTO.getUnionid();
String appid = userWeixinDTO.getAppid();
MemberDTO memberDTO = memberAndWeixinUserDTO.getMemberDTO();
UserWeixinDTO _userWeixinDTO = this.userWeixinService.findFirstByUnionIdAndAppIdAndOpenId(unionid, appid, openid);
// 有账号
if (Objects.nonNull(_userWeixinDTO.getId())) {
UserWeixinDTO _userWeixinDTO0 = this.userWeixinService.findFirstByAppIdAndOpenId(appid, openid);
// 会员存在
if(Objects.nonNull(_userWeixinDTO0.getMemberId())) {
// 账号存在,修改账号和会员
this.updateWeixin(_userWeixinDTO, userWeixinDTO);
MemberDTO _memberDTO = this.memberService.findById(_userWeixinDTO.getMemberId());
MemberDTO memberDTO0 = memberAndWeixinUserDTO.getMemberDTO();
memberDTO0.setUserIptvId(_memberDTO.getUserIptvId());
this.updateMember(_memberDTO, memberDTO0);
// 有账号无会员
} else {
// 是否存在会员
UserWeixinDTO userWeixinDTO1 = this.userWeixinService.findFirstByUnionId(unionid);
// 有其他账号
if (Objects.nonNull(userWeixinDTO1.getId())) {
Long memberId = userWeixinDTO1.getMemberId();
if (Objects.nonNull(memberId)) {
userWeixinDTO.setMemberId(memberId);
MemberDTO memberDTO0 = this.memberService.findById(memberId);
MemberDTO memberDTO1 = memberAndWeixinUserDTO.getMemberDTO();
this.updateMember(memberDTO0, memberDTO1);
} else {
MemberDTO memberDTO1 = memberAndWeixinUserDTO.getMemberDTO();
Member member = new Member();
BeanUtils.copyProperties(memberDTO1, member);
member.setId(null);
MemberDTO _memberDTO1 = this.memberService.create(member);
userWeixinDTO.setMemberId(_memberDTO1.getId());
}
}
this.updateWeixin(_userWeixinDTO, userWeixinDTO);
}
// 无账号
} else {
// 是否存在会员
UserWeixinDTO userWeixinDTO1 = this.userWeixinService.findFirstByUnionId(unionid);
// 有其他账号
if (Objects.nonNull(userWeixinDTO1.getId())) {
Long memberId = userWeixinDTO1.getMemberId();
if (Objects.nonNull(memberId)) {
userWeixinDTO.setMemberId(memberId);
MemberDTO memberDTO0 = this.memberService.findById(memberId);
MemberDTO memberDTO1 = memberAndWeixinUserDTO.getMemberDTO();
this.updateMember(memberDTO0, memberDTO1);
} else {
MemberDTO memberDTO1 = memberAndWeixinUserDTO.getMemberDTO();
Member member = new Member();
BeanUtils.copyProperties(memberDTO1, member);
member.setId(null);
MemberDTO _memberDTO1 = this.memberService.create(member);
userWeixinDTO.setMemberId(_memberDTO1.getId());
}
} else {
MemberDTO memberDTO1 = memberAndWeixinUserDTO.getMemberDTO();
Member member = new Member();
BeanUtils.copyProperties(memberDTO1, member);
member.setId(null);
MemberDTO _memberDTO1 = this.memberService.create(member);
userWeixinDTO.setMemberId(_memberDTO1.getId());
}
this.createWeixin(userWeixinDTO);
}
}
@Transactional(propagation = Propagation.SUPPORTS, rollbackFor = Exception.class)
public void asyncUnsubscribe(MemberAndWeixinUserDTO memberAndWeixinUserDTO) {
UserWeixinDTO userWeixinDTO = memberAndWeixinUserDTO.getUserWeixinDTO();
String openid = userWeixinDTO.getOpenid();
String unionid = userWeixinDTO.getUnionid();
String appid = userWeixinDTO.getAppid();
MemberDTO memberDTO = memberAndWeixinUserDTO.getMemberDTO();
UserWeixinDTO _userWeixinDTO = this.userWeixinService.findFirstByUnionIdAndAppIdAndOpenId(unionid, appid, openid);
if (Objects.nonNull(_userWeixinDTO)) {
// 账号存在,修改账号和会员
this.updateWeixin(_userWeixinDTO, userWeixinDTO);
MemberDTO _memberDTO = this.memberService.findById(_userWeixinDTO.getMemberId());
if (Objects.nonNull(_memberDTO)) {
memberDTO.setUserIptvId(_memberDTO.getUserIptvId());
this.updateMember(_memberDTO, memberDTO);
} else {
throw new EntityNotFoundException(MemberDTO.class, "id", GlobeExceptionMsg.MEMBER_ID_IS_NULL);
}
} else {
throw new EntityNotFoundException(UserWeixinDTO.class, "id", GlobeExceptionMsg.WEIXIN_IS_NULL);
}
}
private MemberDTO createMember(MemberDTO memberDTO){
Member member = new Member();
BeanUtils.copyProperties(memberDTO, member);
return this.memberService.create(member);
}
private MemberDTO updateMember(MemberDTO _memberDTO, MemberDTO memberDTO){
memberDTO.setId(_memberDTO.getId());
memberDTO.setCode(_memberDTO.getCode());
Member member = new Member();
BeanUtils.copyProperties(memberDTO, member);
return this.memberService.update(member);
}
private void createWeixin(UserWeixinDTO weixinDTO){
UserWeixin userWeixin = new UserWeixin();
BeanUtils.copyProperties(weixinDTO, userWeixin);
this.userWeixinService.create(userWeixin);
}
private void updateWeixin(UserWeixinDTO _userWeixinDTO, UserWeixinDTO weixinDTO){
weixinDTO.setId(_userWeixinDTO.getId());
if (Objects.nonNull(_userWeixinDTO.getMemberId())) {
weixinDTO.setMemberId(_userWeixinDTO.getMemberId());
}
if (StringUtils.isNotBlank(_userWeixinDTO.getUnionid())){
weixinDTO.setUnionid(_userWeixinDTO.getUnionid());
}
if (StringUtils.isNotBlank(_userWeixinDTO.getAppid())) {
weixinDTO.setAppid(_userWeixinDTO.getAppid());
}
if (StringUtils.isNotBlank(_userWeixinDTO.getOpenid())) {
weixinDTO.setOpenid(_userWeixinDTO.getOpenid());
}
UserWeixin userWeixin = new UserWeixin();
BeanUtils.copyProperties(weixinDTO, userWeixin);
this.userWeixinService.update(userWeixin);
}
private void createUserTv(UserTvDTO userTvDTO){
UserTv userTv = new UserTv();
BeanUtils.copyProperties(userTvDTO, userTv);
this.userTvService.create(userTv);
}
private void updateUserTv(UserTvDTO _userTvDTO, UserTvDTO userTvDTO){
userTvDTO.setId(_userTvDTO.getId());
Long memberId = _userTvDTO.getMemberId();
if (Objects.isNull(memberId)){
String memberCode = userTvDTO.getMemberCode();
if (StringUtils.isNotBlank(memberCode)) {
MemberDTO memberDTO = this.memberService.findByCode(memberCode);
userTvDTO.setMemberId(memberDTO.getId());
}
} else {
userTvDTO.setMemberId(memberId);
}
userTvDTO.setPlatformAccount(_userTvDTO.getPlatformAccount());
userTvDTO.setCreateTime(_userTvDTO.getCreateTime());
UserTv userTv = new UserTv();
BeanUtils.copyProperties(userTvDTO, userTv);
log.info("updateUserTv ==>> userTv ==>> {}" , userTv);
this.userTvService.update(userTv);
}
}
package com.topdraw.business.process.service.impl.member;
import com.topdraw.business.module.member.address.domain.MemberAddress;
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.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.process.service.member.MemberAddressOperationService;
import lombok.extern.slf4j.Slf4j;
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 java.util.Objects;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
@Slf4j
public class MemberAddressOperationServiceImpl implements MemberAddressOperationService {
@Autowired
private MemberAddressService memberAddressService;
@Autowired
private MemberService memberService;
public void asyncDeleteMemberAddress(MemberAddressDTO memberAddressDTO){
String memberCode = memberAddressDTO.getMemberCode();
MemberDTO memberDTO = this.memberService.findByCode(memberCode);
MemberAddressDTO _memberAddressDTO =
this.memberAddressService.findByMemberIdAndSequence(memberDTO.getId(), memberAddressDTO.getSequence());
if (Objects.nonNull(_memberAddressDTO)) {
this.memberAddressService.delete(_memberAddressDTO.getId());
}
}
public void asyncMemberAddress(MemberAddressDTO memberAddressDTO){
MemberDTO memberDTO = this.memberService.findByCode(memberAddressDTO.getMemberCode());
MemberAddressDTO _memberAddressDTO = this.memberAddressService.findByMemberIdAndSequence(memberDTO.getId(),
memberAddressDTO.getSequence());
if (Objects.nonNull(_memberAddressDTO)) {
memberAddressDTO.setId(_memberAddressDTO.getId());
memberAddressDTO.setMemberId(memberDTO.getId());
this.updateMemberAddress(memberAddressDTO);
} else {
memberAddressDTO.setId(null);
memberAddressDTO.setMemberId(memberDTO.getId());
this.createMemberAddress(memberAddressDTO);
}
}
public void createMemberAddress(MemberAddressDTO memberAddressDTO){
MemberAddress memberAddress = new MemberAddress();
BeanUtils.copyProperties(memberAddressDTO, memberAddress);
this.memberAddressService.create(memberAddress);
}
public void updateMemberAddress(MemberAddressDTO memberAddressDTO){
MemberAddress memberAddress = new MemberAddress();
BeanUtils.copyProperties(memberAddressDTO, memberAddress);
this.memberAddressService.update(memberAddress);
}
}
package com.topdraw.business.process.service.impl.member;
import cn.hutool.core.util.ObjectUtil;
import com.topdraw.business.module.member.domain.Member;
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.user.weixin.service.UserWeixinService;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinDTO;
import com.topdraw.business.process.service.member.MemberOperationService;
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.Assert;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Objects;
@Service
//@CacheConfig(cacheNames = "member")
public class MemberOperationServiceImpl implements MemberOperationService {
@Autowired
private MemberService memberService;
@Autowired
private MemberProfileService memberProfileService;
@Autowired
private MemberVipHistoryService memberVipHistoryService;
@Autowired
private UserWeixinService userWeixinService;
@Autowired
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
public void asyncUpdateMemberVip(MemberDTO memberDTO) {
String code = memberDTO.getCode();
MemberDTO memberDTO1 = this.findByCode(code);
memberDTO1.setVip(memberDTO.getVip());
memberDTO1.setVipExpireTime(memberDTO.getVipExpireTime());
Member member = new Member();
BeanUtils.copyProperties(memberDTO1, member);
this.update(member);
}
// @Cacheable(key = "#memberId")
@Override
public MemberDTO findById(Long memberId) {
MemberDTO memberDTO = this.memberService.findById(memberId);
return Objects.nonNull(memberId) ? memberDTO : null;
}
@Override
public MemberDTO findByCode(String code) {
return this.memberService.findByCode(code);
}
public void createVipHistory(MemberVipHistory memberVipHistory){
this.memberVipHistoryService.create(memberVipHistory);
}
// @CachePut(key = "#resources.id")
@Override
public MemberDTO update(Member resources) {
MemberDTO memberDTO = this.memberService.update(resources);
return memberDTO;
}
@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);
}
// @CachePut(key = "#resources.id")
@Override
public MemberDTO doInsertMember(Member resources) {
return this.memberService.create(resources);
}
@Override
public MemberDTO doUpdateMemberExp(Member member) {
return this.update(member);
}
// @CachePut(key = "#resources.id")
@Override
public MemberDTO doUpdateMemberPoints(Member resources) {
return this.memberService.doUpdateMemberPoints(resources);
}
@Override
public MemberDTO doUpdateMemberCoupon(Member member) {
return this.update(member);
}
@Override
public MemberProfileDTO getMemberProfileAndCheckVip(Long memberId, String appid) {
// 会员加密信息
MemberProfileDTO memberProfileDTO_0 = this.findMemberProfileByMemberId(memberId);
// 会员信息
MemberDTO memberDTO = this.findById(memberId);
// 初始化会员加密信息
MemberProfileDTO memberProfileDTO_1 = this.configMemberProfile(memberProfileDTO_0,memberDTO,appid);
return memberProfileDTO_1;
}
/**
* 配置会员信息
* @param memberProfileDTO_0
* @param memberDTO
* @return
*/
private MemberProfileDTO configMemberProfile(MemberProfileDTO memberProfileDTO_0, MemberDTO memberDTO, String appid) {
if (Objects.isNull(memberProfileDTO_0)) return memberProfileDTO_0;
MemberProfileDTO memberProfileDTO = new MemberProfileDTO();
BeanUtils.copyProperties(memberProfileDTO_0,memberProfileDTO);
// vip
Integer vip = memberDTO.getVip();
// 过期时间
LocalDateTime vipExpireTime = memberDTO.getVipExpireTime();
Long timeLong = 0L;
if (ObjectUtil.isNotNull(vipExpireTime)) {
// 检查vip
MemberDTO memberDTO1 = this.checkVipStatus(memberDTO,vipExpireTime,appid);
// 更新会员信息
this.threadPoolTaskExecutor.execute(()->{
Member member = new Member();
BeanUtils.copyProperties(memberDTO1,member);
this.memberService.update(member);
});
vip = memberDTO1.getVip();
LocalDateTime vipExpireTime1 = memberDTO1.getVipExpireTime();
if (Objects.nonNull(vipExpireTime1)) {
timeLong = vipExpireTime1.toInstant(ZoneOffset.of("+8")).toEpochMilli();
}
}
// 过期时间
memberProfileDTO.setVipExpireTime(timeLong);
// 头像
memberProfileDTO.setAvatarUrl(memberDTO.getAvatarUrl());
// 生日
memberProfileDTO.setBirthday(memberDTO.getBirthday());
// 性别
memberProfileDTO.setGender(memberDTO.getGender());
// 会员id
memberProfileDTO.setMemberId(memberDTO.getId());
// vip
memberProfileDTO.setVip(vip);
return memberProfileDTO;
}
/**
* 检查vip是否过期
* 1.当前vip如果过期则查看是否有vip历史变动
* 2.如果vip变动历史有记录则获取vip变动记录
* 3.如果vip没有记录则查看是否关注了公众号
* @param vipExpireTime
* @return
*/
private MemberDTO checkVipStatus(MemberDTO memberDTO, LocalDateTime vipExpireTime, String appid) {
Long memberId = memberDTO.getId();
LocalDateTime nowTime = LocalDateTime.now();
//vip过期,回退上个vip状态 同时修改member表vip
if (nowTime.compareTo(vipExpireTime) >= 0 ) {
Integer vip = 0;
LocalDateTime vipExpireTime1 = memberDTO.getVipExpireTime();
//查询小于失效时间的那条记录 查不到 取微信表里 关注状态
MemberVipHistory memberVipHistory = this.memberVipHistoryService.findByTime(memberId, nowTime);
if (ObjectUtil.isNull(memberVipHistory.getId())) {
UserWeixinDTO userWeixin = this.userWeixinService.findFirstByMemberIdAndAppid(memberId, appid);
// 微信公众号关注的状态 0:未关注 1:关注
Integer status = userWeixin.getStatus();
if (status != 1) vip = 0; else vip = 1;
vipExpireTime1 = null;
} else {
vip = memberVipHistory.getVip();
vipExpireTime1 = memberVipHistory.getVipExpireTime();
}
memberDTO.setVipExpireTime(vipExpireTime1);
memberDTO.setVip(vip);
}
return memberDTO;
}
/**
* 查询会员加密信息
* @param memberId
* @return
*/
private MemberProfileDTO findMemberProfileByMemberId(Long memberId) {
return this.memberProfileService.findByMemberId(memberId);
}
}
package com.topdraw.business.process.service.impl.member;
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.process.service.dto.MemberProfileAndMemberDTO;
import com.topdraw.business.process.service.member.MemberOperationService;
import com.topdraw.business.process.service.member.MemberProfileOperationService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.Objects;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/20 17:34
* @version: :
* @modified By:
* @since : modified in 2022/3/20 17:34
*/
@Service
public class MemberProfileOperationServiceImpl implements MemberProfileOperationService {
@Autowired
private MemberProfileService memberProfileService;
@Autowired
private MemberOperationService memberOperationService;
@Autowired
private MemberService memberService;
public void asyncCreateMemberProfile(MemberProfileDTO memberProfileDTO) {
String memberCode = memberProfileDTO.getMemberCode();
MemberDTO memberDTO = this.memberService.findByCode(memberCode);
Long memberId = memberDTO.getId();
MemberProfileDTO _memberProfileDTO = this.memberProfileService.findByMemberId(memberId);
if (Objects.isNull(_memberProfileDTO.getId())) {
memberProfileDTO.setMemberId(memberId);
this.createMemberProfileAndSyncMember(memberProfileDTO, memberDTO);
}
}
private void createMemberProfileAndSyncMember(MemberProfileDTO memberProfileDTO, MemberDTO memberDTO) {
this.createMemberProfile(memberProfileDTO);
this.syncMember(memberProfileDTO, memberDTO);
}
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);
}
private void createMemberProfile(MemberProfileDTO memberProfileDTO) {
MemberProfile memberProfile = new MemberProfile();
BeanUtils.copyProperties(memberProfileDTO, memberProfile);
this.memberProfileService.createDefault(memberProfile);
}
public MemberProfileDTO asyncMemberProfile(MemberProfileDTO memberProfileDTO){
String memberCode = memberProfileDTO.getMemberCode();
MemberDTO memberDTO = this.memberService.findByCode(memberCode);
Long memberId = memberDTO.getId();
MemberProfileDTO _memberProfileDTO = this.memberProfileService.findByMemberId(memberId);
memberProfileDTO.setId(_memberProfileDTO.getId());
memberProfileDTO.setMemberId(memberId);
return this.updateMemberProfile(memberProfileDTO);
}
private MemberProfileDTO updateMemberProfile(MemberProfileDTO memberProfileDTO) {
MemberProfile memberProfile = new MemberProfile();
BeanUtils.copyProperties(memberProfileDTO, memberProfile);
return this.memberProfileService.update(memberProfile);
}
public void asyncMemberProfileAndMember(MemberProfileAndMemberDTO resources) {
MemberProfileDTO memberProfileDTO = resources.getMemberProfileDTO();
MemberProfileDTO _memberProfileDTO = this.asyncMemberProfile(memberProfileDTO);
MemberDTO memberDTO = resources.getMemberDTO();
String code = memberDTO.getCode();
if (!StringUtils.isEmpty(code)) {
MemberDTO memberDTO1 = this.memberService.findByCode(code);
Member member = new Member();
BeanUtils.copyProperties(memberDTO1, member);
member.setNickname(_memberProfileDTO.getRealname());
member.setBirthday(_memberProfileDTO.getBirthday());
member.setGender(_memberProfileDTO.getGender());
this.memberService.update(member);
}
}
}
package com.topdraw.business.process.service.impl.member;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.relatedinfo.domain.MemberRelatedInfo;
import com.topdraw.business.module.member.relatedinfo.service.MemberRelatedInfoService;
import com.topdraw.business.module.member.relatedinfo.service.dto.MemberRelatedInfoDTO;
import com.topdraw.business.process.service.member.MemberRelatedInfoOperationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/20 18:41
* @version: :
* @modified By:
* @since : modified in 2022/3/20 18:41
*/
@Service
public class MemberRelatedInfoOperationServiceImpl implements MemberRelatedInfoOperationService {
@Autowired
private MemberRelatedInfoService memberRelatedInfoService;
@Override
public MemberRelatedInfoDTO findById(Long id) {
return this.memberRelatedInfoService.findById(id);
}
@Override
public void create(MemberRelatedInfo resources) {
this.memberRelatedInfoService.create(resources);
}
@Override
public void update(MemberRelatedInfo resources) {
this.memberRelatedInfoService.update(resources);
}
@Override
public void delete(Long id) {
this.memberRelatedInfoService.delete(id);
}
@Override
public MemberRelatedInfoDTO findByIdCard(MemberRelatedInfo resources) {
return this.memberRelatedInfoService.findByIdCard(resources);
}
@Override
public MemberRelatedInfoDTO findByIdCard(String idCard) {
return this.memberRelatedInfoService.findByIdCard(idCard);
}
@Override
public MemberRelatedInfoDTO findByMemberIdAndIdCard(Long memberId, String idCard) {
return this.memberRelatedInfoService.findByMemberIdAndIdCard(memberId, idCard);
}
@Override
public MemberRelatedInfoDTO findByMemberCodeAndIdCard(String memberCode, String idCard) {
return this.memberRelatedInfoService.findByMemberCodeAndIdCard(memberCode, idCard);
}
@Override
public MemberRelatedInfoDTO findByMemberIdAndIdCard(MemberRelatedInfo resources) {
return this.memberRelatedInfoService.findByMemberIdAndIdCard(resources);
}
@Override
public MemberRelatedInfoDTO findByMemberIdAndIdCard(Member member, MemberRelatedInfo resources) {
return this.memberRelatedInfoService.findByMemberIdAndIdCard(member, resources);
}
}
package com.topdraw.business.process.service.member;
import com.topdraw.business.module.member.address.domain.MemberAddress;
import com.topdraw.business.module.member.address.service.dto.MemberAddressDTO;
public interface MemberAddressOperationService {
}
package com.topdraw.business.process.service.member;
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;
public interface MemberOperationService {
/**
*
* @param memberId
* @return
*/
MemberDTO findById(Long memberId);
/**
*
* @param code
* @return
*/
MemberDTO findByCode(String code);
/**
* 修改会员
* @param resources
*/
MemberDTO update(Member resources);
/**
*
* @param member
*/
MemberDTO doUpdateMember(Member member);
/**
*
* @param member
*/
MemberDTO doInsertMember(Member member);
/**
*
* @param member
*/
MemberDTO doUpdateMemberExp(Member member);
/**
*
* @param member
*/
MemberDTO doUpdateMemberPoints(Member member);
/**
*
* @param member
*/
MemberDTO doUpdateMemberCoupon(Member member);
/**
*
* @param memberId
* @param appid
* @return
*/
MemberProfileDTO getMemberProfileAndCheckVip(Long memberId, String appid);
}
package com.topdraw.business.process.service.member;
public interface MemberProfileOperationService {
}
package com.topdraw.business.process.service.member;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.relatedinfo.domain.MemberRelatedInfo;
import com.topdraw.business.module.member.relatedinfo.service.dto.MemberRelatedInfoDTO;
/**
* @author XiangHan
* @date 2021-10-22
*/
public interface MemberRelatedInfoOperationService {
/**
* 根据ID查询
* @param id ID
* @return MemberRelatedInfoDTO
*/
MemberRelatedInfoDTO findById(Long id);
/**
* 新增
* @param resources
*/
void create(MemberRelatedInfo resources);
/**
* 修改
* @param resources
*/
void update(MemberRelatedInfo resources);
/**
* 删除
* @param id
*/
void delete(Long id);
/**
* 通过身份证查询
* @param resources
* @return
*/
MemberRelatedInfoDTO findByIdCard(MemberRelatedInfo resources);
/**
* 通过身份证查询
* @param idCard 身份证
* @return
*/
MemberRelatedInfoDTO findByIdCard(String idCard);
/**
*
* @param memberId
* @param idCard
* @return
*/
MemberRelatedInfoDTO findByMemberIdAndIdCard(Long memberId, String idCard);
/**
*
* @param memberCode
* @param idCard
* @return
*/
MemberRelatedInfoDTO findByMemberCodeAndIdCard(String memberCode, String idCard);
/**
*
* @param resources
* @return
*/
MemberRelatedInfoDTO findByMemberIdAndIdCard(MemberRelatedInfo resources);
/**
*
* @param member
* @param resources
* @return
*/
MemberRelatedInfoDTO findByMemberIdAndIdCard(Member member, MemberRelatedInfo resources);
}
package com.topdraw.config;
public class LocalConstants {
// 小屏侧
public static final String ENV_MOBILE = "mobile";
// 大屏侧
public static final String ENV_VIS = "vis";
// 服务侧
public static final String ENV_SERVICE = "service";
// 管理侧
public static final String ENV_MANAGEMENT = "management";
// 大屏类型
public static final int DEVICE_VIS = 1;
// 小屏类型
public static final int DEVICE_MOBILE = 2;
// 平台类型
public static final String PLATFORM_TYPE_SERVICE = "service";
public static final String PLATFORM_TYPE_MANAGEMENT = "management";
//会员平台类型 类型 1:大屏;2:小屏
public static final Integer MEMBER_PLATFORM_TYPE_VIS = 1;
public static final Integer MEMBER_PLATFORM_TYPE_WEIXIN = 2;
// 重庆_重数_vis
public static final String APP_CODE_CHONGQING_CHONGSHU_VIS = "CHONGQING_chongshu_vis";
// 事件类型 3:参加活动
public static final Integer EVT_TYPE_ACTIVITY = 3;
}
package com.topdraw.config;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.naming.ConfigurationException;
import java.util.List;
import java.util.Map;
@Component
public class RabbitMqBindingConfig {
/**************************************************数据源选择*************************************************************/
@Autowired
private RabbitMqSourceConfig rabbitMqSourceConfig;
@Autowired
private RabbitMqCustomConfig rabbitMqCustomConfig;
@Resource(name = "managementRabbitAdmin")
private RabbitAdmin managementRabbitAdmin;
@Resource(name = "serviceRabbitAdmin")
private RabbitAdmin serviceRabbitAdmin;
@PostConstruct
public void initBinding() throws ConfigurationException {
// String source = rabbitMqSourceConfig.getActiveSource();
List<Map<String, String>> list = rabbitMqCustomConfig.getList();
if (CollectionUtils.isNotEmpty(list)) {
for (Map<String, String> map : list) {
String exchange = map.get("exchange");
String exchangeType = map.get("exchange-type");
Exchange exchange_ = null;
switch (exchangeType) {
case ExchangeTypes.TOPIC:
exchange_ = ExchangeBuilder.topicExchange(exchange)
.durable(true).build();
break;
case ExchangeTypes.FANOUT:
exchange_ = ExchangeBuilder.fanoutExchange(exchange)
.durable(true).build();
break;
case ExchangeTypes.HEADERS:
exchange_ = ExchangeBuilder.headersExchange(exchange)
.durable(true).build();
break;
default:
exchange_ = ExchangeBuilder.directExchange(exchange)
.durable(true).build();
break;
}
String queue = map.get("queue");
Queue queue_ = new Queue(queue);
String routingKey = map.get("routing-key");
if (StringUtils.isBlank(routingKey)) {
routingKey = queue;
}
Binding binding_ = BindingBuilder.bind(queue_).to(exchange_).with(routingKey).and(null);
String active = map.get("active");
switch (active) {
case "management":
this.managementRabbitAdmin.declareExchange(exchange_);
this.managementRabbitAdmin.declareQueue(queue_);
this.managementRabbitAdmin.declareBinding(binding_);
break;
case "service":
this.serviceRabbitAdmin.declareExchange(exchange_);
this.serviceRabbitAdmin.declareQueue(queue_);
this.serviceRabbitAdmin.declareBinding(binding_);
break;
/* case "service,management":
this.serviceRabbitAdmin.declareExchange(exchange_);
this.serviceRabbitAdmin.declareQueue(queue_);
this.serviceRabbitAdmin.declareBinding(binding_);
this.managementRabbitAdmin.declareExchange(exchange_);
this.managementRabbitAdmin.declareQueue(queue_);
this.managementRabbitAdmin.declareBinding(binding_);
break;*/
default:
break;
}
}
}
}
}
package com.topdraw.config;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
@Configuration
public class RabbitMqConfig {
//////////////////////////////////////////////////////// OMO 小屏///////////////////////////////////////////////////////////////
/** 获取带参二维码(大屏->小屏) */
public static final String GET_QR_CODE_QUEUE = "queue.qrCode.get";
/** 删除全部收藏队列(大屏->小屏) */
public static final String COLLECTION_DELETE_ALL_QUEUE = "queue.collection.deleteall";
/** 添加收藏队列(大屏->小屏) */
public static final String COLLECTION_ADD_QUEUE = "queue.collection.add";
/** 删除收藏队列(大屏->小屏) */
public static final String COLLECTION_DELETE_QUEUE = "queue.collection.delete";
/** 微信侧 公众号关注与取消关注 */
public static final String WEIXIN_SUBORUNSUB_QUEUE = "weixin.subOrUnSub.queue";
//////////////////////////////////////////////////////// 重数 ///////////////////////////////////////////////////////////////
/** 路由(事件)--direct route.key*/
// 事件,uc-gateway
public static final String UC_ROUTE_KEY_DIRECT_EVENT_AAA = "uc.route.key.direct.event.aaa";
// uc-service 服务侧
public static final String UC_ROUTE_KEY_DIRECT_EVENT_BBB = "uc.route.key.direct.event.bbb";
// uc-service 管理侧
public static final String UC_ROUTE_KEY_DIRECT_EVENT_CCC = "uc.route.key.direct.event.ccc";
@Value("${mutil-mq.service.host}")
private String serviceHost;
@Value("${mutil-mq.service.port}")
private Integer servicePort;
@Value("${mutil-mq.service.username}")
private String serviceUserName;
@Value("${mutil-mq.service.password}")
private String servicePassword;
@Value("${mutil-mq.service.virtual-host}")
private String serviceVirtualHost;
@Bean(name = "serviceConnectionFactory")
@Primary
public ConnectionFactory serviceConnectionFactory(){
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
/*connectionFactory.setHost("139.196.145.150");
connectionFactory.setPort(5672);
connectionFactory.setUsername("admin");
connectionFactory.setPassword("Topdraw1qaz");
connectionFactory.setVirtualHost("member_center");*/
connectionFactory.setHost(serviceHost);
connectionFactory.setPort(servicePort);
connectionFactory.setUsername(serviceUserName);
connectionFactory.setPassword(servicePassword);
connectionFactory.setVirtualHost(serviceVirtualHost);
return connectionFactory;
}
@Bean(name = "serviceRabbitListenerContainerFactory")
@Primary
public RabbitListenerContainerFactory userCenterRabbitListenerContainerFactory(
SimpleRabbitListenerContainerFactoryConfigurer containerFactoryConfigurer,
@Qualifier("serviceConnectionFactory") ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
containerFactoryConfigurer.configure(factory,connectionFactory);
return factory;
}
@Bean(name = "serviceRabbitTemplate")
public RabbitTemplate userCenterRabbitTemplate(ConnectionFactory ucServiceConnectionFactory){
RabbitTemplate u = new RabbitTemplate(ucServiceConnectionFactory);
return u;
}
@Value("${mutil-mq.management.host}")
private String managementHost;
@Value("${mutil-mq.management.port}")
private Integer managementPort;
@Value("${mutil-mq.management.username}")
private String managementUserName;
@Value("${mutil-mq.management.password}")
private String managementPassword;
@Value("${mutil-mq.management.virtual-host}")
private String managementVirtualHost;
@Bean(name = "managementConnectionFactory")
public ConnectionFactory managementConnectionFactory(){
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
/*connectionFactory.setHost("139.196.192.242");
connectionFactory.setPort(5672);
connectionFactory.setUsername("member_center");
connectionFactory.setPassword("Tjlh@2021");
connectionFactory.setVirtualHost("member_center");*/
connectionFactory.setHost(managementHost);
connectionFactory.setPort(managementPort);
connectionFactory.setUsername(managementUserName);
connectionFactory.setPassword(managementPassword);
connectionFactory.setVirtualHost(managementVirtualHost);
return connectionFactory;
}
@Bean(name = "managementRabbitListenerContainerFactory")
public RabbitListenerContainerFactory memberServiceRabbitListenerContainerFactory(
SimpleRabbitListenerContainerFactoryConfigurer containerFactoryConfigurer,
@Qualifier("managementConnectionFactory") ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
containerFactoryConfigurer.configure(factory,connectionFactory);
return factory;
}
@Bean(name = "managementRabbitTemplate")
public RabbitTemplate memberServiceRabbitTemplate(ConnectionFactory ucGatewayConnectionFactory){
RabbitTemplate u = new RabbitTemplate(ucGatewayConnectionFactory);
return u;
}
/**
* 处理事件
* @return org.springframework.amqp.core.Queue
* @author XiangHan
* @date 2021/9/7 10:19 上午
*/
@Bean
public Queue eventDirect() {
return new Queue(UC_ROUTE_KEY_DIRECT_EVENT_AAA);
}
}
package com.topdraw.config;
import lombok.Data;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.List;
import java.util.Map;
@Data
@Configuration
@ConfigurationProperties(prefix = "service.mq")
public class RabbitMqCustomConfig {
private List<Map<String, String>> list;
/**
* viewRecord
* @return
*/
public Map<String, String> getViewRecordInfo() {
if (CollectionUtils.isNotEmpty(list)) {
for (Map<String, String> map : list) {
String type = map.get("source");
if (type.equalsIgnoreCase("viewRecord")) {
return map;
}
}
}
return null;
}
/**
* ucg_event
* @return
*/
public Map<String, String> getUcgEventInfo() {
if (CollectionUtils.isNotEmpty(list)) {
for (Map<String, String> map : list) {
String type = map.get("source");
if (type.equalsIgnoreCase("event")) {
return map;
}
}
}
return null;
}
/**
* ucg_collection
* @return
*/
public Map<String, String> getUcgCollectionInfo() {
if (CollectionUtils.isNotEmpty(list)) {
for (Map<String, String> map : list) {
String type = map.get("source");
if (type.equalsIgnoreCase("collection")) {
return map;
}
}
}
return null;
}
/**
* uce
* @return
*/
public Map<String, String> getUceInfo() {
if (CollectionUtils.isNotEmpty(list)) {
for (Map<String, String> map : list) {
String type = map.get("source");
if (type.equalsIgnoreCase("uce")) {
return map;
}
}
}
return null;
}
/**
* eventBus
* @return
*/
public Map<String, String> getEventBusInfo() {
if (CollectionUtils.isNotEmpty(list)) {
for (Map<String, String> map : list) {
String type = map.get("source");
if (type.equalsIgnoreCase("eventBus")) {
return map;
}
}
}
return null;
}
/**
* wechat
* @return
*/
public Map<String, String> getWechatInfo() {
if (CollectionUtils.isNotEmpty(list)) {
for (Map<String, String> map : list) {
String type = map.get("source");
if (type.equalsIgnoreCase("wechat")) {
return map;
}
}
}
return null;
}
}
package com.topdraw.config;
import lombok.Data;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.List;
import java.util.Map;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/5/12 12:37
* @version: :
* @modified By:
* @since : modified in 2022/5/12 12:37
*/
@Data
@Configuration
@ConfigurationProperties(prefix = "service.mq.error.logs")
public class RabbitMqErrorLogConfig {
private List<Map<String, String>> list;
/**
* uce
* @return
*/
public Map<String, String> getWechatError() {
if (CollectionUtils.isNotEmpty(list)) {
for (Map<String, String> map : list) {
String type = map.get("type");
if (type.equalsIgnoreCase("wechat")) {
return map;
}
}
}
return null;
}
/**
* uce
* @return
*/
public Map<String, String> getUceError() {
if (CollectionUtils.isNotEmpty(list)) {
for (Map<String, String> map : list) {
String type = map.get("type");
if (type.equalsIgnoreCase("uce")) {
return map;
}
}
}
return null;
}
/**
* ucg
* @return
*/
public Map<String, String> getUcgError() {
if (CollectionUtils.isNotEmpty(list)) {
for (Map<String, String> map : list) {
String type = map.get("type");
if (type.equalsIgnoreCase("ucg")) {
return map;
}
}
}
return null;
}
/**
* 数据总线
* @return
*/
public Map<String, String> getEventBusError() {
if (CollectionUtils.isNotEmpty(list)) {
for (Map<String, String> map : list) {
String type = map.get("type");
if (type.equalsIgnoreCase("eventBus")) {
return map;
}
}
}
return null;
}
/**
* 个人信息完善
* @return
*/
public Map<String, String> getCompleteInfoError() {
if (CollectionUtils.isNotEmpty(list)) {
for (Map<String, String> map : list) {
String type = map.get("type");
if (type.equalsIgnoreCase("completeInfo")) {
return map;
}
}
}
return null;
}
/**
* 订购
* @return
*/
public Map<String, String> getOrderError() {
if (CollectionUtils.isNotEmpty(list)) {
for (Map<String, String> map : list) {
String type = map.get("type");
if (type.equalsIgnoreCase("order")) {
return map;
}
}
}
return null;
}
/**
* 参加活动
* @return
*/
public Map<String, String> getActivityError() {
if (CollectionUtils.isNotEmpty(list)) {
for (Map<String, String> map : list) {
String type = map.get("type");
if (type.equalsIgnoreCase("activity")) {
return map;
}
}
}
return null;
}
/**
* 签到
* @return
*/
public Map<String, String> getSignError() {
if (CollectionUtils.isNotEmpty(list)) {
for (Map<String, String> map : list) {
String type = map.get("type");
if (type.equalsIgnoreCase("sign")) {
return map;
}
}
}
return null;
}
/**
* 观影、播放记录
* @return
*/
public Map<String, String> getPlayError() {
if (CollectionUtils.isNotEmpty(list)) {
for (Map<String, String> map : list) {
String type = map.get("type");
if (type.equalsIgnoreCase("play")) {
return map;
}
}
}
return null;
}
}
package com.topdraw.config;
import lombok.Data;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.naming.ConfigurationException;
import java.util.Map;
import java.util.Objects;
@Data
@Configuration
public class RabbitMqSourceConfig {
@Value("${mutil-mq.service.host}")
private String serviceHost;
@Value("${mutil-mq.service.port}")
private Integer servicePort;
@Value("${mutil-mq.service.username}")
private String serviceUserName;
@Value("${mutil-mq.service.password}")
private String servicePassword;
@Value("${mutil-mq.service.virtual-host}")
private String serviceVirtualHost;
public static final String SERVICE_ = "serviceRabbitListenerContainerFactory";
@Bean(name = "serviceConnectionFactory")
@Primary
public ConnectionFactory serviceConnectionFactory(){
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setHost(serviceHost);
connectionFactory.setPort(servicePort);
connectionFactory.setUsername(serviceUserName);
connectionFactory.setPassword(servicePassword);
connectionFactory.setVirtualHost(serviceVirtualHost);
return connectionFactory;
}
@Bean(name = SERVICE_)
@Primary
public RabbitListenerContainerFactory serviceRabbitListenerContainerFactory(
SimpleRabbitListenerContainerFactoryConfigurer containerFactoryConfigurer,
@Qualifier("serviceConnectionFactory") ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
containerFactoryConfigurer.configure(factory, connectionFactory);
return factory;
}
@Bean(name = "serviceRabbitTemplate")
public RabbitTemplate serviceRabbitTemplate(ConnectionFactory serviceConnectionFactory){
RabbitTemplate rabbitTemplate = new RabbitTemplate(serviceConnectionFactory);
return rabbitTemplate;
}
@Bean(name = "serviceRabbitAdmin")
public RabbitAdmin serviceRabbitAdmin(
@Qualifier("serviceConnectionFactory") ConnectionFactory connectionFactory) {
RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
rabbitAdmin.setAutoStartup(true);
return rabbitAdmin;
}
public static final String MANAGEMENT_ = "managementRabbitListenerContainerFactory";
@Value("${mutil-mq.management.host}")
private String managementHost;
@Value("${mutil-mq.management.port}")
private Integer managementPort;
@Value("${mutil-mq.management.username}")
private String managementUserName;
@Value("${mutil-mq.management.password}")
private String managementPassword;
@Value("${mutil-mq.management.virtual-host}")
private String managementVirtualHost;
@Bean(name = "managementConnectionFactory")
public ConnectionFactory managementConnectionFactory(){
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setHost(managementHost);
connectionFactory.setPort(managementPort);
connectionFactory.setUsername(managementUserName);
connectionFactory.setPassword(managementPassword);
connectionFactory.setVirtualHost(managementVirtualHost);
return connectionFactory;
}
@Bean(name = MANAGEMENT_)
public RabbitListenerContainerFactory managementRabbitListenerContainerFactory(
SimpleRabbitListenerContainerFactoryConfigurer containerFactoryConfigurer,
@Qualifier("managementConnectionFactory") ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
containerFactoryConfigurer.configure(factory, connectionFactory);
return factory;
}
@Bean(name = "managementRabbitTemplate")
public RabbitTemplate managementRabbitTemplate(ConnectionFactory managementConnectionFactory){
RabbitTemplate rabbitTemplate = new RabbitTemplate(managementConnectionFactory);
return rabbitTemplate;
}
@Bean(name = "managementRabbitAdmin")
public RabbitAdmin managementRabbitAdmin(
@Qualifier("managementConnectionFactory") ConnectionFactory connectionFactory) {
RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
rabbitAdmin.setAutoStartup(true);
return rabbitAdmin;
}
/**************************************************数据源*************************************************************/
/*@Value("${service.platform}")
private String platform;
@Value("${service.active}")
private String active;
public String getActiveSource() throws ConfigurationException {
if (StringUtils.isBlank(platform))
throw new ConfigurationException("【error】=> platform is none !! ");
if (StringUtils.isBlank(active))
throw new ConfigurationException("【error】=> active is none !! ");
if (active.equalsIgnoreCase("service,management") || active.equalsIgnoreCase("management,service")) {
return "service,management";
}
return active;
}*/
private String chargeSource(String active) {
if (active.equalsIgnoreCase("management")) {
return MANAGEMENT_;
}
if (active.equalsIgnoreCase("service")) {
return SERVICE_;
}
return null;
}
/**************************************************uc-getaway 2 uc-consumer*************************************************************/
public static final String EVENT_EXCHANGE = "event.exchange";
public static final String EVENT_QUEUE = "event.queue";
@Value("#{rabbitMqCustomConfig.getUcgEventInfo()}")
private Map<String, String> ucgEventInfo;
public String getUcgEventQueue(){
if (Objects.nonNull(ucgEventInfo)) {
if (MapUtils.isNotEmpty(ucgEventInfo)) {
String queue = ucgEventInfo.get("queue");
return queue;
}
}
return EVENT_QUEUE;
}
public String getUcgEventSource(){
if (Objects.nonNull(ucgEventInfo)) {
if (MapUtils.isNotEmpty(ucgEventInfo)) {
String source = ucgEventInfo.get("active");
if (StringUtils.isNotBlank(source)) {
return this.chargeSource(source);
} else {
return SERVICE_;
}
}
}
return SERVICE_;
}
public String getUcgEventStartUp(){
if (Objects.nonNull(ucgEventInfo)) {
if (MapUtils.isNotEmpty(ucgEventInfo)) {
String source = ucgEventInfo.get("active");
if (StringUtils.isNotBlank(source)) {
return "true";
}
}
}
return "false";
}
/* public static final String COLLECTION_DELETE_ALL_QUEUE = "queue.collection.deleteall";
public static final String COLLECTION_ADD_QUEUE = "queue.collection.add";
public static final String COLLECTION_DELETE_QUEUE = "queue.collection.delete";*/
public static final String COLLECTION_EXCHANGE = "collection.exchange";
public static final String COLLECTION_QUEUE = "collection.queue";
@Value("#{rabbitMqCustomConfig.getUcgCollectionInfo()}")
private Map<String, String> ucgIptvCollectionInfo;
public String getUcgCollectionQueue(){
if (Objects.nonNull(ucgIptvCollectionInfo)) {
if (MapUtils.isNotEmpty(ucgIptvCollectionInfo)) {
String queue = ucgIptvCollectionInfo.get("queue");
return queue;
}
}
return COLLECTION_QUEUE;
}
public String getUcgCollectionQueueAdd(){
return "queue.collection.add";
}
public String getUcgCollectionQueueDelete(){
return "queue.collection.delete";
}
public String getUcgCollectionQueueDeleteAll(){
return "queue.collection.deleteall";
}
public String getUcgCollectionSource(){
if (Objects.nonNull(ucgIptvCollectionInfo)) {
if (MapUtils.isNotEmpty(ucgIptvCollectionInfo)) {
String source = ucgIptvCollectionInfo.get("active");
if (StringUtils.isNotBlank(source)) {
return this.chargeSource(source);
} else {
return SERVICE_;
}
}
}
return SERVICE_;
}
public String getUcgCollectionStartUp(){
if (Objects.nonNull(ucgIptvCollectionInfo)) {
if (MapUtils.isNotEmpty(ucgIptvCollectionInfo)) {
String source = ucgIptvCollectionInfo.get("active");
if (StringUtils.isNotBlank(source)) {
return "true";
}
}
}
return "false";
}
public static final String VIEW_RECORD_EXCHANGE = "viewRecord.exchange";
public static final String VIEW_RECORD_QUEUE = "viewRecord.queue";
@Value("#{rabbitMqCustomConfig.getViewRecordInfo()}")
private Map<String, String> viewRecordInfo;
public String getViewRecordQueue(){
if (Objects.nonNull(viewRecordInfo)) {
if (MapUtils.isNotEmpty(viewRecordInfo)) {
String queue = viewRecordInfo.get("queue");
return queue;
}
}
return VIEW_RECORD_QUEUE;
}
public String getViewRecordSource(){
if (Objects.nonNull(viewRecordInfo)) {
if (MapUtils.isNotEmpty(viewRecordInfo)) {
String source = viewRecordInfo.get("active");
if (StringUtils.isNotBlank(source)) {
return this.chargeSource(source);
} else {
return SERVICE_;
}
}
}
return SERVICE_;
}
public String getViewRecordStartUp(){
if (Objects.nonNull(viewRecordInfo)) {
if (MapUtils.isNotEmpty(viewRecordInfo)) {
String source = viewRecordInfo.get("active");
if (StringUtils.isNotBlank(source)) {
return "true";
}
}
}
return "false";
}
/**************************************************uc-engine 2 uc-consumer*************************************************************/
public static final String UCE_EXCHANGE = "uce.exchange";
public static final String UCE_QUEUE = "uce.queue";
@Value("#{rabbitMqCustomConfig.getUceInfo()}")
private Map<String, String> uceInfo;
public String getUceQueue(){
if (Objects.nonNull(uceInfo)) {
if (MapUtils.isNotEmpty(uceInfo)) {
String queue = uceInfo.get("queue");
return queue;
}
}
return UCE_QUEUE;
}
public String getUceSource(){
if (Objects.nonNull(uceInfo)) {
if (MapUtils.isNotEmpty(uceInfo)) {
String source = uceInfo.get("active");
if (StringUtils.isNotBlank(source)) {
return this.chargeSource(source);
} else {
return MANAGEMENT_;
}
}
}
return MANAGEMENT_;
}
public String getUceStartUp(){
if (Objects.nonNull(uceInfo)) {
if (MapUtils.isNotEmpty(uceInfo)) {
String source = uceInfo.get("active");
if (StringUtils.isNotBlank(source)) {
return "true";
}
}
}
return "false";
}
public String getMemberInfoAsyncQueue(){
return "queue.MemberInfoSync";
}
/**************************************************eventBus*************************************************************/
public static final String UC_EVENTBUS_EXCHANGE = "uc.eventbus";
public static final String UC_EVENTBUS_KEY = "uc.eventbus.*.topic";
public static final String UC_EVENTBUS_QUEUE = "uc.eventbus";
@Value("#{rabbitMqCustomConfig.getEventBusInfo()}")
private Map<String, String> eventBusInfo;
public String getEventBusQueue(){
if (Objects.nonNull(eventBusInfo)) {
if (MapUtils.isNotEmpty(eventBusInfo)) {
String queue = eventBusInfo.get("queue");
return queue;
}
}
return UC_EVENTBUS_QUEUE;
}
public String getEventBusSource(){
if (Objects.nonNull(eventBusInfo)) {
if (MapUtils.isNotEmpty(eventBusInfo)) {
String source = eventBusInfo.get("active");
if (StringUtils.isNotBlank(source)) {
return this.chargeSource(source);
} else {
return SERVICE_;
}
}
}
return SERVICE_;
}
public String getEventBusStartUp(){
if (Objects.nonNull(eventBusInfo)) {
if (MapUtils.isNotEmpty(eventBusInfo)) {
String source = eventBusInfo.get("active");
if (StringUtils.isNotBlank(source)) {
return "true";
}
}
}
return "false";
}
/**************************************************wechat*************************************************************/
public static final String WEIXIN_EXCHANGE = "weixin.subOrUnSub.direct";
public static final String WEIXIN_SUBORUNSUB_QUEUE = "weixin.subOrUnSub.queue";
@Value("#{rabbitMqCustomConfig.getWechatInfo()}")
private Map<String, String> wechatInfo;
public String getWechatQueue(){
if (Objects.nonNull(wechatInfo)) {
if (MapUtils.isNotEmpty(wechatInfo)) {
String queue = wechatInfo.get("queue");
return queue;
}
}
return WEIXIN_SUBORUNSUB_QUEUE;
}
public String getWechatSource(){
if (Objects.nonNull(wechatInfo)) {
if (MapUtils.isNotEmpty(wechatInfo)) {
String source = wechatInfo.get("active");
if (StringUtils.isNotBlank(source)) {
return this.chargeSource(source);
} else {
return SERVICE_;
}
}
}
return SERVICE_;
}
public String getWechatStartUp(){
if (Objects.nonNull(wechatInfo)) {
if (MapUtils.isNotEmpty(wechatInfo)) {
String source = wechatInfo.get("active");
if (StringUtils.isNotBlank(source)) {
return "true";
}
}
}
return "false";
}
}
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("${service.area: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);
}
// service: 服务侧 management: 管理侧
public static String UC_SERVICE_PLATFORM;
@Value("${service.platform:management}")
public void setUcServicePlatform(String ucServicePlatform) {
UC_SERVICE_PLATFORM = ucServicePlatform;
}
public static boolean isService() {
return ObjectUtil.equals(UC_SERVICE_PLATFORM, LocalConstants.ENV_SERVICE);
}
public static boolean isManagement() {
return ObjectUtil.equals(UC_SERVICE_PLATFORM, LocalConstants.ENV_MANAGEMENT);
}
}
package com.topdraw.exception;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/10 17:16
* @version: :
* @modified By:
* @since : modified in 2022/3/10 17:16
*/
public interface GlobeExceptionCode {
// 会员信息
Integer MEMBER_CODE_IS_NULL = 000100001;
}
package com.topdraw.exception;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/10 17:16
* @version: :
* @modified By:
* @since : modified in 2022/3/10 17:16
*/
public interface GlobeExceptionMsg {
/**************************************************************/
/** 系统 */
String OPERATION_FORBID = "operation forbid";
String ENTITY_ALREADY_EXISTS = "entity already exists";
/**************************************************************/
/** 优惠券 */
String COUPON_ID_IS_NULL = "coupon id is null";
String COUPON_CODE_IS_NULL = "coupon code is null";
/**************************************************************/
/** 会员管理 */
String MEMBER_CODE_IS_NULL = "memberCode is null";
String MEMBER_ID_IS_NULL = "memberId is null";
String MEMBER_ID_AND_CODE_ARE_NULL = "memberId and memberCode both null";
String MEMBER_INFO_ERROR = "member info is error";
String MEMBER_BLOCK_STATUS = "member status is block";
/**************************************************************/
/** 账户管理 **/
/** iptv */
String IPTV_ID_IS_NULL = "iptvId is null";
String IPTV_PLATFORM_ACCOUNT_IS_NULL = "platformAccount is null";
String IPTV_IS_NULL = "iptv is null";
String VIS_USER_ID_IS_NULL = "visUserId is null";
/** 微信 */
String APP_ID_IS_NULL = "appId is null";
String OPEN_ID_IS_NULL = "openId is null";
String UNION_ID_IS_NULL = "unionId is null";
String ALREADY_BIND = "already bind";
String WEIXIN_IS_NULL = "weixin is null";
}
package com.topdraw.exception;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/5/13 15:50
* @version: :
* @modified By:
* @since : modified in 2022/5/13 15:50
*/
public class RabbitMqExceptionHandler {
}
package com.topdraw.mq.consumer;
import com.topdraw.config.RabbitMqConfig;
import com.topdraw.mq.domain.DataSyncMsg;
import com.rabbitmq.client.Channel;
import com.topdraw.mq.domain.TableOperationMsg;
import com.topdraw.resttemplate.RestTemplateClient;
import com.topdraw.util.FileUtil;
import com.topdraw.util.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.ExchangeTypes;
import org.apache.commons.collections4.MapUtils;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import java.io.IOException;
import java.time.LocalDate;
import java.util.Map;
@Component
@Slf4j
public class UcEngineEventConsumer {
private static final Logger LOG = LoggerFactory.getLogger(UcEngineEventConsumer.class);
public class UcEngineManagement2IptvConsumer {
@Autowired
AutoRoute autoUser;
......@@ -26,6 +28,46 @@ public class UcEngineEventConsumer {
@Autowired
RestTemplateClient restTemplateClient;
@Value("#{rabbitMqErrorLogConfig.getUceError()}")
private Map<String, String> error;
@RabbitHandler
@RabbitListener(queues = "#{rabbitMqSourceConfig.getMemberInfoAsyncQueue()}",
containerFactory = "#{rabbitMqSourceConfig.getUceSource()}",
autoStartup = "#{rabbitMqSourceConfig.getUceStartUp()}",
ackMode = "AUTO")
public void ucEventConsumer2(Channel channel, Message message, String content) throws IOException {
log.info(" receive MemberInfoAsync msg , content is : {} ", content);
try {
TableOperationMsg tableOperationMsg = this.parseContent(content);
autoUser.route(tableOperationMsg);
// channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
if (MapUtils.isNotEmpty(error)) {
String errorStart = this.error.get("start");
if (errorStart.equalsIgnoreCase("true")) {
String fileName = this.error.get("fileName")+"_"+ LocalDate.now() +".log";
String filePath = this.error.get("filePath");
String filePath1 = filePath+fileName;
FileUtil.writeStringToFile2(filePath1, content, e.getMessage());
}
}
e.printStackTrace();
}
log.info("ucEventConsumer ====>>>> end");
}
/**
* 事件
* @param content
......@@ -34,14 +76,39 @@ public class UcEngineEventConsumer {
* @date 2021/9/7 11:26 上午
*/
@RabbitHandler
@RabbitListener(bindings = {
@QueueBinding(value = @Queue(value = RabbitMqConfig.UC_ROUTE_KEY_DIRECT_EVENT_BBB),
exchange = @Exchange(value = ExchangeTypes.DIRECT))
}, containerFactory = "serviceRabbitListenerContainerFactory")
public void ucEventConsumer(String content) {
log.info(" receive dataSync msg , content is : {} ", content);
TableOperationMsg tableOperationMsg = this.parseContent(content);
autoUser.route(tableOperationMsg);
@RabbitListener(queues = "#{rabbitMqSourceConfig.getUceQueue()}",
containerFactory = "#{rabbitMqSourceConfig.getUceSource()}",
autoStartup = "#{rabbitMqSourceConfig.getUceStartUp()}",
ackMode = "MANUAL")
public void ucEventConsumer(Channel channel, Message message, String content) throws IOException {
log.info(" receive ucEventConsumer msg , content is : {} ", content);
try {
TableOperationMsg tableOperationMsg = this.parseContent(content);
autoUser.route(tableOperationMsg);
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
if (MapUtils.isNotEmpty(error)) {
String errorStart = this.error.get("start");
if (errorStart.equalsIgnoreCase("true")) {
String fileName = this.error.get("fileName")+"_"+ LocalDate.now() +".log";
String filePath = this.error.get("filePath");
String filePath1 = filePath+fileName;
FileUtil.writeStringToFile2(filePath1, content, e.getMessage());
}
}
e.printStackTrace();
}
log.info("ucEventConsumer ====>>>> end");
}
......
package com.topdraw.mq.consumer;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.rabbitmq.client.Channel;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
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.service.TaskService;
import com.topdraw.business.module.task.template.service.TaskTemplateService;
import com.topdraw.business.module.task.template.service.dto.TaskTemplateDTO;
import com.topdraw.business.module.user.iptv.service.UserTvService;
import com.topdraw.business.module.user.iptv.service.dto.UserTvDTO;
import com.topdraw.exception.EntityNotFoundException;
import com.topdraw.mq.domain.DataSyncMsg;
import com.topdraw.resttemplate.RestTemplateClient;
import com.topdraw.util.DateUtil;
import com.topdraw.util.FileUtil;
import com.topdraw.util.JSONUtil;
import com.topdraw.util.TimestampUtil;
import com.topdraw.utils.RedisUtils;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.text.ParseException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
@Component
@Slf4j
public class UcEventBusIptv2ManagementUcEngine {
@Autowired
private TaskService taskService;
@Autowired
private UserTvService userTvService;
@Autowired
private MemberService memberService;
@Autowired
private TaskAttrService taskAttrService;
@Autowired
private TaskTemplateService taskTemplateService;
@Autowired
private RestTemplateClient restTemplateClient;
@Autowired
private RedisUtils redisUtils;
@Value("#{rabbitMqErrorLogConfig.getEventBusError()}")
private Map<String, String> error;
/**
* 事件
* @param content
* @description 基础数据同步
* @author Hongyan Wang
* @date 2021/9/7 11:26 上午
*/
@RabbitHandler
@RabbitListener(queues = "#{rabbitMqSourceConfig.getEventBusQueue()}",
containerFactory = "#{rabbitMqSourceConfig.getEventBusSource()}",
autoStartup = "#{rabbitMqSourceConfig.getEventBusStartUp()}",
ackMode = "MANUAL")
public void eventBusConsumer(Channel channel, Message message, String content) throws ParseException, IOException {
log.info(" receive dataSync msg , content is : {} ", content);
try {
this.parseContent(content);
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
if (MapUtils.isNotEmpty(error)) {
String errorStart = this.error.get("start");
if (errorStart.equalsIgnoreCase("true")) {
String fileName = this.error.get("fileName")+"_"+LocalDate.now() +".log";
String filePath = this.error.get("filePath");
String filePath1 = filePath+fileName;
FileUtil.writeStringToFile2(filePath1, content, e.getMessage());
}
}
e.printStackTrace();
}
log.info("ucEventConsumer ====>>>> end");
}
/**
* 数据解析
* @param content
* @return
*/
private void parseContent(String content) throws ParseException {
PlayContent commonMsg = JSONUtil.parseMsg2Object(content, PlayContent.class);
String evt = commonMsg.getEvt();
switch (evt.toUpperCase()) {
case "PLAY":
PlayContent playContent = JSONUtil.parseMsg2Object(content, PlayContent.class);
PlayContent.MsgData msgData = playContent.getMsgData();
if (Objects.nonNull(msgData)) {
String time = playContent.getTime();
String formatDate = DateUtil.formatDate(time);
Integer deviceType = playContent.getDeviceType();
String platformAccount = msgData.getPlatformAccount();
String mediaCode = msgData.getMediaCode();
Long mediaId = msgData.getMediaId();
String mediaName = msgData.getMediaName();
Integer playDuration = msgData.getPlayDuration();
if (Objects.isNull(playDuration) || playDuration == 0) {
return;
}
log.info("playDuration ==>> {}", playDuration);
DataSyncMsg dataSyncMsg = new DataSyncMsg();
dataSyncMsg.setEvt(evt);
DataSyncMsg.MsgData msg = new DataSyncMsg.MsgData();
Integer playDurationValueTotal = 0;
if (StringUtils.isNotBlank(platformAccount)) {
UserTvDTO userTvDTO = this.userTvService.findByPlatformAccount(platformAccount);
if(Objects.nonNull(userTvDTO)) {
// 用大屏账号+日期做为key,并判断这个key是否存在 ,数据类型为hash eg:<total,1>,<1,playDuration>,<2,playDuration>
String key = platformAccount+"|"+formatDate;
Map<Object, Object> hmget =
this.redisUtils.hmget(key);
if (MapUtils.isEmpty(hmget)) {
// 初始化播放总时长<total>和第一个播放时间
playDurationValueTotal = playDuration;
Map<String, Object> map = new HashMap<>();
map.put("total", playDurationValueTotal);
map.put("1", playDuration);
this.redisUtils.hmset(key, map, 129600);
} else {
// 计算播放总时长 total = 播放总时长+当前播放时长
Integer total = this.getRedisTotal(hmget);
playDurationValueTotal = total + playDuration;
}
Integer totalKey = this.getRedisTotalKey(hmget);
Integer maxSize = totalKey + 1;
Map<String, Object> map = new HashMap<>();
map.put(String.valueOf(maxSize), playDuration);
map.put("total", playDurationValueTotal);
this.redisUtils.hmset(key, map);
this.checkTask(playDurationValueTotal, time, deviceType,
mediaCode, mediaId, mediaName, dataSyncMsg, msg, userTvDTO);
}
}
}
break;
}
//return null;
}
private DataSyncMsg checkTask(Integer playDurationValueTotal, String time, Integer deviceType, String mediaCode,
Long mediaId, String mediaName, DataSyncMsg dataSyncMsg,
DataSyncMsg.MsgData msgData, UserTvDTO userTvDTO) {
// 检查播放记录任务
List<TaskAttrDTO> taskAttrDTOList = new ArrayList<>();
TaskTemplateDTO taskTemplateDTO = this.taskTemplateService.findByType(8);
if (Objects.nonNull(taskTemplateDTO.getId())) {
List<Task> taskList = this.taskService.findByTemplateId(taskTemplateDTO.getId());
if (CollectionUtils.isNotEmpty(taskList)) {
for (Task task : taskList) {
TaskAttrDTO taskAttrDTO = this.taskAttrService.findByTaskId(task.getId());
taskAttrDTOList.add(taskAttrDTO);
}
} else {
return null;
}
} else {
return null;
}
List<List<Integer>> attrList = new ArrayList<>();
if (CollectionUtils.isNotEmpty(taskAttrDTOList)) {
for (TaskAttrDTO taskAttrDTO : taskAttrDTOList) {
String attrStr = taskAttrDTO.getAttrStr();
if (StringUtils.isNotBlank(attrStr)) {
JSONObject parse = JSONObject.parseObject(attrStr, JSONObject.class);
List<Integer> value = (List<Integer>) parse.get("value");
attrList.add(value);
}
}
} else {
return null;
}
int size = attrList.size();
DataSyncMsg dataSyncMsg1 = null;
if (size > 0) {
for (int i = size-1; i >= 0; i--) {
Integer integer = attrList.get(i).get(0);
if (playDurationValueTotal >= integer) {
dataSyncMsg1 = getDataSyncMsg(time, mediaCode, mediaId, mediaName, integer, dataSyncMsg,
msgData, userTvDTO);
dataSyncMsg1.setEvt("PLAY");
dataSyncMsg1.setEvent(8);
dataSyncMsg1.setTime(LocalDateTime.now());
dataSyncMsg1.setDeviceType(deviceType);
this.taskDeal(dataSyncMsg1);
}
}
}
return dataSyncMsg1;
}
private Integer getRedisTotalKey(Map<Object, Object> hmget) {
Set<Object> objects = hmget.keySet();
return objects.size();
}
private Integer getRedisTotal(Map<Object, Object> hmget) {
Set<Object> objects = hmget.keySet();
Integer playDurationValueTotal_ = 0;
for (Object key_ : objects) {
if (key_.toString().equalsIgnoreCase("total")) {
playDurationValueTotal_ = Integer.valueOf(hmget.get(key_).toString());
return playDurationValueTotal_;
} else {
continue;
}
}
return playDurationValueTotal_;
}
private DataSyncMsg getDataSyncMsg(String time, String mediaCode, Long mediaId, String mediaName,
Integer playDuration, DataSyncMsg dataSyncMsg, DataSyncMsg.MsgData msgData1, UserTvDTO userTvDTO) {
String priorityMemberCode = userTvDTO.getPriorityMemberCode();
String memberCode = "";
if (StringUtils.isNotBlank(priorityMemberCode)) {
memberCode = priorityMemberCode;
} else {
memberCode = this.memberService.findById(userTvDTO.getMemberId()).getCode();
}
if (StringUtils.isBlank(memberCode))
throw new EntityNotFoundException(MemberDTO.class, "memberCode", "memberCode is null");
msgData1.setMemberCode(memberCode);
msgData1.setMediaId(mediaId);
JSONObject param = new JSONObject();
// 增量
param.put("playDuration", playDuration);
msgData1.setParam(JSON.toJSONString(param));
JSONObject description = new JSONObject();
description.put("mediaId", mediaId);
description.put("mediaName", mediaName);
description.put("playDuration", playDuration);
description.put("mediaCode", mediaCode);
description.put("time", time);
msgData1.setDescription(JSON.toJSONString(description));
dataSyncMsg.setMsg(msgData1);
return dataSyncMsg;
}
/**
* 任务处理
* @param dataSyncMsg
*/
private void taskDeal(DataSyncMsg dataSyncMsg) {
this.restTemplateClient.dealTask(dataSyncMsg);
}
@Data
static class PlayContent {
private String evt;
private Integer event;
private Integer deviceType;
private String time;
private MsgData msgData;
@Data
static class MsgData {
private String platformAccount;
private Integer playDuration;
private Long mediaId;
private String mediaCode;
private String mediaName;
}
}
}
package com.topdraw.mq.consumer;
import com.topdraw.config.RabbitMqConfig;
import com.topdraw.mq.domain.DataSyncMsg;
import com.topdraw.resttemplate.RestTemplateClient;
import com.topdraw.util.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
@Component
@Slf4j
public class UcGatewayEventConsumer {
@Autowired
RestTemplateClient restTemplateClient;
@Autowired
AutoRoute autoUser;
/**
* 事件
* @param content
* @description 基础数据同步
* @author Hongyan Wang
* @date 2021/9/7 11:26 上午
*/
@RabbitHandler
@RabbitListener(bindings = {
@QueueBinding(value = @Queue(value = RabbitMqConfig.UC_ROUTE_KEY_DIRECT_EVENT_AAA),
exchange = @Exchange(value = ExchangeTypes.DIRECT))
}, containerFactory = "managementRabbitListenerContainerFactory")
public void ucEventConsumer(String content) {
log.info(" receive dataSync msg , content is : {} ", content);
DataSyncMsg dataSyncMsg = this.parseContent(content);
this.taskDeal(dataSyncMsg);
log.info("ucEventConsumer ====>>>> end");
}
/**
* 数据解析
* @param content
* @return
*/
private DataSyncMsg parseContent(String content) {
DataSyncMsg dataSyncMsg = JSONUtil.parseMsg2Object(content,DataSyncMsg.class);
Assert.notNull(dataSyncMsg,"ERROR -->> operationConsumer -->> parseContent -->> 【dataSyncMsg】 not be null !!");
DataSyncMsg.MsgData msgData = dataSyncMsg.getMsg();
Assert.notNull(msgData,"ERROR -->> operationConsumer -->> parseContent -->> 【msgData】 not be null !!");
return dataSyncMsg;
}
/**
* 任务处理
* @param dataSyncMsg
*/
private void taskDeal(DataSyncMsg dataSyncMsg) {
this.restTemplateClient.dealTask(dataSyncMsg);
}
}
package com.topdraw.mq.consumer;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.rabbitmq.client.Channel;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.user.iptv.service.UserTvService;
import com.topdraw.business.module.user.iptv.service.dto.UserTvDTO;
import com.topdraw.mq.domain.DataSyncMsg;
import com.topdraw.resttemplate.RestTemplateClient;
import com.topdraw.util.FileUtil;
import com.topdraw.util.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import javax.validation.constraints.NotNull;
import java.io.IOException;
import java.time.LocalDate;
import java.util.Map;
import java.util.Objects;
@Component
@Slf4j
public class UcGatewayIptv2IptvConsumer {
@Autowired
RestTemplateClient restTemplateClient;
@Autowired
AutoRoute autoUser;
@Autowired
private MemberService memberService;
@Autowired
private UserTvService userTvService;
@Value("#{rabbitMqErrorLogConfig.getUcgError()}")
private Map<String, String> error;
/**
* 事件
* @param content
* @description 基础数据同步
* @author Hongyan Wang
* @date 2021/9/7 11:26 上午
*/
@RabbitHandler
@RabbitListener(queues = "#{rabbitMqSourceConfig.getUcgEventQueue()}",
containerFactory = "#{rabbitMqSourceConfig.getUcgEventSource()}",
autoStartup = "#{rabbitMqSourceConfig.getUcgEventStartUp()}",
ackMode = "MANUAL")
public void eventConsumer(Channel channel, Message message, String content) throws IOException {
log.info(" receive dataSync msg , content is : {} ", content);
try {
DataSyncMsg dataSyncMsg = this.parseContent(content);
this.taskDeal(dataSyncMsg);
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
if (MapUtils.isNotEmpty(error)) {
String errorStart = this.error.get("start");
if (StringUtils.isEmpty(errorStart) || errorStart.equalsIgnoreCase("true")) {
String fileName = this.error.get("fileName")+"_"+ LocalDate.now() +".log";
String filePath = this.error.get("filePath");
String filePath1 = filePath+fileName;
FileUtil.writeStringToFile2(filePath1, content, e.getMessage());
}
}
e.printStackTrace();
}
log.info("ucEventConsumer ====>>>> end");
}
/**
* 数据解析
* @param content
* @return
*/
private DataSyncMsg parseContent(String content) {
DataSyncMsg dataSyncMsg = JSONUtil.parseMsg2Object(content,DataSyncMsg.class);
Assert.notNull(dataSyncMsg,"ERROR -->> operationConsumer -->> parseContent -->> 【dataSyncMsg】 not be null !!");
DataSyncMsg.MsgData msgData = dataSyncMsg.getMsg();
Long memberId = msgData.getMemberId();
String memberCode = msgData.getMemberCode();
if (Objects.nonNull(memberId) && StringUtils.isBlank(memberCode)) {
MemberDTO memberDTO = this.memberService.findById(memberId);
String code = memberDTO.getCode();
msgData.setMemberCode(code);
}
String platformAccount = msgData.getPlatformAccount();
if (StringUtils.isNotBlank(platformAccount)) {
UserTvDTO userTvDTO = userTvService.findByPlatformAccount(platformAccount);
if (Objects.nonNull(userTvDTO)) {
String priorityMemberCode = userTvDTO.getPriorityMemberCode();
if (StringUtils.isNotBlank(priorityMemberCode)) {
msgData.setMemberCode(priorityMemberCode);
} else {
MemberDTO memberDTO = this.memberService.findById(userTvDTO.getMemberId());
msgData.setMemberCode(memberDTO.getCode());
}
}
}
Assert.notNull(msgData,"ERROR -->> operationConsumer -->> parseContent -->> 【msgData】 not be null !!");
return dataSyncMsg;
}
/**
* 任务处理
* @param dataSyncMsg
*/
private void taskDeal(DataSyncMsg dataSyncMsg) {
this.restTemplateClient.dealTask(dataSyncMsg);
}
/**
* @description 添加收藏记录
* @param content 消息内容
*/
@RabbitHandler
@RabbitListener(queues = "#{rabbitMqSourceConfig.getUcgCollectionQueue()}",
containerFactory = "#{rabbitMqSourceConfig.getUcgCollectionSource()}",
autoStartup = "#{rabbitMqSourceConfig.getUcgCollectionStartUp()}",
ackMode = "MANUAL")
public void collectionConsumer(Channel channel, Message message, String content) throws IOException {
log.info("receive UserCollection add message, content {}", content);
try {
JSONObject jsonObject = JSON.parseObject(content, JSONObject.class);
if (Objects.nonNull(content)) {
String evt = jsonObject.get("evt").toString();
String msgData = jsonObject.get("msgData").toString();
switch (evt.toUpperCase()) {
// 添加收藏
case "ADDCOLLECTION":
this.restTemplateClient.addCollection(msgData);
break;
// 删除收藏
case "DELETECOLLECTION":
this.restTemplateClient.deleteCollection(msgData);
break;
// 删除全部收藏
case "DELETEALLCOLLECTION":
this.restTemplateClient.deleteAllCollection(msgData);
break;
default:
break;
}
}
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
if (MapUtils.isNotEmpty(error)) {
String errorStart = this.error.get("start");
if (errorStart.equalsIgnoreCase("true")) {
String fileName = this.error.get("fileName")+"_"+ LocalDate.now() +".log";
String filePath = this.error.get("filePath");
String filePath1 = filePath+fileName;
FileUtil.writeStringToFile2(filePath1, content, e.getMessage());
}
}
e.printStackTrace();
}
}
/**
* @description 处理观影记录
* @param content 消息内容
*/
@RabbitHandler
@RabbitListener(queues = "#{rabbitMqSourceConfig.getViewRecordQueue()}",
containerFactory = "#{rabbitMqSourceConfig.getViewRecordSource()}",
autoStartup = "#{rabbitMqSourceConfig.getViewRecordStartUp()}",
ackMode = "MANUAL")
public void viewRecordConsumer(Channel channel, Message message, String content) throws IOException {
log.info("receive ViewRecord add message, content {}", content);
try {
JSONObject jsonObject = JSON.parseObject(content, JSONObject.class);
if (Objects.nonNull(content)) {
String evt = jsonObject.get("evt").toString();
String msgData = jsonObject.get("msgData").toString();
switch (evt.toUpperCase()) {
// 添加收藏
case "VIEWRECORD":
this.restTemplateClient.dealViewRecord(msgData);
break;
default:
break;
}
}
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
if (MapUtils.isNotEmpty(error)) {
String errorStart = this.error.get("start");
if (errorStart.equalsIgnoreCase("true")) {
String fileName = this.error.get("fileName")+"_"+ LocalDate.now() +".log";
String filePath = this.error.get("filePath");
String filePath1 = filePath+fileName;
FileUtil.writeStringToFile2(filePath1, content, e.getMessage());
}
}
e.printStackTrace();
}
}
/**
* @description 添加收藏记录
* @param content 消息内容
*/
@RabbitHandler
@RabbitListener(queues = "#{rabbitMqSourceConfig.getUcgCollectionQueueAdd()}",
containerFactory = "#{rabbitMqSourceConfig.getUcgCollectionSource()}",
autoStartup = "#{rabbitMqSourceConfig.getUcgCollectionStartUp()}",
ackMode = "MANUAL")
public void collectionConsumerAdd(Channel channel, Message message, String content) throws IOException {
log.info("receive collectionConsumerAdd add message, content {}", content);
try {
JSONObject jsonObject = JSON.parseObject(content, JSONObject.class);
if (Objects.nonNull(content)) {
String evt = jsonObject.get("evt").toString();
String msgData = jsonObject.get("msgData").toString();
switch (evt.toUpperCase()) {
// 添加收藏
case "ADDCOLLECTION":
this.restTemplateClient.addCollection(msgData);
break;
// 删除收藏
case "DELETECOLLECTION":
this.restTemplateClient.deleteCollection(msgData);
break;
// 删除全部收藏
case "DELETEALLCOLLECTION":
this.restTemplateClient.deleteAllCollection(msgData);
break;
default:
break;
}
}
// channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
if (MapUtils.isNotEmpty(error)) {
String errorStart = this.error.get("start");
if (errorStart.equalsIgnoreCase("true")) {
String fileName = this.error.get("fileName")+"_"+ LocalDate.now() +".log";
String filePath = this.error.get("filePath");
String filePath1 = filePath+fileName;
FileUtil.writeStringToFile2(filePath1, content, e.getMessage());
}
}
e.printStackTrace();
}
}
/**
* @description 添加收藏记录
* @param content 消息内容
*/
@RabbitHandler
@RabbitListener(queues = "#{rabbitMqSourceConfig.getUcgCollectionQueueDelete()}",
containerFactory = "#{rabbitMqSourceConfig.getUcgCollectionSource()}",
autoStartup = "#{rabbitMqSourceConfig.getUcgCollectionStartUp()}",
ackMode = "MANUAL")
public void collectionConsumerDelete(Channel channel, Message message, String content) throws IOException {
log.info("receive collectionConsumerDelete add message, content {}", content);
try {
JSONObject jsonObject = JSON.parseObject(content, JSONObject.class);
if (Objects.nonNull(content)) {
String evt = jsonObject.get("evt").toString();
String msgData = jsonObject.get("msgData").toString();
switch (evt.toUpperCase()) {
// 添加收藏
case "ADDCOLLECTION":
this.restTemplateClient.addCollection(msgData);
break;
// 删除收藏
case "DELETECOLLECTION":
this.restTemplateClient.deleteCollection(msgData);
break;
// 删除全部收藏
case "DELETEALLCOLLECTION":
this.restTemplateClient.deleteAllCollection(msgData);
break;
default:
break;
}
}
// channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
if (MapUtils.isNotEmpty(error)) {
String errorStart = this.error.get("start");
if (errorStart.equalsIgnoreCase("true")) {
String fileName = this.error.get("fileName")+"_"+ LocalDate.now() +".log";
String filePath = this.error.get("filePath");
String filePath1 = filePath+fileName;
FileUtil.writeStringToFile2(filePath1, content, e.getMessage());
}
}
e.printStackTrace();
}
}
/**
* @description 添加收藏记录
* @param content 消息内容
*/
@RabbitHandler
@RabbitListener(queues = "#{rabbitMqSourceConfig.getUcgCollectionQueueDeleteAll()}",
containerFactory = "#{rabbitMqSourceConfig.getUcgCollectionSource()}",
autoStartup = "#{rabbitMqSourceConfig.getUcgCollectionStartUp()}",
ackMode = "MANUAL")
public void collectionConsumerDeleteAll(Channel channel, Message message, String content) throws IOException {
log.info("receive collectionConsumerDeleteAll add message, content {}", content);
try {
JSONObject jsonObject = JSON.parseObject(content, JSONObject.class);
if (Objects.nonNull(content)) {
String evt = jsonObject.get("evt").toString();
String msgData = jsonObject.get("msgData").toString();
switch (evt.toUpperCase()) {
// 添加收藏
case "ADDCOLLECTION":
this.restTemplateClient.addCollection(msgData);
break;
// 删除收藏
case "DELETECOLLECTION":
this.restTemplateClient.deleteCollection(msgData);
break;
// 删除全部收藏
case "DELETEALLCOLLECTION":
this.restTemplateClient.deleteAllCollection(msgData);
break;
default:
break;
}
}
// channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
if (MapUtils.isNotEmpty(error)) {
String errorStart = this.error.get("start");
if (errorStart.equalsIgnoreCase("true")) {
String fileName = this.error.get("fileName")+"_"+ LocalDate.now() +".log";
String filePath = this.error.get("filePath");
String filePath1 = filePath+fileName;
FileUtil.writeStringToFile2(filePath1, content, e.getMessage());
}
}
e.printStackTrace();
}
}
}
......@@ -2,19 +2,23 @@ package com.topdraw.mq.consumer;
import com.alibaba.fastjson.JSONObject;
import com.topdraw.config.RabbitMqConfig;
import com.rabbitmq.client.Channel;
import com.topdraw.mq.domain.SubscribeBean;
import com.topdraw.resttemplate.RestTemplateClient;
import com.topdraw.utils.RedisUtils;
import com.topdraw.utils.StringUtils;
import com.topdraw.util.FileUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ExchangeTypes;
import org.apache.commons.collections4.MapUtils;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.time.LocalDate;
import java.util.Map;
/**
* 微信事件
*/
......@@ -22,104 +26,14 @@ import org.springframework.transaction.annotation.Transactional;
@Slf4j
public class WeiXinEventConsumer {
@Autowired
private RestTemplateClient restTemplateClient;
private static final String QR_CODE_URL = "QR_CODE_URL_";
/**
* @description 删除用户收藏记录
* @param content 消息内容
*/
/*@RabbitHandler
@RabbitListener(bindings = {
@QueueBinding(value = @Queue(value = RabbitMqConfig.COLLECTION_DELETE_QUEUE),
exchange = @Exchange(value = ExchangeTypes.DIRECT))},
containerFactory = "managementRabbitListenerContainerFactory")*/
public void deleteCollection(String content) {
try {
log.info("receive UserCollection delete message, content {}", content);
this.restTemplateClient.deleteCollection(content);
} catch (Exception e) {
log.error("CollectionDeleteConsumer || UserCollection delete error || {}", e.toString(), e);
}
}
@Value("#{rabbitMqErrorLogConfig.getWechatError()}")
private Map<String, String> error;
/**
* @description 删除全部收藏记录
* @param content 消息内容
*/
/*@RabbitHandler
@RabbitListener(bindings = {
@QueueBinding(value = @Queue(value = RabbitMqConfig.COLLECTION_DELETE_ALL_QUEUE),
exchange = @Exchange(value = ExchangeTypes.DIRECT))},
containerFactory = "managementRabbitListenerContainerFactory")*/
@Transactional
public void deleteAllCollection(String content) {
try {
log.info("receive UserCollection delete all message, content {}", content);
this.restTemplateClient.deleteAllCollection(content);
} catch (Exception e) {
log.error("CollectionDeleteConsumer || UserCollection delete all error || {}", e.toString(), e);
}
}
/**
* 处理带参的二维码事件
* @param content 消息内容
* @description 获取公众号带参二维码
*/
/*@RabbitHandler
@RabbitListener(bindings = {
@QueueBinding(value = @Queue(value = RabbitMqConfig.GET_QR_CODE_QUEUE),
exchange = @Exchange(value = ExchangeTypes.DIRECT))},
containerFactory = "managementRabbitListenerContainerFactory")*/
public void getQrCode(String content) {
try {
log.info("receive get qrCode message, content {}", content);
JSONObject jsonObject = JSONObject.parseObject(content);
/*String appid = jsonObject.getString("appid");
String IPTVappid = jsonObject.getString("IPTVappid");
String platformAccount = jsonObject.getString("platformAccount");
String sessionId = jsonObject.getString("sessionId");
String key = QR_CODE_URL + appid + "_" + platformAccount + "_" + sessionId;
String url = (String) redisUtils.get(key);
if (StringUtils.isBlank(url)) {
Map<String, String> wxInfo = WeixinUtil.getWeixinInfoByAppid(appid);
var appType = wxInfo.get("appType");
// 订阅号不支持带参二维码,直接返回
if (StrUtil.isNotEmpty(appType) && ObjectUtil.equals(appType, WeChatConstants.WX_SUBSCRIPTION)) {
log.error("订阅号不支持带参二维码 || {} || {}", appid, content);
return;
}
QrCode qrCode = new QrCode();
qrCode.setActionName(WeChatConstants.QR_STR_SCENE);
if (StringUtils.isNotBlank(wxInfo.get("qrCodeExpireSeconds"))) {
qrCode.setExpireSeconds(Integer.valueOf(wxInfo.get("qrCodeExpireSeconds")));
}
ActionInfo actionInfo = new ActionInfo();
Scene scene = new Scene();
scene.setSceneStr(content);
actionInfo.setScene(scene);
qrCode.setActionInfo(actionInfo);
JSONObject jsonQrCode = weixinRequestUtil.getQrCode(wxInfo, qrCode);
url = jsonQrCode.getString("url");
Integer expireSeconds = jsonQrCode.getInteger("expire_seconds");
redisUtils.set(key, url, expireSeconds, TimeUnit.SECONDS);
}
HashMap<String, Object> map = new HashMap<>();
map.put("sessionId", sessionId);
map.put("url", url);
map.put("appid", appid);
map.put("IPTVappid", IPTVappid);
map.put("platformAccount", platformAccount);
map.put("extraInfo", content);*/
restTemplateClient.sendQrCodeMessage(content);
} catch (Exception e) {
log.error("GetQrCodeConsumer || get qrCode error || {}", e.toString(), e);
}
}
/**
* 关注和取关事件
......@@ -130,13 +44,12 @@ public class WeiXinEventConsumer {
* }
* @param content
*/
/*@RabbitHandler
@RabbitListener(bindings = {
@QueueBinding(value = @Queue(value = RabbitMqConfig.WEIXIN_SUBORUNSUB_QUEUE),
exchange = @Exchange(value = ExchangeTypes.DIRECT))},
containerFactory = "managementRabbitListenerContainerFactory")*/
@RabbitHandler
@RabbitListener(queues = "#{rabbitMqSourceConfig.getWechatQueue()}",
containerFactory = "#{rabbitMqSourceConfig.getWechatSource()}",
autoStartup = "#{rabbitMqSourceConfig.getWechatStartUp()}", ackMode = "MANUAL")
@Transactional
public void subOrUnSubEvent(String content) {
public void subOrUnSubEvent(Channel channel, Message message, String content) throws IOException {
try {
log.info("receive wxu subOrUnSub message, content {}", content);
JSONObject jsonObject = JSONObject.parseObject(content);
......@@ -145,18 +58,16 @@ public class WeiXinEventConsumer {
JSONObject wechatMsg = jsonObject.getJSONObject("allFieldsMap");
String appid = map.getString("mpId");
String unionid = map.getString("unionid");
// Map<String, String> wxInfoMap = WeixinUtil.getWeixinInfoByAppid(appid);
String openid = wechatMsg.getString("FromUserName");
String msgType = wechatMsg.getString("MsgType");
if ("event".equals(msgType)) {
String event = wechatMsg.getString("Event");
log.info("event ===>> [{}]",event);
String eventKey = wechatMsg.getString("EventKey");
SubscribeBean subscribeBean = new SubscribeBean();
subscribeBean.setAppId(appid);
subscribeBean.setOpenId(openid);
subscribeBean.setAppid(appid);
subscribeBean.setOpenid(openid);
subscribeBean.setUnionid(unionid);
subscribeBean.setEventKey(eventKey);
......@@ -166,76 +77,30 @@ public class WeiXinEventConsumer {
if (event.equals("unsubscribe"))
this.restTemplateClient.unsubscribe(subscribeBean);
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
}
} catch (Exception e) {
log.error("WXSubscribeConsumer || subOrUnSub msg error || {} || {}", content, e.getMessage());
}
}
/**
* @description 添加收藏记录
* @param content 消息内容
*/
/* @RabbitHandler
@RabbitListener(bindings = {
@QueueBinding(value = @Queue(value = RabbitMqConfig.COLLECTION_ADD_QUEUE),
exchange = @Exchange(value = ExchangeTypes.DIRECT))},
containerFactory = "managementRabbitListenerContainerFactory")*/
@Transactional
public void addCollection(String content) {
try {
log.info("receive UserCollection add message, content {}", content);
JSONObject jsonObject = JSONObject.parseObject(content);
String platformAccount = jsonObject.getString("platformAccount");
String data = jsonObject.getString("data");
if (StringUtils.isBlank(data) || !data.startsWith("[")) {
// return;
}
/*Optional<TvUser> userOptional = tvUserRepository.findByPlatformAccount(platformAccount);
if (!userOptional.isPresent()) {
return;
}
Long tvUserId = userOptional.get().getId();
List<UserCollectionMq> userCollectionMqList = JSONObject.parseArray(data, UserCollectionMq.class);
if (userCollectionMqList == null || userCollectionMqList.isEmpty()) {
return;
}
Map<Long, List<UserCollectionMq>> collect = userCollectionMqList.stream().collect(Collectors.groupingBy(UserCollectionMq::getUserCollectionId));
for (Map.Entry<Long, List<UserCollectionMq>> entry : collect.entrySet()) {
List<UserCollectionMq> value = entry.getValue();
UserCollectionMq userCollectionMq = value.get(0);
if (StringUtils.isBlank(userCollectionMq.getName())) {
userCollectionMq.setName("DEFAULT");
}
UserCollection userCollection = userCollectionRepository
.findFirstByUserIdAndTypeAndName(tvUserId, userCollectionMq.getType(), userCollectionMq.getName()).orElseGet(UserCollection::new);
userCollection.setAppId(userCollectionMq.getAppId())
.setUserId(tvUserId)
.setName(userCollectionMq.getName())
.setType(userCollectionMq.getType())
.setCount(userCollection.getCount() == null ? value.size() : userCollection.getCount() + value.size());
UserCollection userCollectionSave = userCollectionRepository.save(userCollection);
for (UserCollectionMq collectionMq : value) {
UserCollectionDetail userCollectionDetail = collectionMq2DetailMapper.toEntity(collectionMq);
Optional<UserCollectionDetail> userCollectionDetailOptional = userCollectionDetailRepository
.findByDetailIdAndDetailTypeAndUserCollectionId(userCollectionDetail.getDetailId(), userCollectionDetail.getDetailType(), userCollectionSave.getId());
//观影记录同一天只存一条记录
if (userCollectionDetailOptional.isPresent() &&
DateUtil.isSameDay(new Date(userCollectionDetailOptional.get().getCreateTime().getTime()), new Date())) {
userCollectionDetail.setId(userCollectionDetailOptional.get().getId());
} else {
userCollectionDetail.setId(null)
.setUserCollectionId(userCollectionSave.getId());
}
userCollectionDetailRepository.save(userCollectionDetail);
channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
if (MapUtils.isNotEmpty(error)) {
String errorStart = this.error.get("start");
if (errorStart.equalsIgnoreCase("true")) {
String fileName = this.error.get("fileName")+"_"+LocalDate.now() +".log";
String filePath = this.error.get("filePath");
String filePath1 = filePath+fileName;
FileUtil.writeStringToFile2(filePath1, content, e.getMessage());
}
}*/
this.restTemplateClient.addCollection(content);
} catch (Exception e) {
log.error("CollectionAddConsumer || UserCollection add error || {}", e.toString(), e);
}
e.printStackTrace();
log.info("ucEventConsumer ====>>>> end");
}
}
}
......
......@@ -6,6 +6,7 @@ import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
*
......@@ -15,21 +16,18 @@ import java.io.Serializable;
@NoArgsConstructor
public class DataSyncMsg implements Serializable {
// 实体类型(表示需要修改的数据模型)
// @NotNull
// private EntityType entityType;
// 事件类型(用户的实际操作)
@NotNull
private String eventType;
private String evt;
// 具体事件 行为事件类型 1:登录;2:观影;3:参与活动;4:订购;10:跨屏绑定;11:积分转移;30:积分兑换商品;98:系统操作;99:其他
private Integer event;
//设备类型 1:大屏;2:小屏(微信)3.小屏(xx)
@NotNull
private Integer deviceType;
// 发送时间
private LocalDateTime time;
// 消息体
private MsgData msg;
// 其他属性
private String extraData;
/**
* 消息体
*/
......@@ -37,22 +35,16 @@ public class DataSyncMsg implements Serializable {
@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
@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 description;
private String param;
private String platformAccount;
}
}
......
package com.topdraw.mq.domain;
import lombok.Getter;
// 实体类型
@Getter
public enum EntityType {
// 用户
PERSON,
// 会员
MEMBER,
// 小屏-微信
WEIXIN_USER,
// 大屏
VIS_USER,
// 地址
PERSON_ADDRESS
}
package com.topdraw.mq.domain;
// 关注的事件
public enum EventType {
// 关注
SUBSCRIBE,
// 取消关注
UN_SUBSCRIBE,
// 绑定
BIND,
// 取消绑定
UN_BIND,
// 变更主账号
C_M_ACCOUNT,
// 获取积分
GAIN_POINT,
// 消耗积分
CONSUME_POINT,
// 观影
VIEWING
}
......@@ -10,10 +10,10 @@ import lombok.NoArgsConstructor;
public class SubscribeBean {
/** */
private String openId;
private String openid;
/** */
private String appId;
private String appid;
private String unionid;
......
......@@ -6,6 +6,7 @@ import com.topdraw.business.module.member.address.domain.MemberAddress;
import com.topdraw.mq.domain.DataSyncMsg;
import com.topdraw.mq.domain.SubscribeBean;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.http.ResponseEntity;
......@@ -41,13 +42,13 @@ public class RestTemplateClient {
}
public JSONObject dealTask(DataSyncMsg dataSyncMsg) {
String url = BASE_URL + "/ucEngine/api/taskOperation/dealTask";
String url = BASE_URL + "/uce/taskOperation/dealTask";
log.info("request uc : url is " + url + ", dataSyncMsg is " + dataSyncMsg);
String content = JSON.toJSONString(dataSyncMsg);
HashMap<Object, Object> objectObjectHashMap = new HashMap<>();
objectObjectHashMap.put("content", content);
log.info("===>>>" + content);
restTemplate.postForEntity(url, objectObjectHashMap, String.class);
restTemplate.postForEntity(url, objectObjectHashMap, String.class);
/* ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, objectObjectHashMap, String.class);
if (responseEntity.getStatusCode().is2xxSuccessful()) {
String entityBody = responseEntity.getBody();444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444被44444444444444 444444 44444 44444 44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
......@@ -63,7 +64,7 @@ public class RestTemplateClient {
public JSONObject getMemberInfo(Long memberId) {
JSONObject resultSet = null;
String url = BASE_URL + "/api/member/findById/" + memberId;
String url = BASE_URL + "/uce/member/findById/" + memberId;
log.info("request uc : url is " + url + ", memberId is " + memberId);
ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
if (responseEntity.getStatusCode().is2xxSuccessful()) {
......@@ -78,7 +79,7 @@ public class RestTemplateClient {
}
public String createMemberAddress(MemberAddress member) {
String url = BASE_URL + "/api/MemberAddress/create";
String url = BASE_URL + "/uce/memberAddress/create";
log.info("request uc : url is " + url + ", memberId is " + JSONObject.toJSONString(member));
restTemplate.postForEntity(url, member, String.class);
/* ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, member, String.class);
......@@ -91,7 +92,7 @@ public class RestTemplateClient {
}
public String unsubscribe(SubscribeBean subscribeBean) {
String url = BASE_URL + "/ucEngine/api/userOperation/unsubscribe";
String url = BASE_URL + "/uce/userOperation/unsubscribe";
String content = JSON.toJSONString(subscribeBean);
HashMap<Object, Object> objectObjectHashMap = new HashMap<>();
......@@ -107,7 +108,7 @@ public class RestTemplateClient {
}
public String subscribe(SubscribeBean subscribeBean) {
String url = BASE_URL + "/ucEngine/api/userOperation/subscribe";
String url = BASE_URL + "/uce/userOperation/subscribe";
String content = JSON.toJSONString(subscribeBean);
HashMap<String, String> objectObjectHashMap = new HashMap<>();
......@@ -124,7 +125,7 @@ public class RestTemplateClient {
}
public String sendQrCodeMessage(String content) {
String url = BASE_URL + "/ucEngine/api/userOperation/sendQrCodeMessage";
String url = BASE_URL + "/uce/userOperation/sendQrCodeMessage";
restTemplate.postForEntity(url, content, String.class);
/* ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, content, String.class);
String entityBody = "";
......@@ -136,7 +137,7 @@ public class RestTemplateClient {
}
public String addCollection(String content) {
String url = BASE_URL + "/ucEngine/api/userOperation/addCollection";
String url = BASE_URL + "/uce/userOperation/addCollection";
//处理接口调用 中文不显示问题
content = new String(Base64.getEncoder().encode(content.getBytes(StandardCharsets.UTF_8)));
......@@ -151,7 +152,10 @@ public class RestTemplateClient {
}
public String deleteCollection(String content) {
String url = BASE_URL + "/ucEngine/api/userOperation/deleteCollection";
String url = BASE_URL + "/uce/userOperation/deleteCollection";
//处理接口调用 中文不显示问题
content = new String(Base64.getEncoder().encode(content.getBytes(StandardCharsets.UTF_8)));
restTemplate.postForEntity(url, content, String.class);
/* ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, content, String.class);
String entityBody = "";
......@@ -163,7 +167,7 @@ public class RestTemplateClient {
}
public String deleteAllCollection(String content) {
String url = BASE_URL + "/ucEngine/api/userOperation/deleteAllCollection";
String url = BASE_URL + "/uce/userOperation/deleteAllCollection";
restTemplate.postForEntity(url, content, String.class);
/*ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, content, String.class);
String entityBody = "";
......@@ -173,4 +177,19 @@ public class RestTemplateClient {
log.info("uc response: " + entityBody);*/
return null;
}
public String dealViewRecord(String content) {
String url = BASE_URL + "/uce/userOperation/addCollection";
//处理接口调用 中文不显示问题
content = new String(Base64.getEncoder().encode(content.getBytes(StandardCharsets.UTF_8)));
restTemplate.postForEntity(url, content, String.class);
/* ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, content, String.class);
String entityBody = "";
if (responseEntity.getStatusCode().is2xxSuccessful()) {
entityBody = responseEntity.getBody();
}
log.info("uc response: " + entityBody);*/
return null;
}
}
......
package com.topdraw.util;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class Base64Util {
public static String encode(String name){
String name1 = new String(Base64.getEncoder().encode(name.getBytes(StandardCharsets.UTF_8)));
return name1;
}
public static void main(String[] args) {
// String name = "test005@itv";
String name = "18580619168a@iptv";
String encode = encode(name);
System.out.println(encode);
}
}
package com.topdraw.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateUtil {
......@@ -12,5 +14,17 @@ public class DateUtil {
return System.currentTimeMillis();
}
public static String formatDate(String time){
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
try {
//使用SimpleDateFormat的parse()方法生成Date
Date date = sf.parse(time);
String format = sf.format(date);
return format;
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
......
package com.topdraw.util;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.time.LocalDateTime;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/5/12 11:43
* @version: :
* @modified By:
* @since : modified in 2022/5/12 11:43
*/
public class FileUtil {
private static void createFile(String filePath){
File testFile = new File(filePath);
File fileParent = testFile.getParentFile();//返回的是File类型,可以调用exsit()等方法
//String fileParentPath = testFile.getParent();//返回的是String类型
if (!fileParent.exists()) {
fileParent.mkdirs();// 能创建多级目录
}
if (!testFile.exists()) {
try {
testFile.createNewFile();//有路径才能创建文件
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void writeStringToFile2(String filePath, String content, String error) {
try {
String property = System.getProperty("user.dir");
filePath = property + filePath;
createFile(filePath);
FileWriter fw = new FileWriter(filePath, true);
BufferedWriter bw = new BufferedWriter(fw);
bw.append(LocalDateTime.now()+"\n");
bw.write("【content】==>> \n"+content+"\n");
bw.write("【error】==>> \n"+error+"\n");
bw.write("----------------------------------------------------------------\n");
bw.close();
fw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.topdraw.util;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -149,6 +150,14 @@ public class IdWorker {
return idWorker.nextId();
}
public static String generatorCode(String prefix){
IdWorker idWorker = new IdWorker();
if (StringUtils.isNotBlank(prefix)) {
return prefix+"_"+String.valueOf(idWorker.nextId());
}
return String.valueOf(idWorker.nextId());
}
public static void main(String[] args) {
IdWorker idWorker = new IdWorker();
System.out.println(idWorker.nextId());
......
package com.topdraw.util;
import java.util.ArrayList;
import java.util.List;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/5/5 12:57
* @version: :
* @modified By:
* @since : modified in 2022/5/5 12:57
*/
public class ListUtil {
public static List<List<Integer>> sortList(List<List<Integer>> list, String desc) {
return null;
}
public static boolean containsValue(List<Integer> list, Integer value) {
return false;
}
public static void main(String[] args) {
List<List<Integer>> listList = new ArrayList<>();
List<Integer> integerList = new ArrayList<>();
integerList.add(1);
integerList.add(30);
List<Integer> integerList1 = new ArrayList<>();
integerList1.add(31);
integerList1.add(60);
listList.add(integerList);
listList.add(integerList1);
// Integer firstMaxInteger = listList.get(0).get;
/*Integer firstMaxInteger = 0;
for (List<Integer> integers : listList) {
firstMaxInteger = integers.get(integerList.size() - 1);
}*/
}
}
package com.topdraw.util;
import org.redisson.api.RLock;
public class RedissonUtil {
public static void lock(RLock rLock){
rLock.lock();
}
public static void unlock(RLock rLock){
if (rLock.isLocked() && rLock.isHeldByCurrentThread())
rLock.unlock();
}
}
spring:
# 数据源
datasource:
url: jdbc:log4jdbc:mysql://122.112.214.149:3306/tj_user_iptv?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
username: root
password: root
# 驱动程序
driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
# Druid
type: com.alibaba.druid.pool.DruidDataSource
druid:
# 初始化配置
initial-size: 3
# 最小连接数
min-idle: 3
# 最大连接数
max-active: 15
# 获取连接超时时间
max-wait: 5000
# 连接有效性检测时间
time-between-eviction-runs-millis: 90000
# 最大空闲时间
min-evictable-idle-time-millis: 1800000
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/*"
# jpa
jpa:
properties:
hibernate:
# 数据库类型
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
hibernate:
# 生产环境设置成 none,避免程序运行时自动更新数据库结构
ddl-auto: none
open-in-view: true
# redis
redis:
#数据库索引
database: 0
host: 122.112.214.149
port: 6379
password: redis123
#连接超时时间
timeout: 5000
###########################################自定义属性#################################################################
# 多mq配置
mutil-mq:
# 服务侧
service:
# ip
host: 122.112.214.149
# host: 139.196.145.150
# 端口
port: 5672
# 用户名
username: guest
# username: admin
# 密码
password: guest
# password: Topdraw1qaz
# 虚拟空间
virtual-host: member_center_chongshu
publisher-confirms: true #如果对异步消息需要回调必须设置为true
# 管理侧
management:
# host: 122.112.214.149 # rabbitmq的连接地址
host: 122.112.214.149 # rabbitmq的连接地址
port: 5672 # rabbitmq的连接端口号
virtual-host: member_center # rabbitmq的虚拟host
username: guest # rabbitmq的用户名
password: guest # rabbitmq的密码
# username: admin # rabbitmq的用户名
# password: Topdraw1qaz # rabbitmq的密码
publisher-confirms: true #如果对异步消息需要回调必须设置为true
# 服务属性
service:
mq:
list:
- source: event
exchange: event.exchange
queue: event.queue
exchange-type: direct
routing-key:
active: service
- source: collection
exchange: collection.exchange
queue: collection.queue
exchange-type: direct
routing-key:
active: service
- source: viewRecord
exchange: viewRecord.exchange
queue: viewRecord.queue
exchange-type: direct
routing-key:
active: service
- source: eventBus
exchange: uc.eventbus
queue: uc.eventbus
exchange-type: topic
routing-key: uc.eventbus.*.topic
active: service
- source: uce
exchange: uce.exchange
queue: uce.queue
exchange-type: direct
routing-key:
active: management
- source: wechat
exchange: weixin.exchange.direct
queue: weixin.subOrUnSub.queue
exchange-type: direct
routing-key:
active:
error:
logs:
list:
- type: eventBus
filePath: /logs/mq/eventBus/
fileName: error
start: on
- type: ucg
filePath: /logs/mq/ucg/
fileName: error
start: on
- type: uce
filePath: /logs/mq/uce/
fileName: error
start: on
- type: wechat
filePath: /logs/mq/wechat/
fileName: error
start: on
api:
baseUrl: http://127.0.0.1:8447
\ No newline at end of file
spring:
# 数据源
datasource:
# 数据源地址
url: jdbc:log4jdbc:mysql://139.196.145.150:3306/ucs_iptv_sichuan?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
# 用户名
url: jdbc:log4jdbc:mysql://122.112.214.149:3306/tj_user_iptv?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
username: root
# 密码
password: Tjlh@2021
password: root
# url: jdbc:log4jdbc:mysql://139.196.145.150:3306/ucs_iptv_sichuan?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
# username: root
# password: Tjlh@2021
# 驱动程序
driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
# Druid
......@@ -38,16 +38,6 @@ spring:
url-pattern: /*
exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
# freemarker
freemarker:
check-template-location: false
jackson:
time-zone: GMT+8
data:
redis:
repositories:
enabled: false
# jpa
jpa:
properties:
......@@ -58,13 +48,7 @@ spring:
# 生产环境设置成 none,避免程序运行时自动更新数据库结构
ddl-auto: none
open-in-view: true
# 文件上传
servlet:
multipart:
file-size-threshold: 2KB
max-file-size: 100MB
max-request-size: 200MB
show-sql: false
# redis
redis:
......@@ -76,113 +60,125 @@ spring:
#连接超时时间
timeout: 5000
# rabbitmq
# rabbitmq:
# # ip
# host: 139.196.145.150
# # 端口号
# port: 5672
# # 用户名
# username: admin # rabbitmq的用户名
# # 密码
# password: Topdraw1qaz
# # 虚拟空间
# virtual-host: member_center
# # 如果对异步消息需要回调必须设置为true
# publisher-confirms: true
#是否允许生成代码,生产环境设置为false
generator:
enabled: false
#是否开启 swagger-ui
swagger:
enabled: true
###########################################自定义属性#################################################################
# 多mq配置
mutil-mq:
# 服务侧
service:
# # ip
# host: 139.196.192.242
# # 端口
# port: 5672
# # 用户名
# username: member_center
# # 密码
# password: Tjlh@2021
# # 虚拟空间
# virtual-host: /member_center
host: 122.112.214.149 # rabbitmq的连接地址
port: 5672 # rabbitmq的连接端口号
virtual-host: member_center_sichuan # rabbitmq的虚拟hosthhh
username: guest # rabbitmq的用户名
password: guest # rabbitmq的密码
publisher-confirms: true #如果对异步消息需要回调必须设置为true
# 管理侧
management:
# ip
# host: 139.196.145.150
# # 端口
# port: 5672
# # 用户名
# username: admin
# # 密码
# password: Topdraw1qaz
# # 虚拟空间
# virtual-host: member_center
# ip
host: 122.112.214.149
# host: 139.196.145.150
# 端口
port: 5672
# 用户名
username: guest
# username: admin
# 密码
password: guest
# password: Topdraw1qaz
# 虚拟空间
virtual-host: member_center_sichuan
# virtual-host: member_center_iptv_sichuan
virtual-host: member_center_small_sichuan
publisher-confirms: true #如果对异步消息需要回调必须设置为true
#登录图形验证码有效时间/分钟
loginCode:
expiration: 2
# 管理侧
management:
# host: 122.112.214.149 # rabbitmq的连接地址
host: 122.112.214.149 # rabbitmq的连接地址
port: 5672 # rabbitmq的连接端口号
virtual-host: member_center_small_sichuan # rabbitmq的虚拟host
# virtual-host: member_center_small_chongshu # rabbitmq的虚拟host
username: guest # rabbitmq的用户名
password: guest # rabbitmq的密码
# username: admin # rabbitmq的用户名
# password: Topdraw1qaz # rabbitmq的密码
publisher-confirms: true #如果对异步消息需要回调必须设置为true
# 服务属性
service:
# 服务域 mobile:小屏侧 vis:大屏侧
area: vis
#平台类型 service: 服务侧 management: 管理侧
platform: service
# uc-engine服务地址
api:
baseUrl: http://127.0.0.1:8447
mq:
list:
# - source: event
# exchange: event.exchange
# queue: event.queue
# exchange-type: direct
# routing-key:
# active: service
- source: collection
exchange: exchange.collection
queue: collection.queue
exchange-type: direct
routing-key:
active: service
- source: collection
exchange: userCenter_exchange
queue: queue.collection.add
exchange-type: direct
routing-key: route.UserCollection.add
active: service
- source: collection
exchange: userCenter_exchange
queue: queue.collection.delete
exchange-type: direct
routing-key: route.UserCollection.delete
active: service
- source: collection
exchange: userCenter_exchange
queue: queue.collection.deleteall
exchange-type: direct
routing-key: route.UserCollection.deleteall
active: service
# 线程池设置
task:
pool:
# 核心线程池大小
core-pool-size: 10
# 最大线程数
max-pool-size: 30
# 活跃时间
keep-alive-seconds: 60
# 队列容量
queue-capacity: 50
# - source: viewRecord
# exchange: viewRecord.exchange
# queue: viewRecord.queue
# exchange-type: direct
# routing-key:
# active: service
# - source: eventBus
# exchange: uc.eventbus
# queue: uc.eventbus
# exchange-type: topic
# routing-key: uc.eventbus.*.topic
# active: service
- source: uce
exchange: uc.direct
queue: uc.route.key.direct.event.bbb
exchange-type: direct
routing-key:
active: service
- source: uce
exchange: exchange.MemberInfoSync
queue: queue.MemberInfoSync
exchange-type: direct
routing-key:
active: service
# - source: wechat
# exchange: weixin.subOrUnSub.direct
# queue: weixin.subOrUnSub.queue
# exchange-type: direct
# routing-key:
# active: active
error:
logs:
list:
- type: eventBus
filePath: /logs/mq/eventBus/
fileName: error
start: on
- type: ucg
filePath: /logs/mq/ucg/
fileName: error
start: on
- type: uce
filePath: /logs/mq/uce/
fileName: error
start: on
- type: wechat
filePath: /logs/mq/wechat/
fileName: error
start: on
#权限 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
\ No newline at end of file
api:
baseUrl: http://127.0.0.1:8447
\ No newline at end of file
......
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>UserCenter</contextName>
<contextName>uc-consumer</contextName>
<!--定义参数,后面可以通过${app.name}使用-->
<property name="app.name" value="member-engine"/>
<property name="app.name" value="uc-consumer"/>
<property name="log.path" value="./logs"/>
<property name="log.pattern" value="%d [%thread] %-5level %logger{36} [%file : %line] - %msg%n"/>
......
......@@ -2,8 +2,16 @@ package com.topdraw.resttemplate;
import com.alibaba.fastjson.JSONObject;
import com.topdraw.BaseTest;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.util.IOUtils;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import java.io.*;
import java.lang.reflect.Field;
import java.time.LocalDate;
import java.time.LocalDateTime;
public class RestTemplateTest extends BaseTest {
......@@ -16,4 +24,92 @@ public class RestTemplateTest extends BaseTest {
System.out.println(memberInfo);
}
@Test
public void error(){
String msg3 = "{\n" +
" \"evt\": \"play\", \n" +
" \"deviceType\": 1, \n" +
// " \"time\": \"2022-04-14 00:10:09\",\n" +
" \"time\": \"2022-05-03 23:10:09\",\n" +
" \"msgData\": {\n" +
" \"platformAccount\": \"topdraw\", \n" +
" \"playDuration\": "+23+", \n" +
" \"mediaCode\": \"\", \n" +
" \"mediaName\": \"\"\n" +
" }\n" +
" }";
String classpathUrlPrefix = ApplicationContext.CLASSPATH_URL_PREFIX;
String panfu = "";
// String filePath = classpathUrlPrefix+"/mq/play/error.log";
String property = System.getProperty("user.dir");
String separator = File.separator;
System.out.println(property);
String fileName = "error_"+ LocalDate.now() +".log";
String filePath = property+separator+"logs"+separator+"mq"+separator+fileName;
createFile(filePath);
this.writeStringToFile2(filePath, msg3);
String a = "{\n" +
"\"data\": [\n" +
"\t{\n" +
"\t\"app_id\": 57,\n" +
"\t\"user_id\": 1,\n" +
"\t\"type\": 1,\n" +
"\t\"name\": \"PersonalCollectionRecords\",\n" +
"\t\"count\": 22,\n" +
"\t\"images\": \"{\\\"map\\\":{\\\"poster\\\":[0]},\\\"list\\\":[{\\\"id\\\":47422,\\\"type\\\":2,\\\"width\\\":222,\\\"height\\\":294,\\\"fileUrl\\\":\\\"upload/image/media/2020-07-30/9a8a02db-9444-4bff-ba54-ea784ae4f88c.jpg\\\",\\\"size\\\":104643}]}\",\n" +
"\t\"id\": 756756,\n" +
"\t\"user_collection_id\": 1,\n" +
"\t\"detail_folder_code\": \"Default\",\n" +
"\t\"detail_type\": \"MEDIA\",\n" +
"\t\"detail_id\": 46532,\n" +
"\t\"detail_code\": \"media_558bc45a-5480-46ec-be9a-c749ffdbdf49\",\n" +
"\t\"detail_name\": \"熊出没之探险日记2\",\n" +
"\t\"detail_total_index\": 40,\n" +
"\t\"detail_sequence\": 1,\n" +
"\t\"create_time\": 1644503167000,\n" +
"\t\"update_time\": 1644503167000\n" +
"\t}\n" +
"\t],\n" +
"\"platformAccount\": \"topdraw\"\n" +
"}";
}
private void createFile(String filePath){
File testFile = new File(filePath);
File fileParent = testFile.getParentFile();//返回的是File类型,可以调用exsit()等方法
String fileParentPath = testFile.getParent();//返回的是String类型
System.out.println("fileParent:" + fileParent);
System.out.println("fileParentPath:" + fileParentPath);
if (!fileParent.exists()) {
fileParent.mkdirs();// 能创建多级目录
}
if (!testFile.exists()) {
try {
testFile.createNewFile();//有路径才能创建文件
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println(testFile);
}
public void writeStringToFile2(String filePath, String error) {
try {
FileWriter fw = new FileWriter(filePath, true);
BufferedWriter bw = new BufferedWriter(fw);
bw.append(LocalDateTime.now()+"=>"+error+"\n");
//bw.write("我是");// 往已有的文件上添加字符串
//bw.write("程序猿\n ");
bw.close();
fw.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
......