Commit 9cc43dc0 9cc43dc0475f2849977eb899b0749f7f99cabac4 by xianghan@topdraw.cn

V2.0.0.REALESE

1 parent ab82edc0
Showing 88 changed files with 1997 additions and 303 deletions
INSERT INTO `uc_permanent_rights` VALUES (6, '', '优享白银', 0, 1, 90.00, 10.00, 0, 2, 0, 0, '2021-10-26 18:18:49', '2021-10-26 18:18:49');
INSERT INTO `uc_permanent_rights` VALUES (7, '', '优享黄金', 0, 3, 1.00, 20.00, 1, 1, 0, 0, '2021-10-26 18:19:52', '2021-10-28 10:59:26');
INSERT INTO `uc_permanent_rights` VALUES (8, '', '优享白金', 0, 4, 2.00, 40.00, 1, 1, 1, 0, '2021-10-26 18:20:13', '2021-10-28 10:59:18');
INSERT INTO `uc_permanent_rights` VALUES (9, '', '优享钻石', 0, 2, 4.00, 80.00, 1, 1, 1, 1, '2021-10-26 18:20:39', '2021-10-28 11:56:04');
INSERT INTO `uc_permanent_rights` VALUES (10, '', '优享黑钻', 0, 6, 8.00, 160.00, 1, 2, 1, 1, '2021-10-26 18:21:09', '2021-10-28 10:58:56');
RENAME TABLE tj_user_0819.uc_user__group TO tj_user_0819.uc_member_group;
ALTER TABLE tj_user_0819.uc_member_group ADD member_id varchar(100) NULL COMMENT '会员id';
ALTER TABLE `tj_user`.`uc_member`
ADD COLUMN `vip_expire_time` datetime NULL DEFAULT NULL COMMENT 'vip失效时间' AFTER `black_status`;
\ No newline at end of file
......
......@@ -7,10 +7,10 @@
<map>
<entry key="com.zeroturnaround.jrebel.FormatVersion" value="7.0.0" />
<entry key="jrebelEnabled" value="true" />
<entry key="lastExternalPluginCheckTime" value="1636770952724" />
<entry key="lastExternalPluginCheckTime" value="1639400088018" />
</map>
</option>
<option name="version" value="6" />
<option name="version" value="7" />
</configuration>
</facet>
</component>
......
/logs/
member-service-impl.iml
/member-service-impl.iml
/src/main/resources/rebel.xml
\ No newline at end of file
......
......@@ -124,7 +124,7 @@
</profiles>
<build>
<finalName>member-service</finalName>
<finalName>uc-engine</finalName>
<resources>
<resource>
<directory>src/main/java</directory>
......
......@@ -12,6 +12,7 @@ import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.retry.annotation.EnableRetry;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.bind.annotation.CrossOrigin;
/**
* @author XiangHan
......
......@@ -52,6 +52,7 @@ public class AsyncMqProducer {
String entityName = asyncMqSend.entityName();
String methodName = asyncMqSend.method();
String exchangeName = asyncMqSend.exchangeName();
Object defaultServiceImpl = joinPoint.getTarget();
String defaultServiceImplName = defaultServiceImpl.getClass().getName();
......@@ -83,7 +84,7 @@ public class AsyncMqProducer {
}
private void sendMqMessage(TableOperationMsg tableOperationMsg){
this.messageProducer.sendFanoutMessage(JSON.toJSONString(tableOperationMsg));
this.messageProducer.sendMessage(JSON.toJSONString(tableOperationMsg));
}
}
......
......@@ -12,6 +12,7 @@ import java.sql.Timestamp;
import java.math.BigDecimal;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* @author XiangHan
......@@ -92,7 +93,7 @@ public class Coupon implements Serializable {
// 过期时间
@Column(name = "expire_time")
private Timestamp expireTime;
private LocalDateTime expireTime;
// 自领取当日,几天内有效
@Column(name = "valid_days")
......
......@@ -11,6 +11,7 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.sql.Timestamp;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* @author XiangHan
......@@ -51,7 +52,7 @@ public class CouponHistory implements Serializable {
// 失效时间
@Column(name = "expire_time")
private Timestamp expireTime;
private LocalDateTime expireTime;
// 使用状态 0:未使用;1:已使用;-1:已过期
@Column(name = "use_status")
......
......@@ -3,6 +3,7 @@ package com.topdraw.business.basicdata.coupon.history.service.dto;
import lombok.Data;
import java.sql.Timestamp;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
......@@ -31,7 +32,7 @@ public class CouponHistoryDTO implements Serializable {
private Timestamp receiveTime;
// 失效时间
private Timestamp expireTime;
private LocalDateTime expireTime;
// 使用状态 0:未使用;1:已使用;-1:已过期
private Integer useStatus;
......
......@@ -4,6 +4,7 @@ import lombok.Data;
import java.sql.Timestamp;
import java.math.BigDecimal;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
......@@ -62,7 +63,7 @@ public class CouponDTO implements Serializable {
private Timestamp startTime;
// 过期时间
private Timestamp expireTime;
private LocalDateTime expireTime;
// 自领取当日,几天内有效
private Integer validDays;
......
......@@ -57,7 +57,7 @@ public class ExpHistoryServiceImpl implements ExpHistoryService {
@Override
@Transactional(rollbackFor = Exception.class)
// @AsyncMqSend()
@AsyncMqSend()
public void create(ExpHistory resources) {
ExpHistoryRepository.save(resources);
}
......
......@@ -33,6 +33,9 @@ public class MemberAddress implements Serializable {
@Column(name = "member_id", nullable = false)
private Long memberId;
@Transient
private String memberCode;
// 类型 1:家;2:公司;3:学校
@Column(name = "type", nullable = false)
private Integer type;
......
package com.topdraw.business.basicdata.member.address.rest;
import com.topdraw.business.basicdata.member.service.MemberService;
import com.topdraw.business.basicdata.member.service.dto.MemberDTO;
import com.topdraw.common.ResultInfo;
import com.topdraw.annotation.Log;
import com.topdraw.business.basicdata.member.address.domain.MemberAddress;
......@@ -7,10 +9,13 @@ import com.topdraw.business.basicdata.member.address.service.MemberAddressServic
import com.topdraw.business.basicdata.member.address.service.dto.MemberAddressQueryCriteria;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.util.Assert;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
import java.util.Objects;
/**
* @author XiangHan
* @date 2021-10-22
......@@ -18,10 +23,13 @@ import io.swagger.annotations.*;
@Api(tags = "MemberAddress管理")
@RestController
@RequestMapping("/api/MemberAddress")
@CrossOrigin
public class MemberAddressController {
@Autowired
private MemberAddressService MemberAddressService;
@Autowired
private MemberService memberService;
@GetMapping(value = "/pageMemberAddress")
@ApiOperation("查询MemberAddress")
......@@ -47,7 +55,17 @@ public class MemberAddressController {
@PutMapping(value = "/update")
@ApiOperation("修改MemberAddress")
public ResultInfo update(@Validated @RequestBody MemberAddress resources) {
MemberAddressService.update(resources);
Long memberId = resources.getMemberId();
Integer sequence = resources.getSequence();
Assert.notNull(memberId,"memberId can't be null");
Assert.notNull(sequence,"sequence can't be null");
MemberDTO memberDTO = this.memberService.findById(memberId);
if (Objects.nonNull(memberDTO)) {
String code = memberDTO.getCode();
Assert.notNull(code,"code can't be null");
resources.setMemberCode(code);
MemberAddressService.update(resources);
}
return ResultInfo.success();
}
......
......@@ -2,6 +2,8 @@ package com.topdraw.business.basicdata.member.domain;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.topdraw.business.basicdata.member.profile.domain.MemberProfile;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.CreatedDate;
......@@ -11,6 +13,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
......@@ -23,103 +26,111 @@ import java.sql.Timestamp;
@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")
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 Timestamp bindIptvTime;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
// 是否在黑名单 1:是;0否
/** 是否在黑名单 1:是;0否 */
@Column(name = "black_status")
private Long blackStatus;
......
......@@ -27,6 +27,9 @@ import java.io.Serializable;
@Table(name="uc_member_profile")
public class MemberProfile implements Serializable {
@Transient
private String memberCode;
// 主键
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
......
......@@ -4,10 +4,13 @@ import com.topdraw.business.basicdata.member.profile.domain.MemberProfile;
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 MemberProfileRepository extends JpaRepository<MemberProfile, Long>, JpaSpecificationExecutor<MemberProfile> {
Optional<MemberProfile> findByMemberId(Long memberId);
}
......
package com.topdraw.business.basicdata.member.profile.rest;
import com.topdraw.business.basicdata.member.profile.service.dto.MemberProfileDTO;
import com.topdraw.business.basicdata.member.service.MemberService;
import com.topdraw.business.basicdata.member.service.dto.MemberDTO;
import com.topdraw.common.ResultInfo;
import com.topdraw.annotation.Log;
import com.topdraw.business.basicdata.member.profile.domain.MemberProfile;
import com.topdraw.business.basicdata.member.profile.service.MemberProfileService;
import com.topdraw.business.basicdata.member.profile.service.dto.MemberProfileQueryCriteria;
import com.topdraw.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.util.Assert;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
import java.util.Objects;
/**
* @author XiangHan
* @date 2021-10-22
......@@ -18,10 +25,13 @@ import io.swagger.annotations.*;
@Api(tags = "MemberProfile管理")
@RestController
@RequestMapping("/api/MemberProfile")
@CrossOrigin
public class MemberProfileController {
@Autowired
private MemberProfileService MemberProfileService;
@Autowired
private MemberService memberService;
/*@GetMapping
@ApiOperation("查询MemberProfile")
......@@ -47,7 +57,23 @@ public class MemberProfileController {
@PutMapping(value = "/update")
@ApiOperation("修改MemberProfile")
public ResultInfo update(@Validated @RequestBody MemberProfile resources) {
MemberProfileService.update(resources);
Long memberId = resources.getMemberId();
Assert.notNull(memberId,"memberId can't be null");
MemberDTO memberDTO = this.memberService.findById(memberId);
if (Objects.nonNull(memberDTO)) {
String code = memberDTO.getCode();
if (StringUtils.isNotEmpty(code)) {
resources.setMemberCode(code);
MemberProfileDTO memberProfile = this.MemberProfileService.findByMemberId(memberId);
if (Objects.nonNull(memberProfile)) {
resources.setId(memberProfile.getId());
MemberProfileService.update(resources);
} else {
resources.setId(null);
this.create(resources);
}
}
}
return ResultInfo.success();
}
......
......@@ -41,4 +41,5 @@ public interface MemberProfileService {
void delete(Long id);
MemberProfileDTO findByMemberId(Long memberId);
}
......
......@@ -2,6 +2,8 @@ package com.topdraw.business.basicdata.member.profile.service.impl;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.basicdata.member.profile.domain.MemberProfile;
import com.topdraw.business.basicdata.member.service.MemberService;
import com.topdraw.business.basicdata.member.service.dto.MemberDTO;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.basicdata.member.profile.repository.MemberProfileRepository;
import com.topdraw.business.basicdata.member.profile.service.MemberProfileService;
......@@ -21,6 +23,7 @@ import com.topdraw.utils.QueryHelp;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* @author XiangHan
......@@ -36,6 +39,7 @@ public class MemberProfileServiceImpl implements MemberProfileService {
@Autowired
private MemberProfileMapper MemberProfileMapper;
@Override
public Map<String, Object> queryAll(MemberProfileQueryCriteria criteria, Pageable pageable) {
Page<MemberProfile> page = MemberProfileRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
......@@ -81,5 +85,15 @@ public class MemberProfileServiceImpl implements MemberProfileService {
MemberProfileRepository.delete(MemberProfile);
}
@Override
public MemberProfileDTO findByMemberId(Long memberId) {
Optional<MemberProfile> memberProfile = MemberProfileRepository.findByMemberId(memberId);
if (memberProfile.isPresent()) {
MemberProfile memberProfile1 = memberProfile.get();
return MemberProfileMapper.toDto(memberProfile1);
}
return null;
}
}
......
......@@ -11,6 +11,7 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.sql.Timestamp;
import java.io.Serializable;
import java.time.LocalDate;
/**
* @author XiangHan
......@@ -33,6 +34,9 @@ public class MemberRelatedInfo implements Serializable {
@Column(name = "member_id", nullable = false)
private Long memberId;
@Transient
private String memberCode;
// 人物关系 0:子女;1:父母
@Column(name = "type")
private Integer type;
......@@ -53,6 +57,14 @@ public class MemberRelatedInfo implements Serializable {
@Column(name = "sex")
private Integer sex;
// 生日
@Column(name = "birthday")
private LocalDate birthday;
// 头像地址
@Column(name = "avatar_url")
private String avatarUrl;
// 创建时间
@CreatedDate
@Column(name = "create_time")
......
package com.topdraw.business.basicdata.member.relatedinfo.rest;
import com.topdraw.business.basicdata.member.service.MemberService;
import com.topdraw.business.basicdata.member.service.dto.MemberDTO;
import com.topdraw.common.ResultInfo;
import com.topdraw.annotation.Log;
import com.topdraw.business.basicdata.member.relatedinfo.domain.MemberRelatedInfo;
......@@ -8,10 +10,13 @@ import com.topdraw.business.basicdata.member.relatedinfo.service.dto.MemberRelat
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.util.Assert;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
import java.util.Objects;
/**
* @author XiangHan /api/MemberRelatedInfo
* @date 2021-10-22
......@@ -19,10 +24,13 @@ import io.swagger.annotations.*;
@Api(tags = "MemberRelatedInfo管理")
@RestController
@RequestMapping("/api/MemberRelatedInfo")
@CrossOrigin
public class MemberRelatedInfoController {
@Autowired
private MemberRelatedInfoService MemberRelatedInfoService;
@Autowired
private MemberService memberService;
@GetMapping(value = "/pageMemberRelatedInfos")
@ApiOperation("查询MemberRelatedInfo")
......@@ -42,7 +50,17 @@ public class MemberRelatedInfoController {
@PutMapping(value = "/update")
@ApiOperation("修改MemberRelatedInfo")
public ResultInfo update(@Validated @RequestBody MemberRelatedInfo resources) {
MemberRelatedInfoService.update(resources);
Long memberId = resources.getMemberId();
String idCard = resources.getIdCard();
Assert.notNull(memberId,"memberId can't be null");
Assert.notNull(idCard,"idCard can't be null");
MemberDTO memberDTO = this.memberService.findById(memberId);
if (Objects.nonNull(memberDTO)) {
String code = memberDTO.getCode();
Assert.notNull(code,"code can't be null");
resources.setMemberCode(code);
MemberRelatedInfoService.update(resources);
}
return ResultInfo.success();
}
......
package com.topdraw.business.basicdata.member.relatedinfo.service.dto;
import lombok.Data;
import javax.persistence.Column;
import java.sql.Timestamp;
import java.io.Serializable;
import java.time.LocalDate;
/**
......@@ -33,6 +36,12 @@ public class MemberRelatedInfoDTO implements Serializable {
// 性别 0:女;1:男;-1:未知
private Integer sex;
// 生日
private LocalDate birthday;
// 头像地址
private String avatarUrl;
// 创建时间
private Timestamp createTime;
......
......@@ -3,16 +3,22 @@ package com.topdraw.business.basicdata.member.rest;
import com.topdraw.annotation.Log;
import com.topdraw.business.basicdata.member.domain.Member;
import com.topdraw.business.basicdata.member.service.MemberService;
import com.topdraw.business.basicdata.member.service.dto.MemberQueryCriteria;
import com.topdraw.business.basicdata.member.service.dto.MemberDTO;
import com.topdraw.business.basicdata.user.iptv.domain.UserTv;
import com.topdraw.business.process.service.UserTvOperationService;
import com.topdraw.common.ResultInfo;
import com.topdraw.util.Base64Util;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Objects;
/**
* @author XiangHan
* @date 2021-10-22
......@@ -20,11 +26,33 @@ import org.springframework.web.bind.annotation.*;
@Api(tags = "Member管理")
@RestController
@RequestMapping("/api/member")
@CrossOrigin
public class MemberController {
@Autowired
private MemberService memberService;
@Autowired
private UserTvOperationService userTvOperationService;
@Log
@GetMapping(value = "/findById/{id}")
@ApiOperation("新增UserTv会员")
public ResultInfo findById(@PathVariable Long id) {
MemberDTO memberDTO = this.memberService.findById(id);
return ResultInfo.success(memberDTO);
}
@Log
@PostMapping(value = "/createMemberByUserTv")
@ApiOperation("新增UserTv会员")
public ResultInfo createMemberByUserTv(@Validated @RequestBody UserTv resources) {
String platformAccount = resources.getPlatformAccount();
Assert.notNull(platformAccount, "The given platformAccount must not be null!");
boolean result = this.userTvOperationService.createMemberByUserTv(resources);
return ResultInfo.success(result);
}
@Log
@PostMapping(value = "/create")
@ApiOperation("新增Member")
......@@ -45,7 +73,19 @@ public class MemberController {
@PutMapping(value = "/update")
@ApiOperation("修改Member")
public ResultInfo update(@Validated @RequestBody Member resources) {
memberService.update(resources);
Long memberId = resources.getId();
Assert.notNull(memberId,"memberId can't be null");
MemberDTO memberDTO = this.memberService.findById(memberId);
if (Objects.nonNull(memberDTO)) {
String code = memberDTO.getCode();
Assert.notNull(code, "code can't be null");
resources.setCode(code);
String nickname = resources.getNickname();
if (!StringUtils.isEmpty(nickname)) {
resources.setNickname(Base64Util.encode(nickname));
}
memberService.update(resources);
}
return ResultInfo.success();
}
......
......@@ -3,6 +3,7 @@ package com.topdraw.business.basicdata.member.service;
import com.topdraw.business.basicdata.member.domain.Member;
import com.topdraw.business.basicdata.member.service.dto.MemberDTO;
import com.topdraw.business.basicdata.member.service.dto.MemberQueryCriteria;
import com.topdraw.business.basicdata.user.iptv.domain.UserTv;
import org.springframework.data.domain.Pageable;
import java.util.List;
......@@ -48,4 +49,6 @@ public interface MemberService {
* @return MemberDTO
*/
MemberDTO getByCode(String code);
void doUpdateMemberPoints(Member member);
}
......
......@@ -4,6 +4,7 @@ import lombok.Data;
import java.io.Serializable;
import java.sql.Timestamp;
import java.time.LocalDateTime;
/**
......@@ -13,6 +14,9 @@ import java.sql.Timestamp;
@Data
public class MemberDTO implements Serializable {
// vip过期时间
private LocalDateTime vipExpireTime;
// 主键
private Long id;
......
......@@ -7,6 +7,11 @@ import com.topdraw.business.basicdata.member.service.MemberService;
import com.topdraw.business.basicdata.member.service.dto.MemberDTO;
import com.topdraw.business.basicdata.member.service.dto.MemberQueryCriteria;
import com.topdraw.business.basicdata.member.service.mapper.MemberMapper;
import com.topdraw.business.basicdata.user.iptv.domain.UserTv;
import com.topdraw.business.basicdata.user.iptv.service.UserTvService;
import com.topdraw.business.basicdata.user.iptv.service.dto.UserTvDTO;
import com.topdraw.common.ResultInfo;
import com.topdraw.config.LocalConstants;
import com.topdraw.mq.config.RabbitMqConfig;
import com.topdraw.util.IdWorker;
import com.topdraw.util.RedissonUtil;
......@@ -15,11 +20,13 @@ import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.StringUtils;
import com.topdraw.utils.ValidationUtil;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
......@@ -33,9 +40,8 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.util.Assert;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.nio.charset.StandardCharsets;
import java.util.*;
/**
* @author XiangHan
......@@ -43,7 +49,7 @@ import java.util.Objects;
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
//@CacheConfig(cacheNames = "uc-member-info")
@Slf4j
public class MemberServiceImpl implements MemberService {
@Autowired
......@@ -55,6 +61,12 @@ public class MemberServiceImpl implements MemberService {
@Autowired
private RedissonClient redissonClient;
@Autowired
PlatformTransactionManager platformTransactionManager;
@Autowired
private com.topdraw.business.basicdata.user.iptv.service.UserTvService UserTvService;
@Override
public Map<String, Object> queryAll(MemberQueryCriteria criteria, Pageable pageable) {
Page<Member> page = memberRepository.findAll((root, criteriaQuery, criteriaBuilder)
......@@ -68,6 +80,7 @@ public class MemberServiceImpl implements MemberService {
}
@Override
// @Cacheable(value = "member::memberId",key = "#p0")
public MemberDTO findById(Long id) {
Member member = memberRepository.findById(id).orElseGet(Member::new);
ValidationUtil.isNull(member.getId(),"Member","id",id);
......@@ -77,8 +90,9 @@ public class MemberServiceImpl implements MemberService {
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
@AsyncMqSend
public Long create(Member resources) {
log.info("start=====>>>>>resources======>>>>接收到的数据 --->>>> " + resources);
Member member = this.checkMemberData(resources);
memberRepository.save(member);
return member.getId();
......@@ -86,7 +100,8 @@ public class MemberServiceImpl implements MemberService {
private Member checkMemberData(Member member) {
Long defaultValue = 0L;
member.setCode(String.valueOf(IdWorker.generator()));
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();
......@@ -94,39 +109,36 @@ public class MemberServiceImpl implements MemberService {
Integer status = member.getStatus();
member.setStatus(Objects.nonNull(status) ? status:1);
Integer vip = member.getVip();
member.setVip(Objects.nonNull(vip) ? status:0);
member.setVip(Objects.nonNull(vip) ? vip:0);
Integer level = member.getLevel();
member.setLevel(Objects.nonNull(level) ? level:0);
member.setLevel(Objects.nonNull(level) ? level:1);
member.setExp(defaultValue);
member.setPoints(defaultValue);
member.setDuePoints(defaultValue);
member.setCouponAmount(defaultValue);
member.setDueCouponAmount(defaultValue);
member.setBlackStatus(0L);
String nickname = member.getNickname();
if (StringUtils.isEmpty(nickname)) {
nickname = "未设置";
}
String base64Nickname = new String(Base64.getEncoder().encode(nickname.getBytes(StandardCharsets.UTF_8)));
member.setNickname(base64Nickname);
return member;
}
@Autowired
PlatformTransactionManager platformTransactionManager;
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
@CacheEvict(value = "member::memberId",key = "#p0.id")
public void update(Member resources) {
RLock rLock = this.redissonClient.getLock("updateMember" + resources.getId().toString());
RLock rLock = this.redissonClient.getLock("member::update::id" + resources.getId().toString());
try {
RedissonUtil.lock(rLock);
String name = Thread.currentThread().getName();
System.out.println("=============>>>>【name】 ===== >> " + name + " =======>> start ===>> ");
System.out.println("=============>>>>【name】 ===== >> " + name + " =======>> 【resources】 ===>> " + resources);
Member member = memberRepository.findById(resources.getId()).orElseGet(Member::new);
ValidationUtil.isNull(member.getId(), "Member", "id", resources.getId());
System.out.println("=============>>>>【name】 ===== >> " + name + " =======>> 【member-search】 ===>> " + member);
member.copy(resources);
this.save(member);
// platformTransactionManager.commit(transaction);
System.out.println("=============>>>>【name】 ===== >> " + name + " =======>> 【exp】 ===>> " + member.getExp());
System.out.println("=============>>>>【name】 ===== >> " + name + " =======>> 【point】 ===>> " + member.getPoints());
System.out.println("=============>>>>【name】 ===== >> " + name + " =======>> 【member】 ===>> " + member);
} catch (Exception e) {
e.printStackTrace();
throw e;
......@@ -135,8 +147,7 @@ public class MemberServiceImpl implements MemberService {
}
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void save(Member member){
private void save(Member member){
memberRepository.save(member);
}
......@@ -145,9 +156,18 @@ public class MemberServiceImpl implements MemberService {
@AsyncMqSend()
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
Member member = memberRepository.findById(id).orElseThrow(
RLock rLock = this.redissonClient.getLock("member::delete::id" + 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);
memberRepository.delete(member);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(rLock);
}
}
......@@ -156,4 +176,23 @@ public class MemberServiceImpl implements MemberService {
return StringUtils.isNotEmpty(code) ? memberMapper.toDto(memberRepository.findFirstByCode(code).orElseGet(Member::new))
: new MemberDTO();
}
@Override
public void doUpdateMemberPoints(Member resources) {
RLock rLock = this.redissonClient.getLock("member::update::id" + resources.getId().toString());
try {
RedissonUtil.lock(rLock);
Member member = memberRepository.findById(resources.getId()).orElseGet(Member::new);
ValidationUtil.isNull(member.getId(), "Member", "id", resources.getId());
member.copy(resources);
this.save(member);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(rLock);
}
}
}
......
......@@ -10,6 +10,7 @@ import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.UUID;
import java.io.Serializable;
......@@ -27,6 +28,10 @@ import java.io.Serializable;
@Table(name="uc_points_available")
public class PointsAvailable implements Serializable {
/** 会员编号 */
@Transient
private String memberCode;
// 主键
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
......@@ -54,9 +59,9 @@ public class PointsAvailable implements Serializable {
private Long points;
// 过期时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Column(name = "expire_time")
private Timestamp expireTime;
private LocalDateTime expireTime;
// 描述
@Column(name = "description")
......
......@@ -10,6 +10,7 @@ import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.Optional;
......@@ -24,7 +25,7 @@ public interface PointsAvailableRepository extends JpaRepository<PointsAvailable
List<PointsAvailableDTO> findByMemberId(Long memberId);
List<PointsAvailable> findByMemberIdAndExpireTimeBefore(Long memberId , Date now);
List<PointsAvailable> findByMemberIdAndExpireTimeBefore(Long memberId , LocalDateTime now);
/**
* 即将过期的积分
......@@ -75,7 +76,7 @@ public interface PointsAvailableRepository extends JpaRepository<PointsAvailable
* @param memberId
* @return
*/
@Query(value = "SELECT sum(upa.points) AS pointsExpire from uc_points_available upa where upa.member_id = ?1 and upa.expire_time > now()"
@Query(value = "SELECT sum(upa.points) AS pointsExpire from uc_points_available upa where upa.member_id = ?1 and (upa.expire_time > now() or upa.expire_time is null)"
,nativeQuery = true)
Long findAvailablePointsByMemberId(long memberId);
......
......@@ -3,15 +3,12 @@ package com.topdraw.business.basicdata.points.available.service;
import com.topdraw.business.basicdata.points.available.domain.PointsAvailable;
import com.topdraw.business.basicdata.points.available.service.dto.PointsAvailableDTO;
import com.topdraw.business.basicdata.points.available.service.dto.PointsAvailableQueryCriteria;
import com.topdraw.business.process.domian.TempPoints;
import org.springframework.data.domain.Pageable;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Map;
import java.util.List;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
/**
* @author XiangHan
......@@ -78,9 +75,7 @@ public interface PointsAvailableService {
* @param timestamp
* @return
*/
List<PointsAvailableDTO> findByMemberIdAndExpireTimeBefore(Long memberId, Date timestamp);
List<PointsAvailableDTO> findByMemberIdAndExpireTimeAfter(Long memberId, Date timestamp);
List<PointsAvailableDTO> findByMemberIdAndExpireTimeBefore(Long memberId, LocalDateTime timestamp);
/**
* 即将过期的积分
......@@ -91,14 +86,6 @@ public interface PointsAvailableService {
Long findSoonExpireTime(Long memberId,Integer factor);
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> findByMemberIdAndExpireTimeBefore(PointsAvailableQueryCriteria criteria, Pageable pageable);
/**
*
* @param memberId
* @return
......@@ -106,38 +93,20 @@ public interface PointsAvailableService {
List<PointsAvailableDTO> findByMemberIdOrderByExpireTime(Long memberId);
/**
* 可用总积分
* @param criteria 条件参数
* @return Map<String,Object>
*/
Long findEveryDayPointsAvailable(PointsAvailableQueryCriteria criteria);
/**
* 总积分
* @param criteria
* @return
*/
Long findEveryDayPointsProduce(PointsAvailableQueryCriteria criteria);
/**
* 积分消耗
* @param criteria
*
* @param memberId
* @return
*/
Long findEveryDayPointsConsume(PointsAvailableQueryCriteria criteria);
long findAvailablePointsByMemberId(long memberId);
/**
* 积分过期
* @param criteria
*
* @param memberId
* @return
*/
Long findEveryDayPointsExpire(PointsAvailableQueryCriteria criteria);
long findAvailablePointsByMemberId(long memberId);
long findTotalPointsByMemberId(Long memberId);
List<PointsAvailableDTO> findByExpireTimeBefore(Timestamp now);
void delete4Custom(Long id);
long findTotalPointsByMemberId(Long memberId);
void create4Custom(PointsAvailable pointsAvailable);
}
......
......@@ -3,6 +3,7 @@ package com.topdraw.business.basicdata.points.available.service.dto;
import lombok.Data;
import java.sql.Timestamp;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
......@@ -31,7 +32,7 @@ public class PointsAvailableDTO implements Serializable {
private Long points;
// 过期时间
private Timestamp expireTime;
private LocalDateTime expireTime;
// 描述
private String description;
......
package com.topdraw.business.basicdata.points.available.service.impl;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.basicdata.points.available.domain.PointsAvailable;
import com.topdraw.util.RedissonUtil;
import com.topdraw.util.TimestampUtil;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.basicdata.points.available.repository.PointsAvailableRepository;
import com.topdraw.business.basicdata.points.available.service.PointsAvailableService;
......@@ -24,6 +24,7 @@ import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.StringUtils;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.*;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
......@@ -53,11 +54,6 @@ public class PointsAvailableServiceImpl implements PointsAvailableService {
}
@Override
public Map<String, Object> findByMemberIdAndExpireTimeBefore(PointsAvailableQueryCriteria criteria, Pageable pageable) {
return this.queryAll(criteria,pageable);
}
@Override
public List<PointsAvailableDTO> findByMemberIdOrderByExpireTime(Long memberId) {
return PointsAvailableMapper.toDto(PointsAvailableRepository.findByMemberIdOrderByExpireTime(memberId));
}
......@@ -76,14 +72,24 @@ public class PointsAvailableServiceImpl implements PointsAvailableService {
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend
public void create(PointsAvailable resources) {
PointsAvailableRepository.save(resources);
RLock rLock = this.redissonClient.getLock("PointsAvailable::create::id"+resources.getMemberId().toString());
try {
RedissonUtil.lock(rLock);
PointsAvailableRepository.save(resources);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(rLock);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(PointsAvailable resources) {
RLock rLock = this.redissonClient.getLock("updatePointsAvailable"+resources.getId().toString());
RLock rLock = this.redissonClient.getLock("PointsAvailable::update::id"+resources.getMemberId().toString());
try {
RedissonUtil.lock(rLock);
PointsAvailable PointsAvailable = PointsAvailableRepository.findById(resources.getId()).orElseGet(PointsAvailable::new);
......@@ -102,14 +108,33 @@ public class PointsAvailableServiceImpl implements PointsAvailableService {
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
PointsAvailable PointsAvailable = PointsAvailableRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", PointsAvailable.class, id), 1));
PointsAvailableRepository.delete(PointsAvailable);
RLock rLock = this.redissonClient.getLock("PointsAvailable::delete::id"+id);
try {
RedissonUtil.lock(rLock);
PointsAvailable PointsAvailable = PointsAvailableRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", PointsAvailable.class, id), 1));
PointsAvailableRepository.delete(PointsAvailable);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(rLock);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteBatchByIds(List<Long> id) {
PointsAvailableRepository.deleteBatchByIds(id);
RLock rLock = this.redissonClient.getLock("PointsAvailable::create::id"+id.get(0));
try {
RedissonUtil.lock(rLock);
PointsAvailableRepository.deleteBatchByIds(id);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(rLock);
}
}
......@@ -120,45 +145,17 @@ public class PointsAvailableServiceImpl implements PointsAvailableService {
}
@Override
public List<PointsAvailableDTO> findByMemberIdAndExpireTimeBefore(Long memberId, Date timestamp) {
public List<PointsAvailableDTO> findByMemberIdAndExpireTimeBefore(Long memberId, LocalDateTime timestamp) {
return Objects.nonNull(memberId)?
PointsAvailableMapper.toDto(PointsAvailableRepository.findByMemberIdAndExpireTimeBefore(memberId, timestamp))
:null;
}
@Override
public List<PointsAvailableDTO> findByMemberIdAndExpireTimeAfter(Long memberId, Date timestamp) {
return Objects.nonNull(memberId)?
PointsAvailableMapper.toDto(PointsAvailableRepository.findByMemberIdAndExpireTimeAfter(memberId, timestamp))
:null;
}
@Override
public Long findSoonExpireTime(Long memberId, Integer factor) {
return PointsAvailableRepository.findSoonExpireTime(memberId, factor);
}
@Override
public Long findEveryDayPointsAvailable(PointsAvailableQueryCriteria criteria) {
return PointsAvailableRepository.findEveryDayPointsAvailable(criteria);
}
@Override
public Long findEveryDayPointsProduce(PointsAvailableQueryCriteria criteria) {
return this.PointsAvailableRepository.findEveryDayPointsProduce(criteria);
}
@Override
public Long findEveryDayPointsConsume(PointsAvailableQueryCriteria criteria) {
return 0L;
}
@Override
public Long findEveryDayPointsExpire(PointsAvailableQueryCriteria criteria) {
return this.PointsAvailableRepository.findEveryDayPointsExpire(criteria);
}
@Override
public long findAvailablePointsByMemberId(long memberId) {
Long availablePoints = this.PointsAvailableRepository.findAvailablePointsByMemberId(memberId);
......@@ -166,13 +163,39 @@ public class PointsAvailableServiceImpl implements PointsAvailableService {
}
@Override
public List<PointsAvailableDTO> findByExpireTimeBefore(Timestamp now) {
return PointsAvailableMapper.toDto(this.PointsAvailableRepository.findByExpireTimeBefore(now));
public long findTotalPointsByMemberId(Long memberId) {
return this.PointsAvailableRepository.findTotalCountByMemberId(memberId);
}
@Override
public long findTotalPointsByMemberId(Long memberId) {
return this.PointsAvailableRepository.findTotalCountByMemberId(memberId);
public void delete4Custom(Long id) {
Assert.notNull(id, "The given id must not be null!");
RLock rLock = this.redissonClient.getLock("PointsAvailable::delete::id"+id);
try {
RedissonUtil.lock(rLock);
PointsAvailable PointsAvailable = PointsAvailableRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", PointsAvailable.class, id), 1));
PointsAvailableRepository.delete(PointsAvailable);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(rLock);
}
}
@Override
public void create4Custom(PointsAvailable resources) {
RLock rLock = this.redissonClient.getLock("PointsAvailable::create::id"+resources.getMemberId().toString());
try {
RedissonUtil.lock(rLock);
PointsAvailableRepository.save(resources);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(rLock);
}
}
}
......
......@@ -23,6 +23,9 @@ import java.io.Serializable;
@Table(name="uc_points_detail")
public class PointsDetail implements Serializable {
@Transient
private String memberCode;
// 主键
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
......
......@@ -60,4 +60,6 @@ public interface PointsDetailService {
* @return
*/
List<PointsDetailDTO> findByMemberId(Long memberId);
void create4Custom(PointsDetail pointsDetail);
}
......
......@@ -59,14 +59,13 @@ public class PointsDetailServiceImpl implements PointsDetailService {
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
@AsyncMqSend
public void create(PointsDetail resources) {
PointsDetailRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void update(PointsDetail resources) {
PointsDetail PointsDetail = PointsDetailRepository.findById(resources.getId()).orElseGet(PointsDetail::new);
ValidationUtil.isNull( PointsDetail.getId(),"PointsDetail","id",resources.getId());
......@@ -76,7 +75,6 @@ public class PointsDetailServiceImpl implements PointsDetailService {
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
PointsDetail PointsDetail = PointsDetailRepository.findById(id).orElseThrow(
......@@ -102,4 +100,9 @@ public class PointsDetailServiceImpl implements PointsDetailService {
PointsDetailMapper.toDto(PointsDetailRepository.findByMemberId(memberId))
:null;
}
@Override
public void create4Custom(PointsDetail pointsDetail) {
PointsDetailRepository.save(pointsDetail);
}
}
......
......@@ -11,6 +11,7 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.sql.Timestamp;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* @author XiangHan
......@@ -54,7 +55,7 @@ public class RightsHistory implements Serializable {
// 失效时间
@Column(name = "expire_time")
private Timestamp expireTime;
private LocalDateTime expireTime;
@CreatedDate
@Column(name = "create_time")
......
......@@ -5,6 +5,7 @@ import lombok.Data;
import javax.persistence.Column;
import java.sql.Timestamp;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
......@@ -33,7 +34,7 @@ public class RightsHistoryDTO implements Serializable {
private Timestamp sendTime;
// 失效时间
private Timestamp expireTime;
private LocalDateTime expireTime;
private Timestamp createTime;
......
......@@ -11,6 +11,7 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.sql.Timestamp;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* @author XiangHan
......@@ -50,7 +51,7 @@ public class Task implements Serializable {
// 任务失效时间
@Column(name = "expire_time")
private Timestamp expireTime;
private LocalDateTime expireTime;
// 显示顺序
@Column(name = "sequence")
......
......@@ -5,6 +5,7 @@ import lombok.Data;
import javax.persistence.Column;
import java.sql.Timestamp;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
......@@ -32,7 +33,7 @@ public class TaskDTO implements Serializable {
private Timestamp validTime;
// 任务失效时间
private Timestamp expireTime;
private LocalDateTime expireTime;
// 显示顺序
private Integer sequence;
......
package com.topdraw.business.basicdata.user.iptv.domain;
import lombok.Data;
import lombok.experimental.Accessors;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import javax.persistence.*;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2021-12-16
*/
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_user_tv")
public class UserTv implements Serializable {
@Transient
private String memberCode;
// ID
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 人ID
@Column(name = "person_id")
private Long personId;
// 运营商平台
@Column(name = "platform")
private String platform;
// 运营商平台账号
@Column(name = "platform_account")
private String platformAccount;
// 手机号
@Column(name = "cellphone")
private String cellphone;
// 用户名
@Column(name = "username")
private String username;
// 密码 MD5
@Column(name = "password")
private String password;
// 昵称 Base64
@Column(name = "nickname")
private String nickname;
// 头像
@Column(name = "image")
private String image;
// 登录天数(总天数)
@Column(name = "login_days")
private Integer loginDays;
// 连续登录天数
@Column(name = "continue_days")
private Integer continueDays;
// 活跃时间
@Column(name = "active_time")
private Timestamp activeTime;
// 分组 分组ID用逗号分隔
@Column(name = "groups")
private String groups;
// 标签 标签用逗号分隔
@Column(name = "tags")
private String tags;
// 登录类型 1-运营商隐式登录 2-手机验证登录 3-微信登录 4-QQ登录 5-微博登录 6-苹果登录
@Column(name = "login_type")
private Integer loginType;
// 状态 0-下线 1-上线
@Column(name = "status")
private Integer status;
// 描述
@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;
// 会员id
@Column(name = "member_id")
private Long memberId;
public void copy(UserTv source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}
}
package com.topdraw.business.basicdata.user.iptv.repository;
import com.topdraw.business.basicdata.user.iptv.domain.UserTv;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.util.Optional;
/**
* @author XiangHan
* @date 2021-12-16
*/
public interface UserTvRepository extends JpaRepository<UserTv, Long>, JpaSpecificationExecutor<UserTv> {
Optional<UserTv> findByPlatformAccount(String platformAccount);
}
package com.topdraw.business.basicdata.user.iptv.rest;
import com.topdraw.business.basicdata.member.domain.Member;
import com.topdraw.business.basicdata.member.service.MemberService;
import com.topdraw.business.basicdata.user.iptv.service.dto.UserTvDTO;
import com.topdraw.common.ResultInfo;
import com.topdraw.annotation.Log;
import com.topdraw.business.basicdata.user.iptv.domain.UserTv;
import com.topdraw.business.basicdata.user.iptv.service.UserTvService;
import com.topdraw.business.basicdata.user.iptv.service.dto.UserTvQueryCriteria;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.Assert;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
import java.io.IOException;
import java.util.Objects;
import javax.servlet.http.HttpServletResponse;
/**
* @author XiangHan
* @date 2021-12-16
*/
@Api(tags = "UserTv管理")
@RestController
@RequestMapping("/api/UserTv")
public class UserTvController {
@Autowired
private UserTvService UserTvService;
@GetMapping
@ApiOperation("查询UserTv")
public ResultInfo getUserTvs(UserTvQueryCriteria criteria, Pageable pageable) {
return ResultInfo.successPage(UserTvService.queryAll(criteria,pageable));
}
@GetMapping(value = "/all")
@ApiOperation("查询所有UserTv")
public ResultInfo getUserTvs(UserTvQueryCriteria criteria) {
return ResultInfo.success(UserTvService.queryAll(criteria));
}
@Log
@PostMapping
@ApiOperation("新增UserTv")
public ResultInfo create(@Validated @RequestBody UserTv resources) {
UserTvService.create(resources);
return ResultInfo.success();
}
@Log
@PutMapping
@ApiOperation("修改UserTv")
public ResultInfo update(@Validated @RequestBody UserTv resources) {
UserTvService.update(resources);
return ResultInfo.success();
}
@Log
@DeleteMapping(value = "/{id}")
@ApiOperation("删除UserTv")
public ResultInfo delete(@PathVariable Long id) {
UserTvService.delete(id);
return ResultInfo.success();
}
}
package com.topdraw.business.basicdata.user.iptv.service;
import com.topdraw.business.basicdata.user.iptv.domain.UserTv;
import com.topdraw.business.basicdata.user.iptv.service.dto.UserTvDTO;
import com.topdraw.business.basicdata.user.iptv.service.dto.UserTvQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.Map;
import java.util.List;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
/**
* @author XiangHan
* @date 2021-12-16
*/
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);
void update(UserTv resources);
void delete(Long id);
UserTvDTO findByPlatformAccount(String platformAccount);
}
package com.topdraw.business.basicdata.user.iptv.service.dto;
import lombok.Data;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2021-12-16
*/
@Data
public class UserTvDTO implements Serializable {
// ID
private Long id;
// 人ID
private Long personId;
// 运营商平台
private String platform;
// 运营商平台账号
private String platformAccount;
// 手机号
private String cellphone;
// 用户名
private String username;
// 密码 MD5
private String password;
// 昵称 Base64
private String nickname;
// 头像
private String image;
// 登录天数(总天数)
private Integer loginDays;
// 连续登录天数
private Integer continueDays;
// 活跃时间
private Timestamp activeTime;
// 分组 分组ID用逗号分隔
private String groups;
// 标签 标签用逗号分隔
private String tags;
// 登录类型 1-运营商隐式登录 2-手机验证登录 3-微信登录 4-QQ登录 5-微博登录 6-苹果登录
private Integer loginType;
// 状态 0-下线 1-上线
private Integer status;
// 描述
private String description;
// 创建者
private String createBy;
// 创建时间
private Timestamp createTime;
// 更新者
private String updateBy;
// 更新时间
private Timestamp updateTime;
// 会员id
private Long memberId;
}
package com.topdraw.business.basicdata.user.iptv.service.dto;
import lombok.Data;
import com.topdraw.annotation.Query;
/**
* @author XiangHan
* @date 2021-12-16
*/
@Data
public class UserTvQueryCriteria{
}
package com.topdraw.business.basicdata.user.iptv.service.impl;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.basicdata.member.domain.Member;
import com.topdraw.business.basicdata.member.service.MemberService;
import com.topdraw.business.basicdata.member.service.dto.MemberDTO;
import com.topdraw.business.basicdata.user.iptv.domain.UserTv;
import com.topdraw.config.LocalConstants;
import com.topdraw.util.IdWorker;
import com.topdraw.util.RedissonUtil;
import com.topdraw.util.TimestampUtil;
import com.topdraw.utils.StringUtils;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.basicdata.user.iptv.repository.UserTvRepository;
import com.topdraw.business.basicdata.user.iptv.service.UserTvService;
import com.topdraw.business.basicdata.user.iptv.service.dto.UserTvDTO;
import com.topdraw.business.basicdata.user.iptv.service.dto.UserTvQueryCriteria;
import com.topdraw.business.basicdata.user.iptv.service.mapper.UserTvMapper;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.util.Assert;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
/**
* @author XiangHan
* @date 2021-12-16
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class UserTvServiceImpl implements UserTvService {
@Autowired
private UserTvRepository UserTvRepository;
@Autowired
private UserTvMapper UserTvMapper;
@Autowired
private MemberService memberService;
@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));
}
@Override
public List<UserTvDTO> queryAll(UserTvQueryCriteria criteria) {
return UserTvMapper.toDto(UserTvRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
@Override
public UserTvDTO findById(Long id) {
UserTv UserTv = UserTvRepository.findById(id).orElseGet(UserTv::new);
ValidationUtil.isNull(UserTv.getId(),"UserTv","id",id);
return UserTvMapper.toDto(UserTv);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend
public Long create(UserTv resources) {
MemberDTO memberDTO = memberService.getByCode(resources.getMemberCode());
if (Objects.nonNull(memberDTO)) {
Long id = memberDTO.getId();
resources.setMemberId(id);
UserTvRepository.save(resources);
return resources.getId();
}
return null;
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend
public void update(UserTv resources) {
UserTv UserTv = UserTvRepository.findById(resources.getId()).orElseGet(UserTv::new);
ValidationUtil.isNull( UserTv.getId(),"UserTv","id",resources.getId());
UserTv.copy(resources);
UserTvRepository.save(UserTv);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend
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);
}
@Override
public UserTvDTO findByPlatformAccount(String platformAccount) {
Optional<UserTv> userTv = UserTvRepository.findByPlatformAccount(platformAccount);
if (userTv.isPresent()) {
ValidationUtil.isNull( userTv.get().getId(),"UserTv","id",userTv.get().getId());
return UserTvMapper.toDto(userTv.get());
}
return null;
}
}
package com.topdraw.business.basicdata.user.iptv.service.mapper;
import com.topdraw.base.BaseMapper;
import com.topdraw.business.basicdata.user.iptv.domain.UserTv;
import com.topdraw.business.basicdata.user.iptv.service.dto.UserTvDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
/**
* @author XiangHan
* @date 2021-12-16
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface UserTvMapper extends BaseMapper<UserTvDTO, UserTv> {
}
package com.topdraw.business.basicdata.user.weixin.domain;
import lombok.Data;
import lombok.experimental.Accessors;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import javax.persistence.*;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2021-12-16
*/
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_user_weixin")
public class UserWeixin implements Serializable {
// ID
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 用户ID
@Column(name = "member_id")
private Long memberId;
// 微信unionid,针对开发者
@Column(name = "unionid")
private String unionid;
// 微信appid
@Column(name = "appid")
private String appid;
// 微信openid,针对微信app
@Column(name = "openid")
private String openid;
// 关注状态 0 -未关注 1 - 已关注
@Column(name = "status")
private Integer status;
// 关注同步状态 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 Timestamp expiresTime;
// 描述
@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;
// 来源类型
@Column(name = "source_type")
private String sourceType;
// 来源id
@Column(name = "source_id")
private String sourceId;
// 来源id
@Column(name = "source_desc")
private String sourceDesc;
// 人id
@Column(name = "person_id")
private Long personId;
// 来源用户id
@Column(name = "source_user")
private Long sourceUser;
// 来源实体:活动-activity/商品-item
@Column(name = "source_entity")
private String sourceEntity;
// 授权时间
@Column(name = "auth_time")
private Timestamp authTime;
@Column(name = "sex")
private Integer sex;
@Column(name = "country")
private String country;
@Column(name = "province")
private String province;
@Column(name = "city")
private String city;
public void copy(UserWeixin source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}
}
package com.topdraw.business.basicdata.user.weixin.repository;
import com.topdraw.business.basicdata.user.weixin.domain.UserWeixin;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.util.Optional;
/**
* @author XiangHan
* @date 2021-12-16
*/
public interface UserWeixinRepository extends JpaRepository<UserWeixin, Long>, JpaSpecificationExecutor<UserWeixin> {
}
package com.topdraw.business.basicdata.user.weixin.rest;
import com.topdraw.common.ResultInfo;
import com.topdraw.annotation.Log;
import com.topdraw.business.basicdata.user.weixin.domain.UserWeixin;
import com.topdraw.business.basicdata.user.weixin.service.UserWeixinService;
import com.topdraw.business.basicdata.user.weixin.service.dto.UserWeixinQueryCriteria;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
/**
* @author XiangHan
* @date 2021-12-16
*/
@Api(tags = "UserWeixin管理")
@RestController
@RequestMapping("/api/UserWeixin")
public class UserWeixinController {
@Autowired
private UserWeixinService UserWeixinService;
@GetMapping
@ApiOperation("查询UserWeixin")
public ResultInfo getUserWeixins(UserWeixinQueryCriteria criteria, Pageable pageable) {
return ResultInfo.successPage(UserWeixinService.queryAll(criteria,pageable));
}
@GetMapping(value = "/all")
@ApiOperation("查询所有UserWeixin")
public ResultInfo getUserWeixins(UserWeixinQueryCriteria criteria) {
return ResultInfo.success(UserWeixinService.queryAll(criteria));
}
@Log
@PostMapping
@ApiOperation("新增UserWeixin")
public ResultInfo create(@Validated @RequestBody UserWeixin resources) {
UserWeixinService.create(resources);
return ResultInfo.success();
}
@Log
@PutMapping
@ApiOperation("修改UserWeixin")
public ResultInfo update(@Validated @RequestBody UserWeixin resources) {
UserWeixinService.update(resources);
return ResultInfo.success();
}
@Log
@DeleteMapping(value = "/{id}")
@ApiOperation("删除UserWeixin")
public ResultInfo delete(@PathVariable Long id) {
UserWeixinService.delete(id);
return ResultInfo.success();
}
}
package com.topdraw.business.basicdata.user.weixin.service;
import com.topdraw.business.basicdata.user.weixin.domain.UserWeixin;
import com.topdraw.business.basicdata.user.weixin.service.dto.UserWeixinDTO;
import com.topdraw.business.basicdata.user.weixin.service.dto.UserWeixinQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.Map;
import java.util.List;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
/**
* @author XiangHan
* @date 2021-12-16
*/
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 create(UserWeixin resources);
void update(UserWeixin resources);
void delete(Long id);
}
package com.topdraw.business.basicdata.user.weixin.service.dto;
import lombok.Data;
import java.sql.Timestamp;
import java.io.Serializable;
/**
* @author XiangHan
* @date 2021-12-16
*/
@Data
public class UserWeixinDTO implements Serializable {
// ID
private Long id;
// 用户ID
private Long memberId;
// 微信unionid,针对开发者
private String unionid;
// 微信appid
private String appid;
// 微信openid,针对微信app
private String openid;
// 关注状态 0 -未关注 1 - 已关注
private Integer status;
// 关注同步状态 0-未同步,1-已同步
private Integer syncStatus;
// 昵称
private String nickname;
// 头像地址
private String headimgurl;
// 特权信息
private String privilege;
// 刷新凭据
private String refreshToken;
// 凭据
private String accessToken;
// 超时(秒)
private Integer expiresIn;
// 超时时间
private Timestamp expiresTime;
// 描述
private String description;
// 创建者
private String createBy;
// 创建时间
private Timestamp createTime;
// 更新者
private String updateBy;
// 更新时间
private Timestamp updateTime;
// 来源类型
private String sourceType;
// 来源id
private String sourceId;
// 来源id
private String sourceDesc;
// 人id
private Long personId;
// 来源用户id
private Long sourceUser;
// 来源实体:活动-activity/商品-item
private String sourceEntity;
// 授权时间
private Timestamp authTime;
private Integer sex;
private String country;
private String province;
private String city;
}
package com.topdraw.business.basicdata.user.weixin.service.dto;
import lombok.Data;
import com.topdraw.annotation.Query;
/**
* @author XiangHan
* @date 2021-12-16
*/
@Data
public class UserWeixinQueryCriteria{
}
package com.topdraw.business.basicdata.user.weixin.service.impl;
import com.topdraw.business.basicdata.user.weixin.domain.UserWeixin;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.utils.FileUtil;
import com.topdraw.business.basicdata.user.weixin.repository.UserWeixinRepository;
import com.topdraw.business.basicdata.user.weixin.service.UserWeixinService;
import com.topdraw.business.basicdata.user.weixin.service.dto.UserWeixinDTO;
import com.topdraw.business.basicdata.user.weixin.service.dto.UserWeixinQueryCriteria;
import com.topdraw.business.basicdata.user.weixin.service.mapper.UserWeixinMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.util.Assert;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.StringUtils;
import java.util.List;
import java.util.Map;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.LinkedHashMap;
/**
* @author XiangHan
* @date 2021-12-16
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class UserWeixinServiceImpl implements UserWeixinService {
@Autowired
private UserWeixinRepository UserWeixinRepository;
@Autowired
private UserWeixinMapper UserWeixinMapper;
@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)));
}
@Override
public UserWeixinDTO findById(Long id) {
UserWeixin UserWeixin = UserWeixinRepository.findById(id).orElseGet(UserWeixin::new);
ValidationUtil.isNull(UserWeixin.getId(),"UserWeixin","id",id);
return UserWeixinMapper.toDto(UserWeixin);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(UserWeixin resources) {
UserWeixinRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(UserWeixin resources) {
UserWeixin UserWeixin = UserWeixinRepository.findById(resources.getId()).orElseGet(UserWeixin::new);
ValidationUtil.isNull( UserWeixin.getId(),"UserWeixin","id",resources.getId());
UserWeixin.copy(resources);
UserWeixinRepository.save(UserWeixin);
}
@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);
}
}
package com.topdraw.business.basicdata.user.weixin.service.mapper;
import com.topdraw.base.BaseMapper;
import com.topdraw.business.basicdata.user.weixin.domain.UserWeixin;
import com.topdraw.business.basicdata.user.weixin.service.dto.UserWeixinDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
/**
* @author XiangHan
* @date 2021-12-16
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface UserWeixinMapper extends BaseMapper<UserWeixinDTO, UserWeixin> {
}
package com.topdraw.business.process.domian;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Transient;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TempIptvUser {
// 账户
@Transient
private String platformAccount;
// 分数
@Transient
private Long points;
}
......@@ -24,7 +24,6 @@ public class TempPoints extends TempRights {
// 积分类型 0:通用
@Transient
@NotNull(message = "【pointsType】积分类型不得为空!!")
protected Integer pointsType;
@Transient
......
......@@ -7,6 +7,7 @@ import lombok.NoArgsConstructor;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import java.sql.Timestamp;
import java.time.LocalDateTime;
/**
* 权益-非持久化数据
......@@ -30,11 +31,14 @@ public class TempRights {
/** 会员ID */
@Transient
@NotNull(message = "")
protected Long memberId;
/** 会员编号 */
@Transient
protected String memberCode;
/** 账号id */
@Transient
@Transient
protected Long userId;
/** 发放策略 */
......@@ -43,21 +47,20 @@ public class TempRights {
/** 账号id */
@Transient
private Long accountId;
protected Long accountId;
/** 过期时间 */
@Transient
protected Timestamp expireTime;
protected LocalDateTime expireTime;
/** 设备类型 1:大屏;2:小屏(微信)3.小屏(xx) */
@Transient
@NotNull(message = "")
@NotNull(message = "设备类型不得为空")
protected Integer deviceType;
/** 应用code(表示当前用户对应应用的标识) */
@Transient
// @NotNull
protected String appCode;
/** 订单id */
......
package com.topdraw.business.process.domian.result;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CustomPointsResult {
private boolean result;
private Long point;
}
package com.topdraw.business.process.rest;
import com.topdraw.annotation.Log;
import com.topdraw.business.basicdata.member.domain.Member;
import com.topdraw.business.basicdata.member.service.MemberService;
import com.topdraw.business.basicdata.member.service.dto.MemberDTO;
import com.topdraw.business.basicdata.points.available.service.PointsAvailableService;
import com.topdraw.business.basicdata.points.available.service.dto.PointsAvailableQueryCriteria;
import com.topdraw.business.basicdata.points.available.service.dto.PointsAvailableQueryType;
import com.topdraw.business.basicdata.points.detail.service.PointsDetailService;
import com.topdraw.business.basicdata.points.detail.service.dto.PointsDetailQueryCriteria;
import com.topdraw.business.basicdata.user.iptv.domain.UserTv;
import com.topdraw.business.basicdata.user.iptv.service.UserTvService;
import com.topdraw.business.basicdata.user.iptv.service.dto.UserTvDTO;
import com.topdraw.business.basicdata.user.weixin.service.UserWeixinService;
import com.topdraw.business.basicdata.user.weixin.service.dto.UserWeixinDTO;
import com.topdraw.business.process.domian.TempIptvUser;
import com.topdraw.business.process.domian.TempPoints;
import com.topdraw.business.process.domian.result.CustomPointsResult;
import com.topdraw.business.process.service.PointsOperationService;
import com.topdraw.business.process.service.UserTvOperationService;
import com.topdraw.common.ResultCode;
import com.topdraw.common.ResultInfo;
import com.topdraw.config.LocalConstants;
import com.topdraw.util.TimestampUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.Data;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -21,6 +36,7 @@ import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
......@@ -30,7 +46,7 @@ import java.util.Objects;
*/
@Api(tags = "PointsOperation管理")
@RestController
@RequestMapping("/api/PointsOperation")
@RequestMapping("/api/pointsOperation")
public class PointsOperationController {
private static final Logger LOG = LoggerFactory.getLogger(PointsOperationController.class);
......@@ -41,6 +57,13 @@ public class PointsOperationController {
PointsDetailService pointsDetailService;
@Autowired
PointsAvailableService pointsAvailableService;
@Autowired
UserTvService userTvService;
@Autowired
UserWeixinService userWeixinService;
@Autowired
MemberService memberService;
@GetMapping(value = "/pagePointsDetails")
@ApiOperation("查询PointsDetail")
......@@ -67,32 +90,116 @@ public class PointsOperationController {
return ResultInfo.success(Objects.isNull(aLong) ? 0L : aLong);
}
/*@Log
@PostMapping(value = "/cleanInvalidPointsAndCalculateCurrentPointsByMemberIds")
@ApiOperation("清除过期积分并计算总积分,管理端使用")
public ResultInfo cleanInvalidPointsAndCalculateCurrentPointsByMemberIds(List<Long> memberIds) {
if (!CollectionUtils.isEmpty(memberIds)) {
for (Long memberId : memberIds) {
this.pointsOperationService.cleanInvalidPointsAndCalculateCurrentPoints(memberId);
}
}
return ResultInfo.success();
}*/
@Log
@PostMapping(value = "/grantPointsByManual")
@ApiOperation("新增PointsDetail")
@ApiOperation("手动发放积分")
public ResultInfo grantPointsByManual(@Validated @RequestBody TempPoints tempPoints) {
Long memberId = tempPoints.getMemberId();
this.pointsOperationService.grantPointsByManual(memberId,tempPoints);
Long points = tempPoints.getPoints();
Assert.notNull(memberId,"memberId can't be null!");
Assert.notNull(points,"points can't be null!");
MemberDTO memberDTO = this.memberService.findById(memberId);
if (Objects.nonNull(memberDTO)) {
String code = memberDTO.getCode();
Assert.notNull(code,"code can't be null!");
tempPoints.setMemberCode(code);
this.pointsOperationService.grantPointsByManualByTempPoints(tempPoints);
}
return ResultInfo.success();
}
/**
* 通过用户账户id消耗积分
* @param tempIptvUser
* @return
*/
@Log
@PostMapping(value = "/customPointsByUserTvPlatformAccount")
@ApiOperation("通过大屏账户积分消耗")
public ResultInfo customPointsByUserTvPlatformAccount(@Validated @RequestBody TempIptvUser tempIptvUser) {
String platformAccount = tempIptvUser.getPlatformAccount();
Long points = tempIptvUser.getPoints();
TempPoints tempPoints = new TempPoints();
UserTvDTO userTvDTO = this.userTvService.findByPlatformAccount(platformAccount);
if (Objects.nonNull(userTvDTO)) {
Long memberId = userTvDTO.getMemberId();
if (Objects.isNull(memberId)) {
return ResultInfo.failed("会员信息不存在");
}
MemberDTO memberDTO = this.memberService.findById(memberId);
tempPoints.setMemberCode(memberDTO.getCode());
tempPoints.setMemberId(memberId);
}
tempPoints.setPoints(points);
tempPoints.setDeviceType(LocalConstants.DEVICE_VIS);
tempPoints.setAppCode(LocalConstants.APP_CODE_CHONGQING_CHONGSHU_VIS);
tempPoints.setEvtType(LocalConstants.EVT_TYPE_ACTIVITY);
return this.customPoints(tempPoints);
}
/**
* 通过用户账户id消耗积分
* @param tempPoints
* @return
*/
@Log
@PostMapping(value = "/customPointsByUserId")
@ApiOperation("积分消耗")
public ResultInfo customPointsByUserId(@Validated @RequestBody TempPoints tempPoints) {
Long userId = tempPoints.getUserId();
// 设备类型 1:大屏;2:小屏(微信)3.小屏(xx)
Integer deviceType = tempPoints.getDeviceType();
Long memberId = null;
if (deviceType == LocalConstants.DEVICE_VIS) {
memberId = this.getMemberIdByIpTvUserId(userId);
}
if (deviceType == LocalConstants.DEVICE_MOBILE) {
memberId = this.getMemberIdByWeiXinUserId(userId);
}
if (Objects.isNull(memberId)) {
return ResultInfo.failed("会员信息不存在");
}
tempPoints.setMemberId(memberId);
return this.customPoints(tempPoints);
}
/**
* 获取iptv账户对应的会员id
* @param userId
* @return
*/
private Long getMemberIdByIpTvUserId(Long userId) {
UserTvDTO userTvDTO = this.userTvService.findById(userId);
return userTvDTO.getMemberId();
}
/**
* 获取微信账户对应的会员id
* @param userId
* @return
*/
private Long getMemberIdByWeiXinUserId(Long userId) {
UserWeixinDTO userWeixinDTO = this.userWeixinService.findById(userId);
return userWeixinDTO.getMemberId();
}
@Log
@PostMapping(value = "/consumePoints")
@ApiOperation("积分消耗")
public ResultInfo customPoints(@Validated @RequestBody TempPoints tempPoints) {
this.pointsOperationService.customPoints(tempPoints);
return ResultInfo.success();
Integer pointsType = tempPoints.getPointsType();
if (Objects.isNull(pointsType)) {
tempPoints.setPointsType(0);
}
CustomPointsResult b = this.pointsOperationService.customPoints(tempPoints);
String description = "操作成功";
if (!b.isResult()) {
description = "操作失败,积分不足";
}
return ResultInfo.success(Arrays.asList(b),description);
}
}
......
......@@ -6,9 +6,6 @@ import com.topdraw.business.basicdata.rights.history.service.dto.RightsHistoryQu
import com.topdraw.business.basicdata.rights.history.service.dto.RightsHistoryQueryType;
import com.topdraw.business.process.service.RightsOperationService;
import com.topdraw.common.ResultInfo;
import com.topdraw.annotation.Log;
import com.topdraw.business.basicdata.rights.domain.Rights;
import com.topdraw.business.basicdata.rights.service.RightsService;
import com.topdraw.util.TimestampUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
......@@ -33,9 +30,13 @@ public class RightsOperationController {
private RightsOperationService rightsOperationService;
@Autowired
private RightsHistoryService rightsHistoryService;
@Autowired
private RightsService rightsService;
/**
*
* @param criteria
* @param pageable
* @return
*/
@GetMapping
@ApiOperation("查询RightsHistory")
public ResultInfo queryRightsHistory(RightsHistoryQueryCriteria criteria, Pageable pageable) {
......@@ -46,13 +47,22 @@ public class RightsOperationController {
return ResultInfo.successPage(rightsHistoryService.queryAll(criteria,pageable));
}
/**
*
* @param id
* @return
*/
@GetMapping(value = "/findRightsHistoryById/{id}")
@ApiOperation("查询RightsHistory")
public ResultInfo findRightsHistoryById(@PathVariable Long id) {
return ResultInfo.success(rightsHistoryService.findById(id));
}
/**
*
* @param rightsHistory
* @return
*/
@PostMapping(value = "/grantRightsByManual")
@ApiOperation("查询RightsHistory")
public ResultInfo grantRightsByManual(@Validated @RequestBody RightsHistory rightsHistory) {
......
package com.topdraw.business.process.rest;
import com.topdraw.annotation.Log;
import com.topdraw.business.process.domian.TempIptvUser;
import com.topdraw.business.process.service.TaskOperationService;
import com.topdraw.common.ResultInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
@Api("任务处理")
@RestController
@RequestMapping(value = "/api/TaskOperation")
......@@ -30,6 +34,27 @@ public class TaskOperationController {
}
/**
* 针对重庆20211220号的积分兑换活动专门定制的接口
* 1.用户每天首次进入活动详情页的时候赠送5个积分
* 2.判断任务是否已经做过,没有做过的话,保存任务记录,任务记录通过redis保存即可
*/
@Log
@PostMapping(value = "/createPoint4ChongQing")
@ApiOperation("针对重庆大屏20211220号的积分兑换活动专门定制的接口")
public ResultInfo createPoint4ChongQing(@RequestBody TempIptvUser tempIptvUser){
String platformAccount = tempIptvUser.getPlatformAccount();
Long points = tempIptvUser.getPoints();
// 判断任务是否已经做过
boolean result = this.taskOperationService.createPoint2ChongQing(platformAccount,points);
String message = "操作成功";
if (!result){
message = "操作失败,该会员今日已参加过活动";
}
return ResultInfo.success(Arrays.asList(result),message);
}
}
......
......@@ -3,6 +3,7 @@ package com.topdraw.business.process.service;
import com.topdraw.business.basicdata.points.domain.Points;
import com.topdraw.business.basicdata.task.domain.Task;
import com.topdraw.business.process.domian.TempPoints;
import com.topdraw.business.process.domian.result.CustomPointsResult;
import java.util.List;
import java.util.Map;
......@@ -21,12 +22,17 @@ public interface PointsOperationService {
*/
void grantPointsByManual(Long memberId , TempPoints tempPoints);
/**
*
* @param tempPoints
*/
void grantPointsByManualByTempPoints(TempPoints tempPoints);
/**
* 积分扣减
* @param tempPoints 积分对象
*/
boolean customPoints(TempPoints tempPoints);
CustomPointsResult customPoints(TempPoints tempPoints);
/**
......
package com.topdraw.business.process.service;
import com.topdraw.common.ResultInfo;
import com.topdraw.module.mq.DataSyncMsg;
/**
* @description 权益操作接口
......@@ -18,4 +17,5 @@ public interface TaskOperationService {
ResultInfo dealTask(String content);
boolean createPoint2ChongQing(String platformAccount, Long points);
}
......
package com.topdraw.business.process.service;
import com.topdraw.business.basicdata.user.iptv.domain.UserTv;
public interface UserTvOperationService {
boolean createMemberByUserTv(UserTv resources);
}
......@@ -105,8 +105,11 @@ public class ExpOperationServiceImpl implements ExpOperationService {
private long getExpByMemberId(TempExp tempExp) {
Long memberId = tempExp.getMemberId();
MemberDTO memberDTO = this.memberOperationService.findById(memberId);
Long exp = memberDTO.getExp();
return exp;
if (Objects.nonNull(memberDTO)) {
Long exp = memberDTO.getExp();
return Objects.isNull(exp) ? 0L : exp;
}
return 0L;
}
......
package com.topdraw.business.process.service.impl;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.basicdata.member.domain.Member;
import com.topdraw.business.basicdata.member.service.MemberService;
import com.topdraw.business.basicdata.member.service.dto.MemberDTO;
......@@ -42,7 +43,7 @@ public class MemberOperationServiceImpl implements MemberOperationService {
@Override
public void doUpdateMemberPoints(Member member) {
this.doUpdateMemberInfo(member);
this.memberService.doUpdateMemberPoints(member);
}
@Override
......
......@@ -251,7 +251,7 @@ public class RightsOperationServiceImpl implements RightsOperationService {
tempCoupon.setRightsSendStrategy(0);
tempCoupon.setCode(couponDTO.getCode());
if (Objects.nonNull(expireTime))
tempCoupon.setExpireTime(TimestampUtil.long2Timestamp(expireTime));
tempCoupon.setExpireTime(TimestampUtil.long2LocalDateTime(expireTime));
tempCouponList.add(tempCoupon);
}
break;
......
......@@ -14,6 +14,10 @@ import com.topdraw.business.basicdata.task.progress.domain.TrTaskProgress;
import com.topdraw.business.basicdata.task.progress.service.TrTaskProgressService;
import com.topdraw.business.basicdata.task.progress.service.dto.TrTaskProgressDTO;
import com.topdraw.business.basicdata.task.progress.service.dto.TrTaskProgressQueryCriteria;
import com.topdraw.business.basicdata.user.iptv.domain.UserTv;
import com.topdraw.business.basicdata.user.iptv.service.UserTvService;
import com.topdraw.business.basicdata.user.iptv.service.dto.UserTvDTO;
import com.topdraw.business.process.service.PointsOperationService;
import com.topdraw.business.process.service.RightsOperationService;
import com.topdraw.business.process.service.TaskOperationService;
import com.topdraw.business.basicdata.member.service.MemberService;
......@@ -23,23 +27,24 @@ import com.topdraw.business.basicdata.task.service.TaskService;
import com.topdraw.business.basicdata.task.template.domain.TaskTemplate;
import com.topdraw.business.basicdata.task.template.service.TaskTemplateService;
import com.topdraw.business.process.domian.*;
import com.topdraw.business.process.service.UserTvOperationService;
import com.topdraw.common.ResultInfo;
import com.topdraw.module.mq.DataSyncMsg;
import com.topdraw.util.*;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.TimeUnit;
import static java.util.stream.Collectors.toList;
......@@ -53,8 +58,6 @@ import static java.util.stream.Collectors.toList;
@Slf4j
public class TaskOperationServiceImpl implements TaskOperationService {
private static final Logger LOG = LoggerFactory.getLogger(PointsOperationServiceImpl.class);
@Autowired
TaskService taskService;
@Autowired
......@@ -74,6 +77,7 @@ public class TaskOperationServiceImpl implements TaskOperationService {
@Autowired
MemberGroupService memberGroupService;
private static final Integer TASK_FINISH_STATUS = 1;
private static final Integer TASK_UNFINISH_STATUS = 2;
private static final Integer POINTS_TYPE_RANDOM = 1;
......@@ -111,7 +115,7 @@ public class TaskOperationServiceImpl implements TaskOperationService {
}
long r = System.currentTimeMillis();
LOG.info("总耗时======>>>>>" + (r-l));
log.info("总耗时======>>>>>" + (r-l));
return ResultInfo.success();
......@@ -221,65 +225,6 @@ public class TaskOperationServiceImpl implements TaskOperationService {
}
/**
* 计算总权益 = 已获得的积分 + 已获得的积分 * 额外积分比率
* @param permanentRights
* @param map
*/
@Deprecated
private Map<RightType, Object> calculateRight(PermanentRightsDTO permanentRights, Map<RightType, Object> map,Long memberId) {
// 验证永久权益
boolean b = this.validatedPermanentRights(permanentRights, memberId);
if (b) {
// 获得的积分
List<TempPoints> tempPointsList = (List<TempPoints>)map.get(RightType.POINTS);
if (!CollectionUtils.isEmpty(tempPointsList)) {
// 经过永久权益计算后的总积分
this.calculateTotalPoints(permanentRights,tempPointsList);
map.put(RightType.POINTS,tempPointsList);
}
// TODO 其他权益
}
return map;
}
/**
* 经过永久权益计算后的总积分
* @param permanentRights 永久权益
* @param tempPointsList 积分
* @return BigDecimal 总积分
*/
@Deprecated
private BigDecimal calculateTotalPoints(PermanentRightsDTO permanentRights, List<TempPoints> tempPointsList) {
// 总积分
BigDecimal rewardsPoints = null;
// 额外积分费率
BigDecimal extraPoints = permanentRights.getExtraPoints();
for (TempPoints tempPoints : tempPointsList) {
rewardsPoints = new BigDecimal(tempPoints.getPoints());
if (Objects.nonNull(extraPoints) && extraPoints.compareTo(BigDecimal.ZERO) > 0) {
// 已获得的积分 * 额外积分比率
BigDecimal multiply = (extraPoints.divide(new BigDecimal(100),4,RoundingMode.HALF_UP)).multiply(rewardsPoints);
// 四舍五入
BigDecimal bigDecimal = multiply.setScale(0, RoundingMode.HALF_UP);
// 已获得的积分 + 已获得的积分 * 额外积分比率
rewardsPoints = rewardsPoints.add(bigDecimal);
tempPoints.setPoints(rewardsPoints.longValue());
}
}
return rewardsPoints;
}
/**
* 验证是否满足永久权益
* @param permanentRights
* @param memberId
......@@ -336,7 +281,7 @@ public class TaskOperationServiceImpl implements TaskOperationService {
tempRights.setRightsAmount(rightsAmount);
Long expireTime = rightsDTO.getExpireTime();
if (Objects.nonNull(expireTime))
tempRights.setExpireTime(TimestampUtil.long2Timestamp(expireTime));
tempRights.setExpireTime(TimestampUtil.long2LocalDateTime(expireTime));
return tempRights;
}
......@@ -515,7 +460,7 @@ public class TaskOperationServiceImpl implements TaskOperationService {
Long rewardPoints = task.getRewardPoints();
// 过期时间
Long rewardPointsExpireTime = task.getRewardPointsExpireTime();
Timestamp expireTime = task.getExpireTime();
LocalDateTime expireTime = task.getExpireTime();
// 积分类型(0:定值、1:随机)
Integer pointsType = task.getPointsType();
// 随机积分的最大值
......@@ -573,7 +518,7 @@ public class TaskOperationServiceImpl implements TaskOperationService {
List<Task> taskStream = taskList1.stream().filter(task1 ->
task1.getStatus() == 1 &&
(Objects.isNull(task1.getExpireTime()) || task1.getExpireTime().compareTo(TimestampUtil.now()) >= 0) &&
(Objects.isNull(task1.getExpireTime()) || task1.getExpireTime().compareTo(LocalDateTime.now()) >= 0) &&
(Objects.isNull(task1.getValidTime()) || task1.getValidTime().compareTo(TimestampUtil.now()) <= 0) &&
(Objects.isNull(task1.getMemberLevel()) || task1.getMemberLevel() <= memberDTO1.getLevel()) &&
(Objects.isNull(task1.getMemberVip()) || task1.getMemberVip() <= memberDTO1.getVip())
......@@ -852,4 +797,95 @@ public class TaskOperationServiceImpl implements TaskOperationService {
private TaskTemplate getTaskTemplate(Integer event) {
return this.taskTemplateService.findByType(event);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
@Autowired
UserTvService userTvService;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Autowired
private PointsOperationService pointsOperationService;
@Autowired
private UserTvOperationService userTvOperationService;
private UserTv checkUserTv(String platformAccount){
UserTv userTv = new UserTv();
userTv.setPlatformAccount(platformAccount);
userTv.setStatus(0);
userTv.setNickname("未设置");
userTv.setPlatform("CTC.ChongQing");
userTv.setCreateBy("#");
userTv.setUpdateBy("#");
return userTv;
}
@Override
public boolean createPoint2ChongQing(String platformAccount, Long points) {
boolean result = this.verificationActivity(platformAccount);
if (!result) {
return result;
}
long l = System.currentTimeMillis();
this.userTvOperationService.createMemberByUserTv(this.checkUserTv(platformAccount));
UserTvDTO userTvDTO = this.userTvService.findByPlatformAccount(platformAccount);
if (Objects.nonNull(userTvDTO)) {
Long memberId = userTvDTO.getMemberId();
if (Objects.nonNull(memberId)) {
MemberDTO memberDTO = this.memberService.findById(memberId);
if (Objects.nonNull(memberDTO)) {
String code = memberDTO.getCode();
TempPoints tempPoints = new TempPoints();
tempPoints.setMemberId(memberId);
tempPoints.setMemberCode(code);
tempPoints.setPoints(points);
tempPoints.setDescription("重庆重数大屏积分兑换活动,时间:202112");
tempPoints.setDeviceType(1);
tempPoints.setEvtType(3);
tempPoints.setPointsType(0);
tempPoints.setExpireTime(LocalDateTime.of(2022,12,31,23,59,59));
this.pointsOperationService.grantPointsByManualByTempPoints(tempPoints);
}
}
}
long currentTimeMillis = System.currentTimeMillis();
log.info("领取积分总耗时--->>>>" + (currentTimeMillis-l));
return true;
}
/**
* 验证是否首次进入活动页面
* @param platform
* @return
*/
private boolean verificationActivity(String platform) {
boolean result = false;
LocalDate now = LocalDate.now();
String s = now+"::"+"chongshujifenduihuanchoujiang"+"::"+platform;
ValueOperations<String, String> stringValueOperations = stringRedisTemplate.opsForValue();
String s1 = stringValueOperations.get(s);
if (org.springframework.util.StringUtils.isEmpty(s1)) {
stringValueOperations.set(s,"true",2, TimeUnit.DAYS);
result = true;
} else {
result = false;
}
return result;
}
}
......
package com.topdraw.business.process.service.impl;
import com.topdraw.business.basicdata.member.domain.Member;
import com.topdraw.business.basicdata.member.service.MemberService;
import com.topdraw.business.basicdata.member.service.dto.MemberDTO;
import com.topdraw.business.basicdata.user.iptv.domain.UserTv;
import com.topdraw.business.basicdata.user.iptv.repository.UserTvRepository;
import com.topdraw.business.basicdata.user.iptv.service.UserTvService;
import com.topdraw.business.basicdata.user.iptv.service.dto.UserTvDTO;
import com.topdraw.business.basicdata.user.iptv.service.mapper.UserTvMapper;
import com.topdraw.business.process.service.UserTvOperationService;
import com.topdraw.config.LocalConstants;
import com.topdraw.util.Base64Util;
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.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Objects;
@Service
@Slf4j
public class UserTvOperationServiceImpl implements UserTvOperationService {
@Autowired
private RedissonClient redissonClient;
@Autowired
private MemberService memberService;
@Autowired
private UserTvService userTvService;
@Override
@Transactional
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);
String code = member.getCode();
member.setCode(StringUtils.isEmpty(code)?String.valueOf(IdWorker.generator()):code);
String platformAccount1 = resources.getPlatformAccount();
member.setNickname(Base64Util.encode(platformAccount1));
member.setBindIptvPlatformType(1);
member.setType(1);
Long memberId = this.memberService.create(member);
if (Objects.nonNull(memberId)) {
UserTv userTv = new UserTv();
BeanUtils.copyProperties(resources,userTv);
userTv.setPlatformAccount(platformAccount);
userTv.setMemberCode(member.getCode());
Long userIptvId = this.userTvService.create(userTv);
if (Objects.nonNull(userIptvId)) {
member.setId(memberId);
member.setUserIptvId(userIptvId);
member.setBindIptvTime(TimestampUtil.now());
member.setPlatformAccount(platformAccount);
this.bindIptvId(member);
}
}
} else {
return false;
}
return true;
}
private void bindIptvId(Member resources) {
RLock rLock = this.redissonClient.getLock("Member::update::code" + resources.getCode());
try {
RedissonUtil.lock(rLock);
MemberDTO member = this.memberService.getByCode(resources.getCode());
if (member!=null) {
this.memberService.update(resources);
}
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(rLock);
}
}
}
......@@ -13,4 +13,19 @@ public class LocalConstants {
// 小屏类型
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;
}
......
......@@ -10,17 +10,52 @@ public class RabbitMqConfig {
/** 交换机--广播*/
public static final String UC_EXCHANGE_FANOUT = "uc.fanout";
public static final String UC_EXCHANGE_DIRECT = "uc.direct";
/** 队列-- */
public static final String UC_QUEUE_DIRECT_BBB = "uc.route.key.direct.event.bbb";
public static final String UC_QUEUE_DIRECT_CCC = "uc.route.key.direct.event.ccc";
/** 队列-- */
public static final String UC_QUEUE_FANOUT_IPTV = "uc.fanout.iptv";
public static final String UC_QUEUE_FANOUT_WEIXIN = "uc.fanout.weixin";
@Bean
FanoutExchange ucFanoutExchange(){
return ExchangeBuilder.fanoutExchange(UC_EXCHANGE_FANOUT).build();
}
@Bean
DirectExchange ucDirectExchange(){
return ExchangeBuilder.directExchange(UC_EXCHANGE_DIRECT).build();
}
@Bean
Queue ucDirectQueueCCC(){
return new Queue(UC_QUEUE_DIRECT_CCC);
}
@Bean
Queue ucDirectQueueBBB(){
return new Queue(UC_QUEUE_DIRECT_BBB);
}
@Bean
Binding directExchangeBindingBBB(DirectExchange directExchange , Queue ucDirectQueueBBB) {
BindingBuilder.DirectExchangeRoutingKeyConfigurer directExchangeRoutingKeyConfigurer =
BindingBuilder.bind(ucDirectQueueBBB).to(directExchange);
return directExchangeRoutingKeyConfigurer.with(UC_QUEUE_DIRECT_BBB);
}
@Bean
Binding directExchangeBindingCCC(DirectExchange directExchange , Queue ucDirectQueueCCC) {
BindingBuilder.DirectExchangeRoutingKeyConfigurer directExchangeRoutingKeyConfigurer =
BindingBuilder.bind(ucDirectQueueCCC).to(directExchange);
return directExchangeRoutingKeyConfigurer.with(UC_QUEUE_DIRECT_CCC);
}
@Bean
Queue ucFanoutQueueIptv(){
return new Queue(UC_QUEUE_FANOUT_IPTV);
}
......@@ -40,4 +75,5 @@ public class RabbitMqConfig {
return BindingBuilder.bind(ucFanoutQueueWeiXin).to(ucFanoutExchange);
}
}
......
package com.topdraw.mq.producer;
import com.topdraw.config.LocalConstants;
import com.topdraw.mq.config.RabbitMqConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
......@@ -16,6 +18,30 @@ public class MessageProducer {
@Autowired
private AmqpTemplate amqpTemplate;
@Value("${service.platform}")
private String platformType;
public void sendMessage(String msg,String exchangeName){
// 管理侧
if (platformType.equalsIgnoreCase(LocalConstants.PLATFORM_TYPE_MANAGEMENT)) {
if (StringUtils.isEmpty(exchangeName)) {
exchangeName = RabbitMqConfig.UC_QUEUE_DIRECT_CCC;
}
this.sendDirectMessage(msg,exchangeName);
}
// 服务侧
if (platformType.equalsIgnoreCase(LocalConstants.PLATFORM_TYPE_SERVICE)) {
if (StringUtils.isEmpty(exchangeName)) {
exchangeName = RabbitMqConfig.UC_QUEUE_DIRECT_BBB;
}
this.sendDirectMessage(msg,exchangeName);
}
}
/**
* 广播
* @param msg
......@@ -23,7 +49,7 @@ public class MessageProducer {
* @author XiangHan
* @date 2021/9/7 11:10 上午
*/
public void sendFanoutMessage(String msg,String exchangeName) {
private void sendFanoutMessage(String msg,String exchangeName) {
if (StringUtils.isEmpty(exchangeName)) {
exchangeName = RabbitMqConfig.UC_EXCHANGE_FANOUT;
}
......@@ -32,12 +58,25 @@ public class MessageProducer {
}
/**
* 广播
* 直连
* @param msg
* @param queueName
* @author XiangHan
* @date 2021/9/7 11:10 上午
*/
private void sendDirectMessage(String msg,String queueName) {
amqpTemplate.convertAndSend(queueName, msg);
log.info("send sendFanoutMessage msg || entityType: {} || msg:{} ", msg);
}
/**
* 发送
* @param msg
* @author XiangHan
* @date 2021/9/7 11:10 上午
*/
public void sendFanoutMessage(String msg) {
this.sendFanoutMessage(msg,null);
public void sendMessage(String msg) {
this.sendMessage(msg,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);
}
}
......@@ -15,5 +15,14 @@ public class RedissonUtil {
rLock.unlock();
}
/**
* 保存数据
* @param key 键
* @param value 值
* @param validTime 过期时间
*/
public static void doSave(String key , String value , Integer validTime){
}
}
......
......@@ -36,6 +36,10 @@ public class TimestampUtil {
return l;
}
public static LocalDateTime long2LocalDateTime(Long expireTime) {
return LocalDateTime.ofInstant(Instant.ofEpochMilli(expireTime),ZoneOffset.of("+8"));
}
public static void main(String[] args) {
long a = 1636616464000L;
long b = 1637046948588L;
......@@ -55,4 +59,6 @@ public class TimestampUtil {
long l1 = localDateTime2long(LocalDateTime.now());
System.out.println(l1);
}
}
......
......@@ -12,5 +12,25 @@ import org.springframework.test.context.junit4.SpringRunner;
public class BaseTest {
public Logger LOG = LoggerFactory.getLogger(BaseTest.class);
private static String replaceUrl(String body, String ftpPath) {
boolean contains = body.contains("<source src=");
if (contains) {
body = body.replaceAll( "(<source src=(.*?)/>)","<source src="+"\""+ftpPath+"\"/>");
}
return body;
}
public static void main(String[] args) {
String a = "<p>gfdsgf <video controls=\"controls\" width=\"300\" height=\"150\">\n" +
"<source src=\"dddd\" /></video></p>";
String c = "<p>测试正文<br /><br /><video controls=\"controls\" width=\"360\" height=\"180\">\n" +
"<source src=\"test\" /></video></p>";
String b = "{{nas-base-url.cms-upload}}/upload/commonFile/theme_activity/2021-12-15/aebd8dbb-87bb-4523-921f-4354c3298fdd.mp4";
String s = replaceUrl(c, b);
System.out.println(s);
}
}
......
......@@ -39,16 +39,16 @@ public class GeneratorCode extends BaseTest {
@Rollback(value = false)
@Transactional(rollbackFor = Exception.class)
public void generator() {
var dbName = "uc_member_group";
var dbName = "uc_user_weixin";
// 表名称,支持多表
var tableNames = Arrays.asList(dbName);
String[] s = dbName.split("_");
var pre = s[0];
var target1 = s[s.length-1];
var preRoute = "com.topdraw.business.basicdata.member.";
var preRoute = "com.topdraw.business.basicdata.user.";
StringBuilder builder = new StringBuilder(preRoute);
builder.append("group");
builder.append("weixin");
// builder.append(target);
tableNames.forEach(tableName -> {
......
package com.topdraw.test.business.basicdata.member;
import com.topdraw.business.basicdata.member.rest.MemberController;
import com.topdraw.business.basicdata.member.service.MemberService;
import com.topdraw.business.basicdata.member.service.dto.MemberDTO;
import com.topdraw.BaseTest;
import com.topdraw.common.ResultInfo;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -10,13 +12,14 @@ public class MemberServiceTest extends BaseTest {
@Autowired
private MemberService memberService;
@Autowired
private MemberController memberController;
@Test
public void findById(){
Long memberId = 3L;
MemberDTO memberDTO = this.memberService.findById(memberId);
Long memberId = 1L;
ResultInfo memberDTO = this.memberController.findById(memberId);
LOG.info("=====>>>" + memberDTO);
}
}
......
......@@ -11,6 +11,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import java.time.LocalDate;
//public class MemberControllerTest {
public class MemberRelatedInfoControllerTest extends BaseTest {
......@@ -29,13 +31,15 @@ public class MemberRelatedInfoControllerTest extends BaseTest {
@Test
public void update(){
MemberRelatedInfo member = new MemberRelatedInfo();
member.setId(1L);
member.setId(15L);
// member.setMemberId(2L);
member.setType(1);
member.setCellphone("18271269120");
member.setIdCard("422827199208010713");
member.setName("fdfd");
member.setSex(1);
member.setBirthday(LocalDate.of(2021,8,23));
member.setAvatarUrl("www.sougou.com");
// member.setCreateTime();
// member.setUpdateTime();
String s = JSON.toJSONString(member);
......@@ -53,6 +57,8 @@ public class MemberRelatedInfoControllerTest extends BaseTest {
member.setIdCard("422827199208010713");
member.setName("fdfd");
member.setSex(1);
member.setBirthday(LocalDate.now());
member.setAvatarUrl("www.baidu.com");
// member.setCreateTime();
// member.setUpdateTime();
String s = JSON.toJSONString(member);
......
......@@ -12,6 +12,7 @@ import org.junit.Test;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import java.time.LocalDateTime;
import java.util.List;
public class PointsAvailableServiceTest extends BaseTest {
......@@ -23,7 +24,7 @@ public class PointsAvailableServiceTest extends BaseTest {
public void loadListExpirePointsByMemberId() {
Long memberId = 2L;
List<PointsAvailableDTO> pointsAvailableDTOS =
this.pointsAvailableService.findByMemberIdAndExpireTimeBefore(memberId, DateUtil.newDate());
this.pointsAvailableService.findByMemberIdAndExpireTimeBefore(memberId, LocalDateTime.now());
LOG.info("===>>>"+pointsAvailableDTOS);
}
......@@ -52,7 +53,7 @@ public class PointsAvailableServiceTest extends BaseTest {
// tempPoints.setDescription("#");
tempPoints.setEvtType(1);
tempPoints.setPoints(10L);
tempPoints.setExpireTime(TimestampUtil.now());
tempPoints.setExpireTime(LocalDateTime.now());
PointsAvailable pointsAvailable = new PointsAvailable();
BeanUtils.copyProperties(tempPoints,pointsAvailable);
......
......@@ -12,6 +12,8 @@ import org.junit.Test;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import java.time.LocalDateTime;
public class PointsDetailServiceTest extends BaseTest {
@Autowired
......@@ -36,7 +38,7 @@ public class PointsDetailServiceTest extends BaseTest {
tempPoints.setDescription("");
tempPoints.setEvtType(1);
tempPoints.setPoints(10L);
tempPoints.setExpireTime(TimestampUtil.now());
tempPoints.setExpireTime(LocalDateTime.now());
MemberDTO memberDTO = this.memberOperationService.findById(memberId);
......
......@@ -12,6 +12,8 @@ import org.junit.Test;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import java.time.LocalDateTime;
public class RightsServiceTest extends BaseTest {
@Autowired
......@@ -36,7 +38,7 @@ public class RightsServiceTest extends BaseTest {
tempPoints.setDescription("");
tempPoints.setEvtType(1);
tempPoints.setPoints(10L);
tempPoints.setExpireTime(TimestampUtil.now());
tempPoints.setExpireTime(LocalDateTime.now());
MemberDTO memberDTO = this.memberOperationService.findById(memberId);
......
......@@ -9,6 +9,7 @@ import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
......@@ -30,7 +31,7 @@ public class CouponOperationControllerTest extends BaseTest {
tempCoupon.setMemberId(2L);
tempCoupon.setRightsSendStrategy(0);
tempCoupon.setAccountId(2L);
tempCoupon.setExpireTime(Timestamp.valueOf("2021-10-28 09:00:00"));
tempCoupon.setExpireTime(LocalDateTime.now());
tempCoupon.setDeviceType(2);
tempCoupon.setAppCode("WEI_XIN_GOLD_PANDA");
tempCoupon.setOrderId(null);
......
......@@ -11,6 +11,7 @@ import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
......@@ -28,7 +29,7 @@ public class ExpOperationControllerTest extends BaseTest {
tempExp.setRewardExp(10L);
tempExp.setRightsSendStrategy(0);
tempExp.setAccountId(userId);
tempExp.setExpireTime(Timestamp.valueOf("2021-10-28 09:00:00"));
tempExp.setExpireTime(LocalDateTime.now());
tempExp.setDeviceType(2);
tempExp.setAppCode("WEI_XIN_GOLD_PANDA");
tempExp.setOrderId(null);
......
......@@ -15,6 +15,7 @@ import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import java.sql.Timestamp;
import java.time.LocalDateTime;
public class PointsOperationControllerTest extends BaseTest {
......@@ -24,19 +25,7 @@ public class PointsOperationControllerTest extends BaseTest {
@Test
public void customPoints() {
Long memberId = 2L;
/*DataSyncMsg dataSyncMsg = new DataSyncMsg();
dataSyncMsg.setEntityType(EntityType.MEMBER);
dataSyncMsg.setEventType(EventType.VIEWING);
DataSyncMsg.MsgData msgData = new DataSyncMsg.MsgData();
msgData.setEvent(1);
msgData.setRemarks("remark");
msgData.setMemberId(memberId);
msgData.setDeviceType(2);
msgData.setAppCode("WEI_XIN_GOLD_PANDA");
dataSyncMsg.setMsgData(msgData);*/
Long memberId = 1L;
TempPoints tempPoints = new TempPoints();
tempPoints.setMemberId(memberId);
tempPoints.setPoints(1L);
......@@ -45,7 +34,6 @@ public class PointsOperationControllerTest extends BaseTest {
tempPoints.setPointsType(0);
tempPoints.setMediaId(1L);
tempPoints.setDeviceType(1);
String s = JSON.toJSONString(tempPoints);
this.pointsOperationController.customPoints(tempPoints);
}
......@@ -53,12 +41,12 @@ public class PointsOperationControllerTest extends BaseTest {
@Test
public void grantPointsByManual(){
TempPoints tempPoints = new TempPoints();
tempPoints.setMemberId(10L);
tempPoints.setMemberId(1L);
tempPoints.setPoints(10L);
tempPoints.setPointsType(0);
tempPoints.setRightsSendStrategy(0);
tempPoints.setAccountId(2L);
tempPoints.setExpireTime(Timestamp.valueOf("2021-11-27 09:00:00"));
tempPoints.setExpireTime(LocalDateTime.now());
tempPoints.setDeviceType(2);
tempPoints.setAppCode("WEI_XIN_GOLD_PANDA");
tempPoints.setOrderId(null);
......@@ -67,6 +55,7 @@ public class PointsOperationControllerTest extends BaseTest {
tempPoints.setItemId(null);
tempPoints.setDescription("系统发放");
tempPoints.setEvtType(1);
tempPoints.setActivityId(1L);
String s = JSON.toJSONString(tempPoints);
ResultInfo byId = this.pointsOperationController.grantPointsByManual(tempPoints);
LOG.info("===>>>"+byId);
......
......@@ -9,6 +9,8 @@ import com.topdraw.util.TimestampUtil;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import java.time.LocalDateTime;
public class RightOperationControllerTest extends BaseTest {
@Autowired
......@@ -21,7 +23,7 @@ public class RightOperationControllerTest extends BaseTest {
rightsHistory.setMemberId(3L);
rightsHistory.setOperatorId(3L);
rightsHistory.setOperatorName("鲁二龙");
rightsHistory.setExpireTime(TimestampUtil.now());
rightsHistory.setExpireTime(LocalDateTime.now());
rightsHistory.setUserId(2L);
ResultInfo byId = this.rightsOperationController.grantRightsByManual(rightsHistory);
LOG.info("===>>>"+byId);
......