Commit ccf3dc70 ccf3dc70b39768f85608eb43c8a076f02e36b5c5 by xianghan

1.优化部分会员信息与会员属性逻辑

1 parent c83b7a48
Showing 101 changed files with 1948 additions and 3081 deletions
package com.topdraw.business.module.common.domain;
import com.topdraw.business.common.CreateGroup;
import com.topdraw.business.common.UpdateGroup;
import com.topdraw.business.module.common.validated.CreateGroup;
import com.topdraw.business.module.common.validated.UpdateGroup;
import lombok.Data;
import lombok.experimental.Accessors;
......@@ -19,10 +19,13 @@ import javax.validation.constraints.NotNull;
*/
@Data
@Accessors(chain = true)
public class DefaultAsyncMqModule {
public class AsyncMqModule {
@Transient
@NotNull(message = "memberCode can't be null" , groups = {CreateGroup.class, UpdateGroup.class})
private String memberCode;
/** 运营商平台账号 */
@Transient
private String platformAccount;
}
......
package com.topdraw.business.module.member.address.domain;
import com.topdraw.business.common.CreateGroup;
import com.topdraw.business.common.UpdateGroup;
import com.topdraw.business.module.common.domain.AsyncMqModule;
import lombok.Data;
import lombok.experimental.Accessors;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
......@@ -25,7 +23,7 @@ import java.time.LocalDateTime;
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_member_address")
public class MemberAddress implements Serializable {
public class MemberAddress extends AsyncMqModule implements Serializable {
/** 主键 */
@Id
......@@ -37,10 +35,6 @@ public class MemberAddress implements Serializable {
@Column(name = "member_id", nullable = false)
private Long memberId;
@Transient
@NotNull(message = "memberCode can't be null" , groups= {CreateGroup.class})
private String memberCode;
/** 类型 1:家;2:公司;3:学校 */
@Column(name = "type", nullable = false)
private Integer type;
......
package com.topdraw.business.module.member.address.domain;
import com.topdraw.business.module.member.domain.Member;
import org.apache.commons.lang3.StringUtils;
import java.util.Objects;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/11 11:08
* @version: :
* @modified By:
* @since : modified in 2022/3/11 11:08
*/
public class MemberAddressBuilder {
private static final Integer DEFAULT_VALUE_0 = 0;
private static final Integer DEFAULT_VALUE_1 = 1;
public static MemberAddress build(MemberAddress memberAddress, Long memberId,String memberCode){
Long id = memberAddress.getId();
Integer type = memberAddress.getType();
Integer isDefault = memberAddress.getIsDefault();
Integer sequence = memberAddress.getSequence();
Integer status= memberAddress.getStatus();
String contactor = memberAddress.getContactor();
String cellphone = memberAddress.getCellphone();
String country = memberAddress.getCountry();
String province = memberAddress.getProvince();
String city = memberAddress.getCity();
String district = memberAddress.getDistrict();
String address = memberAddress.getAddress();
String zipCode = memberAddress.getZipCode();
return build(id,memberId,memberCode,type,isDefault,sequence,status,
contactor,cellphone,country,province,city,district,address,zipCode);
}
public static MemberAddress build(MemberAddress memberAddress, Member member){
Long id = memberAddress.getId();
Long memberId = member.getId();
String memberCode = member.getCode();
Integer type = memberAddress.getType();
Integer isDefault = memberAddress.getIsDefault();
Integer sequence = memberAddress.getSequence();
Integer status= memberAddress.getStatus();
String contactor = memberAddress.getContactor();
String cellphone = memberAddress.getCellphone();
String country = memberAddress.getCountry();
String province = memberAddress.getProvince();
String city = memberAddress.getCity();
String district = memberAddress.getDistrict();
String address = memberAddress.getAddress();
String zipCode = memberAddress.getZipCode();
return build(id,memberId,memberCode,type,isDefault,sequence,status,
contactor,cellphone,country,province,city,district,address,zipCode);
}
public static MemberAddress build(MemberAddress memberAddress){
Long id = memberAddress.getId();
Long memberId = memberAddress.getMemberId();
String memberCode = memberAddress.getMemberCode();
Integer type = memberAddress.getType();
Integer isDefault = memberAddress.getIsDefault();
Integer sequence = memberAddress.getSequence();
Integer status= memberAddress.getStatus();
String contactor = memberAddress.getContactor();
String cellphone = memberAddress.getCellphone();
String country = memberAddress.getCountry();
String province = memberAddress.getProvince();
String city = memberAddress.getCity();
String district = memberAddress.getDistrict();
String address = memberAddress.getAddress();
String zipCode = memberAddress.getZipCode();
return build(id,memberId,memberCode,type,isDefault,sequence,status,
contactor,cellphone,country,province,city,district,address,zipCode);
}
public static MemberAddress build(Long id , Long memberId,String memberCode,
Integer sequence,Integer type ,Integer isDefault , Integer status,
String contactor,String cellphone,
String country,String province,String city,
String district,String address,String zipCode){
MemberAddress memberAddress = new MemberAddress();
memberAddress.setId(Objects.nonNull(id)?null:id);
memberAddress.setMemberId(Objects.nonNull(memberId)?null:memberId);
memberAddress.setMemberCode(stringIsNull(memberCode));
memberAddress.setSequence(Objects.nonNull(sequence)?null:DEFAULT_VALUE_1);
memberAddress.setType(Objects.nonNull(type)?null:DEFAULT_VALUE_0);
memberAddress.setIsDefault(Objects.nonNull(isDefault)?null:DEFAULT_VALUE_0);
memberAddress.setStatus(Objects.nonNull(status)?null:DEFAULT_VALUE_1);
memberAddress.setContactor(stringIsNull(contactor));
memberAddress.setCellphone(stringIsNull(cellphone));
memberAddress.setCountry(stringIsNull(country));
memberAddress.setProvince(stringIsNull(province));
memberAddress.setCity(stringIsNull(city));
memberAddress.setDistrict(stringIsNull(district));
memberAddress.setAddress(stringIsNull(address));
memberAddress.setZipCode(stringIsNull(zipCode));
return memberAddress;
}
private static String stringIsNull(String s){
return StringUtils.isBlank(s)?"":s;
}
private static Object objectIsNull(Object s){
return Objects.nonNull(s)?null:s;
}
}
package com.topdraw.business.module.member.address.rest;
import com.topdraw.aop.log.Log;
import com.topdraw.business.common.CreateGroup;
import com.topdraw.business.common.UpdateGroup;
import com.topdraw.business.module.common.validated.CreateGroup;
import com.topdraw.business.module.common.validated.UpdateGroup;
import com.topdraw.common.ResultInfo;
import com.topdraw.business.module.member.address.domain.MemberAddress;
import com.topdraw.business.module.member.address.service.MemberAddressService;
......
......@@ -2,10 +2,6 @@ package com.topdraw.business.module.member.address.service;
import com.topdraw.business.module.member.address.domain.MemberAddress;
import com.topdraw.business.module.member.address.service.dto.MemberAddressDTO;
import com.topdraw.business.module.member.address.service.dto.MemberAddressQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.Map;
import java.util.List;
/**
* @author XiangHan
......@@ -15,10 +11,10 @@ public interface MemberAddressService {
/**
* 根据ID查询
* @param id ID
* @param resources ID
* @return MemberAddressDTO
*/
MemberAddressDTO findById(Long id);
MemberAddressDTO findById(Long resources);
/**
* 保存会员地址
......
package com.topdraw.business.module.member.address.service.dto;
import lombok.Data;
import java.sql.Timestamp;
import java.io.Serializable;
import java.time.LocalDateTime;
......@@ -13,51 +12,51 @@ import java.time.LocalDateTime;
@Data
public class MemberAddressDTO implements Serializable {
// 主键
/** 主键 */
private Long id;
// 会员id
/** 会员id */
private Long memberId;
// 类型 1:家;2:公司;3:学校
/** 类型 1:家;2:公司;3:学校 */
private Integer type;
// 是否默认地址
/** 是否默认地址 */
private Integer isDefault;
// 显示顺序
/** 显示顺序 */
private Integer sequence;
// 状态 0:不可用;1-可用
/** 状态 0:不可用;1-可用 */
private Integer status;
// 联系人姓名
/** 联系人姓名 */
private String contactor;
// 联系人电话
/** 联系人电话 */
private String cellphone;
// 国家
/** 国家 */
private String country;
// 省份
/** 省份 */
private String province;
// 城市
/** 城市 */
private String city;
// 区县
/** 区县 */
private String district;
// 地址
/** 地址 */
private String address;
// 邮编
/** 邮编 */
private String zipCode;
// 创建时间
/** 创建时间 */
private LocalDateTime createTime;
// 更新时间
/** 更新时间 */
private LocalDateTime updateTime;
}
......
package com.topdraw.business.module.member.address.service.dto;
import com.topdraw.annotation.Query;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class MemberAddressQueryCriteria{
@Query
private Long memberId;
}
......@@ -2,28 +2,24 @@ package com.topdraw.business.module.member.address.service.impl;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.member.address.domain.MemberAddress;
import com.topdraw.business.module.member.address.domain.MemberAddressBuilder;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.util.RedissonUtil;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.member.address.repository.MemberAddressRepository;
import com.topdraw.business.module.member.address.service.MemberAddressService;
import com.topdraw.business.module.member.address.service.dto.MemberAddressDTO;
import com.topdraw.business.module.member.address.service.dto.MemberAddressQueryCriteria;
import com.topdraw.business.module.member.address.service.mapper.MemberAddressMapper;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
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;
/**
* @author XiangHan
......@@ -31,53 +27,62 @@ import java.util.Objects;
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
@Slf4j
public class MemberAddressServiceImpl implements MemberAddressService {
@Autowired
private MemberAddressRepository MemberAddressRepository;
private MemberService memberService;
@Autowired
private MemberAddressMapper MemberAddressMapper;
private MemberAddressMapper memberAddressMapper;
@Autowired
private MemberService memberService;
private MemberAddressRepository memberAddressRepository;
@Autowired
private RedissonClient redissonClient;
@Override
public MemberAddressDTO findById(Long id) {
MemberAddress MemberAddress = MemberAddressRepository.findById(id).orElseGet(MemberAddress::new);
Assert.notNull(id,"id can't be null");
MemberAddress MemberAddress = this.memberAddressRepository.findById(id).orElseGet(MemberAddress::new);
ValidationUtil.isNull(MemberAddress.getId(),"MemberAddress","id",id);
return MemberAddressMapper.toDto(MemberAddress);
return this.memberAddressMapper.toDto(MemberAddress);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void create(MemberAddress resources) {
Long memberId = resources.getMemberId();
MemberDTO memberDTO = this.memberService.findById(memberId);
String code = memberDTO.getCode();
resources.setMemberCode(code);
MemberAddressRepository.save(resources);
log.info("MemberAddressServiceImpl ==>> create ==>> param ==>> [{}]",resources);
MemberDTO memberDTO = this.checkMember(resources);
MemberAddress memberAddress = MemberAddressBuilder.build(resources, memberDTO.getId(), memberDTO.getCode());
this.memberAddressRepository.save(memberAddress);
log.info("MemberAddressServiceImpl ==>> create ==>> result ==>> [{}]",resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void update(MemberAddress resources) {
log.info("MemberAddressServiceImpl ==>> update ==>> param ==>> [{}]",resources);
Assert.notNull(resources.getId(),"id can't be null");
RLock rLock = this.redissonClient.getLock("MemberAddress::update::code" + resources.getId());
try {
RedissonUtil.lock(rLock);
MemberDTO memberDTO = this.checkMember(resources);
resources.setMemberCode(memberDTO.getCode());
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);
MemberAddress MemberAddress = MemberAddressRepository.findById(resources.getId()).orElseGet(MemberAddress::new);
MemberAddress MemberAddress = this.memberAddressRepository.findById(resources.getId()).orElseGet(MemberAddress::new);
ValidationUtil.isNull( MemberAddress.getId(),"MemberAddress","id",resources.getId());
MemberAddress.copy(resources);
MemberAddressRepository.save(MemberAddress);
}
this.memberAddressRepository.save(MemberAddress);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(rLock);
}
}
@Override
......@@ -85,10 +90,30 @@ public class MemberAddressServiceImpl implements MemberAddressService {
@AsyncMqSend()
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
MemberAddress MemberAddress = MemberAddressRepository.findById(id).orElseThrow(
MemberAddress MemberAddress = this.memberAddressRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", MemberAddress.class, id), 1));
MemberAddressRepository.delete(MemberAddress);
this.memberAddressRepository.delete(MemberAddress);
}
/**
* 检查会员
* @param memberAddress
* @return
*/
private MemberDTO checkMember(MemberAddress memberAddress){
Long memberId = memberAddress.getMemberId();
String memberCode = memberAddress.getMemberCode();
return this.checkMember(memberId,memberCode);
}
/**
* 检查会员
* @param memberId 会员id
* @param memberCode 会员code
* @return
*/
private MemberDTO checkMember(Long memberId, String memberCode) {
return this.memberService.checkMember(memberId, memberCode);
}
}
......
......@@ -2,7 +2,7 @@ package com.topdraw.business.module.member.domain;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.topdraw.business.module.member.relatedinfo.domain.UpdateGroup;
import com.topdraw.business.module.common.validated.UpdateGroup;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.CreatedDate;
......@@ -37,11 +37,11 @@ public class Member implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
@NotNull(message = "code can't be null!!",groups = {UpdateGroup.class})
private Long id;
/** 标识 */
@Column(name = "code", nullable = false)
@NotNull(message = "code can't be null!!",groups = {UpdateGroup.class})
private String code;
/** 类型 1:大屏;2:小屏 */
......
package com.topdraw.business.module.member.domain;
public interface MemberConstant {
// vip等级
Integer vip[] = new Integer[]{0,1,2,3,4,5,6,7,8};
}
package com.topdraw.business.module.member.group.domain;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import java.io.Serializable;
/**
* @author luerlong
* @date 2021-09-27
*/
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_group")
public class Group implements Serializable {
/** ID */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
/** CODE */
@Column(name = "code")
private String code;
/** 名称 */
@Column(name = "name")
private String name;
/** 状态 0-下线 1-上线 */
@Column(name = "status")
private Integer status;
/** 权限 0-测试分组 1-鉴权通过(白名单) 2-不允许精准(黑名单)3-可以精准(金名单) */
@Column(name = "permission_type")
private Integer permissionType;
public void copy(Group source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}
}
......@@ -23,58 +23,58 @@ import java.io.Serializable;
@Table(name="uc_member_group")
public class MemberGroup implements Serializable {
// ID ID
/** ID */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 分组ID
/** 分组ID */
@Column(name = "group_id")
private Long groupId;
// 会员ID
/** 会员ID */
@Column(name = "member_id")
private Long memberId;
// 运营商平台账号
/** 运营商平台账号 */
@Column(name = "platform_account")
private String platformAccount;
// 手机号
/** 手机号 */
@Column(name = "cellphone")
private String cellphone;
// 设备
/** 设备 */
@Column(name = "stb_id")
private String stbId;
// 有线MAC地址
/** 有线MAC地址 */
@Column(name = "eth_mac")
private String ethMac;
// 无线MAC地址
/** 无线MAC地址 */
@Column(name = "wifi_mac")
private String wifiMac;
// 描述
/** 描述 */
@Column(name = "description")
private String description;
// 创建者
/** 创建者 */
@Column(name = "create_by")
private String createBy;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新者
/** 更新者 */
@Column(name = "update_by")
private String updateBy;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
......
package com.topdraw.business.module.member.group.repository;
import com.topdraw.business.module.member.group.domain.Group;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* @author luerlong
* @date 2021-09-27
*/
public interface GroupRepository extends JpaRepository<Group, Long>, JpaSpecificationExecutor<Group> {
Optional<Group> findFirstByCode(String code);
List<Group> findByName(String name);
@Query(value = "select t1.id from uc_group t1 left join uc_user__group t2 on t1.id = t2.group_id where t2.user_id = ?1 and t1.permission_type = ?2 ", nativeQuery = true)
List<Map<String, Object>> findByUserIdAndPermissionType(Long userId, Integer type);
}
package com.topdraw.business.module.member.group.rest;
import com.topdraw.aop.log.Log;
import com.topdraw.common.ResultInfo;
import com.topdraw.business.module.member.group.domain.MemberGroup;
import com.topdraw.business.module.member.group.service.MemberGroupService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
/**
* @author XiangHan
* @date 2021-11-17
*/
@Api(tags = "会员分组管理")
@RestController
@RequestMapping("/ucEngine/api/memberGroup")
@CrossOrigin
@Slf4j
public class MemberGroupController {
@Autowired
private MemberGroupService memberGroupService;
@Log("新增会员分组")
@RequestMapping(value = "/create")
@ApiOperation("新增会员分组")
public ResultInfo create(@Validated @RequestBody MemberGroup resources) {
log.info("memberGroup ==>> create ==>> param ==>> [{}]",resources);
this.memberGroupService.create(resources);
log.info("memberGroup ==>> create ==>> result ==>> [{}]",resources);
return ResultInfo.success();
}
@Log("修改会员分组")
@RequestMapping(value = "/update")
@ApiOperation("修改会员分组")
public ResultInfo update(@Validated @RequestBody MemberGroup resources) {
log.info("memberGroup ==>> update ==>> param ==>> [{}]",resources);
this.memberGroupService.update(resources);
log.info("memberGroup ==>> update ==>> result ==>> [{}]",resources);
return ResultInfo.success();
}
@Log("删除会员分组")
@RequestMapping(value = "/{id}")
@ApiOperation("删除会员分组")
public ResultInfo delete(@PathVariable(value = "id") Long resources) {
log.info("memberGroup ==>> delete ==>> param ==>> [{}]",resources);
this.memberGroupService.delete(resources);
log.info("memberGroup ==>> delete ==>> result ==>> [{}]",resources);
return ResultInfo.success();
}
}
package com.topdraw.business.module.member.group.service;
import com.topdraw.business.module.member.group.service.dto.GroupDTO;
/**
* @author luerlong
* @date 2021-09-27
*/
public interface GroupService {
/**
* 根据ID查询
* @param id ID
* @return GroupDTO
*/
GroupDTO findById(Long id);
/**
* Code校验
* @param code
* @return GroupDTO
*/
GroupDTO getByCode(String code);
}
......@@ -25,22 +25,4 @@ public interface MemberGroupService {
*/
MemberGroupDTO findById(Long id);
/**
* 创建会员分组
* @param resources
*/
void create(MemberGroup resources);
/**
* 修改会员分组
* @param resources
*/
void update(MemberGroup resources);
/**
* 删除会员分组
* @param id
*/
void delete(Long id);
}
......
package com.topdraw.business.module.member.group.service.dto;
import lombok.Data;
import java.io.Serializable;
/**
* @author luerlong
* @date 2021-09-27
*/
@Data
public class GroupDTO implements Serializable {
/** ID */
private Long id;
/** CODE */
private String code;
/** 名称 */
private String name;
/** 状态 0-下线 1-上线 */
private Integer status;
/** 权限 0-测试分组 1-鉴权通过(白名单) 2-不允许精准(黑名单)3-可以精准(金名单) */
private Integer permissionType;
}
......@@ -3,6 +3,7 @@ package com.topdraw.business.module.member.group.service.dto;
import lombok.Data;
import java.sql.Timestamp;
import java.io.Serializable;
import java.util.Set;
/**
......@@ -12,42 +13,43 @@ import java.io.Serializable;
@Data
public class MemberGroupDTO implements Serializable {
// ID ID
/** ID */
private Long id;
// 分组ID
/** 分组ID */
private Long groupId;
// 会员ID
/** 会员ID */
private Long memberId;
// 运营商平台账号
/** 运营商平台账号 */
private String platformAccount;
// 手机号
/** 手机号 */
private String cellphone;
// 设备
/** 设备 */
private String stbId;
// 有线MAC地址
/** 有线MAC地址 */
private String ethMac;
// 无线MAC地址
/** 无线MAC地址 */
private String wifiMac;
// 描述
/** 描述 */
private String description;
// 创建者
/** 创建者 */
private String createBy;
// 创建时间
/** 创建时间 */
private Timestamp createTime;
// 更新者
/** 更新者 */
private String updateBy;
// 更新时间
/** 更新时间 */
private Timestamp updateTime;
}
......
package com.topdraw.business.module.member.group.service.dto;
import lombok.Data;
import com.topdraw.annotation.Query;
/**
* @author XiangHan
* @date 2021-11-17
*/
@Data
public class MemberGroupQueryCriteria{
@Query(type = Query.Type.EQUAL)
private Long memberId;
}
package com.topdraw.business.module.member.group.service.impl;
import com.topdraw.business.module.member.group.domain.Group;
import com.topdraw.business.module.member.group.repository.GroupRepository;
import com.topdraw.business.module.member.group.service.GroupService;
import com.topdraw.business.module.member.group.service.dto.GroupDTO;
import com.topdraw.business.module.member.group.service.mapper.GroupMapper;
import com.topdraw.utils.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
/**
* @author luerlong
* @date 2021-09-27
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class GroupServiceImpl implements GroupService {
@Autowired
private GroupRepository groupRepository;
@Autowired
private GroupMapper groupMapper;
@Override
public GroupDTO findById(Long id) {
Group group = groupRepository.findById(id).orElseGet(Group::new);
ValidationUtil.isNull(group.getId(),"Group","id",id);
return groupMapper.toDto(group);
}
@Override
public GroupDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? groupMapper.toDto(groupRepository.findFirstByCode(code).orElseGet(Group::new))
: new GroupDTO();
}
}
......@@ -40,29 +40,4 @@ public class MemberGroupServiceImpl implements MemberGroupService {
return this.memberGroupMapper.toDto(memberGroup);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(MemberGroup resources) {
this.memberGroupRepository.save(resources);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(MemberGroup resources) {
MemberGroup memberGroup = this.memberGroupRepository.findById(resources.getId()).orElseGet(MemberGroup::new);
ValidationUtil.isNull(memberGroup.getId(),"MemberGroup","id",resources.getId());
memberGroup.copy(resources);
this.memberGroupRepository.save(memberGroup);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
MemberGroup MemberGroup = this.memberGroupRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", MemberGroup.class, id), 1));
this.memberGroupRepository.delete(MemberGroup);
}
}
......
package com.topdraw.business.module.weixin.service.mapper;
package com.topdraw.business.module.member.group.service.mapper;
import com.topdraw.base.BaseMapper;
import com.topdraw.business.module.weixin.domain.WeixinMessageTemplate;
import com.topdraw.business.module.weixin.service.dto.WeixinMessageTemplateDTO;
import com.topdraw.business.module.member.group.domain.Group;
import com.topdraw.business.module.member.group.service.dto.GroupDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
/**
* @author pengmengqing
* @date 2021-01-28
* @author luerlong
* @date 2021-09-27
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface WeixinMessageTemplateMapper extends BaseMapper<WeixinMessageTemplateDTO, WeixinMessageTemplate> {
public interface GroupMapper extends BaseMapper<GroupDTO, Group> {
}
......
package com.topdraw.business.module.member.level.domain;
import com.topdraw.business.common.CreateGroup;
import com.topdraw.business.common.UpdateGroup;
import com.topdraw.business.module.common.validated.CreateGroup;
import com.topdraw.business.module.common.validated.UpdateGroup;
import lombok.Data;
import lombok.experimental.Accessors;
import cn.hutool.core.bean.BeanUtil;
......
package com.topdraw.business.module.member.level.rest;
import com.topdraw.aop.log.Log;
import com.topdraw.business.common.CreateGroup;
import com.topdraw.business.common.UpdateGroup;
import com.topdraw.business.module.member.level.domain.MemberLevel;
import com.topdraw.common.ResultInfo;
import com.topdraw.business.module.member.level.service.MemberLevelService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Api(tags = "等级管理")
@RestController
@RequestMapping("/ucEngine/api/memberLevel")
@CrossOrigin
@Slf4j
public class MemberLevelController {
@Autowired
private MemberLevelService memberLevelService;
@Log("新增会员等级")
@RequestMapping(value = "/create")
@ApiOperation("新增会员等级")
public ResultInfo create(@Validated(value = {CreateGroup.class}) @RequestBody MemberLevel resources) {
log.info("memberLevel ==>> update ==>> param ==>> [{}]",resources);
this.memberLevelService.update(resources);
log.info("memberLevel ==>> update ==>> result ==>> [{}]",resources);
return ResultInfo.success();
}
@Log("修改等级")
@RequestMapping(value = "/update")
@ApiOperation("修改等级")
public ResultInfo update(@Validated(value = {UpdateGroup.class}) @RequestBody MemberLevel resources) {
log.info("memberLevel ==>> update ==>> param ==>> [{}]",resources);
this.memberLevelService.update(resources);
log.info("memberLevel ==>> update ==>> result ==>> [{}]",resources);
return ResultInfo.success();
}
@Log("删除等级")
@DeleteMapping(value = "/delete/{id}")
@ApiOperation("删除等级")
public ResultInfo delete(@PathVariable Long resources) {
log.info("memberLevel ==>> delete ==>> param ==>> [{}]",resources);
this.memberLevelService.delete(resources);
log.info("memberLevel ==>> delete ==>> result ==>> [{}]",resources);
return ResultInfo.success();
}
}
package com.topdraw.business.module.member.level.service;
import com.topdraw.business.module.member.level.domain.MemberLevel;
import com.topdraw.business.module.member.level.service.dto.MemberLevelDTO;
import java.util.List;
......@@ -10,6 +9,7 @@ import java.util.List;
* @date 2021-10-22
*/
public interface MemberLevelService {
/**
* 根据ID查询
* @param id ID
......@@ -18,12 +18,6 @@ public interface MemberLevelService {
MemberLevelDTO findById(Long id);
/**
*
* @param resources
*/
void update(MemberLevel resources);
/**
* Code校验
* @param code
* @return MemberLevelDTO
......@@ -31,13 +25,12 @@ public interface MemberLevelService {
MemberLevelDTO getByCode(String code);
/**
*
* 通过等级和状态检索
* @param i
* @param status
* @return
*/
List<MemberLevelDTO> findLevelAndStatus(Integer i, Integer status);
void delete(Long resources);
}
......
......@@ -12,36 +12,36 @@ import java.io.Serializable;
@Data
public class MemberLevelDTO implements Serializable {
// 主键
/** 主键 */
private Long id;
// 标识
/** 标识 */
private String code;
// 名称
/** 名称 */
private String name;
// 状态 0:未启用;1:启用
/** 状态 0:未启用;1:启用 */
private Integer status;
// 对应成长值
/** 对应成长值 */
private Long expValue;
// 等级(不可重复,数字越大等级越高)
/** 等级(不可重复,数字越大等级越高) */
private Integer level;
// 会员徽标
/** 会员徽标 */
private String iconUrl;
// 描述
/** 描述 */
private String description;
// 对应任务id,通过此字段可获得该等级所对应的权益
/** 对应任务id,通过此字段可获得该等级所对应的权益 */
private Long taskId;
// 创建时间
/** 创建时间 */
private Timestamp createTime;
// 更新时间
/** 更新时间 */
private Timestamp updateTime;
}
......
package com.topdraw.business.module.member.level.service.dto;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class MemberLevelQueryCriteria{
}
package com.topdraw.business.module.member.level.service.impl;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.member.level.domain.MemberLevel;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.member.level.repository.MemberLevelRepository;
import com.topdraw.business.module.member.level.service.MemberLevelService;
import com.topdraw.business.module.member.level.service.dto.MemberLevelDTO;
import com.topdraw.business.module.member.level.service.dto.MemberLevelQueryCriteria;
import com.topdraw.business.module.member.level.service.mapper.MemberLevelMapper;
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;
/**
* @author XiangHan
......@@ -32,41 +23,27 @@ import java.util.Map;
public class MemberLevelServiceImpl implements MemberLevelService {
@Autowired
private MemberLevelRepository MemberLevelRepository;
private MemberLevelRepository memberLevelRepository;
@Autowired
private MemberLevelMapper MemberLevelMapper;
private MemberLevelMapper memberLevelMapper;
@Override
public MemberLevelDTO findById(Long id) {
MemberLevel MemberLevel = MemberLevelRepository.findById(id).orElseGet(MemberLevel::new);
MemberLevel MemberLevel = this.memberLevelRepository.findById(id).orElseGet(MemberLevel::new);
ValidationUtil.isNull(MemberLevel.getId(),"MemberLevel","id",id);
return MemberLevelMapper.toDto(MemberLevel);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void update(MemberLevel resources) {
MemberLevel MemberLevel = MemberLevelRepository.findById(resources.getId()).orElseGet(MemberLevel::new);
ValidationUtil.isNull( MemberLevel.getId(),"MemberLevel","id",resources.getId());
MemberLevel.copy(resources);
MemberLevelRepository.save(MemberLevel);
return this.memberLevelMapper.toDto(MemberLevel);
}
@Override
public MemberLevelDTO getByCode(String code) {
return StringUtils.isNotEmpty(code) ? MemberLevelMapper.toDto(MemberLevelRepository.findFirstByCode(code).orElseGet(MemberLevel::new))
return StringUtils.isNotEmpty(code) ? this.memberLevelMapper.toDto(this.memberLevelRepository.findFirstByCode(code).orElseGet(MemberLevel::new))
: new MemberLevelDTO();
}
@Override
public List<MemberLevelDTO> findLevelAndStatus(Integer level, Integer status) {
return MemberLevelMapper.toDto(MemberLevelRepository.findByLevelAndStatus(level,status));
return this.memberLevelMapper.toDto(this.memberLevelRepository.findByLevelAndStatus(level,status));
}
@Override
public void delete(Long resources) {
MemberLevelRepository.deleteById(resources);
}
}
......
package com.topdraw.business.module.member.profile.domain;
import com.topdraw.business.common.CreateGroup;
import com.topdraw.business.common.UpdateGroup;
import com.topdraw.business.module.common.validated.CreateGroup;
import com.topdraw.business.module.common.validated.UpdateGroup;
import lombok.Data;
import lombok.experimental.Accessors;
import cn.hutool.core.bean.BeanUtil;
......@@ -15,7 +15,6 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.sql.Timestamp;
import java.io.Serializable;
import java.time.LocalDate;
/**
* @author XiangHan
......
......@@ -5,7 +5,7 @@ import org.apache.commons.lang3.StringUtils;
import java.util.Objects;
public class MemberProfileBuild {
public class MemberProfileBuilder {
public static MemberProfile build(Member member){
MemberProfile memberProfile = build(member.getId(),member.getNickname(),member.getGender(),"","","","","","",
......@@ -61,10 +61,6 @@ public class MemberProfileBuild {
return StringUtils.isBlank(s)?"":s;
}
private static Object objectIsNull(Object s){
return Objects.nonNull(s)?null:s;
}
public static MemberProfile build(MemberProfile resources) {
if (resources.getMemberId() == null)
throw new NullPointerException("memberId is null");
......
......@@ -3,11 +3,10 @@ package com.topdraw.business.module.member.profile.service.impl;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.profile.domain.MemberProfile;
import com.topdraw.business.module.member.profile.domain.MemberProfileBuild;
import com.topdraw.business.module.member.repository.MemberRepository;
import com.topdraw.business.module.member.profile.domain.MemberProfileBuilder;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.exception.BadRequestException;
import com.topdraw.util.Base64Util;
import com.topdraw.util.RedissonUtil;
import com.topdraw.utils.StringUtils;
import com.topdraw.utils.ValidationUtil;
......@@ -26,8 +25,6 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.util.Assert;
import java.nio.charset.StandardCharsets;
import java.util.*;
/**
* @author XiangHan
......@@ -75,13 +72,11 @@ public class MemberProfileServiceImpl implements MemberProfileService {
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public MemberProfile create(MemberProfile resources) {
log.info("MemberProfileServiceImpl ==>> update ==>> resources ===>> [{}]",resources);
Long memberId = resources.getMemberId();
Assert.notNull(memberId,"memberId can't be null !!");
MemberDTO memberDTO = this.memberService.findById(memberId);
if (Objects.nonNull(memberDTO.getCode()))
// 检查会员
this.checkMember(resources);
this.memberProfileRepository.save(resources);
return resources;
......@@ -90,62 +85,53 @@ public class MemberProfileServiceImpl implements MemberProfileService {
@Override
@Transactional(rollbackFor = Exception.class)
public MemberProfile createDefault(MemberProfile resources) {
MemberProfile memberProfile = MemberProfileBuild.build();
MemberProfile memberProfile = MemberProfileBuilder.build();
return this.create(memberProfile);
}
@Override
@Transactional(rollbackFor = Exception.class)
public MemberProfile createDefault(Member resources) {
MemberProfile memberProfile = MemberProfileBuild.build(resources);
MemberProfile memberProfile = MemberProfileBuilder.build(resources);
return this.create(memberProfile);
}
@Override
public MemberProfile createDefaultByMemberId(Long resources) {
MemberProfile memberProfile = MemberProfileBuild.build(resources);
MemberProfile memberProfile = MemberProfileBuilder.build(resources);
return this.create(memberProfile);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void update(MemberProfile resources) {
log.info("MemberProfileServiceImpl ==>> update ==>> resources ===>> [{}]",resources);
private MemberDTO checkMember(MemberProfile resources){
Long memberId = resources.getMemberId();
String memberCode = resources.getMemberCode();
if (Objects.isNull(memberId) && StringUtils.isBlank(memberCode))
throw new BadRequestException("memberId Or memberCode both null !!");
String realName = resources.getRealname();
if (StringUtils.isNotBlank(realName)) {
resources.setRealname(new String(Base64.getEncoder().encode(realName.getBytes(StandardCharsets.UTF_8))));
return this.memberService.checkMember(memberId,memberCode);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void update(MemberProfile resources) {
log.info("MemberProfileServiceImpl ==>> update ==>> resources ===>> [{}]",resources);
RLock rLock = this.redissonClient.getLock("memberProfile::update::id" + resources.getId());
try {
RedissonUtil.lock(rLock);
this.memberService.findByIdOrCode(memberId, memberCode);
MemberProfileDTO memberProfile = this.findByMemberId(memberId);
if (Objects.nonNull(memberProfile)) {
resources.setId(memberProfile.getId());
MemberProfile memberProfile1 = new MemberProfile();
BeanUtils.copyProperties(memberProfile,memberProfile1);
this.memberProfileRepository.save(memberProfile1);
// 检查会员是否存在
this.checkMember(resources);
// 真实姓名(加密)
String realName = resources.getRealname();
if (StringUtils.isNotBlank(realName)) {
resources.setRealname(Base64Util.encode(realName));
}
MemberProfile memberProfile = new MemberProfile();
BeanUtils.copyProperties(resources,memberProfile);
this.memberProfileRepository.save(memberProfile);
// 同步会员信息
this.synchronizedMemberData(resources);
} else {
resources.setId(null);
MemberProfile memberProfile1 = MemberProfileBuild.build(resources);
this.create(memberProfile1);
}
} catch (Exception e) {
e.printStackTrace();
throw e;
......@@ -169,22 +155,20 @@ public class MemberProfileServiceImpl implements MemberProfileService {
@Transactional(rollbackFor = Exception.class)
public void updateMemberProfileAndMember(MemberProfile resources) {
log.info("MemberProfileServiceImpl ==>> updateMemberProfileAndMember ==>> resources ===>> [{}]",resources);
this.update(resources);
}
/**
* 同步会员信息
* @param nickName
* @param gender
* @param birthday
* @param avatarUrl
* @param member
*/
private void synchronizedMemberData(String nickName , Integer gender , String birthday,
String avatarUrl,Member member) {
MemberProfile memberProfile = new MemberProfile();
memberProfile.setMemberId(member.getId());
memberProfile.setMemberCode(member.getCode());
memberProfile.setRealname(nickName);
memberProfile.setGender(gender);
memberProfile.setBirthday(birthday);
memberProfile.setAvatarUrl(avatarUrl);
this.synchronizedMemberData(memberProfile);
this.synchronizedMemberData(nickName,gender,birthday,avatarUrl,member.getId(),member.getCode());
}
private void synchronizedMemberData(String nickName , Integer gender , String birthday,
......@@ -201,17 +185,17 @@ public class MemberProfileServiceImpl implements MemberProfileService {
private void synchronizedMemberData(MemberProfile resources) {
MemberDTO memberDTO = this.memberService.findByIdOrCode(resources.getMemberId(),resources.getMemberCode());
log.info("updateMemberProfileAndMember ==>> resources ==>> [{}]",resources);
Member member = new Member();
BeanUtils.copyProperties(memberDTO,member);
member.setId(resources.getMemberId());
member.setCode(resources.getMemberCode());
member.setNickname(resources.getRealname());
member.setGender(resources.getGender());
member.setBirthday(resources.getBirthday());
member.setAvatarUrl(resources.getAvatarUrl());
log.info("updateMemberProfileAndMember ==>> member ==>> [{}]",member);
memberService.update(member);
this.memberService.update(member);
}
}
......
package com.topdraw.business.module.member.relatedinfo.domain;
import com.topdraw.business.module.common.domain.DefaultAsyncMqModule;
import com.topdraw.business.module.common.validated.UpdateGroup;
import com.topdraw.business.module.common.domain.AsyncMqModule;
import lombok.Data;
import lombok.experimental.Accessors;
import cn.hutool.core.bean.BeanUtil;
......@@ -25,53 +26,53 @@ import java.time.LocalDate;
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_member_related_info")
public class MemberRelatedInfo extends DefaultAsyncMqModule implements Serializable {
public class MemberRelatedInfo extends AsyncMqModule implements Serializable {
// ID
/** ID */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
@NotNull(groups = {UpdateGroup.class})
@NotNull(message = "id can't be null" , groups = {UpdateGroup.class})
private Long id;
// 会员id
/** 会员id */
@Column(name = "member_id", nullable = false)
private Long memberId;
// 人物关系 0:子女;1:父母
/** 人物关系 0:子女;1:父母 */
@Column(name = "type")
private Integer type;
// 手机号
/** 手机号 */
@Column(name = "cellphone")
private String cellphone;
// 身份证号
/** 身份证号 */
@Column(name = "id_card")
private String idCard;
// 姓名
/** 姓名 */
@Column(name = "name")
private String name;
// 性别 0:女;1:男;-1:未知
/** 性别 0:女;1:男;-1:未知 */
@Column(name = "sex")
private Integer sex;
// 生日
/** 生日 */
@Column(name = "birthday")
private LocalDate birthday;
// 头像地址
/** 头像地址 */
@Column(name = "avatar_url")
private String avatarUrl;
// 创建时间
/** 创建时间 */
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
/** 更新时间 */
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
......
package com.topdraw.business.module.member.relatedinfo.domain;
import com.topdraw.business.module.member.domain.Member;
import org.apache.commons.lang3.StringUtils;
import java.time.LocalDate;
import java.util.Objects;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/11 13:56
* @version: :
* @modified By:
* @since : modified in 2022/3/11 13:56
*/
public class MemberRelatedInfoBuilder {
private static final Integer DEFAULT_VALUE_ = -1;
private static final Integer DEFAULT_VALUE_0 = 0;
public static MemberRelatedInfo build(MemberRelatedInfo memberRelatedInfo){
return build(memberRelatedInfo.getId(),memberRelatedInfo.getMemberCode(),memberRelatedInfo.getId(),memberRelatedInfo.getName(),memberRelatedInfo.getSex(),
memberRelatedInfo.getCellphone(),memberRelatedInfo.getIdCard(),memberRelatedInfo.getBirthday(),memberRelatedInfo.getAvatarUrl(),memberRelatedInfo.getType());
}
public static MemberRelatedInfo build(Member member , MemberRelatedInfo memberRelatedInfo){
return build(member.getId(),member.getCode(),memberRelatedInfo.getId(),memberRelatedInfo.getName(),memberRelatedInfo.getSex(),
memberRelatedInfo.getCellphone(),memberRelatedInfo.getIdCard(),memberRelatedInfo.getBirthday(),memberRelatedInfo.getAvatarUrl(),memberRelatedInfo.getType());
}
public static MemberRelatedInfo build(Long memberId , String memberCode , Long id , String name , Integer sex ,
String cellphone , String idCard, LocalDate birthday , String avatarUrl , Integer type){
MemberRelatedInfo memberRelatedInfo = new MemberRelatedInfo();
memberRelatedInfo.setMemberId(memberId);
memberRelatedInfo.setMemberCode(memberCode);
memberRelatedInfo.setId(id);
memberRelatedInfo.setName(stringIsNull(name));
memberRelatedInfo.setSex(Objects.isNull(sex)?DEFAULT_VALUE_:sex);
memberRelatedInfo.setCellphone(stringIsNull(cellphone));
memberRelatedInfo.setIdCard(StringUtils.isBlank(idCard)?"000000000000000000":idCard);
memberRelatedInfo.setBirthday(Objects.isNull(birthday)? LocalDate.of(1990,01,01):birthday);
memberRelatedInfo.setAvatarUrl(stringIsNull(avatarUrl));
memberRelatedInfo.setType(Objects.isNull(type)?DEFAULT_VALUE_0:type);
return memberRelatedInfo;
}
private static String stringIsNull(String s){
return StringUtils.isBlank(s)?"":s;
}
}
package com.topdraw.business.module.member.relatedinfo.domain;
public interface UpdateGroup {
}
......@@ -4,10 +4,17 @@ import com.topdraw.business.module.member.relatedinfo.domain.MemberRelatedInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
/**
* @author XiangHan
* @date 2021-10-22
*/
public interface MemberRelatedInfoRepository extends JpaRepository<MemberRelatedInfo, Long>, JpaSpecificationExecutor<MemberRelatedInfo> {
MemberRelatedInfo findByIdCard(String idCard);
MemberRelatedInfo findByMemberIdAndIdCard(Long memberId , String idCard);
MemberRelatedInfo findByIdOrIdCard(Long id, String idCard);
}
......
package com.topdraw.business.module.member.relatedinfo.rest;
import com.topdraw.aop.log.Log;
import com.topdraw.business.common.CreateGroup;
import com.topdraw.business.module.member.relatedinfo.domain.UpdateGroup;
import com.topdraw.business.module.common.validated.CreateGroup;
import com.topdraw.business.module.common.validated.UpdateGroup;
import com.topdraw.business.module.member.relatedinfo.service.dto.MemberRelatedInfoDTO;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.common.ResultInfo;
import com.topdraw.business.module.member.relatedinfo.domain.MemberRelatedInfo;
import com.topdraw.business.module.member.relatedinfo.service.MemberRelatedInfoService;
import com.topdraw.exception.BadRequestException;
import com.topdraw.util.Base64Util;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
......@@ -42,13 +39,9 @@ public class MemberRelatedInfoController {
@ApiOperation("新增相关人员")
public ResultInfo create(@Validated(value = {CreateGroup.class}) @RequestBody MemberRelatedInfo resources) {
log.info("memberRelatedInfo ==>> create ==>> resources ===>> [{}]",resources);
String name = resources.getName();
if (StringUtils.hasText(name)) {
String nickNameEncode = Base64Util.encode(name);
resources.setName(nickNameEncode);
}
this.memberRelatedInfoService.create(resources);
return ResultInfo.success();
}
......@@ -59,21 +52,10 @@ public class MemberRelatedInfoController {
log.info("memberRelatedInfo ==>> update ==>> resources ===>> [{}]",resources);
String name = resources.getName();
if (StringUtils.hasText(name)) {
String nickNameEncode = Base64Util.encode(name);
resources.setName(nickNameEncode);
}
Long id = resources.getId();
MemberRelatedInfoDTO memberRelatedInfoDTO = this.memberRelatedInfoService.findById(id);
if (memberRelatedInfoDTO.getId() != null) {
Long memberId = memberRelatedInfoDTO.getMemberId();
if (Objects.isNull(memberId)) {
log.info("id ==>> [{}]",id);
throw new BadRequestException("memberId is null! please check member info");
}
MemberDTO memberDTO = this.memberService.findById(memberId);
if (Objects.nonNull(memberDTO)) {
String code = memberDTO.getCode();
......
package com.topdraw.business.module.member.relatedinfo.service;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.relatedinfo.domain.MemberRelatedInfo;
import com.topdraw.business.module.member.relatedinfo.service.dto.MemberRelatedInfoDTO;
......@@ -16,10 +17,66 @@ public interface MemberRelatedInfoService {
*/
MemberRelatedInfoDTO findById(Long id);
/**
* 新增
* @param resources
*/
void create(MemberRelatedInfo resources);
/**
* 修改
* @param resources
*/
void update(MemberRelatedInfo resources);
/**
* 删除
* @param id
*/
void delete(Long id);
/**
* 通过身份证查询
* @param resources
* @return
*/
MemberRelatedInfo findByIdCard(MemberRelatedInfo resources);
/**
* 通过身份证查询
* @param idCard 身份证
* @return
*/
MemberRelatedInfo findByIdCard(String idCard);
/**
*
* @param memberId
* @param idCard
* @return
*/
MemberRelatedInfo findByMemberIdAndIdCard(Long memberId , String idCard);
/**
*
* @param memberCode
* @param idCard
* @return
*/
MemberRelatedInfo findByMemberCodeAndIdCard(String memberCode , String idCard);
/**
*
* @param resources
* @return
*/
MemberRelatedInfo findByMemberIdAndIdCard(MemberRelatedInfo resources);
/**
*
* @param member
* @param resources
* @return
*/
MemberRelatedInfo findByMemberIdAndIdCard(Member member , MemberRelatedInfo resources);
}
......
package com.topdraw.business.module.member.relatedinfo.service.dto;
import com.topdraw.annotation.Query;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class MemberRelatedInfoQueryCriteria{
@Query
private Long memberId;
}
package com.topdraw.business.module.member.relatedinfo.service.impl;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.relatedinfo.domain.MemberRelatedInfo;
import com.topdraw.business.module.member.relatedinfo.domain.MemberRelatedInfoBuilder;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.exception.BadRequestException;
import com.topdraw.exception.GlobeExceptionMsg;
import com.topdraw.util.Base64Util;
import com.topdraw.util.RedissonUtil;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.member.relatedinfo.repository.MemberRelatedInfoRepository;
import com.topdraw.business.module.member.relatedinfo.service.MemberRelatedInfoService;
import com.topdraw.business.module.member.relatedinfo.service.dto.MemberRelatedInfoDTO;
import com.topdraw.business.module.member.relatedinfo.service.dto.MemberRelatedInfoQueryCriteria;
import com.topdraw.business.module.member.relatedinfo.service.mapper.MemberRelatedInfoMapper;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
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 org.springframework.util.StringUtils;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* @author XiangHan
......@@ -28,47 +33,175 @@ import java.util.Map;
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
@Slf4j
public class MemberRelatedInfoServiceImpl implements MemberRelatedInfoService {
@Autowired
private MemberRelatedInfoRepository MemberRelatedInfoRepository;
private MemberService memberService;
@Autowired
private MemberRelatedInfoMapper memberRelatedInfoMapper;
@Autowired
private MemberRelatedInfoRepository memberRelatedInfoRepository;
@Autowired
private MemberRelatedInfoMapper MemberRelatedInfoMapper;
private RedissonClient redissonClient;
private static final String DEFAULT_IDCARD = "000000000000000000";
@Override
public MemberRelatedInfoDTO findById(Long id) {
MemberRelatedInfo MemberRelatedInfo = MemberRelatedInfoRepository.findById(id).orElseGet(MemberRelatedInfo::new);
ValidationUtil.isNull(MemberRelatedInfo.getId(),"MemberRelatedInfo","id",id);
return MemberRelatedInfoMapper.toDto(MemberRelatedInfo);
log.info("MemberRelatedInfoServiceImpl ==>> findById ==>> param ==>> [{}]",id);
MemberRelatedInfo memberRelatedInfo = this.memberRelatedInfoRepository.findById(id).orElseGet(MemberRelatedInfo::new);
ValidationUtil.isNull(memberRelatedInfo.getId(),"MemberRelatedInfo","id",id);
return this.memberRelatedInfoMapper.toDto(memberRelatedInfo);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void create(MemberRelatedInfo resources) {
MemberRelatedInfoRepository.save(resources);
log.info("MemberRelatedInfoServiceImpl ==>> create ==>> param ==>> [{}]",resources);
String idCard = resources.getIdCard();
Long memberId = resources.getMemberId();
if (Objects.nonNull(memberId) && !StringUtils.hasText(idCard) && !idCard.equalsIgnoreCase(DEFAULT_IDCARD) ) {
MemberRelatedInfo memberRelatedInfo = this.findByMemberIdAndIdCard(resources);
if (Objects.nonNull(memberRelatedInfo))
// 数据已存在
throw new BadRequestException(GlobeExceptionMsg.ENTITY_ALREADY_EXISTS);
}
this.checkMemberAndEncodeRealname(resources);
MemberRelatedInfo memberRelatedInfo = MemberRelatedInfoBuilder.build(resources);
this.memberRelatedInfoRepository.save(memberRelatedInfo);
log.info("MemberRelatedInfoServiceImpl ==>> create ==>> result ==>> [{}]",memberRelatedInfo);
}
/**
* 检查会员是否存在,加密真实姓名
* @param resources
*/
private void checkMemberAndEncodeRealname(MemberRelatedInfo resources) {
// 检查会员是否存在
this.checkMember(resources);
// 加密真实姓名
this.encodeRealname(resources);
}
/**
* 加密真实姓名
* @param resources
* @return
*/
private void encodeRealname(MemberRelatedInfo resources){
String name = resources.getName();
if (StringUtils.hasText(name)) {
String nickNameEncode = Base64Util.encode(name);
if (!nickNameEncode.equalsIgnoreCase(name))
resources.setName(nickNameEncode);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void update(MemberRelatedInfo resources) {
MemberRelatedInfo MemberRelatedInfo = MemberRelatedInfoRepository.findById(resources.getId()).orElseGet(MemberRelatedInfo::new);
ValidationUtil.isNull( MemberRelatedInfo.getId(),"MemberRelatedInfo","id",resources.getId());
MemberRelatedInfo.copy(resources);
MemberRelatedInfoRepository.save(MemberRelatedInfo);
log.info("MemberRelatedInfoServiceImpl ==>> update ==>> param ==>> [{}]",resources);
RLock rLock = this.redissonClient.getLock("memberRelatedInfo::update::id" + resources.getId());
try {
RedissonUtil.lock(rLock);
this.checkMemberAndEncodeRealname(resources);
MemberRelatedInfo memberRelatedInfo = this.memberRelatedInfoRepository.findById(resources.getId()).orElseGet(MemberRelatedInfo::new);
ValidationUtil.isNull(memberRelatedInfo.getId(), "MemberRelatedInfo", "id", resources.getId());
memberRelatedInfo.copy(resources);
this.memberRelatedInfoRepository.save(memberRelatedInfo);
log.info("MemberRelatedInfoServiceImpl ==>> update ==>> param ==>> [{}]", resources);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(rLock);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void delete(Long id) {
Assert.notNull(id, "The given id must not be null!");
MemberRelatedInfo MemberRelatedInfo = MemberRelatedInfoRepository.findById(id).orElseThrow(
MemberRelatedInfo MemberRelatedInfo = this.memberRelatedInfoRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", MemberRelatedInfo.class, id), 1));
MemberRelatedInfoRepository.delete(MemberRelatedInfo);
this.memberRelatedInfoRepository.delete(MemberRelatedInfo);
}
@Override
public MemberRelatedInfo findByIdCard(MemberRelatedInfo resources){
log.info("MemberRelatedInfoServiceImpl ==>> findByIdCard ==>> param ==>> [{}]",resources);
String idCard = resources.getIdCard();
Assert.notNull(idCard,"idCard can't be null");
if (!idCard.equalsIgnoreCase(DEFAULT_IDCARD)) {
MemberRelatedInfo memberRelatedInfo = this.findByIdCard(idCard);
ValidationUtil.isNull(memberRelatedInfo.getId(),"MemberRelatedInfo","id",resources.getId());
log.info("MemberRelatedInfoServiceImpl ==>> findByIdCard ==>> result ==>> [{}]",memberRelatedInfo);
return memberRelatedInfo;
}
return null;
}
@Override
public MemberRelatedInfo findByIdCard(String idCard) {
log.info("MemberRelatedInfoServiceImpl ==>> findByIdCard ==>> param ==>> [{}]",idCard);
MemberRelatedInfo memberRelatedInfo = this.memberRelatedInfoRepository.findByIdCard(idCard);
log.info("MemberRelatedInfoServiceImpl ==>> findByIdCard ==>> result ==>> [{}]",memberRelatedInfo);
return memberRelatedInfo;
}
@Override
public MemberRelatedInfo findByMemberCodeAndIdCard(String memberCode, String idCard) {
Assert.notNull(memberCode,"memberCode can't be null");
Assert.notNull(idCard,"idCard can't be null");
MemberDTO memberDTO = this.checkMember(null, memberCode);
return this.findByMemberIdAndIdCard(memberDTO.getId(),idCard);
}
@Override
public MemberRelatedInfo findByMemberIdAndIdCard(Long memberId, String idCard) {
log.info("MemberRelatedInfoServiceImpl ==>> findByMemberIdAndIdCard ==>> param ==>> [{}]",memberId+","+idCard);
MemberRelatedInfo memberRelatedInfo = this.memberRelatedInfoRepository.findByMemberIdAndIdCard(memberId, idCard);
log.info("MemberRelatedInfoServiceImpl ==>> findByMemberIdAndIdCard ==>> result ==>> [{}]",memberRelatedInfo);
return memberRelatedInfo;
}
@Override
public MemberRelatedInfo findByMemberIdAndIdCard(MemberRelatedInfo resources) {
Long memberId = resources.getMemberId();
String idCard = resources.getIdCard();
return this.findByMemberIdAndIdCard(memberId,idCard);
}
@Override
public MemberRelatedInfo findByMemberIdAndIdCard(Member member, MemberRelatedInfo resources) {
Long memberId = member.getId();
String idCard = resources.getIdCard();
return this.findByMemberIdAndIdCard(memberId,idCard);
}
private MemberDTO checkMember(MemberRelatedInfo resources){
Long memberId = resources.getMemberId();
String code = resources.getMemberCode();
return this.memberService.checkMember(memberId, code);
}
private MemberDTO checkMember(Long memberId , String memberCode){
return this.memberService.checkMember(memberId, memberCode);
}
}
......
package com.topdraw.business.module.member.rest;
import com.topdraw.aop.log.Log;
import com.topdraw.business.common.CreateGroup;
import com.topdraw.business.common.UpdateGroup;
import com.topdraw.business.module.common.validated.CreateGroup;
import com.topdraw.business.module.common.validated.UpdateGroup;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.user.iptv.domain.UserTv;
......@@ -34,24 +34,15 @@ public class MemberController {
@Log("为大屏账户创建会员")
@RequestMapping(value = "/createMemberByUserTv")
@ApiOperation("为大屏账户创建会员")
@Deprecated
public ResultInfo createMemberByUserTv(@Validated(value = {CreateGroup.class}) @RequestBody UserTv resources) {
// todo 此接口废弃,将移动至UserTvController中,AppEngine也要同步修改
log.info("member ==>> createMemberByUserTv ==>> param ==>> [{}]",resources);
boolean result = this.userTvOperationService.createMemberByUserTv(resources);
boolean result = this.userTvOperationService.createTvUserAndCreateMember(resources);
log.info("member ==>> createMemberByUserTv ==>> result ==>> [{}]",result);
return ResultInfo.success(result);
}
@Log("新增会员")
@RequestMapping(value = "/create")
@ApiOperation("新增会员")
public ResultInfo create(@Validated @RequestBody Member resources) {
log.info("member ==>> create ==>> param ==>> [{}]",resources);
Long id = memberService.create(resources);
log.info("member ==>> create ==>> result ==>> [{}]",resources);
return ResultInfo.success(id);
}
@Log("手动修改vip")
@RequestMapping(value = "/doUpdateVipByCode")
@ApiOperation("手动修改vip")
......@@ -61,14 +52,4 @@ public class MemberController {
log.info("member ==>> doUpdateVipByCode ==>> result ==>> [{}]",resources);
return ResultInfo.success();
}
@Log("修改会员")
@RequestMapping(value = "/update")
@ApiOperation("修改会员")
public ResultInfo update(@Validated(value = {UpdateGroup.class}) @RequestBody Member resources) {
log.info("member ==>> update ==>> param ==>> [{}]",resources);
memberService.update(resources);
log.info("member ==>> update ==>> result ==>> [{}]",resources);
return ResultInfo.success();
}
}
......
......@@ -26,14 +26,6 @@ public interface MemberService {
MemberDTO findByCode(String code);
/**
*
* @param id
* @param code
* @return
*/
MemberDTO findByIdOrCode(Long id,String code);
/**
* 保存
* @param resources
* @return Long id
......@@ -54,13 +46,6 @@ public interface MemberService {
void update(Member resources);
/**
* 解绑
* @param resources 会员
* @return Map<String,Object>
*/
void unbind(Member resources);
/**
* 修改会员积分
* @param member 会员
*/
......@@ -72,4 +57,17 @@ public interface MemberService {
* @return Map<String,Object>
*/
List<MemberDTO> findByUserIptvId(Long id);
/**
* 检查会员信息
* @param id 会员id
* @param memberCode 会员编码
*/
MemberDTO checkMember(Long id , String memberCode);
/**
* 检查会员信息
* @param member 会员
*/
MemberDTO checkMember(Member member);
}
......
package com.topdraw.business.module.member.service.dto;
import com.topdraw.annotation.Query;
import lombok.Data;
/**
* @author XiangHan
* @date 2021-10-22
*/
@Data
public class MemberQueryCriteria{
@Query(type = Query.Type.LEFT_LIKE)
private String code;
// 类型 1:大屏;2:小屏
@Query(type = Query.Type.EQUAL)
private Integer type;
// 状态 0:不可用;1:可用
@Query(type = Query.Type.EQUAL)
private Integer status;
// 昵称 base64
@Query(type = Query.Type.LEFT_LIKE)
private String nickname;
// 性别 0:女;1:男;-1:未知
@Query(type = Query.Type.EQUAL)
private Integer gender;
// 分组信息
@Query(type = Query.Type.EQUAL)
private String groups;
// 标签
@Query(type = Query.Type.IN)
private String tags;
// 是否会员 0:非会员;1:会员
@Query(type = Query.Type.EQUAL)
private Integer vip;
// 会员等级(对应level表的level字段,非id)
@Query(type = Query.Type.EQUAL)
private Integer level;
// iptv账号id
@Query(type = Query.Type.EQUAL)
private Long userIptvId;
// 绑定IPTV平台 0:未知;1:电信;2:移动;3:联通
@Query(type = Query.Type.IN)
private Integer bindIptvPlatformType;
}
......@@ -9,12 +9,14 @@ import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.member.service.mapper.MemberMapper;
import com.topdraw.exception.BadRequestException;
import com.topdraw.exception.GlobeExceptionMsg;
import com.topdraw.util.RedissonUtil;
import com.topdraw.utils.StringUtils;
import com.topdraw.utils.ValidationUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
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;
......@@ -42,35 +44,66 @@ public class MemberServiceImpl implements MemberService {
@Override
public MemberDTO findById(Long id) {
Member member = this.memberRepository.findById(id).orElseGet(Member::new);
ValidationUtil.isNull(member.getId(),"Member","id",id);
return memberMapper.toDto(member);
}
@Override
public MemberDTO findByCode(String code) {
Member member = this.memberRepository.findFirstByCode(code).orElseGet(Member::new);
ValidationUtil.isNull(member.getId(),"Member","id",code);
return memberMapper.toDto(member);
}
@Override
public MemberDTO findByIdOrCode(Long id,String code) {
private MemberDTO findByIdOrCode(Long id,String code) {
Member member = this.memberRepository.findByIdOrCode(id,code).orElseGet(Member::new);
ValidationUtil.isNull(member.getId(),"Member","param",code);
return memberMapper.toDto(member);
}
@Override
public List<MemberDTO> findByUserIptvId(Long id) {
List<Member> memberList = this.memberRepository.findByUserIptvId(id);
return memberMapper.toDto(memberList);
}
@Override
public MemberDTO checkMember(Long id, String memberCode) {
if(Objects.isNull(id) && StringUtils.isBlank(memberCode))
throw new BadRequestException(GlobeExceptionMsg.MEMBER_ID_AND_CODE_ARE_NULL);
return this.findByIdOrCode(id, memberCode);
}
@Override
public MemberDTO checkMember(Member member) {
String memberCode = member.getCode();
Long memberId = member.getId();
return this.checkMember(memberId,memberCode);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public Long create(Member resources) {
Member member = MemberBuilder.build(resources);
Long memberId = this.save(member);
......@@ -79,15 +112,18 @@ public class MemberServiceImpl implements MemberService {
this.memberProfileService.createDefault(member);
return member.getId();
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public Member createAndReturnMember(Member resources) {
Member member = MemberBuilder.build(resources);
this.create(member);
this.create(MemberBuilder.build(resources));
return resources;
}
@Override
......@@ -96,43 +132,24 @@ public class MemberServiceImpl implements MemberService {
public void update(Member resources) {
log.info("MemberServiceImpl ==>> update ==>> resources ==>> [{}]" , resources);
String code = resources.getCode();
if (StringUtils.isBlank(code))
throw new BadRequestException("memberCode can't be null!!");
RLock rLock = this.redissonClient.getLock("member::update::code" + resources.getCode());
try {
RedissonUtil.lock(rLock);
Member member = this.memberRepository.findFirstByCode(code).orElseGet(Member::new);
ValidationUtil.isNull(member.getCode(), "Member", "code", resources.getCode());
MemberDTO memberDTO = this.checkMember(resources);
Member member = new Member();
BeanUtils.copyProperties(memberDTO,member);
member.copy(resources);
this.save(member);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
RedissonUtil.unlock(rLock);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend()
public void unbind(Member resources) {
RLock rLock = this.redissonClient.getLock("member::update::code" + resources.getCode());
try {
RedissonUtil.lock(rLock);
Member member = this.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);
}
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
......@@ -160,6 +177,4 @@ public class MemberServiceImpl implements MemberService {
}
}
}
......
......@@ -2,6 +2,7 @@ package com.topdraw.business.module.member.viphistory.domain;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.topdraw.business.module.common.domain.AsyncMqModule;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.CreatedDate;
......@@ -22,7 +23,7 @@ import java.time.LocalDateTime;
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_member_vip_history")
public class MemberVipHistory implements Serializable {
public class MemberVipHistory extends AsyncMqModule implements Serializable {
// 主键
@Id
......
package com.topdraw.business.module.member.viphistory.rest;
import com.topdraw.business.module.member.viphistory.domain.MemberVipHistory;
import com.topdraw.business.module.member.viphistory.service.MemberVipHistoryService;
import com.topdraw.business.module.member.viphistory.service.dto.MemberVipHistoryQueryCriteria;
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.data.domain.Pageable;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* @author luerlong
* @date 2021-12-10
*/
@Api(tags = "MemberVipHistory管理")
@RestController
@RequestMapping("/api/memberVipHistory")
public class MemberVipHistoryController {
@Autowired
private MemberVipHistoryService memberVipHistoryService;
@PostMapping
@ApiOperation("新增MemberVipHistory")
public ResultInfo create(@Validated @RequestBody MemberVipHistory resources) {
memberVipHistoryService.create(resources);
return ResultInfo.success();
}
@PutMapping
@ApiOperation("修改MemberVipHistory")
public ResultInfo update(@Validated @RequestBody MemberVipHistory resources) {
memberVipHistoryService.update(resources);
return ResultInfo.success();
}
@DeleteMapping(value = "/{id}")
@ApiOperation("删除MemberVipHistory")
public ResultInfo delete(@PathVariable Long id) {
memberVipHistoryService.delete(id);
return ResultInfo.success();
}
}
......@@ -2,13 +2,8 @@ package com.topdraw.business.module.member.viphistory.service;
import com.topdraw.business.module.member.viphistory.domain.MemberVipHistory;
import com.topdraw.business.module.member.viphistory.service.dto.MemberVipHistoryDTO;
import com.topdraw.business.module.member.viphistory.service.dto.MemberVipHistoryQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* @author luerlong
......@@ -17,32 +12,35 @@ import java.util.Optional;
public interface MemberVipHistoryService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(MemberVipHistoryQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<MemberVipHistoryDTO>
*/
List<MemberVipHistoryDTO> queryAll(MemberVipHistoryQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return MemberVipHistoryDTO
*/
MemberVipHistoryDTO findById(Long id);
/**
*
* @param resources
*/
void create(MemberVipHistory resources);
/**
*
* @param resources
*/
void update(MemberVipHistory resources);
/**
*
* @param id
*/
void delete(Long id);
/**
*
* @param id
* @param nowTime
* @return
*/
MemberVipHistory findByTime(Long id, LocalDateTime nowTime);
}
......
package com.topdraw.business.module.member.viphistory.service.impl;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.member.viphistory.domain.MemberVipHistory;
import com.topdraw.business.module.member.viphistory.repository.MemberVipHistoryRepository;
import com.topdraw.business.module.member.viphistory.service.MemberVipHistoryService;
import com.topdraw.business.module.member.viphistory.service.dto.MemberVipHistoryDTO;
import com.topdraw.business.module.member.viphistory.service.dto.MemberVipHistoryQueryCriteria;
import com.topdraw.business.module.member.viphistory.service.mapper.MemberVipHistoryMapper;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.ValidationUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* @author luerlong
......@@ -30,35 +25,31 @@ import java.util.Optional;
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
@Slf4j
public class MemberVipHistoryServiceImpl implements MemberVipHistoryService {
@Autowired
private MemberVipHistoryRepository memberVipHistoryRepository;
private MemberService memberService;
@Autowired
private MemberVipHistoryMapper memberVipHistoryMapper;
@Override
public Map<String, Object> queryAll(MemberVipHistoryQueryCriteria criteria, Pageable pageable) {
Page<MemberVipHistory> page = memberVipHistoryRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(memberVipHistoryMapper::toDto));
}
@Override
public List<MemberVipHistoryDTO> queryAll(MemberVipHistoryQueryCriteria criteria) {
return memberVipHistoryMapper.toDto(memberVipHistoryRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
}
@Autowired
private MemberVipHistoryRepository memberVipHistoryRepository;
@Override
public MemberVipHistoryDTO findById(Long id) {
log.info("MemberVipHistoryServiceImpl ==>> findById ==>> param ==>> [{}]",id);
MemberVipHistory memberVipHistory = memberVipHistoryRepository.findById(id).orElseGet(MemberVipHistory::new);
ValidationUtil.isNull(memberVipHistory.getId(),"MemberVipHistory","id",id);
log.info("MemberVipHistoryServiceImpl ==>> findById ==>> result ==>> [{}]",memberVipHistory);
return memberVipHistoryMapper.toDto(memberVipHistory);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(MemberVipHistory resources) {
log.info("MemberVipHistoryServiceImpl ==>> MemberVipHistoryServiceImpl ==>> param ==>> [{}]",resources);
this.checkMember(resources);
memberVipHistoryRepository.save(resources);
}
......@@ -86,5 +77,10 @@ public class MemberVipHistoryServiceImpl implements MemberVipHistoryService {
return memberVipHistory;
}
private MemberDTO checkMember(MemberVipHistory resources){
Long memberId = resources.getMemberId();
String code = resources.getMemberCode();
return this.memberService.checkMember(memberId, code);
}
}
......
package com.topdraw.business.module.points.available.domain;
import com.topdraw.business.module.common.domain.DefaultAsyncMqModule;
import com.topdraw.business.module.common.domain.AsyncMqModule;
import lombok.Data;
import lombok.experimental.Accessors;
import cn.hutool.core.bean.BeanUtil;
......@@ -25,7 +25,7 @@ import java.io.Serializable;
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_points_available")
public class PointsAvailable extends DefaultAsyncMqModule implements Serializable {
public class PointsAvailable extends AsyncMqModule implements Serializable {
// 主键
@Id
......
package com.topdraw.business.module.rights.history.domain;
import com.topdraw.business.module.common.domain.DefaultAsyncMqModule;
import com.topdraw.business.module.common.domain.AsyncMqModule;
import lombok.Data;
import lombok.experimental.Accessors;
import cn.hutool.core.bean.BeanUtil;
......@@ -23,7 +23,7 @@ import java.time.LocalDateTime;
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="tr_rights_histroy")
public class RightsHistory extends DefaultAsyncMqModule implements Serializable {
public class RightsHistory extends AsyncMqModule implements Serializable {
// 主键id
@Id
......
package com.topdraw.business.module.user.iptv.domain;
import com.topdraw.business.common.CreateGroup;
import com.topdraw.business.common.UpdateGroup;
import com.topdraw.business.module.common.domain.AsyncMqModule;
import com.topdraw.business.module.common.validated.CreateGroup;
import lombok.Data;
import lombok.experimental.Accessors;
import cn.hutool.core.bean.BeanUtil;
......@@ -25,15 +25,11 @@ import java.io.Serializable;
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_user_tv")
public class UserTv implements Serializable {
public class UserTv extends AsyncMqModule implements Serializable {
/** 绑定的小屏账户会员编码 */
@Column(name = "priority_member_code")
private String priorityMemberCode;
@Transient
private String memberCode;
// ID
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
......
package com.topdraw.business.module.user.iptv.domain;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.exception.BadRequestException;
import com.topdraw.exception.GlobeExceptionMsg;
import com.topdraw.util.TimestampUtil;
import org.apache.commons.lang3.StringUtils;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/14 14:36
* @version: :
* @modified By:
* @since : modified in 2022/3/14 14:36
*/
public class UserTvBuilder {
public static UserTv build(UserTv userTv){
return build(userTv.getMemberCode(),userTv.getId(),userTv.getPlatformAccount(),userTv.getNickname(),userTv.getUsername(),
userTv.getLoginDays(),userTv.getStatus(),userTv.getContinueDays(),userTv.getCreateBy(),userTv.getUpdateBy());
}
public static UserTv build(String memberCode , UserTv userTv){
return build(memberCode,userTv.getId(),userTv.getPlatformAccount(),userTv.getNickname(),userTv.getUsername(),
userTv.getLoginDays(),userTv.getStatus(),userTv.getContinueDays(),userTv.getCreateBy(),userTv.getUpdateBy());
}
public static UserTv build(Member member ,UserTv userTv){
return build(member.getCode(),userTv.getId(),userTv.getPlatformAccount(),userTv.getNickname(),userTv.getUsername(),
userTv.getLoginDays(),userTv.getStatus(),userTv.getContinueDays(),userTv.getCreateBy(),userTv.getUpdateBy());
}
public static UserTv build(String memberCode , Long id , String platformAccount , String nickname , String username,
int loginDays , int status ,int continueDays , String createBy , String updateBy){
if (StringUtils.isBlank(platformAccount))
throw new BadRequestException(GlobeExceptionMsg.IPTV_PLATFORM_ACCOUNT_IS_NULL);
// todo 原型模式
UserTv userTv = new UserTv();
userTv.setId(id);
userTv.setPlatformAccount(platformAccount);
userTv.setMemberCode(memberCode);
userTv.setNickname(StringUtils.isBlank(nickname)?platformAccount:nickname);
userTv.setUsername(StringUtils.isBlank(username)?platformAccount:username);
userTv.setLoginDays(loginDays);
userTv.setStatus(status);
userTv.setActiveTime(TimestampUtil.now());
userTv.setContinueDays(continueDays);
userTv.setCreateBy(StringUtils.isBlank(createBy)?"system":createBy);
userTv.setUpdateBy(StringUtils.isBlank(updateBy)?"system":updateBy);
return userTv;
}
}
package com.topdraw.business.module.user.iptv.rest;
import com.topdraw.annotation.AnonymousAccess;
import com.topdraw.common.ResultInfo;
import com.topdraw.business.module.user.iptv.domain.UserTv;
import com.topdraw.business.module.user.iptv.service.UserTvService;
import com.topdraw.business.module.user.iptv.service.dto.UserTvQueryCriteria;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.*;
/**
* @author XiangHan
* @date 2021-12-16
*/
@Api(tags = "UserTv管理")
@RestController
@RequestMapping("/ucEngine/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));
}
@PostMapping(value = "/create")
@ApiOperation("新增UserTv")
@AnonymousAccess
public ResultInfo create(@Validated @RequestBody UserTv resources) {
UserTvService.create(resources);
return ResultInfo.success();
}
@PutMapping
@ApiOperation("修改UserTv")
@AnonymousAccess
public ResultInfo update(@Validated @RequestBody UserTv resources) {
UserTvService.update(resources);
return ResultInfo.success();
}
@DeleteMapping(value = "/{id}")
@ApiOperation("删除UserTv")
public ResultInfo delete(@PathVariable Long id) {
UserTvService.delete(id);
return ResultInfo.success();
}
}
package com.topdraw.business.module.user.iptv.service;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.user.iptv.domain.UserTv;
import com.topdraw.business.module.user.iptv.service.dto.UserTvDTO;
import com.topdraw.business.module.user.iptv.service.dto.UserTvQueryCriteria;
import org.springframework.data.domain.Pageable;
import org.springframework.transaction.annotation.Transactional;
import java.util.Map;
import java.util.List;
/**
* @author XiangHan
......@@ -17,38 +11,65 @@ import java.util.List;
public interface UserTvService {
/**
* 查询数据分页
* @param criteria 条件参数
* @param pageable 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(UserTvQueryCriteria criteria, Pageable pageable);
/**
* 查询所有数据不分页
* @param criteria 条件参数
* @return List<UserTvDTO>
*/
List<UserTvDTO> queryAll(UserTvQueryCriteria criteria);
/**
* 根据ID查询
* @param id ID
* @return UserTvDTO
*/
UserTvDTO findById(Long id);
Long create(UserTv resources);
/**
*
* @param resources
* @return
*/
UserTv create(UserTv resources);
/**
*
* @param resources
*/
void update(UserTv resources);
/**
*
* @param resources
*/
void unbindPriorityMemberCode(UserTv resources);
/**
*
* @param id
*/
void delete(Long id);
/**
*
* @param platformAccount
* @return
*/
UserTvDTO findByPlatformAccount(String platformAccount);
/**
*
* @param memberCode
* @return
*/
UserTvDTO findByPriorityMemberCode(String memberCode);
/**
* 通过会员
* @param memberId
* @return
*/
UserTvDTO findByMemberId(Long memberId);
/**
* 检查会员是否是主账号
* @param memberId
* @param memberCode
* @return
*/
boolean checkPriorityMemberByMemberIdOrMemberCode(Long memberId,String memberCode);
MemberDTO findMemberByPlatformAccount(String platformAccount);
}
......
package com.topdraw.business.module.user.iptv.service.impl;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.user.iptv.domain.UserTv;
import com.topdraw.exception.EntityNotFoundException;
import com.topdraw.exception.GlobeExceptionMsg;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.user.iptv.repository.UserTvRepository;
import com.topdraw.business.module.user.iptv.service.UserTvService;
import com.topdraw.business.module.user.iptv.service.dto.UserTvDTO;
import com.topdraw.business.module.user.iptv.service.dto.UserTvQueryCriteria;
import com.topdraw.business.module.user.iptv.service.mapper.UserTvMapper;
import org.apache.commons.lang3.StringUtils;
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;
......@@ -34,106 +29,141 @@ import java.util.Optional;
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class UserTvServiceImpl implements UserTvService {
@Autowired
private UserTvRepository UserTvRepository;
@Autowired
private UserTvMapper UserTvMapper;
private UserTvMapper userTvMapper;
@Autowired
private MemberService memberService;
@Autowired
private UserTvRepository userTvRepository;
/**
* 获取大屏账户对应的会员
* <Waring>
* 如果绑定了小屏,则获取对应主账号对应的会员信息,如果没有绑定小屏会员则默认获取大屏自己的会员(x_member)
* </Waring>
* @param platformAccount
* @return
*/
@Override
public Map<String, Object> queryAll(UserTvQueryCriteria criteria, Pageable pageable) {
Page<UserTv> page = UserTvRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
return PageUtil.toPage(page.map(UserTvMapper::toDto));
public MemberDTO findMemberByPlatformAccount(String platformAccount){
// 大屏账户
UserTvDTO userTvDTO = this.findByPlatformAccount(platformAccount);
if (Objects.nonNull(userTvDTO)) {
// 主账号会员code
String priorityMemberCode = userTvDTO.getPriorityMemberCode();
if (StringUtils.isNotBlank(platformAccount))
return this.findMemberByMemberCode(priorityMemberCode);
else
return this.findMemberByMemberId(userTvDTO.getMemberId());
}
@Override
public List<UserTvDTO> queryAll(UserTvQueryCriteria criteria) {
return UserTvMapper.toDto(UserTvRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
throw new EntityNotFoundException(UserTvDTO.class,"platformAccount", GlobeExceptionMsg.IPTV_IS_NULL);
}
private MemberDTO findMemberByMemberCode(String memberCode) {
return this.memberService.findByCode(memberCode);
}
private MemberDTO findMemberByMemberId(Long memberId) {
return this.memberService.findById(memberId);
}
@Override
public UserTvDTO findById(Long id) {
UserTv UserTv = UserTvRepository.findById(id).orElseGet(UserTv::new);
UserTv UserTv = this.userTvRepository.findById(id).orElseGet(UserTv::new);
ValidationUtil.isNull(UserTv.getId(),"UserTv","id",id);
return UserTvMapper.toDto(UserTv);
return this.userTvMapper.toDto(UserTv);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend
public Long create(UserTv resources) {
public UserTv create(UserTv resources) {
MemberDTO memberDTO = memberService.findByCode(resources.getMemberCode());
if (Objects.nonNull(memberDTO)) {
Long id = memberDTO.getId();
resources.setMemberId(id);
UserTvRepository.save(resources);
return resources.getId();
this.userTvRepository.save(resources);
return resources;
}
return null;
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend
public void update(UserTv resources) {
UserTv UserTv = UserTvRepository.findById(resources.getId()).orElseGet(UserTv::new);
UserTv UserTv = this.userTvRepository.findById(resources.getId()).orElseGet(UserTv::new);
ValidationUtil.isNull( UserTv.getId(),"UserTv","id",resources.getId());
UserTv.copy(resources);
UserTvRepository.save(UserTv);
this.userTvRepository.save(UserTv);
}
@Override
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend
public void unbindPriorityMemberCode(UserTv resources) {
UserTv UserTv = UserTvRepository.findById(resources.getId()).orElseGet(UserTv::new);
UserTv UserTv = this.userTvRepository.findById(resources.getId()).orElseGet(UserTv::new);
ValidationUtil.isNull( UserTv.getId(),"UserTv","id",resources.getId());
UserTv.copy(resources);
UserTvRepository.save(UserTv);
this.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(
UserTv UserTv = this.userTvRepository.findById(id).orElseThrow(
() -> new EmptyResultDataAccessException(String.format("No %s entity " + "with id %s " + "exists!", UserTv.class, id), 1));
UserTvRepository.delete(UserTv);
this.userTvRepository.delete(UserTv);
}
@Override
public UserTvDTO findByPlatformAccount(String platformAccount) {
Optional<UserTv> userTv = UserTvRepository.findByPlatformAccount(platformAccount);
Optional<UserTv> userTv = this.userTvRepository.findByPlatformAccount(platformAccount);
if (userTv.isPresent()) {
ValidationUtil.isNull( userTv.get().getId(),"UserTv","id",userTv.get().getId());
return UserTvMapper.toDto(userTv.get());
return this.userTvMapper.toDto(userTv.get());
}
return null;
}
@Override
public UserTvDTO findByPriorityMemberCode(String memberCode) {
Optional<UserTv> userTv = UserTvRepository.findByPriorityMemberCode(memberCode);
Optional<UserTv> userTv = this.userTvRepository.findByPriorityMemberCode(memberCode);
if (userTv.isPresent()) {
ValidationUtil.isNull( userTv.get().getId(),"UserTv","id",userTv.get().getId());
return UserTvMapper.toDto(userTv.get());
return this.userTvMapper.toDto(userTv.get());
}
return null;
}
@Override
public UserTvDTO findByMemberId(Long memberId) {
Optional<UserTv> userTv = UserTvRepository.findByMemberId(memberId);
Optional<UserTv> userTv = this.userTvRepository.findByMemberId(memberId);
if (userTv.isPresent()) {
ValidationUtil.isNull( userTv.get().getId(),"UserTv","id",userTv.get().getId());
return UserTvMapper.toDto(userTv.get());
return this.userTvMapper.toDto(userTv.get());
}
return null;
}
@Override
public boolean checkPriorityMemberByMemberIdOrMemberCode(Long memberId, String memberCode) {
// 检查会员是否存在
this.checkMember(memberId, memberCode);
//
UserTvDTO userTvDTO = this.findByPriorityMemberCode(memberCode);
if (Objects.nonNull(userTvDTO)) {
return true;
}
return false;
}
private void checkMember(Long memberId, String memberCode){
this.memberService.checkMember(memberId, memberCode);
}
}
......
package com.topdraw.business.module.user.weixin.domain;
import com.topdraw.business.module.common.domain.DefaultAsyncMqModule;
import com.topdraw.business.module.common.domain.AsyncMqModule;
import com.topdraw.business.module.common.validated.CreateGroup;
import lombok.Data;
import lombok.experimental.Accessors;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
......@@ -22,7 +25,7 @@ import java.io.Serializable;
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_user_weixin")
public class UserWeixin extends DefaultAsyncMqModule implements Serializable {
public class UserWeixin extends AsyncMqModule implements Serializable {
// ID
@Id
......@@ -36,14 +39,17 @@ public class UserWeixin extends DefaultAsyncMqModule implements Serializable {
// 微信unionid,针对开发者
@Column(name = "unionid")
@NotNull(message = "unionid can't be null",groups = {CreateGroup.class})
private String unionid;
// 微信appid
@Column(name = "appid")
@NotNull(message = "appid can't be null",groups = {CreateGroup.class})
private String appid;
// 微信openid,针对微信app
@Column(name = "openid")
@NotNull(message = "openid can't be null",groups = {CreateGroup.class})
private String openid;
// 关注状态 0 -未关注 1 - 已关注
......
package com.topdraw.business.module.user.weixin.domain;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.exception.BadRequestException;
import com.topdraw.exception.GlobeExceptionMsg;
import com.topdraw.util.TimestampUtil;
import org.apache.commons.lang3.StringUtils;
import java.sql.Timestamp;
import java.util.Objects;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/14 17:02
* @version: :
* @modified By:
* @since : modified in 2022/3/14 17:02
*/
public class UserWeixinBuilder {
public static UserWeixin build(Long memberId,String appId,String openId,String unionId,String nickname,String headimgurl){
UserWeixin userWeixin = new UserWeixin();
userWeixin.setAppid(appId);
userWeixin.setOpenid(openId);
userWeixin.setUnionid(unionId);
userWeixin.setNickname(nickname);
userWeixin.setHeadimgurl(headimgurl);
return build(memberId,userWeixin);
}
public static UserWeixin build(Long memberId,String appId,String openId,String unionId){
UserWeixin userWeixin = new UserWeixin();
userWeixin.setAppid(appId);
userWeixin.setOpenid(openId);
userWeixin.setUnionid(unionId);
return build(memberId,userWeixin);
}
public static UserWeixin build(UserWeixin userWeixin){
return build(userWeixin.getId(),
userWeixin.getMemberId(),
userWeixin.getUnionid(),userWeixin.getAppid(),userWeixin.getOpenid(),
userWeixin.getStatus(),userWeixin.getSyncStatus(),
userWeixin.getNickname(),userWeixin.getHeadimgurl(),
userWeixin.getPrivilege(), userWeixin.getRefreshToken(),userWeixin.getAccessToken(),
userWeixin.getExpiresIn(),userWeixin.getExpiresTime(),userWeixin.getDescription(),
userWeixin.getCreateBy(),userWeixin.getUpdateBy(),userWeixin.getSourceType(),userWeixin.getSourceId(),
userWeixin.getSourceDesc(),userWeixin.getSourceUser(),userWeixin.getSourceEntity(),userWeixin.getCountry(),userWeixin.getProvince(),
userWeixin.getCity(),userWeixin.getSex());
}
public static UserWeixin build(Long memberId , UserWeixin userWeixin){
return build(userWeixin.getId(),
memberId,
userWeixin.getUnionid(),userWeixin.getAppid(),userWeixin.getOpenid(),
userWeixin.getStatus(),userWeixin.getSyncStatus(),
userWeixin.getNickname(),userWeixin.getHeadimgurl(),
userWeixin.getPrivilege(), userWeixin.getRefreshToken(),userWeixin.getAccessToken(),
userWeixin.getExpiresIn(),userWeixin.getExpiresTime(),userWeixin.getDescription(),
userWeixin.getCreateBy(),userWeixin.getUpdateBy(),userWeixin.getSourceType(),userWeixin.getSourceId(),
userWeixin.getSourceDesc(),userWeixin.getSourceUser(),userWeixin.getSourceEntity(),userWeixin.getCountry(),userWeixin.getProvince(),
userWeixin.getCity(),userWeixin.getSex());
}
public static UserWeixin build(Member member , UserWeixin userWeixin) {
return build(userWeixin.getId(),
member.getId(),
userWeixin.getUnionid(),userWeixin.getAppid(),userWeixin.getOpenid(),
userWeixin.getStatus(),userWeixin.getSyncStatus(),
userWeixin.getNickname(),userWeixin.getHeadimgurl(),
userWeixin.getPrivilege(), userWeixin.getRefreshToken(),userWeixin.getAccessToken(),
userWeixin.getExpiresIn(),userWeixin.getExpiresTime(),userWeixin.getDescription(),
userWeixin.getCreateBy(),userWeixin.getUpdateBy(),userWeixin.getSourceType(),userWeixin.getSourceId(),
userWeixin.getSourceDesc(),userWeixin.getSourceUser(),userWeixin.getSourceEntity(),userWeixin.getCountry(),userWeixin.getProvince(),
userWeixin.getCity(),userWeixin.getSex());
}
public static UserWeixin build(Long id ,
Long memberId,
String unionId, String appId,String openId,
Integer status, Integer syncStatus,
String nickname,String headimgurl,
String privilege,String refreshToken,
String accessToken,Integer expiresIn,Timestamp expiresTime,String description,
String createBy,String updateBy,
String sourceType,String sourceId,
String sourceDesc,
Long sourceUser,String sourceEntity,
String country,String province,String city,
Integer sex){
if (Objects.isNull(memberId)) {
throw new BadRequestException(GlobeExceptionMsg.MEMBER_ID_IS_NULL);
}
UserWeixin userWeixin = new UserWeixin();
userWeixin.setId(Objects.nonNull(id)?id:null);
userWeixin.setMemberId(memberId);
userWeixin.setUnionid(StringUtils.isNotBlank(unionId)?unionId:"");
userWeixin.setAppid(StringUtils.isNotBlank(appId)?appId:"");
userWeixin.setOpenid(StringUtils.isNotBlank(openId)?openId:"");
userWeixin.setStatus(Objects.nonNull(status)?status:0);
userWeixin.setSyncStatus(Objects.nonNull(syncStatus)?syncStatus:0);
userWeixin.setNickname(StringUtils.isNotBlank(nickname)?nickname:"");
userWeixin.setHeadimgurl(StringUtils.isNotBlank(headimgurl)?headimgurl:"");
userWeixin.setPrivilege(StringUtils.isNotBlank(privilege)?privilege:"");
userWeixin.setRefreshToken(StringUtils.isNotBlank(refreshToken)?refreshToken:"");
userWeixin.setAccessToken(StringUtils.isNotBlank(accessToken)?accessToken:"");
userWeixin.setExpiresIn(expiresIn);
userWeixin.setExpiresTime(expiresTime);
userWeixin.setDescription(StringUtils.isNotBlank(description)?description:"");
userWeixin.setCreateBy(StringUtils.isNotBlank(createBy)?createBy:"system");
userWeixin.setUpdateBy(StringUtils.isNotBlank(updateBy)?updateBy:"system");
userWeixin.setSourceType(StringUtils.isNotBlank(sourceType)?sourceType:"");
userWeixin.setSourceId(StringUtils.isNotBlank(sourceId)?sourceId:"");
userWeixin.setSourceDesc(StringUtils.isNotBlank(sourceDesc)?sourceId:"");
userWeixin.setSourceUser(Objects.nonNull(sourceUser)?sourceUser:0L);
userWeixin.setSourceEntity(StringUtils.isNotBlank(sourceEntity)?sourceEntity:"");
userWeixin.setAuthTime(TimestampUtil.now());
userWeixin.setCountry(StringUtils.isNotBlank(country)?country:"");
userWeixin.setProvince(StringUtils.isNotBlank(province)?province:"");
userWeixin.setCity(StringUtils.isNotBlank(city)?city:"");
userWeixin.setSex(Objects.nonNull(sex)?sex:-1);
return userWeixin;
}
}
......@@ -4,7 +4,6 @@ import com.topdraw.annotation.AnonymousAccess;
import com.topdraw.common.ResultInfo;
import com.topdraw.business.module.user.weixin.domain.UserWeixin;
import com.topdraw.business.module.user.weixin.service.UserWeixinService;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinQueryCriteria;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.validation.annotation.Validated;
......@@ -23,18 +22,6 @@ 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));
}
@PostMapping(value = "/create")
@ApiOperation("新增UserWeixin")
@AnonymousAccess
......
......@@ -2,11 +2,6 @@ package com.topdraw.business.module.user.weixin.service;
import com.topdraw.business.module.user.weixin.domain.UserWeixin;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinDTO;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinQueryCriteria;
import org.springframework.data.domain.Pageable;
import java.util.Map;
import java.util.List;
import java.util.Optional;
/**
* @author XiangHan
......@@ -15,21 +10,6 @@ import java.util.Optional;
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
......
......@@ -2,25 +2,18 @@ package com.topdraw.business.module.user.weixin.service.impl;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.user.weixin.domain.UserWeixin;
import com.topdraw.business.module.user.weixin.domain.UserWeixinBuilder;
import com.topdraw.utils.ValidationUtil;
import com.topdraw.business.module.user.weixin.repository.UserWeixinRepository;
import com.topdraw.business.module.user.weixin.service.UserWeixinService;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinDTO;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinQueryCriteria;
import com.topdraw.business.module.user.weixin.service.mapper.UserWeixinMapper;
import 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;
/**
* @author XiangHan
......@@ -37,17 +30,6 @@ public class UserWeixinServiceImpl implements UserWeixinService {
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);
......@@ -58,7 +40,8 @@ public class UserWeixinServiceImpl implements UserWeixinService {
@Transactional(rollbackFor = Exception.class)
@AsyncMqSend
public UserWeixin create(UserWeixin resources) {
UserWeixinRepository.save(resources);
UserWeixin build = UserWeixinBuilder.build(resources);
UserWeixinRepository.save(build);
return resources;
}
......
package com.topdraw.business.module.weixin.domain;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import java.io.Serializable;
import java.sql.Timestamp;
/**
* @author pengmengqing
* @date 2021-01-28
*/
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_user_weixin__weixin_message_template")
public class UserWeixinWeixinMessageTemplate implements Serializable {
// ID
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 用户id
@Column(name = "user_weixin_id", nullable = false)
private Long userWeixinId;
// 微信消息模板id
@Column(name = "weixin_message_template_id", nullable = false)
private Long weixinMessageTemplateId;
// 用户是否订阅: 0-否, 1-是
@Column(name = "status", nullable = false)
private Integer status;
// 创建时间
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
public void copy(UserWeixinWeixinMessageTemplate source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}
}
package com.topdraw.business.module.weixin.domain;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import java.io.Serializable;
import java.sql.Timestamp;
/**
* @author pengmengqing
* @date 2021-01-28
*/
@Entity
@Data
@EntityListeners(AuditingEntityListener.class)
@Accessors(chain = true)
@Table(name="uc_weixin_message_template")
public class WeixinMessageTemplate implements Serializable {
// ID
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// 标识 order-下单成功通知,cancellation-核销成功通知
@Column(name = "code", nullable = false)
private String code;
// 微信appid
@Column(name = "appid", nullable = false)
private String appid;
// 微信模板id
@Column(name = "template_id", nullable = false)
private String templateId;
// 状态:0-无效,1-有效
@Column(name = "status", nullable = false)
private Integer status;
// 描述
@Column(name = "description")
private String description;
// 创建时间
@CreatedDate
@Column(name = "create_time")
private Timestamp createTime;
// 更新时间
@LastModifiedDate
@Column(name = "update_time")
private Timestamp updateTime;
public void copy(WeixinMessageTemplate source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}
}
package com.topdraw.business.module.weixin.repository;
import com.topdraw.business.module.weixin.domain.UserWeixinWeixinMessageTemplate;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
/**
* @author pengmengqing
* @date 2021-01-28
*/
public interface UserWeixinWeixinMessageTemplateRepository extends JpaRepository<UserWeixinWeixinMessageTemplate, Long>, JpaSpecificationExecutor<UserWeixinWeixinMessageTemplate> {
}
package com.topdraw.business.module.weixin.repository;
import com.topdraw.business.module.weixin.domain.WeixinMessageTemplate;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.util.Optional;
/**
* @author pengmengqing
* @date 2021-01-28
*/
public interface WeixinMessageTemplateRepository extends JpaRepository<WeixinMessageTemplate, Long>, JpaSpecificationExecutor<WeixinMessageTemplate> {
Optional<WeixinMessageTemplate> findFirstByCode(String code);
Optional<WeixinMessageTemplate> findFirstByCodeAndAppid(String code, String appid);
Optional<WeixinMessageTemplate> findFirstByTemplateId(String templateId);
}
package com.topdraw.business.module.weixin.rest;
import com.topdraw.annotation.AnonymousAccess;
import com.topdraw.business.module.weixin.service.UserWeixinWeixinMessageTemplateService;
import com.topdraw.business.module.weixin.service.dto.UpdateUserWeixinWeixinMessageTemplateQueryCriteria;
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.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
/**
* @author pengmengqing
* @date 2021-01-28
*/
@Api(tags = "UserWeixinWeixinMessageTemplate管理")
@RestController
@RequestMapping("/ucEngine/api/UserWeixinWeixinMessageTemplate")
public class UserWeixinWeixinMessageTemplateController {
@Autowired
private UserWeixinWeixinMessageTemplateService userWeixinWeixinMessageTemplateService;
@AnonymousAccess
@PostMapping
@ApiOperation("新增或修改MemberWeixinMessageTemplate")
public ResultInfo createOrUpdate(@RequestBody UpdateUserWeixinWeixinMessageTemplateQueryCriteria criteria) {
userWeixinWeixinMessageTemplateService.createOrUpdate(criteria);
return ResultInfo.success(new ArrayList<>());
}
}
package com.topdraw.business.module.weixin.service;
import com.topdraw.business.module.weixin.domain.UserWeixinWeixinMessageTemplate;
import com.topdraw.business.module.weixin.service.dto.UpdateUserWeixinWeixinMessageTemplateQueryCriteria;
import com.topdraw.business.module.weixin.service.dto.UserWeixinWeixinMessageTemplateDTO;
import com.topdraw.business.module.weixin.service.dto.UserWeixinWeixinMessageTemplateQueryCriteria;
import org.springframework.data.domain.Pageable;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
* @author pengmengqing
* @date 2021-01-28
*/
public interface UserWeixinWeixinMessageTemplateService {
void createOrUpdate(UpdateUserWeixinWeixinMessageTemplateQueryCriteria criteria);
}
package com.topdraw.business.module.weixin.service.dto;
import lombok.Data;
import java.util.List;
@Data
public class UpdateUserWeixinWeixinMessageTemplateQueryCriteria {
private Long memberId;
private List<UserWeixinWeixinMessageTemplateQueryCriteria> templateList;
}
package com.topdraw.business.module.weixin.service.dto;
import lombok.Data;
import java.io.Serializable;
import java.sql.Timestamp;
/**
* @author pengmengqing
* @date 2021-01-28
*/
@Data
public class UserWeixinWeixinMessageTemplateDTO implements Serializable {
// ID
private Long id;
// 用户id
private Long userWeixinId;
// 微信消息模板id
private Long weixinMessageTemplateId;
// 用户是否订阅: 0-否, 1-是
private Integer status;
// 创建时间
private Timestamp createTime;
// 更新时间
private Timestamp updateTime;
}
package com.topdraw.business.module.weixin.service.dto;
import com.topdraw.annotation.Query;
import lombok.Data;
/**
* @author pengmengqing
* @date 2021-01-28
*/
@Data
public class UserWeixinWeixinMessageTemplateQueryCriteria {
// 用户id
@Query(propName = "userWeixinId")
private Long memberId;
// 微信消息模板id
@Query
private Long weixinMessageTemplateId;
// 用户是否订阅: 0-否, 1-是
@Query
private Integer status = 1;
private String templateId;
}
package com.topdraw.business.module.weixin.service.dto;
import lombok.Data;
import java.io.Serializable;
/**
* @author pengmengqing
* @date 2021-01-28
*/
@Data
public class WeixinMessageTemplateDTO implements Serializable {
// ID
private Long id;
// 标识 order-下单成功通知,cancellation-核销成功通知
private String code;
// 微信模板id
private String templateId;
// 描述
private String description;
}
package com.topdraw.business.module.weixin.service.dto;
import com.topdraw.annotation.Query;
import lombok.Data;
import java.util.List;
/**
* @author pengmengqing
* @date 2021-01-28
*/
@Data
public class WeixinMessageTemplateQueryCriteria{
private String codes;
@Query(propName = "code", type = Query.Type.IN)
private List<String> codeList;
@Query
private String appid;
@Query
private Integer status = 1;
}
package com.topdraw.business.module.weixin.service.impl;
import com.topdraw.business.module.weixin.domain.UserWeixinWeixinMessageTemplate;
import com.topdraw.business.module.weixin.domain.WeixinMessageTemplate;
import com.topdraw.business.module.weixin.repository.UserWeixinWeixinMessageTemplateRepository;
import com.topdraw.business.module.weixin.repository.WeixinMessageTemplateRepository;
import com.topdraw.business.module.weixin.service.UserWeixinWeixinMessageTemplateService;
import com.topdraw.business.module.weixin.service.dto.UpdateUserWeixinWeixinMessageTemplateQueryCriteria;
import com.topdraw.business.module.weixin.service.dto.UserWeixinWeixinMessageTemplateDTO;
import com.topdraw.business.module.weixin.service.dto.UserWeixinWeixinMessageTemplateQueryCriteria;
import com.topdraw.business.module.weixin.service.mapper.UserWeixinWeixinMessageTemplateMapper;
import com.topdraw.utils.FileUtil;
import com.topdraw.utils.PageUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.ValidationUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.*;
/**
* @author pengmengqing
* @date 2021-01-28
*/
@Service
@Slf4j
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class UserWeixinWeixinMessageTemplateServiceImpl implements UserWeixinWeixinMessageTemplateService {
@Autowired
private UserWeixinWeixinMessageTemplateRepository userWeixinWeixinMessageTemplateRepository;
@Autowired
private WeixinMessageTemplateRepository weixinMessageTemplateRepository;
@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = Exception.class)
public void createOrUpdate(UpdateUserWeixinWeixinMessageTemplateQueryCriteria criteria) {
for (UserWeixinWeixinMessageTemplateQueryCriteria queryCriteria : criteria.getTemplateList()) {
queryCriteria.setMemberId(criteria.getMemberId());
Integer status = queryCriteria.getStatus();
queryCriteria.setStatus(null);
String templateId = queryCriteria.getTemplateId();
Optional<WeixinMessageTemplate> templateOptional = weixinMessageTemplateRepository.findFirstByTemplateId(templateId);
if (!templateOptional.isPresent()) {
log.info("template " + templateId + " not exist");
continue;
}
Long id = templateOptional.get().getId();
queryCriteria.setWeixinMessageTemplateId(id);
Optional<UserWeixinWeixinMessageTemplate> optional = userWeixinWeixinMessageTemplateRepository.findOne(((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, queryCriteria, criteriaBuilder)));
if (!optional.isPresent()) {
UserWeixinWeixinMessageTemplate userWeixinWeixinMessageTemplate = new UserWeixinWeixinMessageTemplate();
userWeixinWeixinMessageTemplate.setUserWeixinId(queryCriteria.getMemberId())
.setWeixinMessageTemplateId(queryCriteria.getWeixinMessageTemplateId())
.setStatus(status);
userWeixinWeixinMessageTemplateRepository.save(userWeixinWeixinMessageTemplate);
} else {
UserWeixinWeixinMessageTemplate UserWeixinWeixinMessageTemplate = optional.get();
if (!status.equals(UserWeixinWeixinMessageTemplate.getStatus())) {
UserWeixinWeixinMessageTemplate.setStatus(status);
userWeixinWeixinMessageTemplateRepository.save(UserWeixinWeixinMessageTemplate);
}
}
}
}
}
package com.topdraw.business.module.weixin.service.mapper;
import com.topdraw.base.BaseMapper;
import com.topdraw.business.module.weixin.domain.UserWeixinWeixinMessageTemplate;
import com.topdraw.business.module.weixin.service.dto.UserWeixinWeixinMessageTemplateDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
/**
* @author pengmengqing
* @date 2021-01-28
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface UserWeixinWeixinMessageTemplateMapper extends BaseMapper<UserWeixinWeixinMessageTemplateDTO, UserWeixinWeixinMessageTemplate> {
}
package com.topdraw.business.process.domian;
import com.topdraw.business.module.common.validated.CreateGroup;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
......@@ -15,76 +16,76 @@ public class TempIptvUser {
private String unionid;
// 账户
/** 账户 */
@Transient
@NotNull(message = "platformAccount can't be null" , groups = {CreateGroup.class})
private String platformAccount;
// 分数
/** 分数 */
@Transient
private Long points;
// ID
/** ID */
private Long id;
// 人ID
/** 人ID */
private Long personId;
// 运营商平台
/** 运营商平台 */
private String platform;
// 手机号
/** 手机号 */
private String cellphone;
// 用户名
/** 用户名 */
private String username;
// 密码 MD5
/** 密码 MD5 */
private String password;
// 昵称 Base64
/** 昵称 Base64 */
private String nickname;
// 头像
/** 头像 */
private String image;
// 登录天数(总天数)
/** 登录天数(总天数) */
private Integer loginDays;
// 连续登录天数
/** 连续登录天数 */
private Integer continueDays;
// 活跃时间
/** 活跃时间 */
private Timestamp activeTime;
// 分组 分组ID用逗号分隔
/** 分组 分组ID用逗号分隔 */
private String groups;
// 标签 标签用逗号分隔
/** 标签 标签用逗号分隔 */
private String tags;
// 登录类型 1-运营商隐式登录 2-手机验证登录 3-微信登录 4-QQ登录 5-微博登录 6-苹果登录
/** 登录类型 1-运营商隐式登录 2-手机验证登录 3-微信登录 4-QQ登录 5-微博登录 6-苹果登录 */
private Integer loginType;
// 状态 0-下线 1-上线
/** 状态 0-下线 1-上线 */
private Integer status;
// 描述
/** 描述 */
private String description;
// 创建者
/** 创建者 */
private String createBy;
// 创建时间
/** 创建时间 */
private Timestamp createTime;
// 更新者
/** 更新者 */
private String updateBy;
// 更新时间
/** 更新时间 */
private Timestamp updateTime;
// 会员id
/** 会员id */
private Long memberId;
private String memberCode;
......
package com.topdraw.business.process.domian;
package com.topdraw.business.process.domian.constant;
public enum RightType {
/**积分*/
......
package com.topdraw.business.process.domian;
package com.topdraw.business.process.domian.validated;
public interface UnbindGroup {
}
......
package com.topdraw.business.process.domian.weixin;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
@Data
......
......@@ -9,14 +9,11 @@ import com.topdraw.business.module.member.viphistory.domain.MemberVipHistory;
import com.topdraw.business.module.member.viphistory.service.MemberVipHistoryService;
import com.topdraw.business.module.user.weixin.service.UserWeixinService;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinDTO;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinQueryCriteria;
import com.topdraw.business.process.domian.weixin.BuyVipBean;
import com.topdraw.business.process.domian.weixin.WeiXinUserBean;
import com.topdraw.business.process.service.MemberOperationService;
import com.topdraw.common.IResultInfo;
import com.topdraw.common.ResultInfo;
import com.topdraw.exception.BadRequestException;
import com.topdraw.weixin.util.WeChatConstants;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
......
......@@ -14,7 +14,7 @@ import com.topdraw.business.module.user.weixin.service.UserWeixinService;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinDTO;
import com.topdraw.business.process.domian.TempCustomPointBean;
import com.topdraw.business.process.domian.TempPoints;
import com.topdraw.business.process.domian.result.CustomPointsResult;
import com.topdraw.business.process.service.dto.CustomPointsResult;
import com.topdraw.business.process.service.PointsOperationService;
import com.topdraw.common.ResultInfo;
import com.topdraw.config.LocalConstants;
......
......@@ -3,6 +3,7 @@ package com.topdraw.business.process.rest;
import com.topdraw.annotation.AnonymousAccess;
import com.topdraw.business.process.domian.TempIptvUser;
import com.topdraw.business.process.service.TaskOperationService;
import com.topdraw.business.process.service.dto.TaskOperationQueryCriteria;
import com.topdraw.common.ResultInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
......
......@@ -5,16 +5,15 @@ import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.topdraw.annotation.AnonymousAccess;
import com.topdraw.business.module.member.profile.domain.MemberProfile;
import com.topdraw.aop.log.Log;
import com.topdraw.business.module.common.validated.CreateGroup;
import com.topdraw.business.module.common.validated.UpdateGroup;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.user.iptv.domain.UserTv;
import com.topdraw.business.module.user.iptv.service.UserTvService;
import com.topdraw.business.module.user.iptv.service.dto.UserTvDTO;
import com.topdraw.business.module.user.weixin.domain.UserWeixin;
import com.topdraw.business.module.user.weixin.service.UserWeixinService;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinDTO;
import com.topdraw.business.process.domian.TempIptvUser;
import com.topdraw.business.process.domian.weixin.BindBean;
import com.topdraw.business.process.domian.weixin.SubscribeBean;
import com.topdraw.business.process.domian.weixin.SubscribeBeanEvent;
......@@ -23,18 +22,15 @@ import com.topdraw.business.process.service.UserOperationService;
import com.topdraw.common.ResultInfo;
import com.topdraw.config.RedisKeyUtil;
import com.topdraw.exception.BadRequestException;
import com.topdraw.exception.EntityNotFoundException;
import com.topdraw.util.Base64Util;
import com.topdraw.util.JSONUtil;
import com.topdraw.utils.RedisUtils;
import com.topdraw.utils.StringUtils;
import com.topdraw.weixin.util.WeChatConstants;
import com.topdraw.weixin.util.WeixinUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.assertj.core.util.Arrays;
import org.springframework.beans.BeanUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;
import org.springframework.validation.annotation.Validated;
......@@ -42,7 +38,6 @@ import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.net.URLDecoder;
import java.time.LocalDateTime;
import java.util.*;
@Api("账户处理")
......@@ -52,180 +47,83 @@ import java.util.*;
public class UserOperationController {
@Autowired
private UserOperationService userTvOperationService;
@Autowired
private UserWeixinService userWeixinService;
@Autowired
private UserTvService userTvService;
@Autowired
private MemberService memberService;
@Autowired
private RedisUtils redisUtils;
@Autowired
private UserOperationService userOperationService;
@Autowired
private UserOperationService userTvOperationService;
@Autowired
private RedisUtils redisUtils;
private static final String SUBSCRIBE = "subscribe";
private static final String UNSUBSCRIBE = "unsubscribe";
private static final Integer SUBSCRIBE_STATUS = 1;
@Log("保存大屏账户同时创建会员")
@PostMapping(value = "/createUserAndCreateMember")
@ApiOperation("新增大屏账户同时创建会员信息")
@AnonymousAccess
public ResultInfo createUserAndCreateMember(@Validated @RequestBody TempIptvUser resources) {
log.info("createUserAndCreateMember ==> input ==> [{}]",resources);
UserTv userTv = new UserTv();
BeanUtils.copyProperties(resources,userTv);
boolean result = this.userTvOperationService.createMemberByUserTv(userTv);
return ResultInfo.success(result);
}
@PostMapping(value = "/createWeixinUserAndCreateMember")
@ApiOperation("新增小屏账户同时创建会员信息")
@AnonymousAccess
public ResultInfo createWeixinUserAndCreateMember(@Validated @RequestBody UserWeixin resources) {
log.info("createWeixinUserAndCreateMember ==> input ==> [{}]",resources);
String appId = resources.getAppid();
if (StringUtils.isBlank(appId))
throw new NullPointerException("appId is null !");
String openId = resources.getOpenid();
if (StringUtils.isBlank(openId))
throw new NullPointerException("openId is null !");
String unionId = resources.getUnionid();
if (StringUtils.isBlank(unionId))
throw new NullPointerException("unionId is null !");
UserWeixinDTO result = this.userTvOperationService.createWeixinUserAndCreateMember(resources);
return ResultInfo.success(result);
}
@GetMapping(value = "/findBindByPlatformAccount/{platformAccount}")
@ApiOperation("保存大屏账户同时创建会员信息")
@AnonymousAccess
public ResultInfo findBindByPlatformAccount(@PathVariable("platformAccount") String platformAccount) {
log.info("findBindByPlatformAccount ==> input ==> [{}]",platformAccount);
public ResultInfo createTvUserAndCreateMember(@Validated(value = {CreateGroup.class}) @RequestBody UserTv resources) {
log.info("UserOperationController ==> createUserAndCreateMember ==>> param ==> [{}]",resources);
List<MemberDTO> result = this.userTvOperationService.findBindByPlatformAccount(platformAccount);
return ResultInfo.success(result);
}
@PostMapping(value = "/sendQrCodeMessage")
@ApiOperation("带参二维码")
@AnonymousAccess
public ResultInfo sendQrCodeMessage(@RequestBody String content) {
log.info("sendQrCodeMessage ==> input ==> [{}]",content);
boolean result = this.userTvOperationService.sendQrCodeMessage(content);
return ResultInfo.success(result);
}
@PostMapping(value = "/deleteAllCollection")
@ApiOperation("删除全部收藏")
@AnonymousAccess
public ResultInfo deleteAllCollection(@RequestBody String content) {
log.info("deleteAllCollection ==> input ==> [{}]",content);
boolean result = this.userTvOperationService.deleteAllCollection(content);
return ResultInfo.success(result);
}
@PostMapping(value = "/deleteCollection")
@ApiOperation("删除收藏")
@AnonymousAccess
public ResultInfo deleteCollection(@RequestBody String content) {
log.info("deleteCollection ==> input ==> [{}]",content);
boolean result = this.userTvOperationService.deleteCollection(content);
return ResultInfo.success(result);
}
@PostMapping(value = "/addCollection")
@ApiOperation("添加收藏")
@AnonymousAccess
public ResultInfo addCollection(@RequestBody String content) {
log.info("addCollection ==> input ==> [{}]",content);
boolean result = this.userTvOperationService.addCollection(content);
boolean result = this.userTvOperationService.createTvUserAndCreateMember(resources);
return ResultInfo.success(result);
}
@Log("大屏用户解绑")
@RequestMapping(value = "/unbind")
@ApiOperation("大屏用户解绑")
@AnonymousAccess
public ResultInfo unbind(@Validated @RequestBody TempIptvUser resources) {
log.info("unbind ==> input ==> [{}]",resources);
UserTv userTv = new UserTv();
BeanUtils.copyProperties(resources,userTv);
String unionid = resources.getUnionid();
String memberCode1 = resources.getMemberCode();
if (Objects.nonNull(memberCode1)) {
MemberDTO memberDTO = this.memberService.findByCode(memberCode1);
String memberCode = memberDTO.getCode();
if (StringUtils.isNotBlank(memberCode)) {
userTv.setMemberCode(memberCode);
this.userTvOperationService.unbind(userTv);
}
}
public ResultInfo unbind(@Validated(value = {UpdateGroup.class}) @RequestBody UserTv resources) {
log.info("UserOperationController ==> unbind ==>> param ==> [{}]",resources);
this.userTvOperationService.unbind(resources);
return ResultInfo.success();
}
@Log("大屏更换主账号")
@RequestMapping(value = "/changeMainAccount")
@ApiOperation("大屏更换主账号")
@AnonymousAccess
public ResultInfo changeMainAccount(@Validated @RequestBody TempIptvUser resources) {
log.info("changeMainAccount ==> input ==> [{}]",resources);
public ResultInfo changeMainAccount(@Validated @RequestBody UserTv resources) {
log.info("UserOperationController ==> changeMainAccount ==>> param ==> [{}]",resources);
UserTv userTv = new UserTv();
BeanUtils.copyProperties(resources,userTv);
Long memberId = resources.getMemberId();
String memberCode1 = resources.getMemberCode();
if (Objects.nonNull(memberCode1)) {
MemberDTO memberDTO = this.memberService.findByCode(memberCode1);
String memberCode = memberDTO.getCode();
if (StringUtils.isNotBlank(memberCode)) {
userTv.setMemberCode(memberCode);
this.userTvOperationService.changeMainAccount(userTv);
}
} else {
String unionid = resources.getUnionid();
this.userTvOperationService.changeMainAccountByUnionId(userTv,unionid);
}
return ResultInfo.success("update success");
this.userTvOperationService.changeMainAccount(resources);
return ResultInfo.success();
}
@Log("微信服务号(H5)登录")
@PostMapping("/serviceLogin")
@ApiOperation("微信服务号(H5)登录")
@AnonymousAccess
public ResultInfo serviceLogin(@Validated @RequestBody WeiXinUserBean resources) {
log.info("UserOperationController ==> serviceLogin ==>> param ==> [{}]",resources);
Object o = this.userTvOperationService.serviceLogin(resources);
return ResultInfo.success(o);
}
@Log("微信小程序登录")
@PostMapping("/appletLogin")
@ApiOperation("微信小程序登录")
@AnonymousAccess
public ResultInfo appletLogin(@Validated @RequestBody WeiXinUserBean resources) {
log.info("appletLogin ==> input ==> [{}]",resources);
log.info("UserOperationController ==> appletLogin ==>> param ==> [{}]",resources);
UserWeixinDTO result = this.userTvOperationService.appletLogin(resources);
return ResultInfo.success(result);
}
@Log("微信小程序绑定大屏")
@PostMapping("/appletBind")
@ApiOperation("微信小程序绑定大屏")
@AnonymousAccess
public ResultInfo appletBind(@Validated @RequestBody BindBean resources) {
log.info("appletBind ==> input ==> [{}]",resources);
log.info("UserOperationController ==> appletBind ==>> param ==> [{}]",resources);
String unionId = resources.getUnionid();
if (StringUtils.isBlank(unionId))
Assert.state(StrUtil.isNotBlank(unionId), "跨屏绑定,请先进行授权");
......@@ -242,14 +140,14 @@ public class UserOperationController {
return ResultInfo.success(result);
}
@Log("微信公众号关注")
@PostMapping("/subscribe")
@ApiOperation("微信公众号关注")
@AnonymousAccess
public ResultInfo subscribe(@Validated @RequestBody SubscribeBeanEvent data) throws IOException {
String content = data.getContent();
log.info("subscribe ==> input ==> [{}]",content);
log.info("UserOperationController ==> subscribe ==>> param ==> [{}]",data);
SubscribeBean subscribeBean = JSONUtil.parseMsg2Object(content, SubscribeBean.class);
SubscribeBean subscribeBean = JSONUtil.parseMsg2Object(data.getContent(), SubscribeBean.class);
this.parseSubscribe(subscribeBean);
boolean result = this.userTvOperationService.subscribe(subscribeBean);
return ResultInfo.success(result);
......@@ -334,45 +232,26 @@ public class UserOperationController {
}
}
@Log("微信公众号取关")
@PostMapping("/unsubscribe")
@ApiOperation("微信公众号取关")
@AnonymousAccess
public ResultInfo unsubscribe(@Validated @RequestBody SubscribeBeanEvent data) {
String content = data.getContent();
log.info("unsubscribe ==> input ==> [{}]",content);
log.info("UserOperationController ==> unsubscribe ==>> param ==> [{}]",data);
SubscribeBean subscribeBean = JSONUtil.parseMsg2Object(content, SubscribeBean.class);
SubscribeBean subscribeBean = JSONUtil.parseMsg2Object(data.getContent(), SubscribeBean.class);
boolean result = this.userTvOperationService.unsubscribe(subscribeBean);
return ResultInfo.success(result);
}
/**
* @param data
* @description 通过大屏关注的订阅号,因为订阅号不支持带参二维码,
* 所以需要先跳到H5(带大屏参数),
* 再做服务号授权(订阅号只能按钮触发获取信息),
* 再将服务号信息和大屏参数缓存下来(该接口的功能)
* 然后跳转到订阅号关注页
* 关注后回调处理时,根据unionid进行相关逻辑
*
* 业务场景:
* 1.未关注-绑定
* 新用户
* 2.先关注-绑定
* 1).未绑定
* 2).已绑定
* 2.1).已绑定当前大屏账户
* 2.2).换绑
* 2.2.1).
* @author Hongyan Wang
* @date 2021/8/24 4:54 下午
*/
@Log("暂存大小屏信息并检查关注与绑定状态")
@PostMapping(value = "/saveUserInfo")
@ApiOperation("保存大屏侧信息")
@ApiOperation("暂存大小屏信息并检查关注与绑定状态")
@AnonymousAccess
public ResultInfo saveUserInfo(@RequestBody String data) {
log.info("saveUserInfo ==> input ==> [{}]",data);
log.info("UserOperationController ==> saveUserInfo ==>> param ==> [{}]",data);
Assert.notNull(data, "用户数据不可为空");
JSONObject json = JSONObject.parseObject(data);
......@@ -445,20 +324,39 @@ public class UserOperationController {
return success;
}
/**
*
* @param resources
* @return
*/
@PostMapping(value = "/saveUserWeixinPhone")
@ApiOperation("保存用户手机号信息")
@Log("删除全部收藏")
@PostMapping(value = "/deleteAllCollection")
@ApiOperation("删除全部收藏")
@AnonymousAccess
public ResultInfo deleteAllCollection(@RequestBody String content) {
log.info("UserOperationController ==> deleteAllCollection ==> param ==> [{}]",content);
boolean result = this.userTvOperationService.deleteAllCollection(content);
return ResultInfo.success(result);
}
@Log("删除收藏")
@PostMapping(value = "/deleteCollection")
@ApiOperation("删除收藏")
@AnonymousAccess
public ResultInfo saveUserWeixinPhone(@RequestBody WeiXinUserBean resources) {
log.info("saveUserWeixinPhone ==> input ==> [{}]",resources);
MemberProfile s = this.userTvOperationService.saveUserWeixinPhone(resources);
return ResultInfo.success(s);
public ResultInfo deleteCollection(@RequestBody String content) {
log.info("UserOperationController ==> deleteCollection ==> param ==> [{}]",content);
boolean result = this.userTvOperationService.deleteCollection(content);
return ResultInfo.success(result);
}
@Log("添加收藏")
@PostMapping(value = "/addCollection")
@ApiOperation("添加收藏")
@AnonymousAccess
public ResultInfo addCollection(@RequestBody String content) {
log.info("UserOperationController ==> addCollection ==>> param ==> [{}]",content);
boolean result = this.userTvOperationService.addCollection(content);
return ResultInfo.success(result);
}
}
......
......@@ -3,9 +3,7 @@ package com.topdraw.business.process.service;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.profile.service.dto.MemberProfileDTO;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinQueryCriteria;
import com.topdraw.business.process.domian.weixin.BuyVipBean;
import com.topdraw.business.process.domian.weixin.WeiXinUserBean;
public interface MemberOperationService {
......
package com.topdraw.business.process.service;
import com.topdraw.business.process.domian.TempPoints;
import com.topdraw.business.process.domian.result.CustomPointsResult;
import com.topdraw.business.process.service.dto.CustomPointsResult;
import java.util.List;
......
package com.topdraw.business.process.service;
import com.topdraw.business.module.rights.history.domain.RightsHistory;
import com.topdraw.business.process.domian.RightType;
import com.topdraw.business.process.domian.constant.RightType;
import java.util.List;
import java.util.Map;
......
package com.topdraw.business.process.service;
import com.alibaba.fastjson.JSONObject;
import com.topdraw.business.module.member.profile.domain.MemberProfile;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.user.iptv.domain.UserTv;
import com.topdraw.business.module.user.iptv.service.dto.UserTvDTO;
import com.topdraw.business.module.user.weixin.domain.UserWeixin;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinDTO;
import com.topdraw.business.process.domian.weixin.BindBean;
import com.topdraw.business.process.domian.weixin.BuyVipBean;
import com.topdraw.business.process.domian.weixin.SubscribeBean;
import com.topdraw.business.process.domian.weixin.WeiXinUserBean;
import java.util.List;
import java.util.Map;
public interface UserOperationService {
......@@ -22,20 +17,20 @@ public interface UserOperationService {
* @param resources
* @return
*/
boolean createMemberByUserTv(UserTv resources);
boolean createTvUserAndCreateMember(UserTv resources);
/**
* 大屏解绑
* @param userTv
* 保存小屏账户并创建会员
* @param resources
* @return
*/
void unbind(UserTv userTv);
UserWeixinDTO createWeixinUserAndCreateMember(UserWeixin resources);
/**
*
* 大屏解绑
* @param userTv
* @param unionId
*/
void unbindByUnionId(UserTv userTv,String unionId);
void unbind(UserTv userTv);
/**
* 大屏切换主账户(会员)
......@@ -44,13 +39,6 @@ public interface UserOperationService {
void changeMainAccount(UserTv userTv);
/**
*
* @param userTv
* @param unionId
*/
void changeMainAccountByUnionId(UserTv userTv,String unionId);
/**
* 微信小程序登录
* @param resources
* @return
......@@ -82,20 +70,6 @@ public interface UserOperationService {
UserWeixinDTO saveUserInfo(String data);
/**
* 获取用户授权并解析、保存用户手机号
* @param resources
* @return
*/
MemberProfile saveUserWeixinPhone(WeiXinUserBean resources);
/**
*
* @param content
* @return
*/
boolean sendQrCodeMessage(String content);
/**
* 大屏删除所有收藏
* @param content
* @return
......@@ -117,13 +91,6 @@ public interface UserOperationService {
boolean addCollection(String content);
/**
* 获取大屏绑定的小屏会员列表
* @param platformAccount
* @return
*/
List<MemberDTO> findBindByPlatformAccount(String platformAccount);
/**
* 服务号(H5)登录
* @param resources
* @return
......@@ -138,14 +105,27 @@ public interface UserOperationService {
boolean appletBind(BindBean resources);
JSONObject getUnionIdByAppIdAndOpenId(String appId,String secret,String code);
UserWeixinDTO createWeixinUserAndCreateMember(UserWeixin resources);
/**
*
* @param memberCode
* @param platformAccount
*/
void bind(String memberCode, String platformAccount);
/**
*
* @param memberDTO
* @param userTvDTO
*/
void bind(MemberDTO memberDTO, UserTvDTO userTvDTO);
/**
*
* @param memberDTO
* @param platformAccount
* @return
*/
UserTvDTO bind(MemberDTO memberDTO, String platformAccount);
}
......
package com.topdraw.business.process.rest;
package com.topdraw.business.process.service.dto;
import lombok.Data;
......@@ -12,7 +12,7 @@ import javax.validation.constraints.NotNull;
@Data
public class TaskOperationQueryCriteria {
@NotNull(message = "【content】 not be null !!!")
@NotNull(message = "content not be null !!!")
private String content;
}
......
......@@ -4,7 +4,6 @@ import cn.hutool.core.util.ObjectUtil;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.profile.service.MemberProfileService;
import com.topdraw.business.module.member.profile.service.dto.MemberProfileDTO;
import com.topdraw.business.module.member.profile.service.dto.MemberProfileQueryCriteria;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.member.viphistory.domain.MemberVipHistory;
......@@ -12,29 +11,18 @@ import com.topdraw.business.module.member.viphistory.service.MemberVipHistorySer
import com.topdraw.business.module.user.weixin.domain.UserWeixin;
import com.topdraw.business.module.user.weixin.service.UserWeixinService;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinDTO;
import com.topdraw.business.module.user.weixin.service.dto.UserWeixinQueryCriteria;
import com.topdraw.business.process.domian.weixin.BuyVipBean;
import com.topdraw.business.process.domian.weixin.WeiXinUserBean;
import com.topdraw.business.process.service.MemberOperationService;
import com.topdraw.exception.EntityNotFoundException;
import com.topdraw.util.LocalDateTimeUtil;
import com.topdraw.util.TimestampUtil;
import com.topdraw.utils.StringUtils;
import com.topdraw.utils.ValidationUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Base64;
import java.util.Objects;
import java.util.Optional;
import static org.bouncycastle.asn1.x500.style.RFC4519Style.member;
@Service
public class MemberOperationServiceImpl implements MemberOperationService {
......
......@@ -12,7 +12,7 @@ import com.topdraw.business.module.points.detail.detailhistory.service.PointsDet
import com.topdraw.business.module.points.detail.domain.PointsDetail;
import com.topdraw.business.module.points.detail.service.PointsDetailService;
import com.topdraw.business.module.points.service.PointsService;
import com.topdraw.business.process.domian.result.CustomPointsResult;
import com.topdraw.business.process.service.dto.CustomPointsResult;
import com.topdraw.business.process.service.MemberOperationService;
import com.topdraw.business.process.service.PointsOperationService;
import com.topdraw.business.process.domian.TempPoints;
......@@ -33,7 +33,6 @@ import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
......
......@@ -6,6 +6,7 @@ import com.topdraw.business.module.rights.history.domain.RightsHistory;
import com.topdraw.business.module.rights.history.service.RightsHistoryService;
import com.topdraw.business.module.rights.service.RightsService;
import com.topdraw.business.module.rights.service.dto.RightsDTO;
import com.topdraw.business.process.domian.constant.RightType;
import com.topdraw.business.process.service.CouponOperationService;
import com.topdraw.business.process.service.ExpOperationService;
import com.topdraw.business.process.service.PointsOperationService;
......
......@@ -6,7 +6,6 @@ import com.topdraw.business.module.coupon.service.CouponService;
import com.topdraw.business.module.coupon.service.dto.CouponDTO;
import com.topdraw.business.module.member.group.service.MemberGroupService;
import com.topdraw.business.module.member.group.service.dto.MemberGroupDTO;
import com.topdraw.business.module.member.group.service.dto.MemberGroupQueryCriteria;
import com.topdraw.business.module.rights.permanentrights.service.PermanentRightsService;
import com.topdraw.business.module.rights.permanentrights.service.dto.PermanentRightsDTO;
import com.topdraw.business.module.rights.service.RightsService;
......@@ -20,7 +19,8 @@ import com.topdraw.business.module.task.progress.service.dto.TrTaskProgressQuery
import com.topdraw.business.module.user.iptv.domain.UserTv;
import com.topdraw.business.module.user.iptv.service.UserTvService;
import com.topdraw.business.module.user.iptv.service.dto.UserTvDTO;
import com.topdraw.business.process.domian.result.TaskTemplateType;
import com.topdraw.business.process.domian.constant.TaskTemplateType;
import com.topdraw.business.process.domian.constant.RightType;
import com.topdraw.business.process.service.PointsOperationService;
import com.topdraw.business.process.service.RightsOperationService;
import com.topdraw.business.process.service.TaskOperationService;
......@@ -981,7 +981,7 @@ public class TaskOperationServiceImpl implements TaskOperationService {
long l = System.currentTimeMillis();
this.userTvOperationService.createMemberByUserTv(this.checkUserTv(platformAccount));
this.userTvOperationService.createTvUserAndCreateMember(this.checkUserTv(platformAccount));
UserTvDTO userTvDTO = this.userTvService.findByPlatformAccount(platformAccount);
if (Objects.nonNull(userTvDTO)) {
......
package com.topdraw.business.process.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.topdraw.aspect.AsyncMqSend;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.domain.MemberBuilder;
import com.topdraw.business.module.member.profile.domain.MemberProfile;
import com.topdraw.business.module.member.profile.domain.MemberProfileBuild;
import com.topdraw.business.module.member.profile.service.MemberProfileService;
import com.topdraw.business.module.member.profile.service.dto.MemberProfileDTO;
import com.topdraw.business.module.member.service.MemberService;
import com.topdraw.business.module.member.service.dto.MemberDTO;
import com.topdraw.business.module.member.service.dto.MemberQueryCriteria;
import com.topdraw.business.module.member.viphistory.domain.MemberVipHistory;
import com.topdraw.business.module.member.viphistory.service.MemberVipHistoryService;
import com.topdraw.business.module.user.iptv.domain.UserConstant;
import com.topdraw.business.module.user.iptv.domain.UserTv;
import com.topdraw.business.module.user.iptv.service.UserTvService;
......@@ -40,35 +31,24 @@ import com.topdraw.config.LocalConstants;
import com.topdraw.config.RedisKeyUtil;
import com.topdraw.exception.BadRequestException;
import com.topdraw.exception.EntityNotFoundException;
import com.topdraw.security.AESUtil;
import com.topdraw.util.IdWorker;
import com.topdraw.exception.GlobeExceptionMsg;
import com.topdraw.util.TimestampUtil;
import com.topdraw.utils.QueryHelp;
import com.topdraw.utils.RedisUtils;
import com.topdraw.utils.StringUtils;
import com.topdraw.weixin.beans.*;
import com.topdraw.weixin.beans.config.WeiXinAppListConfig;
import com.topdraw.weixin.util.WeChatConstants;
import com.topdraw.weixin.util.WeiXinRequestUtil;
import com.topdraw.weixin.util.WeixinUtil;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RedissonClient;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.nio.charset.StandardCharsets;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Service
......@@ -76,7 +56,6 @@ import java.util.stream.Collectors;
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class UserOperationServiceImpl implements UserOperationService {
@Autowired
private MemberService memberService;
@Autowired
......@@ -84,46 +63,26 @@ public class UserOperationServiceImpl implements UserOperationService {
@Autowired
private UserWeixinService userWeixinService;
@Autowired
private RedisUtils redisUtils;
@Autowired
private WeiXinAppListConfig weiXinAppListConfig;
@Autowired
private MemberProfileService memberProfileService;
@Autowired
private WeiXinRequestUtil weixinRequestUtil;
private UserWeixinRepository userWeixinRepository;
@Autowired
private UserCollectionService userCollectionService;
@Autowired
private UserCollectionDetailService userCollectionDetailService;
@Autowired
private UserCollectionDetailRepository userCollectionDetailRepository;
@Autowired
private CollectionMq2DetailMapper collectionMq2DetailMapper;
@Autowired
private UserWeixinRepository userWeixinRepository;
@Autowired
private MemberVipHistoryService memberVipHistoryService;
private UserCollectionDetailRepository userCollectionDetailRepository;
@Autowired
private RedisUtils redisUtils;
/** 取消关注 */
private static final Integer UNSUBSCRIBE_STATUS = 0;
private static final Integer SUBSCRIBE_STATUS = 1;
private static final String SUBSCRIBE = "subscribe";
private static final String UNSUBSCRIBE = "unsubscribe";
private static final Integer[] PLATFORM_LIST = new Integer[]{0,1,2,3};
private static final Integer[] IPTV_MAJOR = new Integer[]{0,1};
private static final String QR_CODE_URL = "QR_CODE_URL_";
@Value("${uc.service.platform:}")
private String platform;
@Value("${key:}")
private String key;
@Value("${uc.app.subAppId:wx05f35931270014be}")
private String subAppId;
private static final Integer[] PLATFORM_LIST = new Integer[]{0,1,2,3};
@Value("${uc.app.h5AppId:wxca962918dfeed88c}")
private String h5AppId;
......@@ -131,174 +90,205 @@ public class UserOperationServiceImpl implements UserOperationService {
@Value("${uc.app.appletAppid:wxc57d42de3d351cec}")
private String appletAppid;
@Value("${file.upload:upload}")
private String filePath;
/**
* 保存大屏账户同时创建会员
*
* @param resources 大屏账户
* @return boolean
*/
@Override
@Transactional
@AsyncMqSend
public boolean createTvUserAndCreateMember(UserTv resources) {
// 大屏账户
String platformAccount = resources.getPlatformAccount();
UserTvDTO userTvDTO = this.userTvService.findByPlatformAccount(platformAccount);
if (Objects.isNull(userTvDTO)) {
// x_member
Member member =
MemberBuilder.build(LocalConstants.MEMBER_PLATFORM_TYPE_VIS,
null, platformAccount, 0);
UserTvDTO _userTvDTO = new UserTvDTO();
BeanUtils.copyProperties(resources, _userTvDTO);
// 创建大屏账户
this.createTvUser(_userTvDTO, member);
return true;
}
throw new BadRequestException(GlobeExceptionMsg.ENTITY_ALREADY_EXISTS);
}
/**
* 微信公众号关注
* 1.未扫描大屏二维码
* 1). 保存、修改小屏账户,创建小屏账户会员
* 2.扫描大屏二维码
* 1). 从redis中获取大屏信息
* 2). 大屏账户保存小屏会员的code
* 3). 小屏会员中保存大屏的id
* @description 大小屏绑定,大屏账户保存小屏会员编码
*
* @param resources
* @return
*/
@Override
public boolean subscribe(SubscribeBean resources) {
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
@AsyncMqSend
public UserWeixinDTO createWeixinUserAndCreateMember(UserWeixin resources) {
String appId = resources.getAppid();
String openId = resources.getOpenid();
String unionId = resources.getUnionid();
String appId = resources.getAppId();
String openId = resources.getOpenId();
String nickname = resources.getNickname();
String headImgUrl = resources.getHeadimgurl();
// 小屏账户
// 检查小屏账户是否存在
UserWeixinDTO userWeixinDTO = this.findFirstByUnionIdAndAppIdAndOpenId(unionId,appId, openId);
if (Objects.nonNull(userWeixinDTO.getId()))
return userWeixinDTO;
if (Objects.isNull(userWeixinDTO.getId())) {
// 当前用户的任意微信app,因为同一unionId的会员是唯一的
UserWeixinDTO userWeixinDTO1 = this.findFirstByUnionId(unionId);
DefaultWeiXinBeanDefinition weiXinBeanDefinition = new DefaultWeiXinBeanDefinition();
weiXinBeanDefinition.setUnionId(unionId);
weiXinBeanDefinition.setAppid(appId);
weiXinBeanDefinition.setOpenId(openId);
weiXinBeanDefinition.setNickname(nickname);
weiXinBeanDefinition.setHeadImgUrl(headImgUrl);
// 创建会员和账户
this.doCreateUserWeiXinAndMember(weiXinBeanDefinition);
UserWeixinDTO _userWeixinDTO = new UserWeixinDTO();
Member member = null;
} else {
if (Objects.nonNull(userWeixinDTO1.getId())) {
// 修改账户和会员信息
this.doUpdateUserWeiXinAndMember(userWeixinDTO,appId,openId,headImgUrl,nickname);
Long memberId = userWeixinDTO1.getMemberId();
resources.setMemberId(memberId);
BeanUtils.copyProperties(resources,_userWeixinDTO);
} else {
// x_member
member =
MemberBuilder.build(LocalConstants.MEMBER_PLATFORM_TYPE_WEIXIN,
null, "", 0);
BeanUtils.copyProperties(resources,_userWeixinDTO);
}
// 大屏信息
JSONObject iptvUserInfo = resources.getIptvUserInfo();
if (Objects.nonNull(iptvUserInfo)) {
this.createWeixinUser(_userWeixinDTO,member);
// 小屏会员
MemberDTO memberDTO = this.findMemberByAppIdAndOpenId(appId,openId);
return null;
}
// 账户
String platformAccount = iptvUserInfo.getString("platformAccount");
this.bind(memberDTO,platformAccount);
@Override
public Object serviceLogin(WeiXinUserBean resources) {
String unionId = resources.getUnionid();
String appId = resources.getAppid();
String openId = resources.getOpenid();
}
// 小屏账户
UserWeixinDTO userWeixinDTO = this.findFirstByUnionIdAndAppIdAndOpenId(unionId,appId, openId);
// 关注历史记录,用于恢复VIP等级(0:普通 1:团粉 其他:会员(过期后vip恢复到最高等级))
this.doInsertSubscribeHistory(appId,openId,WeChatConstants.EVENT_SUBSCRIBE);
if (Objects.isNull(userWeixinDTO.getId())) {
return true;
// member
Member member =
MemberBuilder.build(LocalConstants.MEMBER_PLATFORM_TYPE_WEIXIN,
resources.getHeadimgurl(), resources.getNikename(), 0);
}
userWeixinDTO = new UserWeixinDTO();
BeanUtils.copyProperties(resources,userWeixinDTO);
/**
*
* @param appId
* @param openId
*/
private void doInsertSubscribeHistory(String appId, String openId,String event) {
// 小屏会员
MemberDTO member = this.findMemberByAppIdAndOpenId(appId,openId);
UserWeixin weixinUser = this.createWeixinUser(userWeixinDTO, member);
userWeixinDTO.setId(weixinUser.getId());
MemberVipHistory memberVipHistory = new MemberVipHistory();
memberVipHistory.setMemberId(member.getId()).setStatus(1);
//小屏侧,理论上大屏不会收到该事件
if (WeChatConstants.EVENT_SUBSCRIBE.equals(event)) {//关注
memberVipHistory.setVip(1);
if (member.getVip() == 0) {
member.setVip(1);
memberVipHistory.setBeforeVip(0);
}
} else if (WeChatConstants.EVENT_UNSUBSCRIBE.equals(event)) {// 取消关注
memberVipHistory.setVip(0);
if (member.getVip() == 1) {
member.setVip(0);
memberVipHistory.setBeforeVip(1);
}
}
memberVipHistory.setVipExpireTime(LocalDateTime.now());
memberVipHistoryService.create(memberVipHistory);
// 为了保证返回的同一用户
UserWeixinDTO userWeixinDTO_0 = this.getFirstId(userWeixinDTO);
return userWeixinDTO_0;
}
/**
* 获取小屏账户
* @param unionId
* @param appId
* @param openId
* 小程序登录
* @param resources
* @return
*/
private UserWeixinDTO findFirstByUnionIdAndAppIdAndOpenId( String unionId,String appId, String openId) {
return this.userWeixinService.findFirstByUnionIdAndAppIdAndOpenId(unionId,appId,openId);
}
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = Exception.class)
public UserWeixinDTO appletLogin(WeiXinUserBean resources) {
String unionId = resources.getUnionid();
String appId = resources.getAppid();
String openId = resources.getOpenid();
/**
*
* @param userWeixinDTO
* @param appId
* @param openId
*/
private void doUpdateUserWeiXinAndMember(UserWeixinDTO userWeixinDTO,String appId,String openId,String headImgUrl,String nickName) {
// 小屏账户
UserWeixinDTO userWeixinDTO = this.findFirstByUnionIdAndAppIdAndOpenId(unionId,appId, openId);
userWeixinDTO.setAppid(appId);
userWeixinDTO.setOpenid(openId);
userWeixinDTO.setNickname(nickName);
userWeixinDTO.setHeadimgurl(headImgUrl);
// 修改微信账户关注状态
this.doUpdateUserWeiXinStatus(userWeixinDTO,SUBSCRIBE_STATUS);
if (Objects.isNull(userWeixinDTO.getId())) {
// member
Member member =
MemberBuilder.build(LocalConstants.MEMBER_PLATFORM_TYPE_WEIXIN,
resources.getHeadimgurl(), resources.getNikename(), 0);
// 小屏会员
MemberDTO memberDTO_0 = this.findMemberByAppIdAndOpenId(appId,openId);
userWeixinDTO = new UserWeixinDTO();
BeanUtils.copyProperties(resources, userWeixinDTO);
if (StringUtils.isNotBlank(headImgUrl) && StringUtils.isNotBlank(nickName)) {
memberDTO_0.setAvatarUrl(headImgUrl);
memberDTO_0.setNickname(nickName);
UserWeixin weixinUser = this.createWeixinUser(userWeixinDTO, member);
userWeixinDTO.setId(weixinUser.getId());
}
this.doUpdateMemberVip(memberDTO_0,1);
return this.getFirstId(userWeixinDTO);
}
/**
* 创建会员和账户
* @param weiXinBeanDefinition
* 微信公众号关注
* 1.未扫描大屏二维码
* 1). 保存、修改小屏账户,创建小屏账户会员
* 2.扫描大屏二维码
* 1). 从redis中获取大屏信息
* 2). 大屏账户保存小屏会员的code
* 3). 小屏会员中保存大屏的id
* @description 大小屏绑定,大屏账户保存小屏会员编码
* @param resources
* @return
*/
private void doCreateUserWeiXinAndMember(DefaultWeiXinBeanDefinition weiXinBeanDefinition) {
@Override
public boolean subscribe(SubscribeBean resources) {
String unionId = resources.getUnionid();
String appId = resources.getAppId();
String openId = resources.getOpenId();
String nickname = resources.getNickname();
String headImgUrl = resources.getHeadimgurl();
// 小屏账户
UserWeixin userWeixin = this.generateUserWeiXin(weiXinBeanDefinition,SUBSCRIBE_STATUS);
UserWeixinDTO userWeixinDTO = this.findFirstByUnionIdAndAppIdAndOpenId(unionId,appId, openId);
// 保存会员
// Long memberId = this.doCreateMember(userWeixin,1);
Member member = this.doCreateMemberAndReturnMember(userWeixin,1);
if (Objects.isNull(userWeixinDTO.getId())) {
if (Objects.isNull(member.getId())) {
throw new BadRequestException("会员创建保存失败");
}
// member
Member member =
MemberBuilder.build(LocalConstants.MEMBER_PLATFORM_TYPE_WEIXIN,
resources.getHeadimgurl(), resources.getNikename(), 1);
UserWeixinDTO _userWeixinDTO = new UserWeixinDTO();
BeanUtils.copyProperties(resources,_userWeixinDTO);
this.createWeixinUser(_userWeixinDTO,member);
// 保存或者修改,微信账户信息
this.doCreateUserWeiXin(userWeixin,member);
} else {
// 修改账 status =1 , 会员 vip = 1
this.doUpdateUserWeiXinAndMember(userWeixinDTO,appId,openId,headImgUrl,nickname);
}
/**
* 获取小屏会员
* @param appId
* @param openId
* @return
*/
private MemberDTO findMemberByAppIdAndOpenId(String appId, String openId) {
UserWeixinDTO userWeixinDTO = this.findUserWeiXinByOpenIdAndAppId(appId, openId);
if (Objects.nonNull(userWeixinDTO)) {
Long memberId = userWeixinDTO.getMemberId();
return this.findMemberById(memberId);
// 大屏信息
JSONObject iptvUserInfo = resources.getIptvUserInfo();
if (Objects.nonNull(iptvUserInfo)) {
// 小屏会员
MemberDTO memberDTO = this.findMemberByAppIdAndOpenId(appId,openId);
// 账户
String platformAccount = iptvUserInfo.getString("platformAccount");
this.bind(memberDTO,platformAccount);
}
return null;
return true;
}
/**
......@@ -321,9 +311,6 @@ public class UserOperationServiceImpl implements UserOperationService {
// 修改会员vip,如果没有购买会员则取消团粉
this.doUpdateMemberVip(memberDTO,0);
// 关注历史记录
this.doInsertSubscribeHistory(appId,openId,WeChatConstants.EVENT_UNSUBSCRIBE);
return true;
}
......@@ -363,807 +350,49 @@ public class UserOperationServiceImpl implements UserOperationService {
return null;
}
/**
*
* @param unionid
* @param appId
* @return
* 大屏更换主账号
* @param resources
*/
private UserWeixinDTO findUserWeiXinByUnionIdAndAppId(String unionid, String appId) {
return this.userWeixinService.findFirstByUnionidAndAppid(unionid,appId);
}
@Override
public void changeMainAccount(UserTv resources) {
/**
* 修改会员vip状态
*/
private void doUpdateMemberVip(MemberDTO memberDTO,Integer vip1) {
if (memberDTO != null) {
Integer vip = memberDTO.getVip();
vip = (vip == null ? 0 : vip);
// 未购买付费会员
if (vip <= 1) {
// 会员编码
String memberCode = resources.getMemberCode();
memberDTO.setVip(vip1);
UserTvDTO userTvDTO = this.findByPriorityMemberCode(memberCode);
Member member = new Member();
BeanUtils.copyProperties(memberDTO, member);
this.memberService.update(member);
}
}
}
if (Objects.nonNull(userTvDTO)) {
if (userTvDTO.getPriorityMemberCode().equalsIgnoreCase(memberCode))
throw new BadRequestException("会员已是主账户");
throw new BadRequestException("该会员已绑定其他账户");
/**
* 获取小屏会员
* @param userWeixinDTO
* @return
*/
private MemberDTO findMemberByUserWeixinDTO(UserWeixinDTO userWeixinDTO) {
Long memberId = userWeixinDTO.getMemberId();
if (Objects.nonNull(memberId)) {
MemberDTO memberDTO = this.findMemberById(memberId);
return memberDTO;
}
return null;
// 设置主会员
this.bondPriorityMember(userTvDTO, memberCode,"manual");
}
/**
* 修改微信公众号关注状态
* @param status 0:取消关注 1:关注
* 大屏解绑
* @param resources
*/
private UserWeixinDTO doUpdateUserWeiXinStatus(String appId, String openId, Integer status) {
UserWeixinDTO userWeixinDTO = this.userWeixinService.findFirstByAppIdAndOpenId(appId, openId);
if (Objects.nonNull(userWeixinDTO.getId())) {
@Override
public void unbind(UserTv resources) {
userWeixinDTO.setStatus(status);
String memberCode = resources.getMemberCode();
UserWeixin userWeixin = new UserWeixin();
BeanUtils.copyProperties(userWeixinDTO,userWeixin);
// 大屏会员
MemberDTO memberDTOS = this.findMemberByCode(memberCode);
this.userWeixinService.update(userWeixin);
}
return userWeixinDTO;
}
/**
* 修改微信公众号关注状态
* @param status 0:取消关注 1:关注
*/
private UserWeixinDTO doUpdateUserWeiXinStatus(UserWeixinDTO userWeixinDTO, Integer status) {
userWeixinDTO.setStatus(status);
UserWeixin userWeixin = new UserWeixin();
BeanUtils.copyProperties(userWeixinDTO,userWeixin);
this.userWeixinService.update(userWeixin);
return userWeixinDTO;
}
/**
* 通过openId和appId获取微信信息
* @param appId
* @param openId
* @return
*/
private UserWeixinDTO findUserWeiXinByOpenIdAndAppId(String appId, String openId) {
UserWeixinDTO userWeixinDTO = this.userWeixinService.findFirstByAppIdAndOpenId(appId,openId);
return userWeixinDTO;
}
/**
* 获取会员
* @param memberId
* @return
*/
private MemberDTO findMemberById(Long memberId) {
MemberDTO memberDTO = this.memberService.findById(memberId);
return memberDTO;
}
/**
* 小程序登录
* @param resources
* @return
*/
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = Exception.class)
public UserWeixinDTO appletLogin(WeiXinUserBean resources) {
String appid = resources.getAppid();
String openid = resources.getOpenid();
String headimgurl = resources.getHeadimgurl();
String unionid = resources.getUnionid();
// 解析
DefaultWeiXinBeanDefinition weiXinBeanDefinition = new DefaultWeiXinBeanDefinition();//this.parseAppletInfo(resources);
weiXinBeanDefinition.setAppid(appid);
weiXinBeanDefinition.setOpenId(openid);
weiXinBeanDefinition.setHeadImgUrl(headimgurl);
weiXinBeanDefinition.setUnionId(unionid);
if (Objects.isNull(weiXinBeanDefinition.getAppId())) {
throw new RuntimeException("微信信息解析失败!");
}
// 链接微信服务器获取用户信息,创建UserWeixin
UserWeixin userWeixin = this.generateUserWeiXin(weiXinBeanDefinition,UNSUBSCRIBE_STATUS);
// 保存会员
Long memberId = this.doCreateMember(userWeixin,0);
// 保存或者修改,微信账户信息
UserWeixinDTO userWeixinDTO = this.doCreateUserWeiXin(userWeixin, memberId);
// 为了保证返回的同一用户
UserWeixinDTO userWeixinDTO_0 = this.getFirstId(userWeixinDTO);
return userWeixinDTO_0;
}
/**
*
* @param userWeixinDTO
* @param vip
* @return
*/
private Long doCreateMember(UserWeixinDTO userWeixinDTO,Integer vip) {
UserWeixin userWeixin = new UserWeixin();
BeanUtils.copyProperties(userWeixinDTO,userWeixin);
Long memberId = this.doCreateMember(userWeixin, vip);
return memberId;
}
/**
*
* @param userWeixin
* @param vip
* @return
*/
private Member doCreateMemberAndReturnMember(UserWeixin userWeixin,Integer vip) {
Member memberReturn = null;
if(Objects.nonNull(userWeixin)) {
String unionid = userWeixin.getUnionid();
// 新创建的小屏账户
if(Objects.nonNull(unionid)) {
// 查询第一个账户是否关联了会员
UserWeixinDTO userWeixinDTO = this.userWeixinService.findFirstByUnionId(unionid);
// 无账号,没有绑定会员
if (Objects.isNull(userWeixinDTO.getMemberId())) {
// 默认会员
Member member = MemberBuilder.build(LocalConstants.DEVICE_MOBILE,userWeixin.getHeadimgurl(),
userWeixin.getNickname(),vip);
memberReturn = this.memberService.createAndReturnMember(member);
}
// 如果绑定了会员
if (Objects.nonNull(userWeixinDTO.getMemberId())) {
Long memberId = userWeixinDTO.getMemberId();
MemberDTO memberDTO = this.findMemberById(memberId);
memberReturn = new Member();
BeanUtils.copyProperties(memberDTO,memberReturn);
}
}
}
return memberReturn;
}
/**
* 创建会员
* @description 同一用户只有一个会员,通过unionId查询任意账户是否关联了会员,如果关联了就不用再创建
* @param userWeixin
* @param vip
* @return
*/
private Long doCreateMember(UserWeixin userWeixin,Integer vip) {
Long memberId = null;
if(Objects.nonNull(userWeixin)) {
String unionid = userWeixin.getUnionid();
// 新创建的小屏账户
if(Objects.nonNull(unionid)) {
// 查询第一个账户是否关联了会员
UserWeixinDTO userWeixinDTO = this.userWeixinService.findFirstByUnionId(unionid);
// 无账号,没有绑定会员
if (Objects.isNull(userWeixinDTO.getMemberId())) {
// 默认会员
Member member = MemberBuilder.build(LocalConstants.DEVICE_MOBILE,userWeixin.getHeadimgurl(),
userWeixin.getNickname(),vip);
memberId = this.memberService.create(member);
}
// 如果绑定了会员
if (Objects.nonNull(userWeixinDTO.getMemberId())) {
memberId = userWeixinDTO.getMemberId();
}
}
}
return memberId;
}
private UserWeixinDTO doCreateUserWeiXin(UserWeixinDTO userWeixin,Long memberId) {
if (Objects.isNull(memberId))
throw new NullPointerException("memberId is null !");
UserWeixin userWeixin1 = new UserWeixin();
BeanUtils.copyProperties(userWeixin,userWeixin1);
UserWeixinDTO userWeixinDTO = this.doCreateUserWeiXin(userWeixin1, memberId);
return userWeixinDTO;
}
private UserWeixinDTO doCreateUserWeiXin(UserWeixin userWeixin,Member member) {
Long memberId = member.getId();
String code = member.getCode();
UserWeixinDTO userWeixinDTO = new UserWeixinDTO();
if(Objects.isNull(userWeixin.getId()) && Objects.nonNull(memberId)) {
userWeixin.setMemberId(memberId);
userWeixin.setStatus(SUBSCRIBE_STATUS);
userWeixin.setSyncStatus(0);
userWeixin.setCreateBy("system");
userWeixin.setUpdateBy("system");
userWeixin.setAuthTime(TimestampUtil.now());
userWeixin.setMemberCode(code);
userWeixin = this.userWeixinService.create(userWeixin);
}
BeanUtils.copyProperties(userWeixin,userWeixinDTO);
return userWeixinDTO;
}
/**
* 保存微信账户信息
* @param userWeixin
* @param memberId
*/
private UserWeixinDTO doCreateUserWeiXin(UserWeixin userWeixin,Long memberId) {
MemberDTO memberDTO = this.findMemberById(memberId);
UserWeixinDTO userWeixinDTO = new UserWeixinDTO();
if(Objects.isNull(userWeixin.getId()) && Objects.nonNull(memberId)) {
userWeixin.setMemberId(memberId);
userWeixin.setStatus(SUBSCRIBE_STATUS);
userWeixin.setSyncStatus(0);
userWeixin.setCreateBy("system");
userWeixin.setUpdateBy("system");
userWeixin.setAuthTime(TimestampUtil.now());
userWeixin.setMemberCode(memberDTO.getCode());
userWeixin = this.userWeixinService.create(userWeixin);
}
// 避免账户存在但会员不存在的情况
if(Objects.nonNull(userWeixin.getId()) && Objects.isNull(userWeixin.getMemberId()) && Objects.nonNull(userWeixin.getUnionid())) {
userWeixin.setMemberId(memberId);
this.userWeixinService.update(userWeixin);
}
BeanUtils.copyProperties(userWeixin,userWeixinDTO);
return userWeixinDTO;
}
/**
* 链接微信服务器,创建或者修改UserWeiXinDTO
* @param weiXinBeanDefinition
* @return
*/
private UserWeixin generateUserWeiXin(WeiXinBeanDefinition weiXinBeanDefinition,Integer status) {
String appId = weiXinBeanDefinition.getAppId();
String openId = weiXinBeanDefinition.getOpenId();
String unionId = weiXinBeanDefinition.getUnionId();
String nickname = weiXinBeanDefinition.getNickname();
String headImgUrl = weiXinBeanDefinition.getHeadImgUrl();
// 微信
UserWeixinDTO weixinDTO = this.userWeixinService.findFirstByAppIdAndOpenId(appId,openId);
if (Objects.isNull(weixinDTO.getId())) {
UserWeixin userWeixin = new UserWeixin()
.setAppid(appId)
.setOpenid(openId)
.setUnionid(unionId)
.setNickname(nickname)
.setHeadimgurl(headImgUrl)
.setStatus(status)
.setAuthTime(TimestampUtil.now());
return userWeixin;
}
UserWeixin userWeixin = new UserWeixin();
BeanUtils.copyProperties(weixinDTO,userWeixin);
return userWeixin;
}
/**
* 解析小程序
* @param resources
* @return
*/
private DefaultWeiXinBeanDefinition parseAppletInfo(WeiXinUserBean resources) {
return this.parse(resources);
}
/**
* 解析微信信息
* @param resources
* @return
*/
private DefaultWeiXinBeanDefinition parse(WeiXinUserBean resources) {
Map<String, String> weixinInfoMap = null;
String appId = resources.getWxAppid();
String code = resources.getWxCode();
String encryptedData = resources.getEncryptedData();
String iv = resources.getIv();
String userInfo = null;
if (StringUtils.isNotBlank(appId)) {
String decrypt = AESUtil.decrypt(appId, this.key);
if (decrypt != null) {
appId = decrypt.substring(16);
}
weixinInfoMap = this.getWeixinInfoByAppid(appId);
}
if (StringUtils.isNotBlank(code)) {
String decrypt = AESUtil.decrypt(code, this.key);
if (decrypt != null) {
code = decrypt.substring(16);
}
}
String appId_ = weixinInfoMap.get("appid");
String secret = weixinInfoMap.get("secret");
// 链接微信服务器
String url = WeChatConstants.CODE2SESSION.replace("APPID", appId_)
.replace("SECRET", secret).replace("JSCODE", code);
String entityBody = HttpUtil.get(url);
log.info("entityBody [{}]",entityBody);
JSONObject jsonObject = JSONObject.parseObject(entityBody);
String errCode = jsonObject.getString("errcode");
if (StringUtils.isNotEmpty(errCode)) {
String nameStr = jsonObject.getString("errmsg");
throw new BadRequestException(nameStr);
}
String openId = jsonObject.getString("openid");
String unionId = jsonObject.getString("unionid");
String sessionKey = jsonObject.getString("session_key");
JSONObject userInfoWxJo = null;
if (StringUtils.isNotBlank(encryptedData) && StringUtils.isNotBlank(iv) && StringUtils.isNotBlank(sessionKey)) {
String userInfoWeixin = AESUtil.decryptJsUserInfo(encryptedData, iv, sessionKey);
log.info("userInfoWeixin [{}]",userInfoWeixin);
if (StringUtils.isNotEmpty(userInfoWeixin))
userInfoWxJo = JSONObject.parseObject(userInfoWeixin);
}
String phoneNumber = "";
if (StringUtils.isNotBlank(encryptedData)) {
JSONObject userInfoJo = JSONObject.parseObject(userInfo);
if (Objects.nonNull(userInfoJo)) {
encryptedData = userInfoJo.getString("encryptedData");
iv = userInfoJo.getString("iv");
String sessionkey = jsonObject.getString("session_key");
JSONObject userInfoPhone = AESUtil.decryptJsUserPhone(encryptedData, iv, sessionkey);
if (ObjectUtil.isNull(userInfoPhone)) {
throw new BadRequestException("decrypt phone error...");
}
phoneNumber = userInfoPhone.getString("phoneNumber");
if (StringUtils.isBlank(phoneNumber)) {
throw new BadRequestException("phoneNumber is null...");
}
}
}
DefaultWeiXinBeanDefinition weiXinBeanDefinition =
new DefaultWeiXinBeanDefinition(appId,code,unionId,openId,userInfoWxJo,phoneNumber);
return weiXinBeanDefinition;
}
/**
*
* @param appid
* @return
*/
private Map<String, String> getWeixinInfoByAppid(String appid) {
if (StringUtils.isBlank(appid)) {
throw new RuntimeException("wxAppid can not be null");
}
List<Map<String, String>> list = this.weiXinAppListConfig.getList();
Optional<Map<String, String>> weixinInfoOptional = list.stream().filter(o -> o.get("appid").equals(appid)).findFirst();
if (!weixinInfoOptional.isPresent()) {
throw new RuntimeException("wxAppid error, appid is : " + appid);
}
return weixinInfoOptional.get();
}
/**
* 大屏更换主账号
* @param resources
*/
@Override
public void changeMainAccount(UserTv resources) {
// 会员编码
String memberCode = resources.getMemberCode();
UserTvDTO userTvDTO_0 = this.findByPriorityMemberCode(memberCode);
if (Objects.nonNull(userTvDTO_0)) {
if (userTvDTO_0.getPriorityMemberCode().equalsIgnoreCase(memberCode))
throw new BadRequestException("会员已是主账户");
throw new BadRequestException("该会员已绑定其他账户");
}
// 大屏账户
UserTvDTO userTvDTO = this.findByUserTv(resources);
// 会员
MemberDTO memberDTO = this.findMemberByMemberCode(memberCode);
// 设置主会员
this.bondPriorityMember(userTvDTO, memberDTO,"manual");
}
@Override
public void changeMainAccountByUnionId(UserTv userTv, String unionId) {
UserWeixinDTO userWeixinDTO = this.userWeixinService.findFirstByUnionId(unionId);
Long memberId = userWeixinDTO.getMemberId();
MemberDTO memberDTO = this.findMemberById(memberId);
String code = memberDTO.getCode();
userTv.setMemberCode(code);
this.changeMainAccount(userTv);
}
/**
*
* @param memberCode
* @return
*/
private UserTvDTO findByPriorityMemberCode(String memberCode) {
UserTvDTO userTvDTO = this.userTvService.findByPriorityMemberCode(memberCode);
return userTvDTO;
}
/**
* 设置主会员
* @description 检查大屏账户有没有绑定小屏会员,如果没有绑定就将当前会员的code保存到大屏账户中
* @param userTvDTO
* @param memberDTO
* @param auto manual:手动 auto:自动
*/
private void bondPriorityMember(UserTvDTO userTvDTO, MemberDTO memberDTO,String auto) {
if (auto.equalsIgnoreCase("auto")) {
// 主账户
String priorityMemberCode = userTvDTO.getPriorityMemberCode();
if (StringUtils.isNotEmpty(priorityMemberCode)) {
return;
}
}
String memberCode = memberDTO.getCode();
// 绑定了小屏,结束
if (StringUtils.isNotEmpty(memberCode)) {
userTvDTO.setPriorityMemberCode(memberCode);
}
UserTv userTv = new UserTv();
BeanUtils.copyProperties(userTvDTO,userTv);
this.userTvService.update(userTv);
}
/**
* 通过编码获取会员
* @param memberCode
* @return
*/
private MemberDTO findMemberByMemberCode(String memberCode) {
return this.memberService.findByCode(memberCode);
}
/**
* 大屏解绑
* @param resources
*/
@Override
public void unbind(UserTv resources) {
// 大屏账户
UserTvDTO userTvDTO = this.findByUserTv(resources);
Long id = userTvDTO.getId();
String memberCode = resources.getMemberCode();
// 大屏会员
MemberDTO memberDTOS = this.findMemberByCodeAndUserIptvId(id,memberCode);
// 解绑(置空大屏信息)
this.resetIptvColumn(memberDTOS);
// 置空主账号
this.resetMainAccount(memberCode);
}
@Override
public void unbindByUnionId(UserTv userTv, String unionId) {
UserWeixinDTO userWeixinDTO = this.userWeixinService.findFirstByUnionId(unionId);
Long memberId = userWeixinDTO.getMemberId();
MemberDTO memberDTO = this.findMemberById(memberId);
String code = memberDTO.getCode();
userTv.setMemberCode(code);
this.unbind(userTv);
}
/**
* 置空主账号
* @param memberCode
*/
private void resetMainAccount(String memberCode) {
UserTvDTO userTvDTO = this.userTvService.findByPriorityMemberCode(memberCode);
if (Objects.nonNull(userTvDTO)) {
userTvDTO.setPriorityMemberCode(null);
UserTv userTv = new UserTv();
BeanUtils.copyProperties(userTvDTO,userTv);
this.userTvService.unbindPriorityMemberCode(userTv);
}
}
/**
* 解绑(置空大屏信息)
* @param memberDTOS
*/
private void resetIptvColumn(MemberDTO memberDTOS) {
// 若无关系,不做处理
if (Objects.nonNull(memberDTOS))
return;
Member member = new Member();
memberDTOS.setBindIptvTime(null);
memberDTOS.setUserIptvId(null);
memberDTOS.setBindIptvPlatformType(null);
BeanUtils.copyProperties(memberDTOS, member);
this.memberService.unbind(member);
}
/**
*
* @param tvUserId 大屏ic
* @param memberCode 会员编码
* @return
*/
private MemberDTO findMemberByCodeAndUserIptvId(Long tvUserId,String memberCode) {
MemberDTO memberDTO = memberService.findByCode(memberCode);
return memberDTO;
}
/**
* 通过大屏账户查询大屏信息
* @param resources
* @return
*/
private UserTvDTO findByUserTv(UserTv resources) {
String platformAccount = resources.getPlatformAccount();
UserTvDTO userTvDTO = this.userTvService.findByPlatformAccount(platformAccount);
return userTvDTO;
}
/**
* 创建大屏会员
* @param resources
* @return
*/
@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);
member.setNickname(platformAccount);
member.setType(1);
Long memberId = this.memberService.create(member);
UserTv userTv = new UserTv();
if (Objects.nonNull(memberId)) {
BeanUtils.copyProperties(resources,userTv);
userTv.setPlatformAccount(platformAccount);
userTv.setMemberCode(member.getCode());
userTv.setNickname(platformAccount);
userTv.setUsername(platformAccount);
userTv.setLoginDays(1);
userTv.setStatus(1);
userTv.setActiveTime(TimestampUtil.now());
userTv.setContinueDays(1);
userTv.setCreateBy("system");
userTv.setUpdateBy("system");
this.userTvService.create(userTv);
return true;
}
return false;
} else {
UserTv userTv = new UserTv();
BeanUtils.copyProperties(userTvDTO,userTv);
return true;
}
}
/**
* 绑定会员中的userIptvId字段
* @param memberDTO
* @param userTvDTO
*/
private MemberDTO bindIptvId(MemberDTO memberDTO,UserTvDTO userTvDTO) {
String platform = userTvDTO.getPlatform();
// 绑定IPTV平台 0:未知;1:电信;2:移动;3:联通
Integer bindIptvPlatformType = 0;
// 联通
if (UserConstant.platform_lt.contains(platform)) {
bindIptvPlatformType = PLATFORM_LIST[3];
}
// 移动
if (UserConstant.platform_yd.contains(platform)) {
bindIptvPlatformType = PLATFORM_LIST[2];
}
// 电信
if (UserConstant.platform_dx.contains(platform)) {
bindIptvPlatformType = PLATFORM_LIST[1];
}
memberDTO.setUserIptvId(userTvDTO.getId());
memberDTO.setBindIptvTime(LocalDateTime.now());
memberDTO.setBindIptvPlatformType(bindIptvPlatformType);
return memberDTO;
}
/**
* 修改会员
* @param memberDTO
*/
private void doUpdateMemberByMemberDTO(MemberDTO memberDTO){
Member member = new Member();
BeanUtils.copyProperties(memberDTO,member);
member.setUpdateTime(LocalDateTime.now());
log.info("doUpdateMemberByMemberDTO=====?>>member ==>> [{}]",member);
this.doUpdateMember(member);
}
/**
* 修改会员
* @param member
*/
private void doUpdateMember(Member member){
this.memberService.update(member);
}
/**
* 解析微信信息
* @param resources
* @return
*/
@Override
public MemberProfile saveUserWeixinPhone(WeiXinUserBean resources) {
DefaultWeiXinBeanDefinition weiXinBeanDefinition = this.parseAppletInfo(resources);
if (Objects.nonNull(weiXinBeanDefinition.getOpenId())) {
throw new RuntimeException("微信信息解析失败!");
}
// 保存、修改会员加密信息
return this.doSaveOrUpdateMemberProfile(weiXinBeanDefinition,resources);
// 解绑(置空大屏信息)
this.resetIptvColumn(memberDTOS);
}
@Override
public boolean sendQrCodeMessage(String content) {
try {
log.info("receive get qrCode message, content {}", content);
JSONObject jsonObject = JSONObject.parseObject(content);
String appid = jsonObject.getString("appid");
String IPTVappid = jsonObject.getString("IPTVappid");
String platformAccount = jsonObject.getString("platformAccount");
String sessionId = jsonObject.getString("sessionId");
String key = QR_CODE_URL + appid + "_" + platformAccount + "_" + sessionId;
String url = (String) this.redisUtils.get(key);
if (StringUtils.isBlank(url)) {
Map<String, String> wxInfo = WeixinUtil.getWeixinInfoByAppid(appid);
String appType = wxInfo.get("appType");
// 订阅号不支持带参二维码,直接返回
if (StrUtil.isNotEmpty(appType) && ObjectUtil.equals(appType, WeChatConstants.WX_SUBSCRIPTION)) {
log.error("订阅号不支持带参二维码 || {} || {}", appid, content);
return false;
}
QrCode qrCode = new QrCode();
qrCode.setActionName(WeChatConstants.QR_STR_SCENE);
if (StringUtils.isNotBlank(wxInfo.get("qrCodeExpireSeconds"))) {
qrCode.setExpireSeconds(Integer.valueOf(wxInfo.get("qrCodeExpireSeconds")));
}
ActionInfo actionInfo = new ActionInfo();
Scene scene = new Scene();
scene.setSceneStr(content);
actionInfo.setScene(scene);
qrCode.setActionInfo(actionInfo);
JSONObject jsonQrCode = this.weixinRequestUtil.getQrCode(wxInfo, qrCode);
url = jsonQrCode.getString("url");
Integer expireSeconds = jsonQrCode.getInteger("expire_seconds");
this.redisUtils.set(key, url, expireSeconds, TimeUnit.SECONDS);
}
} catch (Exception e) {
log.error("GetQrCodeConsumer || get qrCode error || {}", e.toString(), e);
}
return true;
// 置空主账号
this.resetMainAccount(memberCode);
}
@Override
......@@ -1335,79 +564,7 @@ public class UserOperationServiceImpl implements UserOperationService {
}
@Override
public List<MemberDTO> findBindByPlatformAccount(String platformAccount) {
UserTvDTO userTvDTO = this.userTvService.findByPlatformAccount(platformAccount);
if (Objects.nonNull(userTvDTO.getId())) {
Long id = userTvDTO.getId();
String priorityMemberCode = userTvDTO.getPriorityMemberCode();
List<MemberDTO> memberDTOList = this.memberService.findByUserIptvId(id);
if (!CollectionUtils.isEmpty(memberDTOList)) {
for (MemberDTO memberDTO : memberDTOList) {
String code = memberDTO.getCode();
if (code.equalsIgnoreCase(priorityMemberCode)) {
memberDTO.setIptvMajor(IPTV_MAJOR[1]);
} else {
memberDTO.setIptvMajor(IPTV_MAJOR[0]);
}
}
}
return memberDTOList;
}
return null;
}
@Override
public Object serviceLogin(WeiXinUserBean resources) {
String unionId = resources.getUnionid();
String appId = resources.getAppid();
String openId = resources.getOpenid();
// if (org.apache.commons.lang3.StringUtils.isBlank(unionId)) {
// TODO 需要商量是否需要创建微信账户
/*UserWeixinDTO userWeixinDTO = this.findUserWeiXinByOpenIdAndAppId(appId, openId);
if (ObjectUtil.isNotEmpty(userWeixinDTO))
return userWeixinDTO;*/
// }
// 小屏账户
UserWeixinDTO userWeixinDTO = this.findFirstByUnionIdAndAppIdAndOpenId(unionId,appId, openId);
if (Objects.isNull(userWeixinDTO.getId())) {
DefaultWeiXinBeanDefinition weiXinBeanDefinition = new DefaultWeiXinBeanDefinition();
weiXinBeanDefinition.setUnionId(unionId);
weiXinBeanDefinition.setAppid(appId);
weiXinBeanDefinition.setOpenId(openId);
// 创建会员和账户
this.doCreateUserWeiXinAndMember(weiXinBeanDefinition);
} else {
// 修改账户和会员信息
this.doUpdateUserWeiXinAndMember(userWeixinDTO,appId,openId,"","");
}
// 为了保证返回的同一用户
UserWeixinDTO userWeixinDTO_0 = this.getFirstId(userWeixinDTO);
return userWeixinDTO_0;
}
@Override
@AsyncMqSend
public boolean appletBind(BindBean resources) {
Long id = resources.getId();
......@@ -1451,171 +608,371 @@ public class UserOperationServiceImpl implements UserOperationService {
throw new EntityNotFoundException(MemberDTO.class, "id", memberId.toString());
}
// 主账户
String priorityMemberCode = userTvDTO.getPriorityMemberCode();
// 主账户
String priorityMemberCode = userTvDTO.getPriorityMemberCode();
if (StringUtils.isBlank(priorityMemberCode)) {
// 主账户会员
String code = memberDTO.getCode();
// 设置主账号
userTvDTO.setPriorityMemberCode(code);
}
// 更新小屏账户更新时间,epg需要根据修改时间来让绑定的二维码消失
this.doUpdateUserWeiXinUpdateTime(userWeixinDTO);
// 更新大屏信息,同步大屏信息时使用
userTvDTO.setMemberCode(memberDTO.getCode());
this.doUpdateUserTv(userTvDTO);
String platform = userTvDTO.getPlatform();
// 绑定IPTV平台 0:未知;1:电信;2:移动;3:联通
Integer bindIptvPlatformType = 0;
// 联通
if (UserConstant.platform_lt.contains(platform)) {
bindIptvPlatformType = PLATFORM_LIST[3];
}
// 移动
if (UserConstant.platform_yd.contains(platform)) {
bindIptvPlatformType = PLATFORM_LIST[2];
}
// 电信
if (UserConstant.platform_dx.contains(platform)) {
bindIptvPlatformType = PLATFORM_LIST[1];
}
memberDTO.setUserIptvId(userTvDTO.getId());
memberDTO.setBindIptvTime(LocalDateTime.now());
memberDTO.setBindIptvPlatformType(bindIptvPlatformType);
memberDTO.setPlatformAccount(platformAccount);
// 修改会员信息
this.doUpdateMemberByMemberDTO(memberDTO);
return true;
}
@Override
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public void bind(String memberCode, String platformAccount) {
MemberDTO memberDTO = this.memberService.findByCode(memberCode);
this.bind(memberDTO,platformAccount);
}
/**
*
* @param memberDTO
* @param userTvDTO
*/
@Override
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public void bind(MemberDTO memberDTO, UserTvDTO userTvDTO) {
String platformAccount = userTvDTO.getPlatformAccount();
// 绑定
this.bind(memberDTO,platformAccount);
}
/**
*
* @param memberDTO
* @param platformAccount
* @return
*/
@Override
public UserTvDTO bind(MemberDTO memberDTO, String platformAccount) {
MemberDTO memberDTO1 = this.memberService.findByCode(memberDTO.getCode());
if (Objects.nonNull(memberDTO1.getUserIptvId())) {
UserTvDTO userTvDTO = this.userTvService.findById(memberDTO1.getUserIptvId());
return userTvDTO;
}
// 大屏账户
UserTvDTO userTvDTO = this.userTvService.findByPlatformAccount(platformAccount);
if (Objects.isNull(userTvDTO)) {
throw new BadRequestException("大屏信息不存在!");
}
// mq同步数据时使用
memberDTO.setPlatformAccount(platformAccount);
// 大屏是否绑定主账号,如果绑定了主账户则不操作大屏账户表
this.bondPriorityMember(userTvDTO,memberDTO.getCode(),"auto");
// 构建小屏会员对象,绑定user_iptv_id字段
String platform = userTvDTO.getPlatform();
// 绑定IPTV平台 0:未知;1:电信;2:移动;3:联通
Integer bindIptvPlatformType = 0;
// 联通
if (UserConstant.platform_lt.contains(platform)) {
bindIptvPlatformType = PLATFORM_LIST[3];
}
// 移动
if (UserConstant.platform_yd.contains(platform)) {
bindIptvPlatformType = PLATFORM_LIST[2];
}
// 电信
if (UserConstant.platform_dx.contains(platform)) {
bindIptvPlatformType = PLATFORM_LIST[1];
}
memberDTO.setUserIptvId(userTvDTO.getId());
memberDTO.setBindIptvTime(LocalDateTime.now());
memberDTO.setBindIptvPlatformType(bindIptvPlatformType);
memberDTO.setPlatformAccount(platformAccount);
// 修改会员
this.doUpdateMemberByMemberDTO(memberDTO);
return null;
}
/**
*
* @param unionid
* @param appId
* @return
*/
private UserWeixinDTO findUserWeiXinByUnionIdAndAppId(String unionid, String appId) {
return this.userWeixinService.findFirstByUnionidAndAppid(unionid,appId);
}
/**
* 修改会员vip状态
*/
private void doUpdateMemberVip(MemberDTO memberDTO,Integer vip1) {
if (memberDTO != null) {
Integer vip = memberDTO.getVip();
vip = (vip == null ? 0 : vip);
// 未购买付费会员
if (vip <= 1) {
memberDTO.setVip(vip1);
Member member = new Member();
BeanUtils.copyProperties(memberDTO, member);
this.memberService.update(member);
}
}
}
/**
* 获取小屏会员
* @param userWeixinDTO
* @return
*/
private MemberDTO findMemberByUserWeixinDTO(UserWeixinDTO userWeixinDTO) {
Long memberId = userWeixinDTO.getMemberId();
if (Objects.nonNull(memberId)) {
MemberDTO memberDTO = this.findMemberById(memberId);
return memberDTO;
}
return null;
}
/**
* 修改微信公众号关注状态
* @param status 0:取消关注 1:关注
*/
private UserWeixinDTO doUpdateUserWeiXinStatus(String appId, String openId, Integer status) {
UserWeixinDTO userWeixinDTO = this.userWeixinService.findFirstByAppIdAndOpenId(appId, openId);
if (StringUtils.isBlank(priorityMemberCode)) {
// 主账户会员
String code = memberDTO.getCode();
userTvDTO.setPriorityMemberCode(code);
}
if (Objects.nonNull(userWeixinDTO.getId())) {
// 更新小屏账户更新时间,epg需要根据修改时间来让绑定的二维码消失
this.doUpdateUserWeiXinUpdateTime(userWeixinDTO);
userWeixinDTO.setStatus(status);
UserWeixin userWeixin = new UserWeixin();
BeanUtils.copyProperties(userWeixinDTO,userWeixin);
// 更新大屏信息
userTvDTO.setMemberCode(memberDTO.getCode());
this.doUpdateUserTv(userTvDTO);
this.userWeixinService.update(userWeixin);
}
memberDTO.setPlatformAccount(platformAccount);
// 会员绑定大屏
this.bindIptvId(memberDTO,userTvDTO);
return userWeixinDTO;
this.doUpdateMemberByMemberDTO(memberDTO);
return true;
}
/**
* 更新微信用户修改的时间
* @param userWeixinDTO
* 修改微信公众号关注状态
* @param status 0:取消关注 1:关注
*/
private void doUpdateUserWeiXinUpdateTime(UserWeixinDTO userWeixinDTO) {
UserWeixin userWeixin = new UserWeixin();
userWeixin.setAppid(userWeixinDTO.getAppid());
userWeixin.setOpenid(userWeixinDTO.getOpenid());
userWeixin.setUpdateTime(TimestampUtil.now());
this.userWeixinService.updateTime(userWeixin);
}
private UserWeixinDTO doUpdateUserWeiXinStatus(UserWeixinDTO userWeixinDTO, Integer status) {
@Override
public JSONObject getUnionIdByAppIdAndOpenId(String appId,String secret,String code) {
// 链接微信服务器
String url = WeChatConstants.CODE2SESSION.replace("APPID", appId)
.replace("SECRET", secret).replace("JSCODE", code);
userWeixinDTO.setStatus(status);
String entityBody = HttpUtil.get(url);
UserWeixin userWeixin = new UserWeixin();
BeanUtils.copyProperties(userWeixinDTO,userWeixin);
JSONObject jsonObject = JSONObject.parseObject(entityBody);
this.userWeixinService.update(userWeixin);
String errCode = jsonObject.getString("errcode");
if (StringUtils.isNotEmpty(errCode)) {
String nameStr = jsonObject.getString("errmsg");
throw new BadRequestException(nameStr);
}
return userWeixinDTO;
return jsonObject;
}
@Override
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public UserWeixinDTO createWeixinUserAndCreateMember(UserWeixin resources) {
/**
* 获取会员
* @param memberId
* @return
*/
private MemberDTO findMemberById(Long memberId) {
MemberDTO memberDTO = this.memberService.findById(memberId);
return memberDTO;
}
String appId = resources.getAppid();
String openId = resources.getOpenid();
String unionId = resources.getUnionid();
/**
*
* @param userWeixinDTO
* @param appId
* @param openId
*/
private void doUpdateUserWeiXinAndMember(UserWeixinDTO userWeixinDTO,String appId,String openId,String headImgUrl,String nickName) {
// 检查账户是否存在
UserWeixinDTO userWeixinDTO = this.findFirstByUnionIdAndAppIdAndOpenId(unionId,appId, openId);
if (Objects.nonNull(userWeixinDTO.getId()))
return userWeixinDTO;
// 修改微信账户关注状态
this.doUpdateUserWeiXinStatus(userWeixinDTO,SUBSCRIBE_STATUS);
// 当前用户的任意微信app
UserWeixinDTO userWeixinDTO1 = this.findFirstByUnionId(unionId);
// 小屏会员
MemberDTO memberDTO_0 = this.findMemberByAppIdAndOpenId(appId,openId);
Long memberId = null;
Integer vip = 0;
if (Objects.nonNull(userWeixinDTO1.getId()) && Objects.nonNull(userWeixinDTO1.getMemberId())) {
if (StringUtils.isNotBlank(headImgUrl) && StringUtils.isNotBlank(nickName)) {
memberDTO_0.setAvatarUrl(headImgUrl);
memberDTO_0.setNickname(nickName);
}
memberId = userWeixinDTO1.getMemberId();
this.doUpdateMemberVip(memberDTO_0,1);
}
} else {
/**
* 获取小屏会员
* @param appId
* @param openId
* @return
*/
private MemberDTO findMemberByAppIdAndOpenId(String appId, String openId) {
UserWeixinDTO userWeixinDTO = this.userWeixinService.findFirstByAppIdAndOpenId(appId,openId);
if (Objects.nonNull(userWeixinDTO)) {
Long memberId = userWeixinDTO.getMemberId();
return this.findMemberById(memberId);
}
return null;
}
userWeixinDTO1 = new UserWeixinDTO();
BeanUtils.copyProperties(resources,userWeixinDTO1);
/**
*
* @param memberCode
* @return
*/
private UserTvDTO findByPriorityMemberCode(String memberCode) {
UserTvDTO userTvDTO = this.userTvService.findByPriorityMemberCode(memberCode);
return userTvDTO;
}
// 创建会员
memberId = this.doCreateMember(userWeixinDTO1,vip);
/**
* 设置主会员
* @description 检查大屏账户有没有绑定小屏会员,如果没有绑定就将当前会员的code保存到大屏账户中
* @param userTvDTO
* @param memberCode
* @param auto manual:手动 auto:自动
*/
private void bondPriorityMember(UserTvDTO userTvDTO, String memberCode,String auto) {
if (auto.equalsIgnoreCase("auto")) {
// 主账户
String priorityMemberCode = userTvDTO.getPriorityMemberCode();
if (StringUtils.isNotEmpty(priorityMemberCode)) {
return;
}
}
userWeixinDTO1.setId(null);
userWeixinDTO1.setAppid(appId);
userWeixinDTO1.setOpenid(openId);
userWeixinDTO1.setUnionid(unionId);
log.info("createWeixinUserAndCreateMember ==>> [{}]",userWeixinDTO1);
// 保存微信账户
userWeixinDTO1 = this.doCreateUserWeiXin(userWeixinDTO1,memberId);
log.info("userWeixinDTO1 ==>> [{}]",userWeixinDTO1);
userTvDTO.setPriorityMemberCode(memberCode);
MemberProfileDTO memberProfileDTO = this.memberProfileService.findByMemberId(memberId);
if (Objects.isNull(memberProfileDTO))
// 创建会员属性信息
this.createMemberProfile(userWeixinDTO1);
UserTv userTv = new UserTv();
BeanUtils.copyProperties(userTvDTO,userTv);
this.userTvService.update(userTv);
return userWeixinDTO1;
}
@Override
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public void bind(String memberCode, String platformAccount) {
MemberDTO memberDTO = this.memberService.findByCode(memberCode);
this.bind(memberDTO,platformAccount);
}
/**
* 置空主账号
* @param memberCode
*/
private void resetMainAccount(String memberCode) {
UserTvDTO userTvDTO = this.userTvService.findByPriorityMemberCode(memberCode);
if (Objects.nonNull(userTvDTO)) {
userTvDTO.setPriorityMemberCode(null);
@Override
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public void bind(MemberDTO memberDTO, UserTvDTO userTvDTO) {
String platformAccount = userTvDTO.getPlatformAccount();
// 绑定
this.bind(memberDTO,platformAccount);
UserTv userTv = new UserTv();
BeanUtils.copyProperties(userTvDTO,userTv);
this.userTvService.unbindPriorityMemberCode(userTv);
}
}
@Override
public UserTvDTO bind(MemberDTO memberDTO, String platformAccount) {
/**
* 解绑(置空大屏信息)
* @param memberDTOS
*/
private void resetIptvColumn(MemberDTO memberDTOS) {
// 若无关系,不做处理
if (Objects.nonNull(memberDTOS))
return;
MemberDTO memberDTO1 = this.memberService.findByCode(memberDTO.getCode());
if (Objects.nonNull(memberDTO1.getUserIptvId())) {
UserTvDTO userTvDTO = this.userTvService.findById(memberDTO1.getUserIptvId());
return userTvDTO;
Member member = new Member();
memberDTOS.setBindIptvTime(null);
memberDTOS.setUserIptvId(null);
memberDTOS.setBindIptvPlatformType(null);
BeanUtils.copyProperties(memberDTOS, member);
this.memberService.update(member);
}
// 大屏账户
UserTvDTO userTvDTO = this.userTvService.findByPlatformAccount(platformAccount);
if (Objects.isNull(userTvDTO)) {
throw new BadRequestException("大屏信息不存在!");
/**
*
* @param memberCode 会员编码
* @return
*/
private MemberDTO findMemberByCode(String memberCode) {
MemberDTO memberDTO = memberService.findByCode(memberCode);
return memberDTO;
}
// mq同步数据时使用
memberDTO.setPlatformAccount(platformAccount);
// 大屏是否绑定主账号,如果绑定了主账户则不操作大屏账户表
this.bondPriorityMember(userTvDTO,memberDTO,"auto");
/**
* 修改会员
* @param memberDTO
*/
private void doUpdateMemberByMemberDTO(MemberDTO memberDTO){
Member member = new Member();
BeanUtils.copyProperties(memberDTO,member);
member.setUpdateTime(LocalDateTime.now());
log.info("doUpdateMemberByMemberDTO=====?>>member ==>> [{}]",member);
this.doUpdateMember(member);
}
// 构建小屏会员对象,绑定user_iptv_id字段
MemberDTO memberDTO0 = this.bindIptvId(memberDTO,userTvDTO);
/**
* 修改会员
* @param member
*/
private void doUpdateMember(Member member){
this.memberService.update(member);
}
// 修改会员
this.doUpdateMemberByMemberDTO(memberDTO0);
return null;
/**
* 更新微信用户修改的时间
* @param userWeixinDTO
*/
private void doUpdateUserWeiXinUpdateTime(UserWeixinDTO userWeixinDTO) {
UserWeixin userWeixin = new UserWeixin();
userWeixin.setAppid(userWeixinDTO.getAppid());
userWeixin.setOpenid(userWeixinDTO.getOpenid());
userWeixin.setUpdateTime(TimestampUtil.now());
this.userWeixinService.updateTime(userWeixin);
}
/**
*
* @param userWeixinDTO1
* @param unionId
* @return
*/
private void createMemberProfile(UserWeixinDTO userWeixinDTO1) {
Long memberId = userWeixinDTO1.getMemberId();
String nickname = userWeixinDTO1.getNickname();
Integer sex = userWeixinDTO1.getGender();
MemberProfile memberProfile = MemberProfileBuild.build(memberId, nickname, sex, null);
this.memberProfileService.create(memberProfile);
}
private UserWeixinDTO findFirstByUnionId(String unionId) {
return this.userWeixinService.findFirstByUnionId(unionId);
}
......@@ -1690,52 +1047,61 @@ public class UserOperationServiceImpl implements UserOperationService {
}
/**
* 保存、修改会员加密信息
* @param resources
* 获取小屏账户
* @param unionId
* @param appId
* @param openId
* @return
*/
private MemberProfile doSaveOrUpdateMemberProfile(DefaultWeiXinBeanDefinition resources,WeiXinUserBean weiXinUserBean) {
// 会员
MemberDTO memberDTO = this.findMemberById(weiXinUserBean.getMemberId());
if (Objects.nonNull(memberDTO)) {
Long memberId = memberDTO.getId();
// 会员加密信息
MemberProfileDTO memberProfileDTO = this.findMemberProfileByMemberId(memberId);
MemberProfile memberProfile = new MemberProfile();
if (Objects.nonNull(memberProfileDTO)) {
BeanUtils.copyProperties(memberProfileDTO , memberProfile);
private UserWeixinDTO findFirstByUnionIdAndAppIdAndOpenId( String unionId,String appId, String openId) {
return this.userWeixinService.findFirstByUnionIdAndAppIdAndOpenId(unionId,appId,openId);
}
memberProfile.setMemberId(memberId);
memberProfile.setPhone(resources.getPhoneNumber());
// 保存、更新会员加密信息
MemberProfile memberProfile1 = this.saveMemberProfile(memberProfile);
return memberProfile1;
/**
*
* @param member
* @return
*/
private Long createMember(Member member){
return this.memberService.create(member);
}
return null;
}
/**
*
* @param resources
* @param member
* @return
*/
private UserTv createTvUser(UserTvDTO resources,Member member){
private MemberProfileDTO findMemberProfileByMemberId(Long memberId) {
MemberProfileDTO memberProfileDTO = this.memberProfileService.findByMemberId(memberId);
return memberProfileDTO;
if (member != null) {
Long memberId = this.createMember(member);
resources.setMemberId(memberId);
}
private MemberProfile saveMemberProfile(MemberProfile memberProfile) {
return this.memberProfileService.create(memberProfile);
UserTv _userTv = new UserTv();
BeanUtils.copyProperties(resources,_userTv);
return this.userTvService.create(_userTv);
}
/**
*
* @param userWeixinDTO
* @param member
* @return
*/
private UserWeixin createWeixinUser(UserWeixinDTO userWeixinDTO,Member member){
if (member != null) {
// 创建会员
Long memberId = this.createMember(member);
userWeixinDTO.setMemberId(memberId);
}
UserWeixin _userWeixin = new UserWeixin();
BeanUtils.copyProperties(userWeixinDTO,_userWeixin);
return this.userWeixinService.create(_userWeixin);
}
}
......
package com.topdraw.exception;
/**
* @author :
* @description:
* @function :
* @date :Created in 2022/3/10 17:16
* @version: :
* @modified By:
* @since : modified in 2022/3/10 17:16
*/
public interface GlobeExceptionMsg {
/**************************************************************/
/** 系统 */
String OPERATION_FORBID = "operation forbid";
String ENTITY_ALREADY_EXISTS = "entity already exists";
/**************************************************************/
/** 会员管理 */
String MEMBER_CODE_IS_NULL = "memberCode is null";
String MEMBER_ID_IS_NULL = "memberId is null";
String MEMBER_ID_AND_CODE_ARE_NULL = "memberId and memberCode both null";
String MEMBER_INFO_ERROR = "member info is error";
String MEMBER_BLOCK_STATUS = "member status is block";
/**************************************************************/
/** 账户管理 **/
String IPTV_ID_IS_NULL = "iptvId is null";
String IPTV_PLATFORM_ACCOUNT_IS_NULL = "platformAccount is null";
String IPTV_IS_NULL = "iptv is null";
}
package com.topdraw.resttemplate;
import com.alibaba.fastjson.JSONObject;
import com.topdraw.business.module.member.address.domain.MemberAddress;
import com.topdraw.business.module.member.domain.Member;
import com.topdraw.business.module.member.relatedinfo.domain.MemberRelatedInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import javax.annotation.PostConstruct;
import java.util.Map;
@Slf4j
@Component
public class RestTemplateClient {
private static RestTemplate restTemplate;
private static String BASE_URL;
@Autowired
private Environment environment;
@PostConstruct
private void init() {
BASE_URL = environment.getProperty("api.baseUrl");
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
// 设置连接超时
factory.setConnectTimeout(5000);
// 设置读取超时
factory.setReadTimeout(8000);
restTemplate = new RestTemplate(factory);
}
public static JSONObject getMemberInfo(Long memberId) {
JSONObject resultSet = null;
String url = BASE_URL + "/api/member/findById/" + memberId;
log.info("request uc : url is " + url + ", memberId is " + memberId);
ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
if (responseEntity.getStatusCode().is2xxSuccessful()) {
String entityBody = responseEntity.getBody();
JSONObject jsonObject = JSONObject.parseObject(entityBody);
if (jsonObject.getInteger("businessCode").equals(200)) {
resultSet = jsonObject.getJSONArray("resultSet").getJSONObject(0);
}
}
log.info("uc response: " + resultSet.toJSONString());
return resultSet;
}
public static String createMember(Member member) {
String entityBody = "";
String url = BASE_URL + "/api/member/create";
log.info("request uc : url is " + url + ", memberId is " + com.alibaba.fastjson.JSONObject.toJSONString(member));
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, member, String.class);
if (responseEntity.getStatusCode().is2xxSuccessful()) {
entityBody = responseEntity.getBody();
}
return entityBody;
}
public static String updateMember(Member member) {
String entityBody = "";
String url = BASE_URL + "/api/member/update";
log.info("request uc : url is " + url + ", memberId is " + com.alibaba.fastjson.JSONObject.toJSONString(member));
restTemplate.put(url, member);
return entityBody;
}
public static String createMemberAddress(MemberAddress member) {
JSONObject resultSet = null;
String url = BASE_URL + "/api/MemberAddress/create";
log.info("request uc : url is " + url + ", memberId is " + com.alibaba.fastjson.JSONObject.toJSONString(member));
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, member, String.class);
String entityBody = "";
if (responseEntity.getStatusCode().is2xxSuccessful()) {
entityBody = responseEntity.getBody();
}
log.info("uc response: " + entityBody);
return entityBody;
}
public static void updateMemberAddress(MemberAddress member) {
String url = BASE_URL + "/api/MemberAddress/update";
log.info("request uc : url is " + url + ", memberId is " + com.alibaba.fastjson.JSONObject.toJSONString(member));
restTemplate.put(url, member);
}
public static void deleteMemberAddress(Long id) {
String url = BASE_URL + "/api/MemberAddress/delete/" + id;
log.info("request uc : url is " + url + ", memberId is " + id);
restTemplate.delete(url);
}
public static JSONObject getMemberProfile(Long memberId) {
JSONObject resultSet = null;
String url = BASE_URL + "/api/MemberRelatedInfo/getMemberRelatedInfos";
log.info("request uc : url is " + url + ", memberId is " + memberId);
ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
if (responseEntity.getStatusCode().is2xxSuccessful()) {
String entityBody = responseEntity.getBody();
JSONObject jsonObject = JSONObject.parseObject(entityBody);
if (jsonObject.getInteger("businessCode").equals(200)) {
resultSet = jsonObject.getJSONArray("resultSet").getJSONObject(0);
}
}
log.info("uc response: " + resultSet.toJSONString());
return resultSet;
}
public static String getMemberAddress(Map<String, Object> param) {
String entityBody = "";
String url = BASE_URL + "/api/MemberAddress/pageMemberAddress?page=" + param.get("page") + "&size=" + param.get("size") + "&memberId=" + param.get("memberId");
log.info("request uc : url is " + url + ", param is " + param);
ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
if (responseEntity.getStatusCode().is2xxSuccessful()) {
entityBody = responseEntity.getBody();
}
log.info("uc response: " + entityBody);
return entityBody;
}
public static String getMemberRelatedInfo(Map<String, Object> param) {
String entityBody = "";
String url = BASE_URL + "/api/MemberRelatedInfo/pageMemberRelatedInfos?page=" + param.get("page") + "&size=" + param.get("size") + "&memberId=" + param.get("memberId");
log.info("request uc : url is " + url + ", memberId is " + param);
ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
if (responseEntity.getStatusCode().is2xxSuccessful()) {
entityBody = responseEntity.getBody();
}
log.info("uc response: " + entityBody);
return entityBody;
}
public static void deleteMemberRelatedInfo(Long memberRelatedId) {
String url = BASE_URL + "/api/MemberRelatedInfo/delete/" + memberRelatedId;
log.info("request uc : url is " + url + ", memberId is " + memberRelatedId);
restTemplate.delete(url, String.class);
}
public static String addMemberRelatedInfo(MemberRelatedInfo resources) {
String entityBody = null;
String url = BASE_URL + "/api/MemberRelatedInfo/create";
log.info("request uc : url is " + url + ", memberRelatedId is " + com.alibaba.fastjson.JSONObject.toJSONString(resources));
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, resources, String.class);
if (responseEntity.getStatusCode().is2xxSuccessful()) {
entityBody = responseEntity.getBody();
// JSONObject jsonObject = JSONObject.parseObject(entityBody);
// if (jsonObject.getInteger("businessCode").equals(200)) {
// resultSet = jsonObject.getJSONArray("resultSet").getJSONObject(0);
// }
}
log.info("uc response: " + entityBody);
return entityBody;
}
public static String updateMemberRelatedInfo(MemberRelatedInfo resources) {
String resultSet = "";
String url = BASE_URL + "/api/MemberRelatedInfo/update";
log.info("request uc : url is " + url + ", memberRelatedId is " + com.alibaba.fastjson.JSONObject.toJSONString(resources));
restTemplate.put(url, resources);
return resultSet;
}
}
package com.topdraw.weixin.applet;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.topdraw.business.process.domian.weixin.WeiXinUserBean;
import com.topdraw.security.AESUtil;
import com.topdraw.utils.StringUtils;
import com.topdraw.weixin.beans.DefaultWeiXinBeanDefinition;
import com.topdraw.weixin.beans.WeiXinUserParser;
import com.topdraw.weixin.beans.config.WeiXinAppListConfig;
import com.topdraw.weixin.util.WeChatConstants;
import com.topdraw.weixin.util.WeiXinRequestUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@Component
public class WeiXinAppletUserParser implements WeiXinUserParser {
@Autowired
private WeiXinAppListConfig weiXinAppListConfig;
@Autowired
private WeiXinRequestUtil weixinRequestUtil;
@Value("${uc.service.platform:}")
private String platform;
@Value("${key:}")
private String key;
@Value("${uc.app.subAppId:wx05f35931270014be}")
private String subAppId;
@Value("${uc.app.h5AppId:wxca962918dfeed88c}")
private String h5AppId;
@Value("${uc.app.appletAppid:wxc57d42de3d351cec}")
private String appletAppid;
@Value("${file.upload:upload}")
private String filePath;
@Override
public DefaultWeiXinBeanDefinition parse(WeiXinUserBean resources) {
String key = this.key;
Map<String, String> weixinInfoMap = null;
String appId = resources.getWxAppid();
String code = resources.getWxCode();
String userInfo = null;
if (StringUtils.isNotBlank(appId)) {
String decrypt = AESUtil.decrypt(appId, key);
if (decrypt != null) {
appId = decrypt.substring(16);
}
weixinInfoMap = getWeixinInfoByAppid(appId);
}
if (StringUtils.isNotBlank(code)) {
String decrypt = AESUtil.decrypt(code, key);
if (decrypt != null) {
code = decrypt.substring(16);
}
}
if (StringUtils.isNotBlank(userInfo)) {
String decrypt = AESUtil.decrypt(userInfo, key);
if (decrypt != null) {
userInfo = decrypt.substring(16);
}
}
return this.generateWeiXinBeanDefinition(code,userInfo,weixinInfoMap);
}
/**
*
* @param code
* @param userInfo
* @param weixinInfoMap
* @return
*/
private DefaultWeiXinBeanDefinition generateWeiXinBeanDefinition(String code, String userInfo, Map<String, String> weixinInfoMap) {
String appId = weixinInfoMap.get("appid");
String secret = weixinInfoMap.get("secret");
JSONObject userInfoWxJo = null;
// 链接微信服务器
/*ResponseEntity<String> responseEntity1 = null;*//*restTemplate.exchange(WeChatConstants.CODE2SESSION.replace("APPID", appId)
.replace("SECRET", secret).replace("JSCODE", code),
HttpMethod.GET, null, String.class);*//*
String entityBody1 = responseEntity1.getBody();*/
String url = WeChatConstants.CODE2SESSION.replace("APPID", appId)
.replace("SECRET", secret).replace("JSCODE", code);
String entityBody = HttpUtil.get(url);
JSONObject jsonObject = JSONObject.parseObject(entityBody);
String openId = jsonObject.getString("openid");
String unionId = jsonObject.getString("unionid");
if (StringUtils.isEmpty(unionId)) {
try {
userInfoWxJo = this.weixinRequestUtil.getUserInfo(weixinInfoMap, openId,code);
} catch (Exception e) {
e.printStackTrace();
}
}
if (StringUtils.isNotBlank(userInfo)) {
JSONObject userInfoJo = JSONObject.parseObject(userInfo);
String encryptedData = userInfoJo.getString("encryptedData");
String iv = userInfoJo.getString("iv");
String key = jsonObject.getString("session_key");
String userInfoWeixin = AESUtil.decryptJsUserInfo(encryptedData, iv, key);
if (StringUtils.isNotEmpty(userInfoWeixin))
userInfoWxJo = JSONObject.parseObject(userInfoWeixin);
}
DefaultWeiXinBeanDefinition weiXinBeanDefinition =
new DefaultWeiXinBeanDefinition(appId,code,unionId,openId,userInfoWxJo,null);
return weiXinBeanDefinition;
}
/**
*
* @param appid
* @return
*/
private Map<String, String> getWeixinInfoByAppid(String appid) {
if (StringUtils.isBlank(appid)) {
throw new RuntimeException("wxAppid can not be null");
}
List<Map<String, String>> list = this.weiXinAppListConfig.getList();
Optional<Map<String, String>> weixinInfoOptional = list.stream().filter(o -> o.get("appid").equals(appid)).findFirst();
if (!weixinInfoOptional.isPresent()) {
throw new RuntimeException("wxAppid error, appid is : " + appid);
}
return weixinInfoOptional.get();
}
}
......@@ -3,13 +3,10 @@ package com.topdraw.test.business.basicdata.member.rest;
import com.alibaba.fastjson.JSON;
import com.topdraw.business.module.member.address.domain.MemberAddress;
import com.topdraw.business.module.member.address.rest.MemberAddressController;
import com.topdraw.business.module.member.address.service.dto.MemberAddressQueryCriteria;
import com.topdraw.common.ResultInfo;
import com.topdraw.BaseTest;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
public class MemberAddressControllerTest extends BaseTest {
......
......@@ -51,7 +51,7 @@ public class MemberControllerTest extends BaseTest {
member.setUserIptvId(1L);
member.setBindIptvPlatformType(0);
String s = JSON.toJSONString(member);
ResultInfo byId = this.memberController.update(member);
ResultInfo byId = null;
LOG.info("===>>>"+byId);
}
......@@ -79,7 +79,7 @@ public class MemberControllerTest extends BaseTest {
member.setBindIptvPlatformType(0);
member.setUpdateTime(LocalDateTime.now());
String s = JSON.toJSONString(member);
ResultInfo byId = this.memberController.create(member);
ResultInfo byId = null;//this.memberController.create(member);
LOG.info("===>>>"+byId);
}
......
......@@ -3,13 +3,10 @@ package com.topdraw.test.business.basicdata.member.rest;
import com.alibaba.fastjson.JSON;
import com.topdraw.business.module.member.relatedinfo.domain.MemberRelatedInfo;
import com.topdraw.business.module.member.relatedinfo.rest.MemberRelatedInfoController;
import com.topdraw.business.module.member.relatedinfo.service.dto.MemberRelatedInfoQueryCriteria;
import com.topdraw.common.ResultInfo;
import com.topdraw.BaseTest;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import java.time.LocalDate;
......
......@@ -2,7 +2,7 @@ package com.topdraw.test.business.process.rest;
import com.alibaba.fastjson.JSON;
import com.topdraw.business.process.rest.TaskOperationController;
import com.topdraw.business.process.rest.TaskOperationQueryCriteria;
import com.topdraw.business.process.service.dto.TaskOperationQueryCriteria;
import com.topdraw.module.mq.DataSyncMsg;
import com.topdraw.module.mq.EventType;
import com.topdraw.BaseTest;
......